Tip40. 자신이 시작한 것은 자신이 끝내라
Tip41. 지역적으로 행동하라
"자신이 시작한 것은 자신이 끝내라" 팁이 가르쳐 주는 것은 이상적으로 말해서 리소스를 할당하는 루틴이 해제 역시 책임져야 한다는 것이다
public long readCustomer(File file){
try(Scanner sc = new Scanner(file)){
return sc.nextLong();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
try-with-resource 를 사용해서 리소스를 할당한 곳에서 해제하는 것이 좋다.
중첩할당
코드의 여러곳에서 동일한 구성의 리소스들을 할당하는 경우에는 언제나 같은 순서로 할당해야 교착 deadlock 가능성을 줄일 수 있다.
A 트랜잭션
리소스A 접근 -> 리소스 B 접근
B 트랜잭선
리소스 B 접근 -> 리소스 A 접근 (X) - 트랜잭션 A 와 데드락 발생 가능성 있음.
리소스 A 접근 -> 리소스 B 접근 (o)
객체와 예외
객체 지향 클래스의 생성자와 소멸자.
리소스를 클래스 안에 캡슐화하는 것이 유용할 수 있다. 특정 유형의 리소스가 필요할 때마다 그 클래스의 객체를 생성하면 된다. 그 객체가 스코프를 벗어나거나 가비지 컬렉터가 객체를 수거해 가면 객체의 소멸자가 클래스 안에 들어 있는 리소스를 해제한다.
자바에서는 C와 다르게 자원을 Garbage Collector 를 통해 객체를 Heap memory 에서 자동으로 자원할당해제 한다. 그래서 자원을 임의의 클래스로 wrapping 했을 때 해당 자원을 해제하려면 Finalizer 를 써볼 수 있다. Finalizer 란 Garbage Collector 에 의해서 객체가 힙 메모리에서 제거되기 전에 객체의 Object.finalize() 메서드를 호출한다. wrapping 객체에서 finalize 메서드를 오버라이드해서 관리하는 자원을 해제할 수 있다.
연습문제
- C와 C++ 에서는 포인터를 사용하고 메모리 할당해제까지 한다음에 null로 할당하도록 하는데 이 포인터에 다른 자원을 할당해서 다른 곳에서 모르고 사용할 수도 있기 때문에 예방 차원에서 null 을 할당한다.
- Java 에서는 null 을 할당하면 이전 변수에 할당되었던 객체는 garbage collector를 통해 정리된다. 하지마 실무에선 대부분 객체를 bean 으로 관리하거나 지역변수로 사용하고 있어서 할 필요가 없어보인다.
'공부노트 > 개발서적' 카테고리의 다른 글
[실용주의 프로그래머] 5장. 구부러지거나 부러지거나 (2) | 2023.08.02 |
---|---|
[실용주의 프로그래머] Topic 27. 헤드라이트를 앞서가지 말라 (0) | 2023.08.02 |