추상화와 은닉화의 차이

윤준혁·2024년 10월 7일

추상화와 은닉화는 객체 지향 프로그래밍의 핵심 원칙 중 두 가지로, 둘 다 복잡성을 줄이고 코드를 더 쉽게 관리할 수 있도록 돕는 개념입니다. 하지만 이 두 개념은 서로 다른 목적을 가지고 있고, 그 동작 방식도 다릅니다.

추상화(Abstraction)

개념

  • 불필요한 세부 사항을 숨기고, 필요한 부분만 사용자에게 제공하는 것을 의미
  • 객체가 수행해야 할 기능의 핵심을 표현하고, 그 외에 복잡한 내부 구현은 숨기는 방식
  • 추상화는 일반적으로 추상 클래스나 인터페이스를 통해 구현

목적

  • 복잡성 제거 : 사용자에게 불필요한 복잡성을 숨기고, 인터페이스만 제공하여 필요한 부분만 신경쓸 수 있도록 함
  • 유연성 제공 : 여러 구현 클래스들이 동일한 추상화를 통해 일관된 방식으로 동작할 수 있음. 구체적인 구현은 숨겨져 있기 때문에 언제든지 구현을 변경할 수 있음
  • 필요한 것만 노출 : 필요한 기능만 외부에 노출하고, 내부 동작은 감춤

예시

은행의 ATM 기계를 생각해보면, 사용자 입장에서는 돈을 인출하거나 잔액을 조회하는 등의 기능만 사용합니다. 하지만 ATM 기계 내부에서는 매우 복잡한 로직이 있습니다. 예를 들어, 계좌 인증, 거래 처리, 통신 프로토콜 등이 이루어지지만, 사용자는 이 복잡한 과정을 알 필요가 없습니다. 사용자에게는 추상화된 인터페이스만 제공되기 때문에, 그 과정에 대한 이해 없이도 기능을 쉽게 사용할 수 있습니다.

은닉화

개념

  • 객체의 데이터와 메서드를 보호하는 것
  • 객체 내부의 데이터를 외부에서 접근할 수 없도록 감추고, 필요한 경우 메서드를 통해서만 접근하게 함
  • 은닉화를 통해 객체의 상태를 보호하고, 객체의 내부 구현이 외부에 영향을 주지 않도록 함(주로 접근 제어자를 사용하여 외부에서의 접근을 제어)

목적

  • 데이터 보호 : 객체의 내부 상태를 보호하고, 잘못된 접근이나 변경을 방지
  • 캡슐화 : 데이터와 메서드를 하나로 묶어 외부에서 불필요한 접근을 제한
  • 유지 보수성 : 내부 구현을 변경해도 외부에는 영향을 주지 않으므로, 유지보수가 용이

예시

class Car {
    private int speed;  // private으로 데이터를 보호
    
    // public 메서드로만 접근 허용
    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        if (speed >= 0) {
            this.speed = speed;  // 속도는 0 이상이어야 함
        }
    }
}
  • 위 예시에서 speed 속성은 private으로 선언되어 객체 외부에서는 직접 접근할 수 없음
  • 대신 getSpeed()와 setSpeed() 메서드를 통해서만 speed에 접근할 수 있음
  • 이를 통해 speed의 값이 잘못된 방식으로 변경되는 것을 방지하고, 속도 값이 음수로 설정되는 등의 오류를 막을 수 있음

추상화와 은닉화의 주요 차이점

추상화와 은닉화의 관계

  • 추상화와 은닉화는 상호 보완적인 개념
  • 추상화는 시스템의 복잡한 부분을 숨기고, 사용자에게 필요한 기능만 제공하는 반면, 은닉화는 데이터와 메서드를 보호하여 객체가 안전하게 동작할 수 있도록 보장
  • 추상화는 더 큰 관점에서의 숨김을 제공하는 반면, 은닉화는 내부 데이터와 로직을 보호하는 데 중점
  • 추상화는 객체 지향 설계에서 복잡한 시스템의 핵심적인 기능만 노출하고, 세부적인 구현을 숨김으로써 복잡성을 줄이는 것에 초점을 맞춥니다. 추상화를 통해 사용자에게 단순하고 일관된 인터페이스를 제공할 수 있습니다.
  • 은닉화는 객체의 데이터와 메서드를 보호하고, 외부에서 직접적으로 객체의 상태를 변경하지 못하게 하여 데이터의 안정성을 보장합니다. 이를 통해 객체의 상태를 외부의 잘못된 접근이나 수정으로부터 보호하고, 일관성을 유지합니다.

0개의 댓글