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

감바스님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

새로운 할인 정책 개발

MemberService memberService = new MemberServiceImpl(); 에 대해 질문 있습니다.

해결된 질문

작성

·

721

0

안녕하세요 너무 쉬운 질문인거 같은데 질문한점 죄송합니다.

1. 아래 코드에서 보통 MemberServiceImpl자리에

   MemberService 이런식으로 쓰이지 않나요?

   어떠한 이유 때문에 MemberServiceImpl이 사용가

   능한가요?

2. 아래 코드는 어떠한 기능때문에         

    MemberServiceImpl()을 사용한건가요?

 

MemberService memberService = new MemberServiceImpl();

답변 2

3

말씀하신 거 처럼

MemberService memberService = new MemberService();

로 하시면 아래 그림처럼 오류가 뜰 겁니다.

임포트 받아온 MemberService는 인터페이스라
인스턴스화 될 수 없기 때문입니다.
(인터페이스는 생성자를 갖을 수 없습니다)

저렇게 A a = new B( ); 가 되는 이유는
다형성 때문입니다.
다형성에 관한 내용은 여기를 참조해주세요.
https://wikidocs.net/269

만약 비지니스 요구사항이 인터페이스를
안써도 되고, MemberService가 클래스였다면
1번 질문의 코드도 물론 가능합니다.

MemberService memberService = new MemberService();

 

반대로 테스트만을 위해서라면 아래처럼 해도
오류는 나지 않습니다만 OCP 관점으로 봤을때는
추천되진 않을 거 같습니다....

MemberServiceImpl memberService = new MemberServiceImpl();

 

그럼 자료형으로 인터페이스와 구현체 중
언제 뭘 쓰느냐는...

기본적으로는 인터페이스라고 알고 있습니다.
서포터스 David님이 다른 질문에서 답글로 공유하신 글 입니다.

https://github.com/david-learner/java-study/tree/master/2018OKKYCON#%EC%84%A4%EA%B3%84

"테스트를 할 때 구현(implementation)이 아니라 설계(interface)에 맞춰야 한다"

다만, 객체가 인터페이스에 의존하지 않고 특정(구체적인) 구현체에 의존하고 있다면 해당 구현체를 테스트해야 하는 일이 있을 수 있습니다.

틀린 점 있으면 피드백 부탁드립니다!

3

안녕하세요. annjae4676님, 공식 서포터즈 David입니다.

인터페이스와 구현체에 대한 내용은 자바 기본 문법에 해당하며 아래 글을 참고해주세요.

https://wikidocs.net/217

감사합니다.