티스토리 뷰

JAVA

객체의 생성과 파괴

김남김 2023. 12. 2. 00:16

 

객체를 만들어야할  떄와 만들지 말아야할 때를 구분하기 위해, 
올바른 객체 생성 방법과 불필요한 생성을 피하는 방법, 
제때 파괴됨을 보장하고 파괴전에 수행해야할 정리 작업을 알아보자. 


1. 생성자 대신 정적 펙터리 메서드를 고려하라.


정적 펙터리 메서드를 통해 값을 할당하게되면 다음과 같은 이점이 있다.  
- 이름을 가질 수 있기에 반환될 객체의 특성을 쉽게 묘사할 수 있다.
- 호출 될 때마다 인스턴스를 새로 생성하지 않아도된다.
- 반환 타입의 하위 객체를 반환할 수 있다. 
- 입력 매개변수마다 매번 다른 클래스의 객체를 반환할 수 있다.
- 정적 패터리 메서드를 작성하는 시점에 반환할 객체의 클래스가 존재하지 않아도된다. 


2. 생성자 매개변수가 많다면 빌더를 고려해라


점층적 생성자 패턴도 있지만 매개변수가 많아질 수록 클라이언트 코드 작성과 읽기가 어렵다.
다른 방법들은 setter을 통해 생성 과정을 가지는데, 이는 객체 완성 전까지 일관성이 무너진 상태가 된다. 
계층적으로 설계된 클래스와 함께 쓰기 좋다. 


3. private 생성자나 열거타입으로 싱글턴임을 보장하라.


 만약 어떠한 객체를 싱글턴으로 만들고 싶다면 생성자를private으로 둠으로써 새로운 인스턴스를 만들지 못하게해라.
혹은 원소가 하나뿐인 열거타입을 통해 구현하면 싱글턴임을 보장할 수 있다.


4. 인스턴스화를 막으려거든 private 생성자를 사용해라.


추상 클래스를 만드는 것으로 인스턴스화를 막을 수 없다. 하위 클래스를 만들어 인스턴스화하면 되기 때문이다.
그렇기때문에, 컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 뿐이니, 생성자를 만들어 private으로 두면 막을 수 있다. 


5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 


클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지않는것이 좋다.
왜냐면 동작이 정적이나 자원이 할당되지않는다면 NPE가 일어날 수도 있기에 위험하다. 
대신에 필요한 자원을 생성자를 통해 넘겨주자. 의존 객체 주입이라하는 이 기법을 통해 클래스의 유연성, 재사용성, 테스트 용이성을 개선할 수 있다. 


6. 불필요한 객체 생성을 피해라.


똑같은 기능의 객체를 매번 생성하기 보다는 객체 하나를 재사용하는 편이 나을 떄가 많다. 
String의 + 연산과 같은 경우에는 새로운 객체를 생성해서 연산하게 되어 쓸모없는 생성이 이뤄진다.
이를 해결하기 위해서는 StringBuilder/ StringBuffer을 통해  해결할 수 있다.
혹은 이미 컬랙션안에서 정의되어 있는 정적변수가 있다면 사용하는 것이 좋다. 
메모리 측면에서도 계속 쓸모 없는 객체를 저장했다가 지우고 하니 좋지않다. 


7. 다 쓴 객체 참조를 해제해라. 


다쓴 객체에 대한 참조를 해제하지 않으면 메모리 누수가 일어날 수 있다. (계속해서 메모리에 쌓이다보면 어떻게될까? 펑) 


8. finalizer와 cleaner 사용을 피하라.


자바는 두가지 객체 소멸자를 제공하는데 그중 finalizer는 에측할 수 없고 상황에 따라 위험할 수 있어 일반적으로 불필요하다.
cleaner는  finalizer보다는 덜 위험하다하지만 여전히 예측할 수 없고 일반적으로 불필요하다. 
꼭 회수해야하는 자원을 다룰 경우에는 try-final 말고 try-with-resources를 사용하자.
코드는 더 짧고 분명해지고 만들어지는 예외정보도 훨씬 유용하다. 이를 통해 정확하고 쉽게 자원을 회수 할 수 있다. 

'JAVA' 카테고리의 다른 글

모든 객체의 공통 메서드  (1) 2023.12.02
자바 습관(올바른 문자열 처리)  (0) 2023.11.29
자바 습관 (기본 프로그래밍)  (0) 2023.11.28
어떻게 협력하는가? (with MVC)  (0) 2023.10.14
Java 코딩 컨벤션  (1) 2023.10.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함