객체지향 설계에서 지켜줘야할 5개의 개발원칙에 대해 알아보자.
하나의 클래스는 하나의 기능만 가지는 것이 좋다.
ex) 자동차라는 클래스를 설계할 때, 자동차 클래스를 만들고 엔진 기능 + 시트 기능 + 에어컨 기능 + ... 하지마라.
대신! 엔진은 엔진 클래스를 만들고, 시트는 시트 클래스를 만들고...
자동차 클래스는 이 클래스들을 묶는 역할만 하자.
=> 유지보수성을 높인다!
기능을 추가할 때, 기존 코드를 수정하지 않고 추가할 수 있어야 한다.
ex) 동물 클래스를 만들어보자. 그 내부에는 울기 메소드가 정의되어 있다. 해당 메소드를 실행하면 고양이는 야옹, 강아지는 멍멍이라고 정의되어 있다.
이 때 새로운 동물이 추가되면 울기 메소드는 수정될 수 밖에 없다....
대신! 동물을 상속받는 하위 클래스로 고양이 클래스, 강아지 클래스를 만들고 자식 클래스에서 울기 메소드를 정의하자.
=> 다형성과 확장의 장점 극대화!
abstract
자식 클래스는 부모 클래스로 대체되어도 프로그램이 정상 동작해야 한다.
ex) 새 클래스를 정의하고 날기 메소드가 정의되어 있다. 펭귄 클래스는 새 클래스를 상속받고 있다. 새 클래스에서 날기 메소드를 실행하고 보니 펭귄 클래스여서 정상동작하지 않는다...
대신! 날기는 인터페이스로 정의하고 날 수 있는 새에만 날기 인터페이스를 상속받게 하자.
=> 다형성의 원리 이용!
interface
하나의 인터페이스보다는 여러 개의 구체적인 인터페이스를 사용하는 것이 좋다.
ex) 강아지 클래스를 구현할 때 동물이라는 클래스만 상속받는 것보다는.
짖는 인터페이스, 네 발로 걸어다니는 인터페이스 등 여러개의 인터페이스를 상속받도록 하자.
=> 자유로운 상속!
의존 관계를 맺을 때는 일반적이고 추상적인 것이 좋다.
ex) 내부 변수로 먹이 타입이 필요하다. 지금은 당근 클래스를 의존하고 있지만, 상추 클래스로 변경하고 싶다...
대신! 두 클래스의 상위 클래스인 채소 클래스를 정의하고 이를 의존하도록 하자.
=> 클래스간의 결합도 감소!