본문 바로가기

스폰지밥으로 공부하는 swift/객체지향과 디자인패턴

캡슐화 왜 해야함??

728x90

캡슐화란?

객체의 속성과 메서드를 하나로 묶어 외부로부터의 직접적인 접근을 제한하고, 해당 객체의 메서드를 통해서만 변경이 가능하도록 하는 것


🤓 즉 캡슐화를 하면 코드의 복잡성을 관리하고 재사용성을 높일 수 있습니다.

캡슐화가 필요한 이유 4가지

  1. 정보은닉 - 클래스의 내부 구현을 외부로부터 숨기게 된다면 클래스의 사용자는 내부 구현에 대해 알 필요 없이 인터페이스(프로토콜)를 통해 클래스를 사용할 수 있습니다.
  2. 재사용성 - 독립적인 모듈을 만들어 다른 곳에서 재사용 할 수 있습니다.
  3. 유지보수 - 해당 클래스가 어떻게 구현되었는지 알 필요 없이 그 클래스를 사용하거나 수정할 수 있습니다.
  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개발에서 캡슐화가 필요한 이유에 대해 알아보았습니다. 다음 시간에는 '제네릭 너 도데체 먼데?' 로 돌아오겠습니다.