상수는 변하지 않는 값(final
)이라고만 생각했는데, 리터럴도 변하지 않는 값이라고 해서.. 사실 리터럴은 들어보기만 했지 깊게 생각해본 적이 없다.. 이제 자세히 알아보자!
변하지 않는 값. 불변의 값
상수는 변하지 않는 변수를 뜻한다.
참조변수를 상수로 지정 할 때, 참조변수에 넣은 인스턴스 안의 데이터 까지도 변하지 않는 줄 착각 할 수 있지만, 참조변수가 상수(참조변수 메모리의 주소값이 변하지 않는다라는 의미)지, 그 주소가 가리키는 데이터들까지 상수라는 의미가 아니다.
final Animal animal = new Animal("강아지", "포유류", "멍멍");
animal.setName("멍멍이"); // 가능
즉, 여기서 상수는
animal
을 뜻한다.
리터럴은 데이터 그 자체를 뜻 한다.
final int num = 1;
int year = 2021;
즉, 여기서 상수는
num
을 뜻하고, '1'이 '리터럴'이 된다.
year
은 변수가 된다.
여기서 클래스 데이터는 리터럴이 될 수 없다.
언제든지 값이 바뀔 수 있기 때문이다.
데이터가 변하지 않도록 설계를 한 클래스를 불변 클래스라 칭한다.(immutable class)