[Java] 상수(Constant)

Java 2014. 1. 24. 05:41

본문 내용은 http://cafe.naver.com/lucasgameschool/785을 참고 하였습니다.



상수(Constant)


상수는 프로그램이 실행되는 동안 (선언과 동시에 값을 설정했다면) 값이 변하지 않는 것.

(선언과 동시에 값을 설정 안했다면) 값을 한 번만 설정이 가능한 것.

명령어로는 c++에서는 const로 Java에서는 final이 있다.

상수는 literal 상수와 symbolic 상수로 나뉘어 진다.


1) Literal 상수                                                                                      

int result = 1 + 2;

숫자를 저장하려면 메모리에 저장공간을 확보해야 하는데, 1과 2라는 숫자는 메모리에 할당을 하지도 않았는데, CPU가 이것들을 연산하고 result라는 메모리 변수에 대입을 하고 있다.

a. 1과 2의 숫자가 메모리 공간에 상수로 지정

b. 두 상수의 덧셈연산이 진쟁된다.

c. 그 결과가 result에 저장. 

즉, int 변수처럼 메모리에 할당이 되지만 변수명이 없이 메모리에 올려진 것을 literal 상수라고 한다.

int 정수 외에도 문자나 실수에도 같은 논리가 적용된다. 

char ch = 'A';
double d = 9.11; // Java - float은 F



2) Symbolic 상수                                                                                  

// symbolic 상수 : 이름이 있는 상수
final int MAX = 10;
final float PI = 3.14F;



결론 : 1, 2는 literal 상수, (final이 붙는) PI는 symbolic 상수다.



c를 공부하신 분들은 포인터와 메모리 구조를 알고 있는데, 이는 Java를 이해하는데 도움이 됩니다. 밑의 그림은 HeadFirst C에서 참고했습니다. 이책은 문자열 부분만큼은 설명이 정말 잘되어있습니다. 코드영역과 데이터 영역은 프로그램이 메모리에 로드될 때 올라오게 되는데, 이때 여기서 "JQK"가 상수메모리 영역에 올라가게 됩니다. 프로그램이 cards 변수가 가리키는 문자열의 내용을 바꾸려 하지만 읽기전용 상수 메모리에 내용이 있기 때문에 바꿀 수가 없습니다.

데이터영역(data segment)에 대한 추가 설명을 하자면 저 영역은 프로그램이 메모리에 로드될 때 할당, 프로그램이 종료될 때 소멸됩니다.



2014년 1월 24일 상수 관련 추가 글

- 클래스에 로딩되면 클래스에 정의된 상수들이 Constant pool에 올라갑니다.

이론상으로는 개체 소멸시 따라서 소멸되야 하지만 Java에서 소멸 타이밍을 알기는 힘들다.

따라서 객체 소멸 후에도 클래스 정보가 메모리에서 사라지지는 않는다.

- 접근과 공유의 문제는 2차적인 문제이다.


'Java' 카테고리의 다른 글

[Java] list와 향상된 for문  (2) 2014.02.09
[Java] 2차원 배열의 길이  (0) 2014.02.08
[Java] String과 StringBuffer의 차이점  (0) 2014.01.24
[Java] 메모리 관점에서 본 String  (0) 2014.01.24
[Java] String constant pool  (0) 2014.01.24
Posted by marvell
,