Object Oriented Programming
객체지향 프로그래밍이란, 기능이 아닌 객체가 중심이 되어, 객체에 따른 역할과 서로 다른 객체 간의 관계를 정의하여 개발하는 기법을 말한다.
객체라는 작은 단위로 쪼개어 개발하기 때문에 확장성과 유지보수에 용이하다.
객체의 사용자( 클라이언트 )는 대상의 역할( 인터페이스 )만 알면 된다.
클라이언트는 실제 객체를 구현하는 구현부를 몰라도 메서드를 통해서 사용할 수 있다.
클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
클라이언트는 구현 대상 자체를 변경(상속된 인터페이스로 변경)해도 영향을 받지 않는다.
인터페이스가 변하면, 클라이언트에 큰 변경이 발생한다.
→ 인터페이스를 안정적으로 잘 설계해야 한다.
객체들의 공통적인 특징을 도출하여 변수와 메서드를 통해 표현하는 것.
하나의 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 묶는 것.
실제로 구현되는 부분을 외부에 드러나지 않도록 은닉할 수 있다.
외부와의 상호작용은 데이터가 아닌, 기능(메서드)으로 한다.
하나의 객체를 다른 객체에게 물려주는 것.
기존 코드를 재활용하여 중복을 없애고 특징을 물려주는 것이 가능하다.
역할(인터페이스)과 구현(클래스)을 분리하는 것.
인터페이스를 구현한 객체 인스턴스를 실행 시점에 변경할 수 있다. (동적 바인딩)
오버로딩
오버라이딩
객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙이다.
이 원칙을 준수한 프로그램은 시간이 지나도 유지 보수와 확장이 쉽다.
Single Responsibility Principle
하나의 클래스는 하나의 책임만 가져야 한다.
변경이 있을때 파급 효과( 다른 객체의 변경 )가 적어야 한다.
→ UI 변경, 객체의 생성과 사용을 분리
Open-Closed Principle
확장에는 열려 있으나, 수정에는 닫혀 있어야 한다.
인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현한다.
Liskov Substitution Principle
부모 인터페이스를 자식 인터페이스로 바꾸더라도 정상 작동해야 한다.
자식 인터페이스는 인터페이스 규약을 다 지키면서 개발해야 한다.
Interface Segregation Principle
여러 클라이언트를 위한 범용 인터페이스보다 하나의 클라이언트만을 위한 특별한 인터페이스가 더 낫다.
인터페이스가 명확해지고, 대체 가능성이 높아진다.
예) 자동차 인터페이스 → 운전 인터페이스, 정비 인터페이스로 분리
Dependency Inversion Principle
구현체가 아닌 인터페이스에 의존해야 한다.
의존성 주입(DI)은 이 원칙을 따르는 방법 중 하나 이다.
MemberRepository m = new MemoryMemberRepository();
MemberRepository m = new JdbcMemberRepository();