객체 지향 프로그래밍
상태(필드)와 행위(메서드)를 가진 객체를 중심으로 설계하고, 객체 간 협력으로 프로그램을 구성하는 프로그래밍 패러다임입니다.
4대 특징
- 캡슐화: 객체의 상태와 행위를 하나의 단위로 묶고, 내부 구현은 숨긴 채 필요한 인터페이스만 외부에 제공합니다.
- 추상화: 불필요한 세부 사항을 감추고 핵심 기능만 추출하는 것으로, 공통된 특징은 인터페이스나 추상 클래스로 정의하고 세부 구현은 구현체에게 위임합니다.
- 다형성: 하나의 인터페이스가 여러 형태로 동작하는 것으로, 오버로딩과 오버라이딩을 통해 같은 메서드명이라도 객체에 따라 다르게 동작합니다.
- 상속: 상위 클래스의 특징을 하위 클래스가 물려받아 확장하는 것으로, 기존 기능을 수정하지 않고 새 기능을 추가할 수 있습니다. (상속 vs 합성 참고)
Tell Don't Ask 원칙
객체의 데이터를 꺼내 와 호출부에서 판단하지 말고, 객체에게 필요한 동작을 수행하도록 메시지를 보내라는 원칙입니다. 이를 지키면 캡슐화가 유지되고, 객체 스스로 자기 데이터를 다루므로 응집도는 높아지고 결합도는 낮아집니다.
// 위반: 데이터를 꺼내 호출부에서 검증하고 다시 채워 넣음
if (account.getBalance().compareTo(amount) < 0) {
throw new IllegalStateException("잔액 부족");
}
account.setBalance(account.getBalance().subtract(amount));
// 준수: 객체에게 메시지만 전달
account.withdraw(amount);
다이아몬드 문제
다중 상속을 허용하는 언어에서 발생하는 모호성 문제입니다. B와 C가 A를 상속해 같은 메서드를 오버라이딩하고, D가 B와 C를 동시에 상속하면 D가 어느 구현을 물려받아야 하는지 알 수 없습니다.
Java는 클래스의 다중 상속 자체를 지원하지 않아 이 문제를 막고, 인터페이스의 다중 구현만 허용합니다.
핵심 정리
- 캡슐화·추상화·다형성·상속 네 가지 특징으로 객체 간 역할과 책임을 나누고 협력 구조를 설계합니다.
- Tell Don't Ask 원칙은 캡슐화를 지키기 위한 실천 지침입니다.
- 다중 상속의 모호성(다이아몬드 문제) 때문에 Java는 클래스 상속을 단일 상속으로 제한합니다.