프로그래밍을 하다보면 값이 변하지않는 데이터 공간에 대한 고민을 한번쯤 하게 된다. 그럴 땐 어떻게 해야할까? 그렇다. 변수가 아닌 상수를 활용하는 것이다.
그럼 상수가 무엇이고 언제 필요하며, 어떻게 선언하는 것인지 알아보자.
상수? 리터럴?
상수는 변수와 마찬가지로 ‘값을 저장할 수 있는 공간’ 이지만, 변수와 달리 한번의 값을 저장하면 다른 값으로 변경할 수 없다. 따라서 상수는 반드시 선언과 동시에 초기화해야 하며, 초기화한 이후부터 상수의 값을 변경하는 것이 허용되지 않는다.
리터럴은 대입연산자 기준, 우변에 작성되는 값 그 자체를 말한다. 해당 포스팅에서 상수와 엮어 헷갈릴 수 있겠지만 변수 또는 상수에 할당되는 값 그 자체를 리터럴이라고 이해하면된다.
- 상수
값을 한번만 저장할 수 있는 공간 - 리터럴
값 그 자체를 의미하는 것
상수의 선언 및 초기화
상수를 선언 및 초기화할 때 포인트는 2가지이다.
- final 명시
- 상수명 전부 대문자로 작성
예제 코드는 다음과 같다.
final int FINGER = 10;
앞전에 상수와 리터럴에 대한 예시가 없어, 이해를 돕기위해 덧붙이면 ‘FINGER’ 라는 명칭은 상수라고 일컫고, 상수에 담긴 데이터 ‘10’은 리터럴이라고 일컫는다.
상수가 필요한 이유
프로그래밍에서 상수가 필요한 이유는 크게 3가지이며 내용은 다음과 같다.
1. 의도하지 않은 값 변경에 대한 리스크 해소
개발자들은 코드를 작성하다보면 누구든 예외없이 실수를 하기 마련이다. 때문에 항상 어리둥절한 오류와 함께 코드수정을 하곤한다.
오류는 다양한 형태로 존재한다. 버전 호환 오류, 오타 오류 등등 수많은 오류는 개발자와 동행한다. 그 중 상수에 대한 필요성을 야기시키는 것이 의도치 않은 변수값의 변경이다. 코드량이 적으면 OK. 괜찮다. 적은 코드량에 뭐 얼마나 많은 변수가 활용되고 있겠는가. 원인을 금방 찾아낼 수 있다. 하지만 방대한 코드량이 작성된 프로그램이라면 얘기가 좀 다르다. 단 몇백줄 짜리 코드가 아닌 몇천줄 아니 몇만줄 프로그램인 경우 얼마나 많은 변수가 사용되었겠는가. 이렇게 많은 양의 코드를 소화하다보면 실수는 당연히 발생하고 예상치도 못한, 의도치도 않은 변수에 대한 값 변경이 일어날 수 있다. 이러한 리스크를 해소하기 위해 우리는 코드 작성 시 변수만을 사용하는것이 아니라 값이 최초에 한번 할당되고 값이 바뀔 필요성이 없는 변수를 대신해 상수를 활용하는 것이 바람직하다.
2. 코드수정 용이
우리가 상수를 사용하지않고 리터럴 ‘10’으로 코드를 작성했고, 이 리터럴을 10번 사용했다고 가정해보자. 어느날 우리는 리터럴 ‘10’을 변경하게됬다. 이 때 우리는 어떻게 수정해야하는가? 그렇다면 이번엔 리터럴 ‘10’을 상수에 담아 리터럴 대신 상수를 10번 사용하였다고 가정해보자. 그럼 어떻게 수정해야 하는가? 아래 예제 코드를 살펴보자.
// 리터럴로 100 범위 내 10의 배수 구하기
int ten1 = 10 * 1
int ten2 = 10 * 2
int ten3 = 10 * 3
int ten4 = 10 * 4
int ten5 = 10 * 5
int ten6 = 10 * 6
int ten7 = 10 * 7
int ten8 = 10 * 8
int ten9 = 10 * 9
int ten10 = 10 * 10
// 상수로 100 범위 내에서 10의 배수 구하기
final int NUM = 10;
int num1 = NUM * 1
int num2 = NUM * 2
int num3 = NUM * 3
int num4 = NUM * 4
int num5 = NUM * 5
int num6 = NUM * 6
int num7 = NUM * 7
int num8 = NUM * 8
int num9 = NUM * 9
int num10 = NUM * 10
우리는 위 두 형식의 코드를 2의 배수를 구하는 형식으로 바꿀 것이다. 첫번째 형식을 먼저보자. 리터럴을 활용해 10의 배수를 구한 코드를 2의 배수를 구하는 코드로 변경하려면 리터럴 ‘10’을 10번 변경해야한다. 두번째 형식을 보자. 상수를 활용해 10의 배수를 구한 코드를 2의 배수를 구하는 코드로 변경하기위해 한번의 상수값 변경으로 쉽게 2의 배수를 구하는 코드로 변경할 수 있다. 상수의 활용은 이러한 코드수정을 용이하게한다.
3. 데이터의 용도 식별 용이
방대한 코드량을 기준으로 생각해보자. 만약 수많은 변수와 상수가 사용되었다고하자. 변수의 경우 수많은 값 변경이 일어날 수 있는 반면, 상수는 최초의 값할당 이후 값이 변경되지않기 때문에 우리가 특정 상수가 어떤한 값을 담고 있는지 빠르게 파악할 수 있다. 물론 상수명으로 값을 유추하는 것도 가능하다. 하지만 상수명으로는 값을 유추하기에 한계가 있기때문에 결국 초기화한 코드를 직접 찾아 들여다볼 수 밖에없다.
읽어주셔서 감사합니다. 😊
참고:
자바의 정석 - 남궁성
'JAVA' 카테고리의 다른 글
JAVA / 배열 (0) | 2020.03.31 |
---|---|
JAVA / 캐스팅(형변환)이란? (0) | 2020.03.30 |
JAVA / 데이터 타입 (0) | 2020.03.24 |
JAVA / 변수란 (0) | 2020.03.23 |
JAVA / JDK & JRE & JVM (0) | 2020.03.20 |