인프런 커뮤니티 질문&답변

박정현님의 프로필 이미지
박정현

작성한 질문수

김영한의 실전 자바 - 기본편

OCP(Open-Closed Principle) 원칙

12. 다형성과 설계 NewCar에서 pressBrake() 기능을 추가한다면..

해결된 질문

작성

·

437

·

수정됨

3

안녕하세요 영한님!

궁금한 점은 OCP 원칙까지 보고나서 생겨난 질문입니다.
Car 인터페이스를 구현하는 K3Car, Model3Car, NewCar의 클래스, Driver는 Car인터페이스를 의존하고 있는데요.,,.

강의 내용과 같이 Car 인터페이스에 있는 추상메소드들만 구현한 클래스끼리 있을 때는 크게 어려운 점이 없는 것 같지만.,.,


위와 같이 NewCar에서 이 때까지 없었던 pressBrake()라는 기능을 새로 추가하여 Driver에게 해당 메소드를 사용하게 하고싶다면! 어떻게 코드를 짜야하는지가 저의 궁금증입니다!

먼저 코드를 짜보면서 혼자 해결해보려고 했으나,.., 자바와 아직 완벽히 친해지지 못했는지 더 좋은 방법이 있지 않을까 하며 만족스러운 해법을 찾지 못 하고 있습니다..

1. Driver 클래스의 drive() 메서드 블록 안에서 instanceof를 사용하여 car변수가 NewCar 클래스일 때 pressBrake()를 사용한다면?
강의에서 배웠던 OCP원칙 중 Closed for modification에 모순이 생겨버리고..

2. Car 인터페이스에 pressBrake() 메서드를 넣는다면?
OCP 원칙에 모순이 생길 뿐더러 오히려 대대적인 코드 수정도 생겨버립니다..

해당 사항에 대해서는 어떻게 대처를 해야 잘했다고 소문이 날지 궁금하여 질문을 올리게 되었습니다!

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 박정현님

OCP 원칙은 클라이언트가 인터페이스에 의존하기 때문에 가능합니다. 쉽게 이야기해서 클라이언트는 인터페이스의 기능만 사용할 수 있습니다.

지금과 같이 특정 클래스만 제공하는 기능을 꼭 사용해야 하면 OCP 원칙을 깨고, 생각하신 것 처럼 1,2 두가지 경우 중에 하나를 선택해야 합니다.

1번 방식을 선택했을 때 조금 더 나은 선택지가 있다면, NewCar라는 구체적인 클래스가 아니라 새로운 인터페이스에 의존하도록 설계하는 것입니다.

만약 미래에 pressBrake()를 사용하는 클래스가 늘어날 것으로 예상된다면, 다음과 같이 해당 기능을 인터페이스로 만듭니다.

interface Brake() {
    void pressBrake();
}

NewCar를 포함한 pressBrake() 기능을 사용하는 클래스가 Brake 인터페이스를 구현합니다.

이제 Driver 클래스 안에서 instanceof를 사용할 때 Brake 인터페이스로 체크하는 방법입니다.

이렇게 하면 Brake 인터페이스를 구현한 모든 클래스의 pressBrake() 기능을 호출할 수 있습니다.

물론 Driver는 이제 Car, Brake 두 가지 인터페이스에 의존(사용)하게 됩니다.

이제부터는 새로운 클래스가 추가되어도 해당 클래스가 Car, Brake라는 인터페이스만 구현하면 Driver 클래스를 변경하지 않아도 됩니다. 따라서 OCP 원칙을 유지할 수 있습니다. 물론 앞서 설명드린 것 처럼 처음 한번은 Driver가 Brake 인터페이스를 사용하도록 코드 변경이 필요하고 OCP 원칙을 한번은 깨야합니다.

감사합니다.

박정현님의 프로필 이미지
박정현
질문자

덕분에 오늘도 어제보다 한걸음 더 나아가게 되었습니다! 매번 감사합니다!

박정현님의 프로필 이미지
박정현

작성한 질문수

질문하기