java-get-together / effective-java

이펙티브 자바 스터디
0 stars 0 forks source link

Chpater 02. Item01~05 [Q&A] #2

Open y00njinuk opened 2 years ago

y00njinuk commented 2 years ago
y00njinuk commented 2 years ago

pirvate 생성자 사용 시 주의점은 어떤 것이 있을까? (p.23 예시)

https://1-7171771.tistory.com/123 (JPA에서 기본생성자가 반드시 필요한이유) , 그외에도 토비의스프링 1장에서도 언급된 부분이 있습니다 툴이나 프레임워크에서 디폴트생성자를 요구하는경우가 의외로 많기때문에(프레임워크에서 리플렉션으로 객체의 인스턴스를 생성해 동적으로 컨트롤 하게되는데 이때 반드시 기본생성자 여야합니다 ) 저는 private생성자로 막을수도있구나 정도로 생각하고, 섣불리쓰면 위험할수있겠구나 라는 생각이 들었습니다. image

public class Application {
// User라는 클래스에대한 리플렉션을 하기위한 과정
    public static void main(String[] args){

       Class<?> userClass = Class.forName("springbook.user.domain.User"); // 리플렉션으로 가져오고자 하는 클래스의 풀패키지명을 입력 
        Constructor<?> constructor = userClass.getConstructor(null); //getConstructor(null)로 반드시 기본생성자로 가져와야만하고, 파라미터가 있는 생성자를 넣게될경우 런타임에러가 발생합니다
        User user =(User) constructor.newInstance(); // User의 인스턴스생성
        System.out.println(user);

    }
}

해당부분 공부했던부분 코드 한번 올려보겠습니다 이때문에 프레임워크에서 기본생성자를 요구합니다

y00njinuk commented 2 years ago

인스턴스를 통제함으로써 얻을 수 있는 이점은 무엇인가? (p.9 Line 21~22)

책에서도 있지만 인스턴스를 통제한다는게 의도치않게 어디서든 인스턴스를 생성할수있는경우를 막는의미 라고 생각됩니다. 이는 p9 4번째문단 4번째줄 "인스턴스화불가(아이템4), 인스턴스화가 불가능하기때문에 클래스 자체를 싱글톤(아이템3)"으로 만들수있다는 장점이있다는것 같네요. 아이템1이었지만 5까지 읽고나니 좀더 이해가될수있는 부분인것같습니다

y00njinuk commented 2 years ago

static final vs final 차이는 무엇일까? (p.8 예시)

아래 이미지 부분이 제일 중요한 것 같습니다. :+1: 아래 링크 참고할게요! image http://www.instanceofjava.com/2016/08/final-static-method-in-java-example.html (edited)

y00njinuk commented 2 years ago

@youngreal 근데.. 혹시 그 말씀해주신 프레임 워크 내에서 reflection을 사용하는 이유가 있는 걸까요? 실제 애플리케이션을 개발할 때는 많이 사용을 하지 않는다고 들었거든요. 또한, 디폴트 생성자의 필요성도 단순히 프레임워크에서 사용에 의한 거라면 여러 개의 인자들로 구성된 생성자들로는 충분히 해결이 되는 것 아닐까요?

y00njinuk commented 2 years ago

@youngreal 님이 작성함.

@y00njinuk 개발하면서 저희가 직접 리플렉션을 사용할일은 드물겠지만 프레임워크자체에서 동적으로 조작하기위해 사용하게 되는것으로 알고있습니다. 스프링의 DI의 원리도 리플렉션이 사용됩니다

심지어 스프링MVC의 DispatcherServlet에도 리플렉션이 있고 여기에서는 매핑된 어노테이션이 붙어있는 메소드,클래스에 대한 정보를 런타임시점에 읽어서 데이터매핑을 가능케합니다. 그러면 왜 런타임시점에 그런 조작을 하는것이냐..는 저도 조금 공부해봐야알겠지만 프레임워크마다 목적이좀 다르기도하고 컴파일 시점에 도무지 할수없는 것들이 있기때문에 프레임워크에서 리플렉션을 사용하는것이 아닐까 라는 생각이 듭니다.

자바만으로 컴파일(정적)시점에 아무리 객체간의 관계를 잘 설계해도 느슨하지않은 결합이 생기는 부분이 있었는데 스프링의 DI는 런타임시점에 이 객체간의 관계를 설정하게 해주어 컴파일시점에는 상당히 느슨하게 결합되어있고 객체의 의존은 런타임시점에 프레임워크가 책임지게됩니다.. 이것자체가 어마어마해서 스프링이 사랑받는 큰이유중 하나가 이부분이죠 이외에도 하이버네이트,JUnit등등.. 에서도 리플렉션은 사용되고있습니다 아마프레임워크라고 하면 거의다 쓰이고있지않을까 싶어요

생성자 인자부분은 리플렉션 자체가 여러개의 인자들로 구성된 생성자를 인자로받는 클래스에대한 정보를 가져오지 못합니다. 그것이 리플렉션의 기본스펙이라고 합니다.

https://da-nyee.github.io/posts/woowacourse-why-the-default-constructor-is-needed/

도움이 되실것같습니다

y00njinuk commented 2 years ago
  • static final vs final 차이는 무엇일까? (p.8 예시) @this-is-spear 님이 작성함.

아래 이미지 부분이 제일 중요한 것 같습니다. 👍 아래 링크 참고할게요! image http://www.instanceofjava.com/2016/08/final-static-method-in-java-example.html (edited)

@this-is-spear 흠.. 결국 static은 일반적으로 클래스 변수로서 접근을 하는 제어자이다보니 overriding 과는 크게 관련이 없을 것 같다는 생각이 드네요 단, 말씀해주신 것처럼 hiding?에 대한 여부는 상속의 유무에 따라 자연히 결정이 될테고요.