Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[아이템1] 3번째 장점에 대한 자세한 설명 #8

Open
bo-ram-bo-ram opened this issue Apr 21, 2024 · 1 comment
Open

[아이템1] 3번째 장점에 대한 자세한 설명 #8

bo-ram-bo-ram opened this issue Apr 21, 2024 · 1 comment
Assignees
Labels
question Further information is requested 👻람보👻

Comments

@bo-ram-bo-ram
Copy link
Member

bo-ram-bo-ram commented Apr 21, 2024

질문있어요 🙋‍♀️🙋‍♂️

📚 책

페이지 : 28p
내용 : 장점 3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다

질문

위 내용이 잘 이해가 안가서 검색해봤는데 공유합니다~~

HelloService 라는 인터페이스를 생성.

public interface HelloService {
 String hello();
}

HelloService 를 구현한 클래스 생성.

public class KoreanHelloService implements HelloService {
 @Override
 public String hello() {
   return "안녕";
 }
}
public class EnglishHelloService implements HelloService {
 @Override
 public String hello() {
   return "Hello";
 }
}

해당 인스턴스들을 반환할 팩터리 클래스 생성

public class HelloServiceFactory {

 public static HelloService of(String lang) {
    if (lang.equals("ko")) {
       return new KoreanHelloService();
    } else {
       return new EnglishHelloService();
    }
 }
}

이렇게하면 반환타입에 호환가능한 다른 타입의 인스턴스들을 반환할 수 있게 만들어준다.

인스턴스의 구현체가 아니더라도 상속을 통해 부모 클래스를 만들고 자식 클래스를 반환하는 방법도 얼마든지 가능하다.

또한, 매개 변수에 따라 다른 클래스의 객체를 반환 할 수 있게 만들 수 있다.

 public static void main(String[] args) {
    HelloService hello = HelloServiceFactory.of("ko");

    System.out.println(hello.hello());
 }

위와 같이 인터페이스 기반의 프레임워크를 사용할 수 있도록 강제할 수 있다.

구체적인 구현을 클라이언트로부터 숨길 수 있다. 자바 8 에서는 static 메서드를 인터페이스에 구현할 수 있으니

public interface HelloService {
 String hello();

 static HelloService of(String lang) {
    if (lang.equals("ko")) {
       return new KoreanHelloService();
    } else {
       return new EnglishHelloService();
    }
 }
}

인터페이스를 위와같이 만들어 팩토리 클래스를 따로 생성할 필요없이 인터페이스 생성만으로도 해결이 가능하다.

인터페이스에서는 static만 선언하면 public static으로 간주한다.

물론 private static 메서드 선언도 가능하다.

@unanchoi
Copy link
Contributor

이열

@0lynny 0lynny mentioned this issue Apr 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested 👻람보👻
Projects
None yet
Development

No branches or pull requests

3 participants