Encapsulation(캡슐화)
- 데이터와 그 데이터를 사용하는 메서드를 하나로 묶음
- Data hiding(정보 은닉)
- 객체 안에 있는 데이터(전부 혹은 일부)를 외부(다른 클래스에 속한 객체들)로부터 보호
데이터 추상화를 이루는 방법 중 하나
Inheritance(상속)
- 이미 존재하는 객체를 기반으로 확장된 객체를 만드는 방법
- 확장된 객체
- 기존의 객체에 속한 데이터와 동작을 모두 물려음
- 여기에 다른 데이터나 동작을 추가할 수 있음
- 실용적인 용도: 코드 중복을 막음
- 여러 객체에 공통되는 데이터나 동작을 부모 객체로 만듦
- 여러 객체들은 각각 그 부모 객체를 상속받음
- 그 후 자기에게만 필요한 데이터나 동작을 추가
다형성을 구현하기 위한 수단
Abstraction(추상화)
Data Abstraction
- 객체 사용 시 그 안에 정확히 어떤 데이터가 있는지 알 필요 없음
- 객체 안에 있는 데이터에 직접 접근 불가
Abstraction
- 다형성을 통한 추상화
- 추상 클래스나 인터페이스를 사용하는 추상화
Polymorphism(다형성)
- 같은 지시(동일한 함수 시그니처 호출)를 내렸는데 다른 종류의 객체가 동작을 달리(객체의 종류에 따라 실제로 실행되는 함수 구현 코드가 다름)하는 것
- 어떤 함수 구현이 실행될지는 런타임에 결정
- 이를 Late Binding, Dynamic Binding, (≒ Dynamic Dispatch)라 함
- 일반적인 함수 호출은 컴파일 타임에 결정
- 이를 Early Binding, Static Binding, (≒ Static Dispatch)라 함
- 다형성을 사용하려면 상속 관계가 필요
- 부모 객체에서 함수 시그니처를 선언
- 자식 객체에서 그 함수를 다르게 구현(Overriding)
다형성은 OOP의 핵심
역할과 구현의 분리
- 역할과 구현으로 구분하면 세상이 단순해지고 유연해지며 변경도 편리함
- 자바의 다형성을 활용
- 역할: 인터페이스
- 구현: 인터페이스를 구현한 클래스, 구현 객체
- 객체 설계 시 역할과 구현을 명확히 분리하여야 함
- 객체 설계 시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
- 유연하고 변경이 용이
- 확장 가능한 설계
- 클라이언트에 영향을 주지 않는 변경이 가능
- 인터페이스를 안정적으로 잘 설계하는 것이 중요
장점
- 클라이언트는 대상의 역할(인터페이스)만 알면 됨
- 클라이언트는 구현 대상의 내부 구조를 몰라도 됨
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않음
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않음
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경 가능
- 다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야 함
클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경 가능