상수(constant)란?
값을 한 번 저장하면 변경할 수 없는 저장 공간
상수는 변수와 마찬가지로 어떠한 값을 저장할 수 있는 공간이다.
그러나 변수와는 달리 한 번 값을 저장한 이후에는 그 값을 변경할 수 없다.
상수를 선언하는 방법은 기본적으로 변수와 동일하지만, 변수와 다른 두 가지 규칙이 있다.
1. 상수를 선언할 때는 타입 앞에 'final'이라는 키워드를 붙여야 한다.
2. 상수는 반드시 선언과 초기화를 동시에 진행해야 한다.
참고: JDK1.6부터 변수와 마찬가지로 상수의 선언과 초기화를 따로 할 수 있으며, 사용하기 전에만 초기화하면 되도록 바뀌었다. 그래도 상수는 선언과 초기화를 동시에 하는 것이 더 바람직하다.
또한 변수와 마찬가지로 위의 두 가지 규칙 이외에도 개발자 간의 암묵적인 약속이 있다.
1. 상수의 이름은 모두 영대문자로 작성해야 한다.
2. 단어의 구분을 위해 띄어쓰기가 필요할 때는 '_'(언더바)를 사용한다.
사용 예시)
final int MAX_VALUE = 9999;
MAX_VALUE = 99999; // 에러
리터럴(literal)이란?
그 자체로 값을 의미하는 것
원래 상수의 정의는 '수식에서 변하지 않는 값'이므로, 리터럴이 기존의 상수와 더 가까운 개념이다.
하지만 프로그래밍에서는 상수를 '변경할 수 없는 저장 공간'으로 정의했기 때문에 다른 용어를 사용한 것뿐이다.
문자 리터럴과 문자열 리터럴
문자는 이전 포스트에서 설명했듯이 하나의 문자만 저장할 수 있는 기본형 타입이다.
문자열은 문자가 연속해서 나열된 것을 의미하며, 문자열 타입 변수를 사용하려면 String이라는 클래스를 사용하면 된다.
String name = "Java";
위와 같이 하나의 문자만 저장할 수 있던 char 타입과 달리, 한 번에 여러 문자를 연속해서 저장할 수 있다.
참고: 문자열은 클래스, 즉 참조형 변수이지만 굉장히 빈번하게 사용되므로 Java에서 기본형과 비슷하게 사용할 수 있도록 도와준다.
문자 리터럴은 ' '(작은따옴표) 안에 넣어야 하고, 반드시 하나의 문자가 들어가야 한다.
문자열 리터럴은 " "(큰따옴표) 안에 넣어야 하고, 문자의 개수는 제한이 없다.
다시 말해 문자의 길이는 반드시 1이어야 하지만, 문자열의 길이는 0 ~ n까지 모두 허용한다.
String str1 = ""; // 길이 = 0
String str2 = " "; // 공백
String str3 = "abc";
// 문자열은 위와 같이 초기화해도 문제가 없지만,
char ch1 = '';
char ch2 = ' ';
char ch3 = 'abc';
// 문자는 ch2를 제외하고 전부 에러가 발생한다
참고: Java에서는 문자열에 포함된 문자의 개수를 '문자의 길이'라고 부른다.
리터럴의 접미사
리터럴의 접미사는 딱 두 가지만 알고 있으면 된다.
- 실수형 타입 float의 접미사 f
- 정수형 타입 long의 접미사 L
두 접미사 모두 대소문자를 구분하지 않으나, long의 접미사는 숫자 '1'과 소문자 'l'이 헷갈리기 쉬우므로 대문자인 'L'을 사용하는 것이 권장된다.
사용 예시)
float f = 3.14f;
long l = 100L;
참고1: 실수형 타입 double에도 접미사 d가 있으나, 기본 타입이므로 생략 가능하다.
참고2: Java에서 int 타입의 리터럴을 long 타입으로 자동으로 변환해주기 때문에 long 타입의 접미사 L도 생략이 가능하다.
하지만 L은 되도록 사용하는 것이 좋다. 왜냐하면 리터럴의 값이 int의 범위를 벗어나서 에러가 발생할 수 있고, 리터럴 연산을 하다가
오버플로우가 발생해 의도하지 않은 값이 저장될 수 있기 때문이다.
// Integer.MAX_VALUE : int 범위의 최댓값 상수
long num = Integer.MAX_VALUE + 1; // 오버플로우로 인해 int의 최솟값이 된다
num = Integer.MAX_VALUE + 1L; // long으로 정상적으로 연산되어, int의 최댓값 + 1이 된다
오버플로우에 관한 내용은 변수의 타입의 정수형 타입 파트에서 확인할 수 있다.
변수의 타입
변수의 타입(type)이란? 변수의 선언과 초기화에서 설명했듯이 변수의 타입은 변수에 '어떤 종류의 값을 저장할 것인지' 컴파일러에게 알려주는 것이며, 컴파일러는 타입을 보고 값을 저장할 공
doshiwa-dev.tistory.com
상수가 필요한 이유
상수를 사용하면 리터럴에 명확한 의미를 부여할 수 있고, 이를 통해 코드의 가독성을 높일 수 있다.
뿐만 아니라 코드의 재사용성을 높여서 코드를 쉽게 변경할 수 있게 해 준다.
int rectangleArea = 20 * 10; // 사각형의 넓이
int rectangleRound = (20 + 10) * 2; // 사각형의 둘레
예를 들어 위와 같은 코드가 있을 때, 변수의 이름을 통해 사각형의 넓이와 둘레를 구하는 코드라는 사실은 알 수 있다.
하지만 이 코드를 작성한 개발자가 아니라면, 각 리터럴이 어떤 값을 의미하는지는 알 수 없다.
참고: 리터럴을 직접 대입하여 보는 사람으로 하여금 그 의미를 알기 힘든 값들을 프로그래밍에서는 '매직 넘버'라고 부른다.
final int WIDTH = 20;
final int HEIGHT = 10;
int rectangleArea = WIDTH * HEIGHT;
int rectangleRound = (WIDTH * HEIGHT) * 2;
위와 같이 리터럴을 직접 대입하는 대신, 상수를 활용하면 보다 명확하게 코드의 의미를 전달할 수 있다.
그리고 수치를 변경해야 하더라도 상수에 저장한 리터럴만 수정하면 되기 때문에 보다 쉽게 코드를 변경할 수 있다.
(이전 코드는 리터럴을 총 4번 수정해야 하지만, 상수를 사용하면 총 2번만 수정하면 된다. 코드가 길어질수록 효과를 크게 볼 수 있다)
'Language > Java' 카테고리의 다른 글
연산자의 종류 (0) | 2023.11.08 |
---|---|
연산자의 기본 개념 (0) | 2023.11.07 |
기본형 타입의 형 변환 (0) | 2023.11.06 |
변수의 타입 (0) | 2023.11.02 |
변수의 선언과 초기화 (0) | 2023.10.31 |