분류 전체보기

Java/effective java

[Effective Java] Item 10. equals는 일반 규약을 지켜 재정의하라

10. equals()는 일반 규약을 지켜 재정의하라equals 재정의하지 않은 경우equals()를 재정의하지 않을 경우 클래스의 인스턴스는 오직 자기 자신과만 같게 된다.== 연산자와 동일하게 동작하여 객체의 메모리 주소를 비교한다.객체 식별성(identity)을 비교한다.class Food { private final String name; private final int price; public Food(String name, int price) { this.name = name; this.price = price; } }public class Main { public static void main(String[] args..

Java/effective java

[Effective Java] 3장. 모든 객체의 공통 메서드 - 0. 들어가기

0. 도입Object는 객체를 만들 수 있는 구체 클래스지만 기본적으로는 상속해서 사용하도록 설계되었다.Object에서 final이 아닌 메서드(equals, hashcode, toString, clone, finalize)는 모두 재정의를 염두에 두고 설계된 것이다.재정의시 지켜야 하는 일반 규약이 명확히 정의되어 있다.=> 모든 클래스는 이 메서드들을 일반 규약에 맞게 재정의해야한다. 3장에서는 final이 아닌 Object 메서드들을 언제 어떻게 재정의해야 하는지를 다룬다.finalize 메서드는 아이템 8에서 다루었으니 더이상 언급하지 않는다.Comprable.compareTo의 경우 Object의 메서드는 아니지만 성격이 비슷하여 함께 다룬다.

Java/effective java

[Effective Java] Item 9. try-finally보다는 try-with-resources를 사용하라.

try-finally보다는 try-with-resources를 사용하라자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어질 수 있다.상당수가 안전망으로 finalizer를 사용하지만 finalizer는 그리 믿을만 하지 않다. try-finally : 전통적으로 쓰이는 방법코드가 지저분하다.package effectivejava.chapter2.item9.tryfinally; import java.io.*; public class Copy { private static final int BUFFER_SIZE = 8 * 1024; // 코드 9-2 자원이 둘 이상이면 try-finally 방식은 너무 지저분하다! (47쪽) static void copy(..

Java/effective java

[Effective Java] Item 8. finalizer와 cleaner 사용을 피하라.

finalizer와 cleaner 사용을 피하라.Java의 2가지 객체 소멸자객체 소멸자: 객체가 메모리에서 제거될 때 자동으로 호출된다.finalizer기본적으로 쓰지 말아야 한다.예측할 수 없고 상황에 따라 위험할 수 있어 일반적으로 불필요하다.cleanerfinalizer의 대안이다.finalizer보다 덜 위험하지만 예측 불가능하고 느리고 일반적으로 불필요하다. Java의 finalizer와 cleaner는 c++의 파괴자와 다르다.특정 객체와 관련된 자원을 회수C++에서 파괴자 : 프로그래머가 명시적으로 호출한다.Java의 가비지 컬렉터: 가비지 컬렉터가 접근 불가능한 자원을 회수하고 프로그래머는 아무런 작업을 하지 않아도 된다.비메모리 자원을 회수C++에서 파괴자가 수행한다.Java는 try-..

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 멤버(메서드, 필드)는 상속된다고 오버라이드가 되지 않으므로 다형..

mint*
'분류 전체보기' 카테고리의 글 목록