Java

Java/effective java

[Effective Java] Item 7. 다 쓴 객체의 참조를 해제하라.

7. 다 쓴 객체의 참조를 해제하라OutOfMemoryError 발생 코드package effectivejava.chapter2.item7; import java.util.*; // 코드 7-1 메모리 누수가 일어나는 위치는 어디인가? (36쪽) public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object ..

Java/effective java

[Effective Java] Item 6. 불필요한 객체 생성을 피하라.

불필요한 객체 생성을 피하라.똑같은 기능의 객체를 매번 사용하는 것보다 객체 하나를 재사용하는 편이 나을 때가 많다.재사용은 빠르고 세련된다.불변 객체는 언제든 재사용 가능하다.String s1 = new String("hi"); // 따라하지 말 것!String s2 = "kim";여기서 s1 문장을 실행할때마다 매번 String 인스턴스를 새로 만든다.s2 문장은 하나의 String 인스턴스를 사용하여 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다.정적 팩터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다.생성자는 호출할 때마다 새로운 객체를 만들지만, 팩토리 메서드는 그렇지 않아도 된다. public final class Boolean..

Java/effective java

[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입(DI)을 사용하라.

5. 자원을 직접 명시하지 말고 의존 객체 주입(DI)을 사용하라.정적 클래스로 구현한 경우public class SpellChecker { private static final Lexicon dictionary = ...; // 자원 private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... }} 싱글톤으로 구현한 경우public class SpellChecker { private final Lexicon dictionary = ...; // 자원 private SpellChecker..

Java/effective java

[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라.

4. 인스턴스화를 막으려거든 private 생성자를 사용하라정적 메서드와 정적 필드만을 담은 클래스객체 지향을 위반하기 쉽다.캡슐화를 위반한다.상태를 가지지 않고, 객체의 데이터를 파라미터로 받아 처리한다.데이터와 행위가 분리된다.public class OrderProcessor { public static void processOrder(Order order, Stock stock) { if (stock.getRemaining() >= order.getAmount()) { stock.subtract(order.getAmount()); } }}상속, 다형성을 지킬 수 없다.static 멤버(메서드, 필드)는 상속된다고 오버라이드가 되지 않으므로 다형..

Java/effective java

[Effective Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보장하라.

3. private 생성자나 열거 타입으로 싱글턴임을 보장하라.싱글턴인스턴스를 오직 하나만 생성할 수 있는 클래스ex ) 함수와 같은 무상태 객체, 설계상 유일해야하는 시스템 컴포넌트클래스를 싱글턴으로 만들면 클라이언트를 테스트하기 어렵다.싱글턴 인스턴스는 private 생성자를 가지므로 새로 생성하여 테스트할 수 없기 때문이다.실제 싱글턴 인스턴스에 접근하여 테스트할 경우 전역상태이므로 테스트 독립성을 깨뜨린다.인터페이스를 구현해 만든 싱글턴일 경우 테스트가 가능하다.현재는 static에 대해 mocking이 가능하지만 권장하지 않는다. 인터페이스를 통해 의존성을 주입하자. 인터페이스를 구현한 싱글턴// 인터페이스 정의public interface DatabaseConnection { void c..

Java/effective java

[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라.

2. 생성자에 매개변수가 많다면 빌더를 고려하라.정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다.위 상황을 해결하기 위해 점층적 생성자 패턴, 자바빈즈 패턴, 빌더 패턴을 알아보자. 점층적 생성자 패턴// 코드 2-1 점층적 생성자 패턴 - 확장하기 어렵다! (14~15쪽) public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private final int..

Java/effective java

[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라.

Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라.정적 팩토리 메서드클래스의 인스턴스를 반환하는 정적 메서드클라이언트는 클래스의 인스턴스를 public 생성자로 얻는다.생성자와 별도로, 정적 팩터리 메서드를 제공하여 인스턴스를 반환할 수 있다.public class Car { private final String make; private final String model; private final int year; private final String color; private final boolean isElectric; // 생성자 public Car(String make, String model, int year, String color, boolean ..

Java/effective java

[Effective Java] 2장. 객체 생성과 파괴 - 0. 들어가기

Javajava는 단일 상속 방식의 객체 지향 언어이다.java의 메서드 안의 코드는 명령형(문장 지향) 방식으로 동작한다. 효과적인 java 코딩법?코드는 단순히 효과적으로 작동하고 다른 사람이 쉽게 이해할 수 있기만 하면 되는게 아니다.프로그램은 계속 수정할 수 있기 때문에, 구조가 수정하기 쉬워야한다.처음부터 기능 T가 어떻게 개선될지까지 고려해 구현 방식을 선택하는 것이 좋다.잘 작동하고, 다른 이가 쉽게 이해할 수 있고 미래의 수정과 개선 작업도 수월한 코드를 작성하는 것이 좋다.단순함이 쉬움을 뜻하지는 않는다.리팩토링의 핵심 목표는 시스템 구조 개선과 중복 제거이고, 이는 잘 설계된 API를 건너뛰고는 도달할 수 없다. 1장. 들어가기핵심 규칙 : 명료성과 단순성컴포넌트는 사용자를 놀라게 하는..

mint*
'Java' 카테고리의 글 목록 (2 Page)