개발 언어/Java

상수(constant,final)와 리터럴(literal)

상수(constant)와 리터럴(literal)

한 번쯤은, 또는 자주 들어봤을만한 용어들이다.
하지만 두 용어를 같은 의미로 사용하거나 차이를 모르는 사람들이 많다.
나 역시 명쾌하게 설명하지 못했기에 포스팅 하고자 한다.

아주 간단하게 설명하자면,

상수는 변하지 않는 변수를 말하며, (ex. final key word)
리터럴은 변수의 '값'이 변하지 않는 데이터 그 자체를 의미, 소스 코드의 고정된 값을 대표하는 용어(ex. 100, "abc")

라고 말할 수 있겠지만, 아래 내용을 보기 전이라면 와닿지 않을 수 있다.(나도 그랬다)
조금 더 구체적으로 알아가보자.
사람들이 이 둘을 헷갈리는 이유는 아마도 둘 다 변하지 않는 값(데이터)를 의미하기 때문이다.

상수(constant)

코드의 관점에서 보자면, 상수는 변하지 않는 변수를 의미한다.
수학적의미,경험 때문인지는 몰라도 숫자만 넣어야 한다고 또는 숫자만 사용했기에 오해하는 경우가 많다.
하지만, 상수는 변하지 않는 변수를 의미한다.

즉, 상수의 값(데이터)는 숫자가 들어갈 수도 있지만
클래스나 구조체처럼 기본형에서 파생되어진 객체나 유도형같은 데이터를 삽입할 수 있다.

다시 한번 떠올리자면, 상수는 데이터가 변하지 않는다고 했다.
그렇기 때문에, 참조변수를 상수로 지정한다면 참조변수에 넣은 인스턴트 안의 데이터까지도 변하지 않는다고 착각할 수 있다.
하지만 이것은 참조변수가 상수라는 것이고, 그 주소가 가리키는 데이터들 모두가 상수라는 의미는 아니다.
(참조변수 메모리의 주소값이 변하지 않는다는 의미)
예를 들어, 상자의 위치가 상수라는 것이고 상자 안에 내용물이 상수라는 것이 아니라는 것이다.

C,C#,C++에서는 const, java에서는 final 을 쓴다.
난 Java를 좋아하니까 Java언어로 예시를 들겠다.

1
2
final Name n = new Name();
= new Name();
cs


이것은 불가능하다. 하지만,

1
2
n1.first = "philip";
 
cs


은 가능하다는 것이다. 즉, 이렇게 Class 내부의 값(데이터)를 변경해도 상관 없다.

리터럴(literal)

리터럴은 데이터 그 자체를 의미한다.
변수에 들어가는, 변하지 않는 값(데이터)를 의미한다는 것이다.

다음 예시를 보자.

 
int a = 10;
 

 

int 앞에 final을 쓰게 된다면, a는 상수(constant)가 된다. 여기서의 리터럴은 10이다.
즉, 10과 같이 변하지 않는 값,데이터(int,double,float,boolean,char...)를 리터럴(literal)이라고 한다.

그러면, 인스턴스(instance, 클래스데이터)가 리터럴이 될 수 있을까?
아니다. 인스턴스 안의 값을 변경하지 않는 이상, 일반적으로 인스턴스는 동적으로 사용하기 위한 용도로 작성되므로
리터럴이 될 수 없다. 그 값이 언제 변할지 모르기 때문이다.

객체 리터럴이라는 표현을 들어본 적이 있는가?
데이터가 변하지 않도록 설계를 해놓은 클래스를 불변 클래스(immutable class)라고 부른다.
해당 클래스는 한번 생성하면 객체 안의 데이터가 변하지 않는다. 만약, 변해야 하는 상황이라면 새로운 객체를 만들어준다.
Java에서의 String, Color같은 클래스가 이와 같은 예이다.

따라서 우리는 "abcd"와 같은 문자열을 Java에서는 '객체 리터럴' 또는 '리터럴'이라고 부르는 것이다.

Conclusion

상수는 변하지 않는 변수를 의미한다. 메모리값(위치)를 변경할 수 없다.

리터럴은 변수의 값이 변하지 않는 데이터(메모리 위치 안의 값)를 의미한다.