객체지향의 특징 중에 캡슐화라는 단어가 있습니다!
캡슐화는 무엇이고 무엇이기에 객체지향의 특징이 될 수 있었을까요?
캡슐화 정의 (위키피디아)
- 객체의 속성과 행위를 하나로 묶고
- 실제 구현 내용 일부를 내부에 감추어 은닉한다.
위의 정의는 위키피다아에 적혀 있는 내용입니다.
무언가를 묶고 숨기고 하는거 같은데 이것을 통해서 어떤 이득이 있길래 객체지향의 특징이라고 하는 걸까요?
아래의 코드를 보겠습니다.
public String getSuperAdmin() {
Member kevin = new Member("kevin", 30, true);
// **중요**
if(kevin.getAge() > 25 && kevin.isAdmin()) {
return "super admin";
}
return "just admin";
}
조잡하지만.. super 관리자를 찾는 로직이 들어간다고 생각해보겠습니다.
캡슐화에 대해서 설명하면서 가장 중요하게 봐야할 부분은 제가 주석으로 표시한 부분입니다.
지금은 25살 이상의 어드민이 true일 경우 super admin으로 분류를 했는데요~ 만약 30살 이상으로 바꾼다면 지금 코드에서 숫자만 25 -> 30으로 바꿔주면 되겠죠?
그렇다면.. 지금 코드.. 나쁘지 않을지도..?
하지만 제가 만들고 싶은 서비스는 오래도록 많은 사람들에게 사랑을 받았으면 좋겠습니다. 오래도록 서비스가 유지되다 보면 제가 중요하다고 한 로직이 여러 곳에서 사용될지 모르겠습니다!
또한, 많은 사람들에게 사랑을 받으며 수많은 요구사항이 발생하고 그때마다 수정을 해야겠죠!
예시로
if(kevin.getAge() > 25 && kevin.isAdmin())
위의 코드가 10곳에서 사용 중이고 25에서 30살로 수정이 필요하다면 10곳을 모두 찾아가서 수정을 해야하는 문제가 생길 수 있습니다.
이때 만약 좀만 더 영리한 근즈리얼이 처음부터 캡슐화를 진행했다면 어땠을까요? 아래 코드로 예시를 들어볼게요!
public String getSuperAdminWithEncapsulation() {
Member kevin = new Member("kevin", 30, true);
if(kevin.isSuperAdmin()) {
return "super admin";
}
return "just admin";
}
// member 안에 메소드
public boolean isSuperAdmin() {
if(this.getAge() > 25 && this.isAdmin()) {
return true;
}
return false;
}
member 객체 안에 메소드로 isSuperAdmin이라는 메소드를 만들어서 super admin이 맞는지 체크하는 로직을 캡슐화 했습니다.
위의 형태로 로직을 처음부터 만들었다면 super admin을 찾는 로직이 10곳 넘게 있다 하더라도 member안에서 단 한번 수정을 한다면 모든 로직이 일괄적으로 수정이 가능합니다.
저는 이것이 캡술화에 가장 큰 장점이라고 생각합니다.
또한, 추가적으로 메소드명을 통해서 지금 로직이 무엇을 하는지 좀 더 명확해질 수 있고요. 서비스 정책의 이해도를 올릴 수 있다고 생각합니다.
그리고 저는 한번 더 나아가 어떤 것들을 캡슐화 하면 좋을까 고민을 해봤는데요!
객체의 데이터를 가져와 비교하거나 수정하려고 할 때 캡슐화를 사용하면 좋습니다.
이 부분은
'객체야 너 데이터좀 줄래? 너 데이터를 갖고 super admin인지 체크좀 해보려고~'
대신 '객체야 너 super admin이야?'
이렇게 객체와의 대화로 보실 수 있는데요 ㅎㅎ
각 객체에게 책임을 주고 메세지를 주고 받는 것이 더 좋은 객체지향 설계가 될 수 있지 않을까 생각합니다!
'객체지향' 카테고리의 다른 글
[객체지향의 사실과 오해] 2장 이상한 나라의 객체 (0) | 2024.03.16 |
---|---|
[객체지향의 사실과 오해] 1장 협력하는 객체들의 공동체 (0) | 2024.03.12 |
객체지향 설계란? - 3. LSP (0) | 2022.01.16 |
객체지향 설계란? - 2. OCP (1) | 2021.12.19 |
객체지향 설계란? - 1. SRP (solid) (0) | 2021.12.01 |
댓글