※ 캡슐화

 

항상 요구사항은 변경된다. 따라서 요구사항의 변경을 당연하게 받아들이고 이에 대처하는 법을 터득해야 한다. 이를 대처하는 방법이 낮은 결합도와 높은 응집도를 유지하는 것이다.

 

- 결합도 : 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지를 나타낸다.

- 응집도 : 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타낸다.

 

캡슐화는 특히 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계 원리다. 캡슐화는 정보은닉(알 필요가 없는 정보는 외부에서 접근하지 못하도록 제한)을 통해 높은 응집도와 낮은 결합도를 갖는다.

 

ex) 스마트폰을 충전하는 방식은 알더라도 내부에서 어떻게 충전되는 지 알 필요가 없다.

 

 

*정보 은닉의 필요성 : 소프트웨어는 결합이 많을수록 문제가 발생한다. 결합이 많은 클래스들이 있다면 하나의 클래스에 변경이나 오류가 생기면 결합된 다른 클래스에도 오류가 발생할 확률이 높다. 이런 결합을 줄이는 방법 중 하나가 정보은닉이다.

 

ex) 입력된 숫자들의 가장 큰 수를 구하는 프로그램

class ResultMax{
    public int[] array;
    public int size;

    public ResultMax(int size){
      this.size = size;
      array = new array[size];
     }

     public void Sort(){
             ......
            정렬 후 마지막 인덱스가 가장 큰수
     }
}

public class Main{
    public static void main(String[] args){
        ResultMax rm = new ResultMax(3);
        rm.array[0] = 1;
        rm.array[1] = 2;
        rm.array[3] = 3;
        rm.Sort();
        Sysout(rm[3]);
    }
}

 

만약 위의 array객체가 성능 향상을 위해서 int형 배열이 아닌 ArrayList로 바꾼다면 Main 부분의 코드 전반적인 부분을 변경해야 한다. array 객체를 private로 정보은닉을 하고 따로 ResultMax 클래스 안 변수에 숫자를 추가해 주는 add()함수를 별도로 구현한다면 코드의 결합도가 낮아질 것이다.

 

public class Main{
    public static void main(String[] args){
        ResultMax rm = new ResultMax();
        rm.add(1); rm.add(2); rm.add(3);
        rm.Sort();
        Sysout(rm.result());
    }
 }

 

위 코드와 같이 add(), result() 함수를 사용하면 array의 자료 구조가 어떻게 변경되든지 간에 상관이 없어진다. 즉, 정보은닉을 이용한 캡슐화를 통해 코드의 결합이 낮아지는 것이다.

 

 

+ Recent posts