본문 바로가기

자바

(31)
(이펙티브 자바) 아이템 07. 다 쓴 객체 참조를 해제하라 소프트웨어를 공부하다보면 코드에 집중하게 된다. C나 C++ 언어로 개발할 때는 계속해서 메모리 관리로 인해 하드웨어적인 고려를 놓치지 않지만, JAVA는 이런 노력까지 대신 해줌으로써 메모리를 신경쓰지 않고 코드에만 집중하게 된다. 그 이유는 모두 알겠지만 가비지 컬렉션 (gc) 때문이다. 그러나 gc가 모든 걸 해결해주지 않는데! 이 문제는 JVM의 메모리구조인 메소드 영역(클래스 영역이라고도 하는 듯?), 스택 영역, 힙 영역 중 힙 영역에서 발생한다. ※ 가비지 컬렉션 알고리즘 모든 작동 중인 코드에서 더 이상 참조하지 않는 메모리를 찾은 후 메모리를 찾은 후 메모리를 할 때 이용할 수 있도록 반환하다는 공통의 목적이 있다. - 전통적인 gc : mark-and-sweep 방식 실행 중인 코드에서..
(이펙티브 자바) 아이템 06. 불필요한 객체 생성을 피하라 들어가며 초기 프로그래밍이 태동하던 시절에는 한적된 자원을 효율적으로 사용하는 것이 중요한 덕목이었다. 따라서 메모리 관리를 잘하는 것이 좋은 프로그래머의 능력이었다. 오늘날에는 컴퓨팅 자원이 과거에 비해 풍족해졌다. 그래서 타이트한 메모리 관리보다 조금 더 자원을 낭비하더라도 이해가 쉬운 코드, 재사용성이 높은 코드가 더 가치 있다. 이렇게 시대가 요구하는 자질이 변했다고 하더라도 불필요한 객체 생성을 통해 애플리케이션 전반의 속도 저하나 지속가능성을 해치는 코드는 앞으로도 계속 지양될 것이다. 책에서 예시로 드는 세 가지 샘플 코드를 통해 어떤 경우에 불필요한 객체가 생성되는지 확인해보자. 쉽게 실수할 수 있는 불필요한 객체 생성 코드 1. String 객체는 객체인데 왜 new 키워드로 선언하지 않..
(이펙티브 자바) 아이템 08. finalizer와 cleaner 사용을 피하라 이번 아이템은 제목에서 유추할 수 있듯이 finalizer와 cleaner의 사용을 피하는 것을 말하고 있다. 피해야 되는 이유에 대해서 크게 CS, 성능, 보안 측면으로 소개하고 있다. 또한, 아래와 같이 자바 9 이후 finalize 메서드는 deprecated 되었음을 볼 수 있다. 그리고 마지막으로 언제 사용해야 하는지에 대한 구체적인 정보를 알려준다. 단점 1. Finalizer는 실행이 아예 안될 수 도 있고 실행이 된다 해도 인스턴스 반납의 지연을 일으킬 수 있다. 아래는 Object 클래스에서 재정의한 finalize 메서드와 hello클래스를 예시로 들었다. /** * Project : FourTeamEffectiveJavaStudy * * @author : jwdeveloper * @c..
(이펙티브 자바) 아이템 02. 생성자에 매개변수가 많다면 빌더를 고려하라 선택적 매개변수가 많을 때 개발자들이 사용하는 방법 3 1. 점층적 생성자 패턴 생성자 형태를 모든 경우의 수로 만드는 방법 단점 : 매개변수가 많아질수록 클라이어느 코드를 작성하거나 읽기 어렵다 매개변수 세기도 어렵고... 버그가 발생하면 찾기가 어렵다 public class Burger { private final boolean olive; private final boolean pickled; private final int patty; private final int egg; private final int cheese; private final int tomato; private final int bacon; public Burger (boolean olive, boolean pickled){ ..
(이펙티브 자바) 아이템 03. private 생성자나 열거타입으로 싱글턴임을 보증하라 들어가며... '싱글턴'이란 단어는 개발하면서 심심치 않게 듣는다. 아마 디자인 패턴 중에서 가장 먼저 접하는 패턴이지 않을까 싶다. 그래서 이번 포스팅에서는 먼저 '이펙티브 자바에서의 싱글턴'을 살펴보면서 본 포스팅의 주목적을 달성할 것이다. 다음으로는 GoF 디자인 패턴에서의 싱글턴을 통해 Lazy Initialization과 Double Checked Locking 방법을 통해 싱글턴을 바라보는 방법을 터득하고, 마지막으로 Spring Framework에서의 싱글턴을 정리하면서 프레임워크에서는 싱글턴을 어떻게 활용하는지 살펴볼 예정이다. 요약 :: a. 이펙티브 자바에서의 싱글턴 b. GoF 디자인 패턴에서의 싱글턴 c. Spring Framework에서의 싱글턴 순서로 진행한다. 이펙티브 자바에서..
(이펙티브 자바) 아이템 04. 인스턴스화를 막으려거든 private 생성자를 사용하라 단순히 정적 메서드와 정적 필드만을 담은 클래스는 언제 사용하는 것일까? 우리가 직접 이러한 방식의 클래스를 만들지는 않더라도 우리가 모르는 사이에 이미 사용하고 있었다. 우리 대부분이 SpringFrameWork를 사용하고 있다고 가정한다면 빈을 생성할때 우리도 모르는 사이에 해당 클래스를 참조하고 있었다. BeanUtils라는 클래스가 바로 그것이다. 해당 클래스의 내부는 전부다 static으로 감싸져있음을 볼 수 있다. 물론 해당 클래스는 인스턴스화를 방지하는 것이 목적이 아니기 때문에 책에서 처럼 생성자에 명시적으로 private을 사용하지는 않았다. 추상클래스로 만들어서 인스턴스화를 방지한것 처럼 보이지만 하위 클래스에서 해당 클래스를 구현하면 그만인 것이다. 해당 클래스에 대한 인스턴스화를 방..
(이펙티브 자바) 아이템 01. 생성자 대신 정적 팩터리 메서드를 고려하라. 보통 클래스의 인스턴스는 public 생성자를 활용하여 생성한다. 그런데 클래스 자체는 생성자와 별도로 아래와 같은 정적 팩토리 메소드를 제공할 수 있다. public static int testMethod() { return 0; } 위에서 설명한 바와 같이 클래스에서는 클라이언트에게 public 생성자를 제공해주지만 이 뿐만 아니라 정적 팩토리 메소드도 제공해줄 수 있다. //public 생성자 public class MyBook { public MyBook() {} } //static factory method public class MyBook { private MyBook() {} public static MyBook getInstance() { return new MyBook(); } } 그럼..