본문 바로가기

프로그래밍/JAVA

(10)
[JAVA] Effective Java - 7. 다 쓴 객체 참조를 해제하라 Java는 C, C++ 처럼 메모리를 직접 관리(malloc(), free(), new, delete) 하는 것이 아닌 Garbage Collector가 존재해 메모리를 자동으로 관리 해주므로 프로그래머가 직접 메모리의 할당과 해제를 할 필요가 줄어들었다. Garbage Collector 참조) https://tgio.tistory.com/36?category=776542 [JAVA] JVM 구조와 동작 2 (Runtime Data Area, Garbage Collector) Runtime Data Area JVM의 메모리 영역으로 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack 5개의 영역으로 나뉜다. Method Area..
[JAVA] Effective Java - 6. 불필요한 객체 생성을 피하라. 똑같은 기능의 객체를 매번 생성하기 보다는 재사용하는 것이 좋다. 예로 불변객체인 String 객체는 int i = 0; while(i < Integer.MAX_VALUE) { // String a = new String("a"); // 평균 0.05초 String a = "a"; // 평균 0.002초 i++; } new 생성자로 매번 생성시 쓸데없는 String 인스턴스가 수백만개 생겨난다. 하지만 String 리터럴 사용시 String Contants Pool에 저장되어 재사용되어지므로 생성 되지않는다. 속도 면에서도 차이가 나는걸 볼 수 있다. 또 다른 예로는 Boolean(String) 생성자(자바 9 이상 deprecated) 와 Boolean.valueOf(String)가 있다. 마찬가지로 ..
[JAVA] Effective Java - 5. 자원을 직접 명시하지 말고 의존 객체 주입 사용 보통 클래스는 하나 이상의 자원에 의존한다. 예시가 생각나지 않아 책에 나온 예시를 참조 하였다. 맞춤법 검사기는 사전에 의존하게 되는데, 이런 클래스들을 유틸리티 클래스 또는 싱글턴으로 구현한 모습을 드물지않게 볼 수 있다. // 정적 유틸리티 class SpellChecker { private final Lexicon dictionary = new KoreanLexicon(); private SpellChecker() {} public static boolean isValid(String word) { //.. } } // 싱글턴 class SpellChecker { private final Lexicon dictionary = new KoreanLexicon(); private SpellChecke..
[JAVA] Effective Java - 4. 인스턴스화를 막으려면 private 생성자를 사용 정적 멤버로만 이루어진 클래스 1. 유틸리티 성 클래스 ex) java.lang.Math, java.util.Arrays 2. 특정 인터페이스를 구현하는 객체를 생성해주는 클래스 ex) java.util.Collections 3. final 클래스와 관련된 메서드들을 모아놓을 때 여기선 final 클래스란 상속이 불가한 클래스 final class Service { } 이런 유틸리티 클래스는 대개 인스턴스화 하지않는다. 그렇다고 생성자를 명시하지않으면 컴파일러가 자동으로 public 기본 생성자를 만들어준다. -> 원하는 방향이 아님 그때, private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. class Service { private Service() { throw new Asserti..
[JAVA] Effective Java - 3. private 생성자나 열거 타입으로 싱글턴 보증 싱글턴이란? 인스턴스를 하나만 생성할 수 있는 클래스를 말한다. 상태를 가지지않는 객체나 설계상 유일한 시스템 컴포넌트에 적합하다. 싱글턴을 만드는 방법은 3가지 이다 1. 유일한 인스턴스에 접근 가능한 public static final public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } public void print() { System.out.println("Elvis"); } } public static final 필드인 Elvis.INSTANCE를 초기화 할 때 생성자가 한번만 호출된다. public 이나 protected 생성자가 없으므로 Elvis의 클래스가 초기화할 때 만들어진 인..
[JAVA] Effective Java - 2. 점층적 생성자, 자바 빈즈, 빌더 패턴 매개변수가 많다면 빌더를 고려하라 매개변수의 수가 많으면 기존 정적 팩터리 메서드와 생성자 모두 대응이 어려움. 이때, 기존 대응 방법과 한계를 먼저 설명. 1. 점층적 생성자 패턴 class Order { private String first; // 필수 private String second; // 필수 private String third; // 선택 private String fourth; // 선택 public Order() { } public Order(String first, String second) { this(first, second, null, null); } public Order(String first, String second, String third) { this(first, ..
[JAVA] Effective Java - 1. 정적 팩터리 메서드 public 생성자 보단 정적 메서드로 제공하는 것이 유리하다. 장점 1. 이름을 가질 수 있다. SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); 여기서 빈 SecurityContext 객체를 생성한다는 것을 직관적으로 알 수 있다. 반환될 객체의 특성을 쉽게 묘사 가능 장점 2. 호출 될 때 마다 새로운 객체생성을 하지 않아도 된다. class ColorCollect { private static final Map colorMap = new HashMap(); public static Color getColor(String colorName) { Color color = colorMap.get(colorName)..
[JAVA] JVM 구조와 동작 2 (Runtime Data Area, Garbage Collector) Runtime Data Area JVM의 메모리 영역으로 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack 5개의 영역으로 나뉜다. Method Area 클래스의 이름, 타입, 멤버변수, 접근제어자, 메소드 이름, 파라미터 타입, 리턴타입 등 클래스 레벨의 정보들이 저장된다. 이 영역에는 Runtime Constant Pool이라는 별도의 관리 영역이 존재하는데, 이 공간은 상수 자료형을 저장해 참조하고 중복을 막는 역할을 한다. -> 모든 Thread가 공유하는 영역 Stack Area 런타임 중 Method 호출시 각 생성되어 사용되는 영역, 지역변수, 파라미터, 리턴값 등의 정보가 저장된다. Method 종료시 해당 St..