캡슐화란?
객체의 속성과 메서드를 하나로 묶어 외부로부터의 직접적인 접근을 제한하고, 해당 객체의 메서드를 통해서만 변경이 가능하도록 하는 것
🤓 즉 캡슐화를 하면 코드의 복잡성을 관리하고 재사용성을 높일 수 있습니다.
캡슐화가 필요한 이유 4가지
- 정보은닉 - 클래스의 내부 구현을 외부로부터 숨기게 된다면 클래스의 사용자는 내부 구현에 대해 알 필요 없이 인터페이스(프로토콜)를 통해 클래스를 사용할 수 있습니다.
- 재사용성 - 독립적인 모듈을 만들어 다른 곳에서 재사용 할 수 있습니다.
- 유지보수 - 해당 클래스가 어떻게 구현되었는지 알 필요 없이 그 클래스를 사용하거나 수정할 수 있습니다.
- 안정성 - 어느 객체가 잘못된 방법으로 상태를 변경하면서 발생할 수 있는 오류를 방지할 수 있습니다.
이러한 이유로, 객체 지향 프로그래밍에서는 캡슐화 원칙을 지키는 것이 중요합니다. Swift에서는 private, fileprivate, internal, public, open 의 접근 제어자를 제공합니다. 이 중 private는 가장 제한적인 범위를 가지며, 해당 요소를 선언한 코드 블록 내에서만 접근이 가능합니다. private 접근 제어자를 사용하면 객체의 상태를 외부로부터 잘 숨길 수 있어요.
약간 딱딱하죠? 전반적으로 재사용성과 유지보수성, 코드 안정성을 위해 사용한다고 보시면 될 것 같습니다!
🤓 바로 스펀지밥으로 예시를 들어보겠습니다.
스펀지밥은 징징이의 집에 놀러갔는데요, 목이 말라 냉장고를 열고 우유를 꺼내 마십니다.
private 미적용시
class SpongeBob {
var drink: String?
}
class Squidward {
var fridge: [String] = ["Milk", "Juice", "Water"]
}
let spongeBob = SpongeBob()
let squidward = Squidward()
spongeBob.drink = squidward.fridge.removeFirst() // 스펀지밥이 징징이의 냉장고에서 음료수를 가져옴
spongeBob.drink // "Milk" 출력
fridge 속성이 public으로 선언되어 있기 때문에 스펀지밥이 징징이의 냉장고에서 직접 음료수를 가져올 수 있는 상황인데요,
징징이는 이 상황이 맘에 들지 않습니다. 스펀지밥이 허락도 없이 자기 냉장고를 여는 것 부터가 맘에 들지 않아요. 그래서 징징이는 냉장고를 자물쇠로 잠가버리고, 스펀지밥에게 "너가 나한테 꺼내달라고 요청해야 꺼내줄거야"라고 말합니다.
캡슐화가 진행된 코드 보실게요!
private 키워드 적용시
class SpongeBob {
private var drink: String?
func getDrink() -> String? {
return drink
}
func setDrink(drink: String) {
drink = drink
}
}
class Squidward {
private var fridge: [String] = ["Milk", "Juice", "Water"]
func giveDrink() -> String {
return fridge.removeFirst()
}
}
let spongeBob = SpongeBob()
let squidward = Squidward()
spongeBob.setDrink(newDrink: squidward.giveDrink()) // 스펀지밥이 징징이에게 요청하여 음료수를 가져옴
spongeBob.getDrink() // "Milk" 출력
보시다시피 fridge 속성이 private으로 선언되어 있어, 스펀지밥이 징징이의 냉장고에서 직접 음료수를 가져올 수 없어요. 대신 징징이에게 요청해서 징징이가 해당 내부 함수를 통해 음료수를 전달하게 됩니다.
✅ private 키워드는 이런 자물쇠와 같은 역할을 해요. 타 객체에서 자신이 가지고 있는 프로퍼티에 대한 접근을 막는거죠. 캡슐화를 진행하다가 private 키워드 때문에 접근이 불가능하다는 메시지가 뜬다면, 당황하지 마시고 해당 클래스 내에서 접근하고자 하는 프로퍼티를 변경해주는 메서드를 만든 후 호출하면 간단하게 해결됩니다 ㅎㅎ
오늘은 iOS개발에서 캡슐화가 필요한 이유에 대해 알아보았습니다. 다음 시간에는 '제네릭 너 도데체 먼데?' 로 돌아오겠습니다.
'스폰지밥으로 공부하는 swift > 객체지향과 디자인패턴' 카테고리의 다른 글
빌 프린터로 알아보는 Observer 패턴 (0) | 2024.04.06 |
---|---|
1급 객체 넌 도데체 뭐하는 놈이냐 (2) | 2024.03.16 |
싱글턴 패턴이란? (0) | 2024.01.24 |
의존성, 의존성 역전의 법칙과 의존성 주입 (1) | 2023.12.06 |