제이제이
article thumbnail

 

캡슐화(Encapsulation)


🤔 캡슐화란?

  • 캡슐화는 하나의 목적을 이루기 위해 관련 있는 모든 것을 논리적으로 하나의 캡슐에 담아 두는 것을 의미합니다.

-> 객체 지향의 관점에서 캡슐은 클래스에 해당합니다.

-> 즉, 클래스를 적절히 캡슐화시키면 프로그램이 간결해집니다.

 

  • 아래의 세가지 코 감기약이 있고 아래와 같은 기능들이 있다고 가정하겠습니다.

1. 흐르는 ‘콧물’을 멎게하는 기능을 가진 캡슐 약

2. 멈추지 않는 ‘재채기’를 가라앉혀 주는 기능을 가진 캡슐 약

3. 답답한 ‘코막힘’ 상태를 완화시켜 주는기능을 가진 캡슐 약

 

  • 위의 기능들을 모아 하나의 코 감기약으로 캡슐화를 하면 복용하면 보다 약 사용에 간편합니다.
  • 아래의 코드를 통해 캡슐화가 되지 않은코드와 캡슐화 된 코드 두 가지를 살펴봅시다.

캡슐화가 되지 않은 상태

💻 예시 코드

class SinivelCap{ //콧물 처치용 캡슐
    void take(){
        System.out.println("콧물이 싹~ 납니다.");
    }
}

class SneezeCap{  //재채기 처치용 캡슐
    void take(){
        System.out.println("재채기가 맺습니다.");
    }
}

class SnuffleCap{ //코막힘 처치용 캡슐
    void take(){
        System.out.println("커기 빵 뚫립니다.");
    }
}

class  ColdPatinet{
    void takeSinivelCap(SinivelCap cap){
        cap.take();
    }
    void takeSneezeCap(SneezeCap cap){
        cap.take();
    }
    void takeSnffleCap(SnuffleCap cap){
        cap.take();
    }
}

public class BadEnxapsulatin {
    public static void main(String[]args){
        ColdPatinet suf = new ColdPatinet();

        //콧물 캡슐 구매 후 복용
        suf.takeSinivelCap(new SinivelCap());

        //재채기 캡슐 구매 후 복용
        suf.takeSneezeCap(new SneezeCap());

        //코막힘 캡슐 구매 후 복용
        suf.takeSnffleCap(new SnuffleCap());
    }
}

 

📸 출력 결과

콧물이 싹~ 납니다.
재채기가 맺습니다.
커기 빵 뚫립니다.

이 경우 코감기 약을 SinivelCap,SneezeCap,SnuffleCap의 순으로 복용해야 하는 불편함이 존재합니다.

 

  • 만약 이 세가지 코감기 약을 하나의 약으로 캡슐화 한다면 어떻게 될까요?
  • 아래의 두가지의 코드를 살펴봅시다.

 

첫번째 캡슐화 하여 하나의 클래스로 만드는 예

  • 한 캡슐에 3가지의 약의 기능을 모아 캡슐화하는 방법

 

💻 예시 코드

class SinusCap{
    void sniTake(){
        System.out.println("콧물이 싹~ 납니다.");
   }
    void sneTake(){
        System.out.println("재채기가 멎습니다.");
    }
    void  snuTake(){
        System.out.println("코가 뻥 뚫립니다.");
    }

    void take(){ //약의 복용 방법 및 순서가 담긴 메소드
        sniTake();
        sneTake();
        snuTake();
    }
}

class ColdPatinet2{
    void takeSinus(SinusCap cap){
        cap.take();
    }
}

public class OneClassEncapulation {
    public static void main(String[]args){
        ColdPatinet2 suf = new ColdPatinet2();
        suf.takeSinus(new SinusCap());
    }
}

 

📸 출력 결과

콧물이 싹~ 납니다.
재채기가 맺습니다.
커기 빵 뚫립니다.

 

  • 코드를 살펴보면 다음과 같습니다.

-> SinusCap 클래스 안에 코감기와 관련된 모든 내용이 캡슐화되었습니다.
-> 이에 ColdPaint2 클래스와 main메소스가 이전 캡슐화 되지 않았던 코드보다 간결해졌음을 알 수 있습니다.

 

두번째 캡슐화 하여 하나의 클래스로 만드는 예

  • 세가지 약들의 기능을 모아 하나의 캡슐로 다시 캡슐화하는 방법

 

💻 예시 코드

class SinivelCap2{ //콧물 처치용 캡슐
    void take(){
        System.out.println("콧물이 싹 ~ 납니다.");
    }
}

class SneezeCap2{ //재채기 처리용 캡슐
    void take(){
        System.out.println("재채기가 맺습니다.");
    }
}

class SnuffleCap2{ //코막힘 처치용 캡슐
    void take(){
        System.out.println("코가 뻥 뚫립니다.");
    }
}

class SinusCap2{
    SinivelCap2 siCap = new SinivelCap2();
    SneezeCap2 szCap = new SneezeCap2();
    SnuffleCap2 sfCap = new SnuffleCap2();

    void take() {
        siCap.take();
        szCap.take();
        sfCap.take();
    }
}

class ColdPatient3{
    void takeSinus(SinusCap2 cap){
        cap.take();
    }
}

public class CompEncapsulation {
    public static void main(String[]args){
        ColdPatient3 suf = new ColdPatient3();
        suf.takeSinus(new SinusCap2());
    }
}

 

📸 출력 결과

콧물이 싹~ 납니다.
재채기가 맺습니다.
커기 빵 뚫립니다.

 

  • 코드를 살펴보면 다음과 같은 사실을 알 수 있습니다.

->  SinusCap2 클래스가 세가지 클래스(SinivelCap2,SneezeCap2,SnuffleCap2)의 인스턴스를 멤버 변수로 가질 수 있는데 이러한 과정을 가리켜 포함 관계 라고 합니다. 이러한 포함관계는 캡슐화하는데 사용되어 코드를 간편하게 만들 수 있습니다.

 

📒 Reference (참고 자료)


  1. 윤성우의 열혈 자바

 

 

profile

제이제이

@아사비치즈스틱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!