본문 바로가기
객체지향

캡슐화란 무엇일까?

by 근즈리얼 2023. 12. 1.
728x90

객체지향의 특징 중에 캡슐화라는 단어가 있습니다!

 

캡슐화는 무엇이고 무엇이기에 객체지향의 특징이 될 수 있었을까요?

 

캡슐화 정의 (위키피디아)

  • 객체의 속성과 행위를 하나로 묶고
  • 실제 구현 내용 일부를 내부에 감추어 은닉한다.

위의 정의는 위키피다아에 적혀 있는 내용입니다.

무언가를 묶고 숨기고 하는거 같은데 이것을 통해서 어떤 이득이 있길래 객체지향의 특징이라고 하는 걸까요?

 

아래의 코드를 보겠습니다.

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이야?'

이렇게 객체와의 대화로 보실 수 있는데요 ㅎㅎ

객체에게 책임을 주고 메세지를 주고 받는 것이 더 좋은 객체지향 설계가 될 수 있지 않을까 생각합니다!

728x90

댓글