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] 기본생성자가 없는데 왜 잘 동작하는지 궁굼합니다. #196

Closed
dkyou7 opened this issue Jan 5, 2021 · 2 comments
Assignees
Labels
Effective Java 3 이펙티브 자바 3

Comments

@dkyou7
Copy link

dkyou7 commented Jan 5, 2021

아이템[1] - 생성자 대신 정적 팩터리 메서드를 고려하라

질문 :

class Fruit {
    // Fruit (){} // 기본생성자가 없는데 왜 잘 동작하는지 궁굼합니다~
    public static Fruit getFruit(String name) {
        if ("Apple".equals(name)) {
            return new Apple();
        } else if ("Banana".equals(name)) {
            return new Banana();
        } else {
            return new Strawberry();
        }
    }
}
class Apple extends Fruit {
    public String print(){
        return "Apple!!";
    }
}
class Banana extends Fruit {
    public String print(){
        return "Banana!!";
    }
}
class Strawberry extends Fruit {
    public String print(){
        return "Strawberry!!";
    }
}

해당 코드가 잘 돌아가는 것이 의문입니다.

기본 생성자가 따로 없고 정적 팩토리 메서드만 있는데, 테스트 돌려보니까 잘 돌아가네요? 왜그런 것일까요?

public class FruitTest {

    @Test
    public void fruit_test(){
        // 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있습니다.
        Fruit fruit1 = Fruit.getFruit("Apple");
        assertEquals(fruit1.getClass().getSimpleName(),"Apple");

        Fruit fruit2 = Fruit.getFruit("Banana");
        assertEquals(fruit2.getClass().getSimpleName(),"Banana");

        Fruit fruit3 = Fruit.getFruit("asdfad");
        assertEquals(fruit3.getClass().getSimpleName(),"Strawberry");

        Apple apple = (Apple) Fruit.getFruit("Apple");
        assertEquals(apple.print(),"Apple!!");

        Banana Banana = (Banana) Fruit.getFruit("Banana");
        assertEquals(Banana.print(),"Banana!!");

        Strawberry Strawberry = (Strawberry) Fruit.getFruit("ewfsd");
        assertEquals(Strawberry.print(),"Strawberry!!");
    }
}
@dkyou7 dkyou7 added the Effective Java 3 이펙티브 자바 3 label Jan 5, 2021
@pci2676
Copy link
Member

pci2676 commented Jan 7, 2021

안녕하세요!
질문의 제목을 질문의 내용에 맞게 수정해주시면 감사하겠습니다.

자바는 아무런 생성자를 선언하지 않으면 기본적으로 숨겨져 있는(보이지 않는) 기본 생성자가 존재합니다.
따라서 질문에 적어주신 위 코드에서 Fruit를 비롯한 모든 클래스는 기본 생성자가 존재하게 됩니다.

class Fruit {
    // Fruit (){} // 기본 생성자가 보이지 않는 상태로 존재합니다.
    public static Fruit getFruit(String name) {
        if ("Apple".equals(name)) {
            return new Apple();
        } else if ("Banana".equals(name)) {
            return new Banana();
        } else {
            return new Strawberry();
        }
    }
}

class Apple extends Fruit {
    /* 아래와 같은 보이지 않는 기본 생성자가 존재
    public Apple {
        super();
    }
    */
    public String print(){
        return "Apple!!";
    }
}

궁금증이 해소되었으면 이슈 클로징 부탁드립니다 :)

@pci2676 pci2676 self-assigned this Jan 7, 2021
@dkyou7 dkyou7 changed the title [아이템 1] 질문드려도 될까요~? [아이템 1] 기본생성자가 없는데 왜 잘 동작하는지 궁굼합니다. Jan 7, 2021
@dkyou7
Copy link
Author

dkyou7 commented Jan 7, 2021

덕분에 궁금증이 해결되었습니다! 감사드려요 :)

@dkyou7 dkyou7 closed this as completed Jan 7, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Effective Java 3 이펙티브 자바 3
Projects
None yet
Development

No branches or pull requests

2 participants