Java/EffectiveJava

EffectiveJava Question Series -1- (Item. 1 ~ Item. 7)

Flambee 2021. 5. 9. 15:43

 이펙티브 자바를 읽고 궁금한 점에 대한 시리즈물입니다.

 

  • item 1. 생성자 대신 정적 팩토리 메서드를 고려하라.
    • Java8에서 interface는 어떻게 변경이 되었고, 왜 변경하였을까요?
      • Java8부터 Defualt Method와 Static Method가 추가됨.
        • Java8 이전까지는 추상메서드와 상수 정의만 가능하였음. 
        • Default Method : 기본 구현을 가지는 Method
        • Static Method : Class의 Static Method와 같음.  재정의 불가능
      • Default Method : 기존 인터페이스가 변경이 되면, 인터페이스를 구현하는 모든 클래스들이 해당 메소드를 구현해야 하는 문제가 있어, 해당 문제를 해결하기 위하여 인터페이스에 메소드를 구현해 놓을 수 있도록 함.
      • Static Method : 인터페이스의 Static Method를 사용하여, 유틸리티성 인터페이스를 만들기 위함.
  • item 2. 생성자에 매개변수가 많다면 빌더를 고려하라.
    • Java에서 생성자나, 빌더 패턴, 자바 빈즈 패턴을 사용하면 어떤 문제가 생길까요? 그리고 해당 문제를 해결하기 위해 만들어진 라이브러리는 무엇일까요?
      • 반복적인 코드 작업으로 인하여, BoilerPlate가 생김.
      • BoilerPlate한 코드를 좀 더 간결하게 만들기 위하여 Lombok 라이브러리가 생김.
  • item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라
    • Java Singleton과 Spring Singleton의 차이는?
      • Java는 클래스 로더, Spring은 스프링 컨테이너에 의해서 구현된다.
      • 범위 : Java Singleton scope는 코드 전체이고 Spring Singleton은 컨테이너 내부이다 
    • Spring에서는 왜 싱글턴 패턴은 어떻게 구현이 될까요? 그리고 왜 쓸까요?
      • 스프링 컨테이너는 해당 클래스에 대해서 하나의 인스턴스만 만들며, 어떤 호출에도 단일 인스턴스만 리턴하기 때문에 Thread safety를 자동으로 보장한다. (Java singleton은 보장 못할 수도 있다함.)
      • DI 컨테이너 요청에서 항상 새로운 객체를 만들게 되면, 메모리적 낭비가 심하기 때문에 스프링은 이를 해결하기 위하여 싱글턴 패턴을 사용한다.
  • item 4. 인스턴스화를 막으려거든 pirvate 생성자를 사용하라.
    • private 메서드는 어떻게 테스트를 해야 할까요?
      • Refection기능을 사용하여 테스트.
  • item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라.
    • Spring에서의 Dependency Injection을 하기 위해 어떠한 방법을 쓰고 있나요?
      • @Autowired Field Injection
      • Setter Injection
      • constructor Injection
  • item 6.  불필요한 객체 생성을 피하라
    • String.matches와 Pattern.matcher에서 성능이 중요한 상황에서 반복해 사용하기에 적합하지 않은 것은 String.matches라고 합니다. 왜 성능에 적합하지 않다고 하는 걸까요? 왜 여러 번 사용하면 안 될까요?
      • Pattern Matcher는 미리 컴파일 된 정규식에 매칭
      • String Matches는 해당 정규식에 대해서 다시 컴파일 하므로 자주 실행했을 경우 리소스 낭비가 있음.
  • item 7. 다 쓴 객체 참조를 해제하라.
    • GC의 대상이 되는 객체와 GC의 대상이 되지 않는 객체는 무엇인가요?
      • GC의 대상이 되는 객체 
        • 모든 객체 참조가 null 인 경우
        • 객체가 블럭 안에서 생성되고, 블럭이 종류 된 경우
        • 부모 객체가 null인 경우에는 자식 객체도 GC의 대상이 된다.
        • Weak Reference한 객체인 경우 
        • Soft Referenc한 객체인 경우
      • GC의 대상이 되는 객체
        • Strong Reference한 객체인 경우
          • 하지만 Strong Reference한 객체도 null로 될 경우 GC 대상이 된다.

 


참고 사이트

stackoverflow.com/questions/2469244/whats-the-difference-between-string-matches-and-matcher-matches/2469275

 

What's the difference between String.matches and Matcher.matches?

What's the difference between String.matches and Matcher.matches? Is there any difference in terms of performance or other things?

stackoverflow.com

itmining.tistory.com/24

 

[JAVA] Garbage Collection의 기초

이 글은 PC 버전 TISTORY에 최적화 되어있습니다. 서론  이전에 안드로이드 메모리 관리 관련하여 Strong, Soft, Weak Reference에 대해 알아보면서 GC에 대해 살짝 언급한 적이 있습니다. Java의 가비지 컬

itmining.tistory.com

ktko.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%95%ED%95%9C%EC%B0%B8%EC%A1%B0Strong-Reference%EC%99%80-%EC%95%BD%ED%95%9C%EC%B0%B8%EC%A1%B0Weak-Reference

 

자바 강한참조(Strong Reference)와 약한참조(Weak Reference)

강한 참조(Strong Reference) 일반적으로 new를 통해서 객체를 생성하게 되면 생기게 되는 참조. 강한 참조를 통해 참조되고 있는 객체는 가비지 컬렉션의 대상에서 제외된다. Soft Reference 강한 참조와

ktko.tistory.com