Java/Effective Java(10)
-
[Effective Java] 아이템 9 : try-finally 보다는 try-with-resources를 사용하라
try-finally InputStream, OutputStream, java.sql.Connection -> 클라이언트가 지나칠 가능성이 있기에 성능에도 문제를 줄 수 있다. 그래서 안전망으로 아이템 8에서 사용한 Finalizer를 사용한다. 또한, 자원이 닫히는 것을 보장하는 try-finally가 존재한다. https://devaily.tistory.com/34 [Effective Java] 아이템 8 : finalizer와 cleaner 사용을 피하라 자바의 객체 소멸자 Finalizer : 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요, 그냥 쓰지 마세요.. 그냥 쓰지 말라고 Cleaner : Finalizer 보다는 덜 위험하지만, 여저힌 위험하고, 불 devaily.tis..
2022.03.31 -
[Effective Java] 아이템 8 : finalizer와 cleaner 사용을 피하라
자바의 객체 소멸자 Finalizer : 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요, 그냥 쓰지 마세요.. 그냥 쓰지 말라고 Cleaner : Finalizer 보다는 덜 위험하지만, 여저힌 위험하고, 불필요하다. C++의 destructor와 Java의 finalizer & cleaner 파괴자는 특정 객체와 관련된 자원을 회수하는 보편적인 방법이고 자바의 소멸자들은 접근할 수 없게 된 객체를 회수하는 역할을 가비지 컬렉터가 담당한다. 자바에서는 try-with-resources와 try-finally를 사용해 해결한다. 왜 Finalizer와 Cleaner의 사용을 자제해야하나? Finalizer와 Cleaner는 즉시 수행된다는 보장이 전혀 없다. 위 두 가지로는 데때 실행되야..
2022.03.30 -
[Effective Java] 아이템 7 : 다 쓴 객체 참조를 해제하라
다 쓴 객체 참조를 해제하라 C같은 메모리를 직접 관리 하는 언어에서 자바와 같이 Garbage Collector를 가진 언어를 사용하면 편리성은 증대해진다. Garbage Collecotor가 사용한 객체를 회수하기 때문이다. 그렇다고 메모리 관리에 주의를 기울이지 않으면 안된다. 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 e) { ensureCapacity()..
2022.03.16 -
[Effective Java] 아이템 6 : 불필요한 객체 생성을 피하라
재사용성 같은 기능의 객체를 매번 생성하는 것 보다는 객체 하나를 재사용하는 것이 더 좋다. 재사용을 하면 반응 속도가 더 빠르고 코드도 세련되어 보인다. 특히 불변 객체는 언제든 재사용할 수 있다. String s = new String("bikini"); 이런 코드는 사용하지 않아야 하는 극단적인 예이다. 왜냐? 코드가 실행 될 때마다 String 인스턴스를 계속 생성해낸다. 만약 이 코드가 반복문이나 자주 호출되는 메소드 안에 존재한다면 실행시 쓸데없는 생성만 계속 될 것이다. 어떻게 사용해야 하나? String s = "bikini"; 이렇게 매번 new 생성자로 새로 생성되는 것이 아니라. 딱 하나의 인스턴스만 사용하게 사용하자. 이와 같이 인스턴스를 사용하면 같은 객체를 재사용할 수 있게 보장..
2022.03.16 -
[Effective Java] 아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
클래스가 하나 이상의 자원에 의존한다면 싱글턴 패턴이나 정적 유틸리티 클래스에서는 사용을 하지 않은 것이 좋다. 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} //아이템 4 - 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } 싱글턴을 잘못 사용한 예 public class SpellChe..
2022.03.15 -
[Effective Java] 아이템 4 : 인스턴스화를 막으려거든 Private 생성자를 사용해라
정적 메소드와 필드만 담는 클래스 곱게 보지 않지만 쓰인새는 존재하는 클래스들 -> Java.lang.Math, Java.util.Array & Collections Final 크래스와 관련한 메소드를 모아 놓을때도 사용 -> 하위 클래스에 넣는건 불가 예시로 라이브러리 Array의 코드 일부를 가져왔다. public class Arrays { /** * This class is non-instantiable. */ private Arrays() { } 생성자를 명시하지 않으면 컴파일러가 생성자를 자동으로 생성 Public 생성자가 만들어진다. -> 사용자는 자동 생성이 되었는지 구분 불가 공개 API도 의도치 않게 인스턴스 될 수도 있다. 추상 클래스로 해도 상속시 무용지물이다. Private 생성자를..
2022.03.14