코딩/Java

상수와 enum

상수는 변하지 않는 값. 아래에서 좌항이 변수 우항이 상수

int x = 1;

 

1 = 2; 그래서 이와같은 구문은 있을 수 없다.

 

이와 같이 코드를 짜면 주석이 지워지거나 로직과 멀리 떨어져 있으면 어느 기능을 하는지 알 수 없다. 또한 57, 34, 93의 의미를 모르는 문제도 있다. 코드를 이해해야 하는 사람은 상당한 어려움에 봉착하게 된다.

 

final은 변수의 값이 한번 지정되면 바뀌지 않는 키워드다 즉 상수가 된다.

static는 클래스의 변수 ( 하나의 저장공간을 공유 ) 인스턴스 마다 값이 바뀔 필요가 없기에 static을 사용

이렇게 코드를 짜면 주석설명이 필요 없다. 

 

enum의 배경 :

 

 

 

애플리케이션이 커지는 과정에서 원래는 과일에 관한 상수만 필요했는데 필요에 의해 기업 이름에 대한 상수가 필요해 졌다. 

 

그런데 위와 같이 APPLE라는 "상수"가 2번 선언되어 에러가 발생했다.

 

 

이렇게 앞에 접미사를 붙여 이름이 충돌하는 문제를 해결 가능하다. 코드를 쉽게 이해하는 데도 도움이 된다.

 

인터페이스를 통해 이름의 충돌도 사라졌고 더욱 간결해졌다. 인터페이스에서 선언된 변수는 무조건  public static final이라는 속성을 암시적으로 가지고 있다.

 

여기의 메인에서 if(FRUIT.APPLE == COMPANY){ System.out.println("과일 사과와 회사 사과는 같다"); 를 쳐보자

당연히 false일 것이다. 회사의 APPLE를 1로 바꾸면 true로 될 것이다. 하지만 우리가 생각한 로직과는 상관없이 코드가 실행이 된다. 과일사과와 회사사과는 같을 수 없기 때문이다. 아래 코드를 봐보자

 

이렇게 각각 인스턴스화 시키면 각각 데이터가 다르기 때문에 아까의 if문은 실행이 되었지만 이번엔 에러가 발생한다.

이것이 바로 우리가 원하는 것이다.

런타임 에러에서 발생했던 문제를 컴파일 에러로 끌어왔다. 이것은 아주 중요하다. 런타임 에러는 어디서 에러가 발생했는지 잘 모를 때가 많기 때문이다.

 

 

if문은 필요가 없어 지워버렸다 그 후 에러가 발생했다. 이유는 switch문 때문이다 왜냐 

switch문의 조건으론 몇가지 제한된 데이터 타입만을 지원한다.

byte, short, char, int, enum, String, Character, Byte, Integer

 

즉 switch문을 여기서 사용할 수 없다는 의미이다. 상당히 아쉽다 상수를 사용할 때 switch문이 가독성이 좋기 때문이다.

여기서 enum으로 해결 할 수 있다.

'코딩 > Java' 카테고리의 다른 글

참조와 복제  (0) 2021.01.09
상수와 enum2  (0) 2021.01.09
object 클래스  (0) 2021.01.06
자바 나만의 예외 만들기  (0) 2021.01.06
예외 만들기  (0) 2021.01.05