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

[아이템 04] 인스턴스화를 막으려거든 private 생성자를 사용하라 #4

Closed
102092 opened this issue Sep 10, 2020 · 7 comments
Assignees

Comments

@102092
Copy link
Contributor

102092 commented Sep 10, 2020

No description provided.

@102092 102092 self-assigned this Sep 10, 2020
@david215
Copy link
Contributor

david215 commented Sep 17, 2020

자바에서는 함수가 클래스 외부에 존재할 수 없기 때문에 유틸리티 클래스를 정의해야 한다는 점이 재밌네요. 기존의 절차지향적 언어들이나 (예: C, 연장선인 C++) 함수가 일급객체인 언어들 (예: Python)은 클래스 외부에 있는 함수를 레퍼런스하는 것이 가능하기 때문에 인스턴스화 하지 않을 개념을 클래스로 정의하는 것이 부자연스러운 것이니까요. 언어가 가지고 있는 한계점을 best practice로 보완하는 게 흥미롭습니다.

추가적으로 우리가 배운 스프링, 특히 DDD와 연결지어 생각하면 유틸리티 클래스를 사용하기 보다는 서비스 객체를 만들어 사용하는 게 더 자연스러워서 유틸리티 클래스를 정의해서 사용했던 경우는 스프링을 잘 몰랐던 초반 이후로는 잘 없었던 같기는 하네요.

@david215
Copy link
Contributor

기본 생성자의 동작 방식과 서브클래스에서 슈퍼클래스의 생성자가 적용되는 방식이 잘 정리된 링크

@102092
Copy link
Contributor Author

102092 commented Sep 17, 2020

@david215

클래스 외부에 있는 함수를 레퍼런스하는 것이 가능하기 때문에 인스턴스화 하지 않을 개념을 클래스로 정의하는 것이 부자연스러운 것이니까요.

이렇게 쓰신 건, 함수가 일급객체인 언어들은 클래스 외부에서 함수를 참고하는 것이 가능하기에, Item4에서 정의하고 있는 클래스의 인스턴스화를 막는 개념? 컨셉? 자체를 생각하는 게 이상하는 뜻인가요?

@102092
Copy link
Contributor Author

102092 commented Sep 17, 2020

하위 클래스에 기본 생성자가 정의되지 않으면, 컴파일러는 자동적으로 상위 클래스의 접근 가능한 기본 생성자를 실행한다.
상위 클래스에 기본 생성자가 없거나, 접근이 불가능하다면 하위 클래스의 생성자가 호출된다 정의되어있지 않으면 에러 발생함.

링크주신 것에서는 이게 핵심인듯 한데.. 제가 이해한 게 맞을까요

@david215
Copy link
Contributor

이렇게 쓰신 건, 함수가 일급객체인 언어들은 클래스 외부에서 함수를 참고하는 것이 가능하기에, Item4에서 정의하고 있는 클래스의 인스턴스화를 막는 개념? 컨셉? 자체를 생각하는 게 이상하는 뜻인가요?

클래스라는 개념 자체가 객체의 성질을 정의하기 위해서 존재하는 것인데 인스턴스화를 막을 이유는 (1) 싱글톤이거나 (2) 원래 객체가 아니었다 둘 중 하나인데 애초에 개념적으로는 유틸리티 클래스는 유틸리티 클래스가 아니었어야 하지만 자바의 언어적 한계상 클래스로 정의된 거죠.

@david215
Copy link
Contributor

하위 클래스에 기본 생성자가 정의되지 않으면, 컴파일러는 자동적으로 상위 클래스의 접근 가능한 기본 생성자를 실행한다.
상위 클래스에 기본 생성자가 없거나, 접근이 불가능하다면 하위 클래스의 생성자가 호출된다 정의되어있지 않으면 에러 발생함.

아이템 주제와 연결지어서 더 풀어서 얘기를 하자면:

  • 클래스 안에 private 생성자를 정의하면 컴파일러가 기본 생성자 (no-arg constructor)를 만들지 않음.
  • 클래스에 접근 가능한 생성자가 없는 경우 클래스를 상속하는 것이 원칙적으로 봉쇄됨.
    • 이유는 하위 클래스 생성자에서는 명시적으로든 암시적으로든 super()를 호출하게 되는데 접근 가능한 생성자가 없기 때문에 에러.
  • 결과적으로 API 유저는 클래스의 private 생성자에 접근이 불가능하기 때문에 생성할 수 없고 또 이 클래스를 상속해서 생성할 수도 없기 때문에 인스턴스화를 원천봉쇄.

@102092
Copy link
Contributor Author

102092 commented Sep 18, 2020

모호하던 부분이 확실하게 이해되었습니다 ! 💯

@wooody92 wooody92 changed the title [아이템 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 [아이템 04] 인스턴스화를 막으려거든 private 생성자를 사용하라 Sep 20, 2020
@102092 102092 closed this as completed Sep 20, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants