발단
시작은 바로 페드로가 보낸 슬랙의 메시지였다...
상수화된 인스턴스를 선언할 때 uppercase로 작성하는 것이 맞는 것인가?에 대한 문제였는데,
그동안 나도 인스턴스에 대해서는 uppercase로 적을 생각을 못해봤었는데 생각해보니, 인스턴스라도 상수라면 uppercase가 맞네? 라는 생각이 들었다.
추가로 하나의 질문을 더 던져주었는데,
static final 변수는 항상 상수일까?에 대한 문제였다.
그렇다! 사실 내가 생각하기에 처음 문제는, 상수화된 인스턴스를 선언할 때 uppercase로 작성하는 것이 맞는 것인가가 아닌,
상수화된 인스턴스가 정말 상수로 볼 수 있는 것인가의 관점으로 봐야한다.
자 여기서 한번 생각해보자.
우리가 생각해볼 수 있는 것은 2가지이다.
- static final은 항상 상수일까?
- scanner는 상수일까?
자바에서의 상수란
상수란 변하지 않고 고정된 값을 담는 변수를 의미한다.
Google Style Guide에 따르면 자바에서의 상수는 UPPER_SNAKE_CASE로 표기한다.
상수는 자바에서 static final 키워드를 통해 선언이 가능하다.
즉, "상수는 static final이다" 라는 말은 맞는 것이라고 볼 수 있다.
그렇다면, static final 변수는 항상 상수일까?
아래와 같은 코드가 있다고 가정하자.
private static final Scanner SCANNER = new Scanner(); // 상수라면
private static final Scanner scanner = new Scanner(); // 상수가 아니라면
위에서 Scanner 변수는 static final 키워드로 선언이 되어있다.
이런 경우 Scanner는 상수일까?
항상 상수인 것은 아니다.
Google Style Guide를 다시 한번 봐보자.
해당 문서에 따르면 인스턴스의 상태가 변경될 수 있다면 해당 변수는 상수가 아니다.
static final이라는 키워드로 사용을 했다고 즉, 객체를 절대 변경하지 않겠다는 의도만으로는 충분하지 않다. 반드시 상태 또한 변경 되어서는 안된다.
Scanner는?
Scanner는 입력 스트림에서 데이터를 읽어와 처리하는 역할을 수행하므로, 내부 상태를 가변적으로 유지해야 한다.
즉, Scanner는 가변 객체이다.
고로 Scanner에 대한 static final 인스턴스는 상수가 될 수 없는 것이다.
'우아한테크코스 6기 > 1단계' 카테고리의 다른 글
[자동차 경주 미션] 학습 내용 정리 (1) | 2024.03.25 |
---|---|
일급 컬렉션 (1) | 2024.03.25 |
[자동차 경주 미션] 개인 회고 (0) | 2024.03.25 |
List의 copyof()와 of() (0) | 2024.03.14 |
Junit5, AssertJ 새롭게 알게 된 내용들 (0) | 2024.02.15 |