본문 바로가기

OOP, FP/이펙티브 자바

(6)
이펙티브 자바 06. 종료자 종료자개발자가 메모리에 직접적으로 관여하는 C++와 같은 언어는 생성자와 쌍으로 존재하야하는 소멸자가 있다. C++에서 이와같은 소멸자는 생성된 자원을 반환하는 수단으로 사용된다. 반면에, 쓰레기 수집기가 존재하는 자바와 같은 언어는 객체에 할당된 자원을 수집기가 알아서 반환하므로 개발자가 직접 소멸자를 호출할 필요가 없기에, 소멸자가 존재하지 않는다. 하지만 자바의 최상위 클래스인 Object 클래스에는 finalize라는 종료자 메소드가 정의되어 있다. 이 메소드는 JVM이 메모리 누수(leak) 를 방지하기 위해 실행하는 메소드로, 가비지 컬렉션이 수행될 때 더 이상 사용하지 않는 자원에 대한 정리 작업을 진행하기 위한 종료자 메소드이다. C++ 의 소멸자 1 2 3 4 5 6 7 8 9 10 11..
이펙티브 자바 05. 만기 참조와 메모리 누수 유효기간이 지난 객체 참조 프로그래머가 직접 메모리를 제어해야하는 C와 같은 언어와 달리, 자바는 가비지 컬렉션(Garbage Collection, 이하 GC)으로 메모리를 관리한다. 자바는 개발자가 메모리를 명시적으로 해제하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요 없는 객체를 찾아 지우는 작업을한다. 그래서 결국에는 메모리 관리가 필요하다는 사실을 망각하곤 한다. 본인 또한 GC에 대해 잘 알지 못하며, 메모리를 관리하지 않는 일이 습관이 되어버렸다. 그헣다면 우리가 객체 수집에 직접 관여해야할 상황은 어떤 상황일까? 바로 자체적으로 메모리를 관리하는 코드를 작성할 경우다.코드를 살펴보자. 12345678910111213141516171819202122232425..
이펙티브 자바 04. private 생성자, 불필요한 객체 private 생성자만 존재하는 클래스자바에는 private 기본 생성자와 정적 메소드나 필드만으로 구성된 클래스가 존재한다.이러한 클래스는 생성자를 다른 곳에서 호출할 수 없으므로 하위 클래스를 만들 수 없다. Arrays와 같이 기본 자료형이나 배열에 적용되는 메소드를 제공하는 클래스를 사용해본 적이 있을 것이다.이런 클래스는 객체를 만들어 제공하는 목적이 아닌, 유틸성 기능을 제공하는 목적으로, 정적 메소드나 필드만으로 구성된다.객체를 지향하는 자바에서 객체를 생성할 수 없고 상속, 구성을 활용할 수 없기 때문에 악명이 높다. 하지만, 이런 클래스들도 분명 필요할 때가 있다.Java.lang.Math나 java.util.Arrays처럼 기본 자료형 또는 배열에 적용되는 메소드를 한군데 모아놓을 때 ..
이펙티브 자바 03. private 생성자, enum 자료형, 싱글톤 패턴 싱글턴 패턴싱글턴은 말 그대로 객체를 하나밖에 생성할 수 없는 클래스를 말한다.동기화 문제를 가진 고전적 구현법, 동기화 문제를 해결하는 방법과 속도를 보완하는 방법처럼 보통 세 가지 방법으로 싱글턴 패턴을 구현할 수 있다. 가장 간단하게는 클래스의 static 필드를 이용하여 만든다.하지만 이는, 쓰레드 환경에서 동기화 문제가 존재하기 때문에 synchronized 키워드를 사용하여 동기화를 시킨다.그러나 동기화는 항상 속도와 관련된 문제가 따라다닌다.싱글턴 패턴의 동기화 과정에서 속도 문제를 해결하기 위해 DCL(Double-Checking Locking) 기법을 사용해서메소드의 동기화되는 부분을 줄일 수 있다. 싱글턴 패턴에 대한 자세한 설명은 헤드퍼스트 디자인 패턴: 5. 싱글턴 패턴 에 등장하므..
이펙티브 자바 02. 점층적 생성자 패턴, 자바빈 패턴, 빌더 패턴 필수적 요소와 선택적 요소클래스의 인스턴스를 생성할 때, 필수적인 요소와 선택적인 요소가 여러개 필요한 경우가 있다.정적 팩토리 메소드나 생성자는 선택적 인자가 많은 상황에 잘 적응하지 못한다는 문제점을 갖고 있다. 마트에서 포장 판매되는 음식을 살 때, 음식에 붙어있는 영양 성분표를 예로 들어보자. 영양 성분표에는 반드시 포함되어야 하는 항목이 몇 가지 되지 않는다.총 제공량(serving size), 1회 제공량(servings per container), 1회 제공량당 칼로리(calories per servings) 등이 필수적인 항목이다.반면에, 선택적인 항목은 적어도 20개가 넘는다.총 지방 함량(total fat), 포화 지방 함량(saturated fat), 트랜스 지방 함량(trans fa..
이펙티브 자바 01. 정적 팩토리 메소드와 서비스 제공자 인터페이스 (JDBC 예제) 객체 생성자바에 처음 입문하면 클래스와 객체에 대해 배운다.이후 실습을 통해 생성자를 정의하고 new 키워드로 생성자를 호출하여 객체를 만들어 사용하는 연습을 하고,시그니처와 오버로딩을 이용해 여러 개의 생성자를 정의하여 제법 객체지향적인 코드를 만든다. 생성자생성자는 객체를 생성하기 위해 기본적으로 제공되는 기능이다.하지만 생성자의 시그니처만을 보고 개발자의 의도를 완전히 파악하기는 어렵다.때문에 우리는 API 문서를 보고, 우리에게 필요한 생성자를 찾아야 한다.정적 팩터리 메소드를 사용하면 메소드 이름, 반환 자료형만으로 의도를 전달할 수 있다. 정적 팩토리 메소드클래스 자신의 타입을 반환하는 public static 메소드.클래스를 정의할 때 생성자와는 별도로 정적 팩토리 메소드를 제공할 수 있다...