캡슐화(Encapsulation)

uglyduck.dev·2020년 9월 20일
0

개념 모아 🗂

목록 보기
21/40

정의

객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것(정보은닉)을 의미한다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다. 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있다.

요구사항 변경에 대처하는 고전적인 설계 원리

응집도(cohesion)

  - 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타냄

결합도(coupling)

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

캡슐화는 특히 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계 원리다.

소프트웨어는 결합이 많을수록 문제가 발생하므로 정보 은닉을 사용한다. 한 클래스가 변경이 발생하면 변경된 클래스의 비밀에 의존하는 다른 클래스들도 변경해야 할 가능성이 커지므로 캡슐화를 사용하여 데이터 구조에 따른 코드의 수정 범위를 캡슐 범위로 한정할 수 있다.

구현 예시

public class ArrayStack{
  // KEY POINT!! public 접근 지시자로 외부에 공개되어 있는 객체
  public int top;
  public int[] itemArray;
  public int stackSize;
  
  // Construtor
  public ArrayStack(int stackSize){...}
  
  // Method(Stack)
  public boolean isEmpty(){...} 
  public boolean isFull(){...}  
  public void push(int item){...}
  public int pop(){...}
  public int peek(){...}
  
  public class StackClient{
    public static void main(String[] args){
      ArrayStack st = new ArrayStack(10);
      st.itemArray[++st.top] = 20;       // pop, push method를 이용하지 않고 직접 배열에 저장
      System.out.print(st.itemArray[st.top]);
      
    }
  }
  
}

위와 같은 코드로 작성되어 있을 시 ArrayStack과 StackClient 클래스는 강한 결합이 발생한다.

가령 ArrayList 클래스를 사용해 스택 구현이 변경되면 StackClient 클래스도 따라서 변경돼야 하는데, 이는 StackClient 클래스가 은닉된 정보를 직접 사용했기 때문에 은닉 정보가 변경되면 해당 정보를 사용한 쪽도 모두 변경되어야 한다.

ArrayStack의 자료구조가 변경돼도 똑같이 StackClient 클래스도 수정돼야 한다.

문제를 해결하기 위해 변경되는 곳을 파악해서 은닉해야한다.

// 접근지시자 public -> private
private int top;
private int[] itemArray;
private int stackSize;

public에서 private로 변경되었으므로 직접적으로 접근할 수 없다. 

push, pop, peek 메서드의 연산만으로 스택을 사용할 수 있다.

수정된 ArrayStack 클래스의 사용

public class ArrayStack{
  // KEY POINT!! private 접근 지시자로 외부에서 접근하지 못함
  private int top;
  private int[] itemArray;
  private int stackSize;
  
  // Construtor
  public ArrayStack(int stackSize){...}
  
  // Method(Stack)
  public boolean isEmpty(){...} 
  public boolean isFull(){...}  
  public void push(int item){...}
  public int pop(){...}
  public int peek(){...}
  
  public class StackClient{
    public static void main(String[] args){
      ArrayStack st = new ArrayStack(10);
      st.push(20)       // pop, push method를 이용하여 코드의 결합이 낮아짐
      System.out.print(st.peek());
      
    }
  }
  
}

Reference

  • 정인상, 채흥석, 『JAVA 객체 지향 디자인 패턴』, 한빛미디어(2019.3.8), 63~67p

  • 신용권, 『이것이 자바다』, 한빛미디어(2018.1.5), 189p

  • 뉴렉처, "자바 객체지향 강의 1강 - 객체지향 프로그래밍의 시작 캡슐화", https://www.youtube.com/watch?v=yGBmRdgc1Ic (2020.04.18)

profile
시행착오, 문제해결 그 어디 즈음에.

0개의 댓글