'Java'에 해당되는 글 2건

  1. 2014.01.24 [Java] 상수(Constant)
  2. 2014.01.24 [Java] String constant pool

[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
,

[Java] String constant pool

Java 2014. 1. 24. 05:07

String constant pool


To cut down the number of String object created, JVM maintains a special memory called "String literal poolor "String constant pool". Each time your code creates a string literal, the JVM checks the string literal pool first. If the string already exists in the pool, a reference is returned. JVM keeps at most one object of any String in this pool.

많은 String object가 만들어지는 것을 방지하기 위해서 JVM은 String literal pool 혹은 String constant pool로 불리는 특별한 메모리를 유지합니다. 당신의 코드가 문자열 리터럴을 만들때마다 JVM은 우선 String literal pool을 체크하게 됩니다. 만약 문자열이 풀안에 존재한다면, 참조값이 반환됩니다. JVM은 이 pool에서 최대 하나의 String object를 유지합니다.


Vasudevan, N. (2012). STRING LITERAL POOL. Retrieved from http://theopentutorials.com/tutorials/java/strings/string-literal-pool/


'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] 상수(Constant)  (0) 2014.01.24
Posted by marvell
,