-
객체의 final 변수개발/자바 2020. 3. 10. 14:56
public class Final { final int ONE = 1; final int TWO = 2; final int THREE = 3; }
public class Main { public static void main(String[] args) { Final f = new Final(); int menu = 3; switch(menu) { case f.ONE: break; case f.TWO: break; case f.THREE: break; } } }
메인함수의 case 부분이 전부 오류난다. 오류 메시지는 "case expressions must be constant expressions"다. constant의 사전적인 의미는 '변함 없는'이며 변수에 대응하는 의미기도 하다. 여기에서의 constant expression은 컴파일 타임에 평가되는 표현식을 말한다. case문에 올 수 있는 것은 컴파일 시간에 값이 결정되는 상수, 문자열, 문자 등이다.
객체 생성은 컴파일 시간에 일어나지 않는다. 소스 코드 상에서는 최소한의 문법 검사만 하는 것이며 실제 실행은 말 그대로 실행 시간(런타임)에 이뤄진다. 때문에 객체를 통해서 접근하는 필드나 함수 등 역시 실행 시간에 속한다. case 문에 올 수 있는 것은 컴파일 시간에 이미 결정되어야 하는 값이기 때문에 위의 코드가 오류를 일으키는 것이다. final 정수형 변수를 클래스에 모아서 관리하고 싶다면 static 키워드를 이용해 final 변수를 정적으로 만들면 된다.
public class Final { static final int ONE = 1; static final int TWO = 2; static final int THREE = 3; }
public class Main { public static void main(String[] args) { int menu = 1; switch(menu) { case Final.ONE: break; case Final.TWO: break; case Final.THREE: break; } } }
'개발 > 자바' 카테고리의 다른 글
추상 클래스는 무엇 (0) 2020.03.19 참조변수에 대한 작은 오해 (0) 2020.03.16 정렬 순서 바꾸기 (0) 2020.03.12 배열 탐색도 연산이다 (0) 2020.03.11 환경변수의 시스템 path에 jdk/bin을 넣는 이유 (0) 2020.02.20