Language/Java Plus (26) 썸네일형 리스트형 Effective JAVA - Item9 : try-finally 보다는 try-with-resources를 사용하라. 기본적으로 자바에서는 close 메서드를 통해 작업 완료시 닫아줘야하는 클래스 인스턴스들이 존재한다. 그 예로는 InputStream, OutputStream, java.sql.Connection 등이 있다. 파일처리, 네트워크 연결(socket 등), 데이터베이스 Connection Pool 자원이 제대로 닫힘을 보장하자! - 개발자가 close 메서드를 놓치는 경우가 존재한다. - 안전망으로 finalizer 가 있지만 믿을만하지 않다. 1. 전통적인 방법 try-finally // 자원이 하나인 경우 String path = "/"; BufferedReader br = new BufferedReader(new FileReader(path)); try{ String result = br.readLin.. Effective JAVA - Item8 : finalizer와 cleaner 사용을 피하라 결론 : 자바에서는 객체 회수는 가비지 컬렉터가 담당하고 비메모리 자원 회수는 try-with-recourses가 담당하므로 여러가지 문제점이 있는 finalizer와 cleaner를 굳이 사용해 객체 회수나 비메모리 자원회수를 수행할 필요가 없다. 자바에는 두가지 객체 소멸자가 존재한다 - finalizer, cleaner 1. finalizer - 예측할 수 없고 상황에 따라 위험하다. - 오작동, 낮은 성능, 이식성 문제의 원인 - 모든 클래스는 Object 클래스를 상속받고 Object 클래스가 해당 finalizer 메서드 소유 - 별도의 스레드 풀을 가지고 동작 - 이미 Deprecated 됨. - 참조 해제 후(null 처리) System.gc() 호출시 자동으로 해당 메서드가 호출됨 2. .. Effective JAVA - Item7 : 다 쓴 객체 참조를 해제하라 자바는 기본적으로 C나 C++에 비해 다 쓴 객체에 대한 메모리 공간에 대한 고민이 적다. 이는 자바에는 가비지 컬렉터가 있기 때문에 다 쓴 객체에 대해 알아서 제거를 해주기 때문이다. 하지만 가바지 컬렉터가 찾지 못하는 다 쓴 객체가 존재하고 이는 메모리 누수를 발생시킨다. 메모리 누수 - 메모리에 처리되지 못한 객체가 쌓이게 되고 성능저하의 원인이 된다. - 심한 경우, 디스크 페이징이나 OutOfMemoryError까지 발생하게 된다. 메모리 누수 1 : 스택과 같이 배열에 객체를 담는 경우, 데이터를 담았다 삭제할 때 , 실제 객체가 삭제되지 않음 - 스택이 여전히 다 쓴 객체들을 참조하기 때문이다. - 이는, 내부적으로 객체를 pop 처리하면 삭제하는 것이 아닌 가리키는 인덱스만 변경하는 구조이.. Effective JAVA - Item6 : 불필요한 객체 생성을 피하라. 매번 객체를 생성하는 것보단 미리 만들어놓은 객체를 사용하는 것이 좋다 - 재사용은 빠르고 세련되다 - 불변 객체는 언제든 재사용이 가능하다. 1. 객체를 계속 생성하는 안좋은 예시 String badThing1 = new String("hello world"); String badThing2 = new String("hello world"); System.out.println(System.identityHashCode(badThing1)); System.out.println(System.identityHashCode(badThing2)); 2. 만들어 놓은 객체를 다시 사용하는 예시 - 같은 가상머신내에서는 똑같은 문자열을 사용하는 모든 객체가 같은 객체를 공유한다. String goodThing1 =.. Effective JAVA - Item5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 요약 많은 클래스가 하나 이상의 자원에 의존하는 상황을 고려해보자 예를 들어, 맞춤법을 확인해주는 클래스는 여러가지 단어가 존재하고 언어가 여럿 존재하기에 하나의 인스턴스를 만들어 사용하는 정적 유틸리티 방식이나 싱글턴 방식을 사용하면 해당 경우에서 유연한 사용이 불가능하다. 예를 들어, 하나의 사전 인스턴스를 만들어놓고 이를 활용해 맞춤법을 확인해주는 클래스는 유연하지 못한 것이다. 즉, 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴으로 사용하기에 적합하지 않다. 의존 객체 주입 방식 이러한 경우에는 해당 클래스(맞춤법 클래스)에 대한 인스턴스를 생성할 때, 생성자를 통해 필요한 자원(사전 클래스)를 넘겨주는 방법이 가장 적합하다. public class spellChec.. Effective JAVA - Item4 : 인스턴스화를 막으려거든 private 생성자를 사용하라. 결론 : "자바에서 프로그래밍 중에는 가끔 인스턴스화를 막아놓고 사용하는 클래스들이 필요한데 이러한 경우 private 생성자 만을 생성해서 인스턴스화를 막자" 정적 메서드와 정적 필드만을 담은 클래스 - 객체 지향적인 사고와는 거리가 조금 먼 클래스 1. 정적 메서드를 모아놓고 사용 가능 - java.lang.Math, java.util.Arrays처럼 기본값이나 배열관련 메서드들을 모아놓을 수 있다. - java.util.Collections처럼 특정 인터페이스를 구현하는 객체들을 생성해주는 메서드들을 모아놓을 수 있다. (자바8부터는 이러한 메서드들을 인터페이스 내부에 구현 가능) - final 클래스(상속이 불가능한 클래스)와 관련된 메서드들을 모아놓을 수 있다. (상속이 불가능하기에 모아놓고 이.. Effective JAVA - Item3 : private 생성자나 열거 타입으로 싱클턴임을 보증하라. 결론 : " 싱글턴 사용시 여러가지 방식중 장단점을 고려해 사용을 하되, 열거타입을 가장 추천한다. 하지만 다른 방법들 또한 단점을 보완하는 해결책이 있으니 그 점을 유의해서 사용하자 " 싱글턴 정리 정의 : 인스턴스를 오직 하나만 만들 수 있는 클래스를 의미한다. 예시 : 함수와 같은 무상태 객체, 설계상 유일해야 하는 시스템 컴포넌트(자바에서 빈을 생각) 문제점 : 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워질 수 있다. -> 타입을 인터페이스로 정의하고 그 인터페이스를 구현하여 만든 클래스가 아니라면 싱글턴 인스턴스를 가짜 구현으로 대체하기 어렵기 때문이다. 예를 들어, Spring에서 테스트시 클래스들을 가짜 객체로 만들어 테스팅한다. 하지만 인터페이스로 구현되지 않은 .. Effective JAVA - Item2 : 생성자에 매개변수가 많다면 빌더를 고려하라. 이펙티브 자바 2장. 객체 생성과 파괴 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라. 결론 : "인스턴스를 한번에 생성하기 때문에 유효성 검사도 가능하고 객체의 불변성을 준다면 스레드 안정성을 가져오며 또한 세터 개념을 사용하기에 가독성도 좋다. 따라서 매개변수가 많고 복잡하여 생성자 생성이 복잡하다면 빌더를 고려하자" 점층적 생성자 패턴의 문제 - 점층적 생성자 패턴이란 여러개의 필드 중에 필수필드를 기준으로 설정을 해두고 선택필드에 대해서 점진적으로 늘려 생성자를 만드는 방식이다. - 예를 들어, 총 20개의 필드가 있고 이 중에 필수 필드가 10개라면 나머지 10개의 필드에 대해서 1개를 받는 생성자 10개, 즉, 모든 경우의 수를 고려해 생성자를 만드는 경우이다. - 이는 수많은 생성.. 이전 1 2 3 4 다음