Java56 Effective Java #07 종료자 사용을 피하라 종료자(finalizer)는 예측 불가능하며, 대체로 위험하고 일반적으로 불필요하다. c++에서 소멸자는 메모리 이외의 자원을 반환하는 데도 사용되는데, 자바에서는 보통 try-finally 블록이 그런 용도로 사용된다.종료자의 한가지 단점은 즉시 실행되리라는 보장이 전혀 없다는 것이다.따라서 긴급한(time-critical) 작업을 종료자 안에서 처리하면 안된다.예를 들면 종료자 안에서 파일을 닫도록 하면 치명적이다. 그 외, 주요정보, 동기화나 입출력 및 자원을 점유하고 반환해야 하는 곳에서 종료자를 사용하여 처리하면 메모리 타이밍이 맞질 않을 것 같다.System.gc나 System.runFinalization 같은 함수에 마음이 흔들리면 곤란하다.이런 함수들은 종료자가 실행될 가능성을 높여주긴 하.. 2016. 4. 13. Effective Java #06 유효기간이 지난 객체 참조는 폐기하라 C나 C++ 처럼 손수 메모리를 관리 해야 하는 언어를 쓰다 가비지 컬렉터가 있는 언어를 사용하게 되면 프로그래밍이 아주 쉬워진다.하지만 필자 생각엔 어떤 언어든 메모리 관리가 제일 중요하다고 생각한다. 자바나 C#에서 가장 큰 고민은 얼마나 효율적으로 코드를 구현할 것인가 인 것 같다.이 이야기는 재사용해야 하는 객체는 재사용하고 폐기하여 반환해야 하는 객체는 반환해야 한다는 것이다.초급 개발자와 중급, 고급 개발자에 차이점도 이 부분에서 나타나는 것 같다. 아래의 간단한 스택(stack) 구현 사례를 보자. 123456789101112131415161718192021222324252627282930// 메모리 누수(memory leak)가 어디서 생기는지 보이는가?public class Stack {.. 2016. 4. 13. Effective Java #05 불필요한 객체는 만들지 말라 기능적으로 동일한 객체는 필요할 때마다 만드는 것보다 재사용하는 편이 낫다.객체를 재사용하는 프로그램은 메모리 관리에 더 용이하다. 절대로 피해야 할 극단적 예를 하나 들어보자. String s = new String("stringette"); 만위 위의 문장이 순환문(loop)나 자주 호출되는 함수 안에 있으면 그 숫자대로 String 객체가 만들어진다.* 가령 필자는 2년차 시절, 야구 기록 웹 API XML 반복문 안에 string 문을 통해 작성한 뒤 속도가 현저하게 떨어지는 증상을 겪은 뒤로 StringBuilder를 사용하기 시작했다. C#이나 자바나 string 문자가 변경되면 새로 객체가 생성된다.String s = "stringette"; 이라면 stringette2가 되면 새로운 객체가.. 2016. 4. 13. Effective Java #04 객체 생성을 막을 때는 private 생성자를 사용하라 생성자를 생략하면 컴파일러는 자동으로 인자없는 public 기본 생성자를 만들어 버린다.사용자는 자동 생성자와 일반 생성자를 구별할 수 있는 방법이 없다.객체를 만들 수 없도록 하려고 클래스를 abstract로 선언해봤자 하위 클래스를 정의하는 순간 객체 생성이 가능해지며상속 받아 사용하는 것이 맞다고 생각 할 수도 있다. 이 경우 기본 생성자는 클래스에 생성자가 없을 때 생성되니, private 생성자를 클래스에 넣어 객체 생성을 방지해야 된다. 123456789//객체를 만들 수 없는 유틸리티 클래스public class UtilityClass{ //기본 생성자가 자동 생성되지 못하도록 하여 객체 생성 방지 private UtilityClass(){ throw new AssertionError(); .. 2016. 4. 13. 이전 1 ··· 10 11 12 13 14 다음