Book/Effective Java
-
[Effective Java] Item 7. 다 쓴 객체 참조를 해제하라Book/Effective Java 2024. 11. 15. 20:39
특별히 문제 없어 보이는 코드에서 ‘메모리 누수’가 발생할 수 있다. 이것이 발생하면 가비지 컬렉션 활동과 메모리 사용량이 늘어나 결국 성능이 저하되고 심할 때는 디스크 페이징이나 OOM Error를 일으켜 프로그램이 예기치 않게 종료되기도 한다. 가비지 컬렉션 언어에서는 메모리 누수를 찾기가 아주 까다롭다. 객체 참조 하나를 살려두면 가비지 컬렉터는 그 객체뿐만아니라 그 객체가 참조하는 모든 객체를 회수해가지 못하기 때문이다. 이러한 문제를 해결하기 위하여 객체 참조를 해제하는 방법들이 존재한다. 참조 변수 null 처리가장 간단한 해법으로는 해당 참조를 다 썼을 때 null 처리를 하는 것이다. 이렇게 하면 null 처리한 참조를 실수로 사용하려 했을 때 NullPointException 이 발생하므..
-
[Effective Java] Item 6. 불필요한 객체 생성을 피하라Book/Effective Java 2024. 11. 14. 20:33
똑같은 기능의 객체를 매번 생성하기 보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 이를 설명할 수 있는 이유들을 살펴보자. 인스턴스 생성하기 코드를 보면,String s1 = new String("bikini");String s2 = "bikini";s1의 경우 실행될 때마다 String 인스턴스를 새로 생성하지만, s2의 경우 하나의 String 인스턴스를 사용한다. 더 나아가 가상 머신 안에서 이와 같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. 위의 내용에서 추가적으로 알아야할 사항이 있다. 우선 하기 코드를 살펴보자.// 문자열 리터럴 생성 비교String a = "동일할까?";String b = "동일할까?";System.out.println(a == b); ..
-
[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라Book/Effective Java 2024. 11. 13. 22:01
사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식은 적합하지 않다. 대신 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다. 이 조건을 만족하는 패턴은 바로 ‘의존 객체 주입 패턴’이다. 이 패턴은 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 것으로 코드는 다음과 같다.public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexicon dictionary) { this.dictionary = Objects.requireNonNull(dictionary); }} 의존 객체 주입은 생성자, 정적 팩터리, 빌더 모두에 똑같이 응용할 수 ..
-
[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라Book/Effective Java 2024. 11. 12. 20:50
가끔 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들 때가 있다. 객체 지향적으로 보이지 않지만 분명 나름의 쓰임새가 있다. 예를 들면 java.lang.Math, java.util.Arrays 처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있다. 또한 java.util.Collections 처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수 있다. 마지막으로 final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 떄문이다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한게 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 즉,..
-
[Effective Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라Book/Effective Java 2024. 11. 11. 21:40
싱글턴(Singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다.싱글턴을 만드는 방식은 보통 두개가 있다. public static final 필드 방식의 싱글턴public class A { public static final A INSTANCE = new A(); private A() { ... }} private 생성자는 A.INSTANCE를 초기화할 때 딱 한 번만 호출된다. 그리고 public이나 protected 생성하자 없으므로 A 클래스가 초기화될 때 만들어진 인스턴스가 전체 시스템에서 하나뿐임이 보장된다. 예외가 있는데, 권한이 있는 클라이언트는 리플랙션 API인 AccessibleObject.setAccessible을 사용해 private 생성자를 호출할 수 있다. ..
-
[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라Book/Effective Java 2024. 11. 10. 11:46
정적 팩터리와 생성자에는 똑같은 제약이 하나 있는데, 그건 선택적 매개변수가 많아지면 적절히 대응하기 어렵다는 점이다. 이럴 때 사용하는 대안이 있다. 점층적 생성자 패턴 (Telescoping Constructor Pattern)매개변수 1개를 받는, 2개를 받는, … n개를 받는 식으로 생성자를 늘려가는 방식이다.public class A { private int a; private int b; private int c; private int d; ... public A(int a, int b) { this.a = a; this.b = b; } public A(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } public A(int ..
-
[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라Book/Effective Java 2024. 11. 9. 11:12
이 장에 대해 설명하기 전에 우선 정적 팩터리 메서드가 무엇인지에 대해 알아보자. 정적 팩터리 메서드란정적 펙터리 메서드란, 객체 생성을 생성자가 아닌 메서드를 통해서 하는 것을 말한다. Boolean flag = Boolean.valueOf(true); // 정적 팩터리 메서드를 통한 생성자 생성 정적 펙터리 메서드는 static 이 선언되어 있어 생성자를 생성하지 않고 객체명으로 메서드를 바로 호출하여 사용 할 수 있다.public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE;} 정적 팩터리 메서드의 장점정적 팩터리 메서드를 고려해야하는 이유는 하기와 같은 여러 장점이 존재하기 때문이다.이름을 가질 수 있다.생..