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

ariwarabbang님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

다양한 설정 형식 지원 - 자바 코드, XML

이전 강의부터 궁금했던것 질문입니다.

21.04.29 10:23 작성

·

375

3

뒤로가면 나오겠지 하고 계속넘어갔는데 나오지 않아서 추가 질문합니다.

설계와 구현에 나뉘어 인터페이스 / 구현체인 클래스로

나누고 실제 클라이언트 코드에서 코드 수정 없이

AppConfig파일만 바꾸면 코드의 교체를 할 수 있도록 예제가 구성이 되었는데요.

예를들어서 자동차 라는 인터페이스가 있고

전기차 , 석유차 라는 클래스가 있다고 했을 경우

스프링 코드를 사용하지 않고 자바로 했을때

자동차 car = new 석유차(); 

-> 자동차 car = new 전기차();

이렇게 하면 코드가 바뀌게 되잖아요?

근데 타입이 자식클래스가 아닌 부모 인터페이스 일 경우

자동차 (부모) 인터페이스에 공통으로 있는 기능을 사용 할 수 있지만 

전기차(자식) 클래스에만 있는 기능은  "car"를 통해 

사용하지 못하는 것 아닌가요? 

그럼에도 불구하고 자료형을 부모타입으로 하는 이유가 궁금합니다. 

답변 5

5

DOES님의 프로필 이미지

2021. 07. 08. 15:51

설계를 잘하면 가능할 것도 같은데요? 그냥 "연료 충전"이라는 매서드를 만들고 전기차에서 "전기로 충전"이라고 오버라이드하면 되듯이 대전제가 되는 매서드를 설정하고 각 타입에서 오버라이드할 수 있게 인터페이스를 잘 설계하면 되지 않을까 조심스레 추측해 봅니다...

개발좌님의 프로필 이미지

2022. 06. 25. 20:58

좋은방법같습니다!

4

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

2021. 04. 30. 20:36

안녕하세요. ariwarabbang님

전기차(자식) 클래스에만 있는 기능은  "car"를 통해 사용하지 못하는 것 아닌가요?

-> 네 맞습니다. 이 기능은 사용하지 못합니다.

그런데 우리는 대 전제를 잘 잡아야 합니다.

인터페이스는 제약입니다. 이렇게 제약이 있고 사용할 수 있는 기능에 한계가 있어야 합니다.

그래야 해당 인터페이스를 호출하는 클라이언트의 코드가 변하지 않습니다.

그리고 그 인터페이스 제약 안에서 구현 클래스들을 변경할 수 있어야, 앞서 말씀드린 DI, OCP 등이 가능합니다.

예를 들어서 자동차를 운전한다는 인터페이스가 있기 때문에 전기차가 나와도 운전면허증을 전기차 전용으로 갱신하지 않을 수 있는 것이지요. 그리고 이 모든 것은 인터페이스라는 제약이 있기 때문입니다.

감사합니다.

3

ariwarabbang님의 프로필 이미지
ariwarabbang
질문자

2021. 05. 02. 17:54

답변 감사합니다 !!

인터페이스 제약 안에서 구현 클래스들을 변경할 수 있어야, 앞서 말씀드린 DI, OCP 등이 가능합니다.

->  그럼 해당 전기차의 기능은 어떻게 사용을 할 수가 있나요?? 전기차로 바뀌었다면 예를들어 인터페이스의 구현체인 클래스가 전기차로 바뀐다면 전기차의 전기를 충전한다와 같이 전기차가 가지고 있는 기능을 사용해야 하는데 

이 때 어떻게 사용하는지가 궁금합니다 ㅎㅎ

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

2021. 05. 03. 18:44

네 이 경우에 충전이라는 별도의 기능이 필요하면 해당 부분만 추가 인터페이스를 만들어서 사용하면 됩니다.

여기서 중요한 점은 이 경우 클라이언트가 충전이라는 기능을 추가로 알아야 하고 결과적으로 클라이언트의 코드에 변경이 발생합니다.

그래서 처음부터 인터페이스를 잘 설계하는게 정말 중요합니다. 인터페이스는 잘 변하지 않도록 설계해야 합니다.

감사합니다.

1

지민재님의 프로필 이미지

2021. 06. 25. 19:13

        Car car1 = new GasolineCar();
        Car car2 = new ElectronicCar();

        car1.run();
        car2.run();
        if(car2 instanceof ElectronicCar){
            ElectronicCar eCar = (ElectronicCar) car2;
            eCar.charge();
        }

위 처럼 다운 캐스팅 해서 사용하면 사용 할 수는 있어요.

애초에 전기차 충전 행위가 일반 자동차에서 연료를 주입 하는것과 같으니 인터페이스를 수정 해야 될것 같기도 하구요.

저도 특정 자식 클래스만 있는 메서드를 어떻게 사용 하는것이 좋은 방법인지 궁금하네요.

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

2021. 06. 26. 21:17

네 결국 이렇게 큰 변화가 발생하면 선택이 필요합니다.

전기차의 충전과, 자동차의 주유를 같은 개념으로 두고 같은 메서드를 사용하게 하거나

추상화가 너무 다르다면 인터페이스도 변하고, 그에따라 클라이언트 코드도 변하는 것이 맞습니다.

감사합니다.

1

궁콘이님의 프로필 이미지

2021. 06. 21. 17:44

저도 궁금하네요