-
Effective Java - 2장. 생성과 파괴(2/3)Computer - Java 2022. 12. 23. 19:08
item 1. 생성자 대신 정적 팩터리 메서드를 고려하라
item 2. 생성자에 매개변수가 많다면 빌더를 고려하라
item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라
item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라
item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
item 6. 불필요한 객체 생성을 피하라
item 7. 다 쓴 객체 참조를 해제하라
item 8. finalizer와 cleaner 사용을 피해라
item 9. try-finally보다는 try-with-resources를 사용하라
item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라
java.lang.Math / java.util.Arrays => object보다는 library. 인스턴스를 만들 목적이 애초에 아님
방법은? 간단하다. 그냥 private 생성자를 쓰면 된다.
추상 클래스로 만들면 오히려 상속해서 만들어 쓰세요~ 라는 거랑 같으니 절대로 인스턴스화하지 않겠다고 추상 클래스를 만들지는 말자.
item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
만약 우리가 맞춤법 검사기를 만든다고 하자. 그럴 때 우리는 정적 유틸리티, 싱글턴 패턴을 쓰기 쉽다.
하지만 이들은 언어가 바뀔 때 대처하기가 쉽지 않다.
그렇게 하지 말고 언어팩 클래스를 만들고 언어팩 클래스를 주입시키면 되는 것 아닌가?
스프링에서 의존 역전에 대한 개념이나, Dependency Inversion Principle을 어느정도 이해하고 있으면 쉽게 넘어갈 것이라 생각한다.
item 6. 불필요한 객체 생성을 피하라
말 그대로다. 불필요한 객체 생성을 피하라는 것이다.
하지만 생각보다 우리가 의도치 않게 불필요한 객체를 많이 생성하고 있다.
(1) Boolean("true") 보다는 Boolean.valueOf("true")를 많이 쓰자
Boolean("true")는 객체를 만들고, Boolean.valueOf("true")는 true값을 가지는 객체의 참조를 반환한다.
(2) 자주 쓰이는 객체 상수는 만들어 놓자(특히 String)
boolean isMatch(String s){
return s.matches("hohohohahaha");
}static final code = "hohohohahaha"
boolean isMatch(String s){
return s.matches(code);
}"hohohohahaha"를 가진 Stirng 객체가 isMatch 호출 시 마다 생성되었다가 버려진다. 함수를 여러 번 호출해도 "hohohohahaha"가 생성되었다가 삭제되는 낭비가 일어나지 않는다. (3) 오토 박싱/언박싱에 신경을 쓰자(박싱은 객체이기 때문에 상대적으로 느림)
객체를 최대한 생성하지 말자는 뜻이 아님! 오히려 자바의 성능이 향상되어서 지키지 않는다고 해서 엄청 크게 차이가 나지는 않는다.
다만 보안이나 다른 문제가 없을 때 굳이 위와 같이 객체를 낭비시키는 일은 하지 말자는 뜻이다.
'Computer - Java' 카테고리의 다른 글
JPA 객체 사용 시 instanceof 는 주의해서 사용하자 (0) 2024.06.30 Effective Java - 3장. 모든 객체의 공통 메서드(2/2) (0) 2022.12.24 Effective Java - 3장. 모든 객체의 공통 메서드(1/2) (0) 2022.12.24 Effective Java - 2장. 생성과 파괴(3/3) (0) 2022.12.23 Effective Java - 2장. 생성과 파괴(1/3) (0) 2022.12.23