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