이 글을 쓰게 된 이유는 Java 에서 Exception 에 대해서 알아보는 과정에서
This 로 "초기화 되지 않음" 상태를 표현할 수 있다는 점을 알게 되어서 이를 정리하려고 합니다
초기화 되지 않음을 표현하는 방법
1. 기본 값
기본 값을 초기화되지 않았다는 표현을 할 방법으로는 한가지 밖에 존재하지 않습니다
Magic Number를 사용하는 방법인데요
int 값이라면 Integer.MAX_VALUE 같은 평범한 케이스에서 생길 수 없는 값을 미리 넣어놓고, 안 들어올 것 같으니까 초기화 안 된거다는 것으로 예외 처리를 하는 방법이 있습니다
당연하지만, 이것은 절대로 들어오지 않는다는 보장이 있어야 합니다
int 값이라면 이런 방식으로 설정이 가능하더라도, boolean 같은 경우가 된다면 더욱 까다로워지는데요
false 이면 초기화되지 않았다! 라는 내용의 설계를 둔다면, true 만으로 변경 가능해야하기에, 프로그램에서 제한이 생깁니다
그렇기에 기본값을 초기화 되었는지, 아니었는지 판단하는 과정은 정말 힘들고, 좋지 않은 방향일 것 같습니다
2. 객체
객체는 어떨까요? Java의 경우에는 너무 당연하지만, 가장 대표적인 방식으로 null로 표현할 수 있습니다
어떤 객체에 대해서 봤을 때 null 이 들어가 있다면 초기화 되지 않았다 라고 말할 수 있을 것 같습니다
하지만 여기에서도 문제가 있습니다
진짜 null이 될 수 있다면 어떻게 될까요? 물론 이렇게 쓰는 경우는 거의 없겠지만
class Strange{
private Object data;
private int count=0;
public void init(){
count=1;
data=null;
}
public void init(Object data){
count=0;
this.data=data;
}
}
이런 상황에서 봤을 때, 이 데이터는 분명히 명시적으로 초기화 되었습니다
null 로 말이죠
그러면 이 데이터가 초기화 되었다는 것은 어떻게 확인할 수 있을까요?
count==0으로? data!=null로? 모두 애매할 것 같습니다
private boolean isInitialized;
같은 변수를 하나 두는 방식으로도 체크하는 방식도 가능해보입니다
this 로 초기화 해두는 방법
이 방법은 실제 Java 에 Throwable 클래스를 보던 도중에 발견했습니다
이런 방식으로 초기화를 해두는데요 이유에 해당하는 것이 this라면, 초기화 되지 않은 것이다 라는 방식으로 초기화를 검증하기도 하는 부분이 신기해서 이 글을 작성하게 되었습니다
'Java' 카테고리의 다른 글
Java 멀티 쓰레드 아는체하기 (1) | 2023.03.05 |
---|---|
Java Exception 알아보기 (0) | 2023.02.27 |
Java Generic 딥 다이브 (6) | 2023.02.23 |
Generics 시작하기 (6) | 2023.02.23 |
java에서 입출력 어디까지 테스트 해야할까요? (2) | 2023.02.19 |