1. 변수와 자료형

변수는 변하는 수입니다. 우리가 어떤 프로그래밍 언어를 학습하던 거의 맨 처음에 변수에 대한 이야기가 나옵니다. 프로그램에서 변하는 수가 필요한 이유는 프로그램이 수행하는 동안 변하는 값들이 많기 때문입니다. 게임을 한다고 하면 게임 머니, 레벨 등이 변할 것이고, 쇼핑을 한다고 하면 장바구니의 물건들, 쇼핑 포인트 등이 변경될 것입니다. 프로그램이 수행 되면서 이렇게 많은 값들이 변하게 될 때 우리는 변수라는 것을 선언하여 사용합니다. 

이러한 변수를 사용하기 위해서는 자료형이라는 것을 선택합니다, 가령 예금잔고에 대한 값은 정수가 필요할 것입니다. (마이너스인 경우도 있으니까요 ㅎㅎㅎ) 이자율이라면 실수가 필요하죠.. 이렇듯 우리가 사용할 변수가 어떤 값을 저장해야 하는가에 따라 선택하는 것이 자료형입니다. Java, C, C++과 같은 언어들은 반드시 변수를 자료형과 함께 선언해야 합니다. 

자료형이 필요한 이유는 이 변수가 가져야 할 메모리의 크기와 종류(?)를 결정하기 위해 필요합니다. 

가령 int age =. 10; 라고 선언하게 되면, i 라는 변수는 4 바이트의 메모리를 가지고 정수 10의 값을 저장하게 됩니다. 이후 age 라는 변수를 참조하게 되면 int 타입의 정의에 따라 4바이트 메모리를 정수 방식으로 읽어오는 것이지요. float는 실수를 나타내는 자료형입니다. Int 처럼 4바이트의 메모리를 사용하지만 내부에 실수를 저장하는 방식은 정수와 전혀 다릅니다. 따라서 float로 선언된 변수를 읽어오거나 값을 저장할 때는 실수형 방식(지수부와 가수부를 분리하여 저장하는)을 이용하여 참조하게 됩니다. 이렇게 언어에서 기본으로 제공되는 자료형을 primitive data type 이라고도 합니다. 기본 자료형외에도 C 언어의 struct나 자바, C++, C#의 class와 같이 프로그래머가 정의한 자료형들이 변수에 사용될 수 있습니다. 이렇게 대부분의 컴파일을 통해 실행파일이 만들어지는 컴파일 언어들은 기본 자료형과 참조자료형을 변수에 선언해야 합니다.

하지만 어떤 언어들은 자료형을 선언하지 않고도 변수를 사용할 수 있습니다. 대표적으로 JavaScript나 Python 등의 언어를 예로 들수 있습니다. 이러한 언어들은 실행 되면서 해석되는 순간에 그 변수가 어떤 자료가 대입되는가에 따라 그때 자료형이 결정됩니다. 가령 var number = 10; 이라고 쓰게되면 number는 정수형 변수가 되는 것이죠. 이러한 언어들을 다른 말로 인터프리터 언어라고 하는데, 따로 컴파일에 의해 실행 파일이 만들어지지 않기 때문에 실행 시점에서 그 변수의 종류가 결정되게 됩니다.

2. 상수

상수는 변수처럼 이름을 가지지만 변하지 않는 수를 써야 할 때 사용합니다. 프로그램에서 상수가 필요한 경우는 변하지 않아야 하는 값을 저장하기 위해서 입니다. 또한 반복적으로 쓰이는 어떤 특정 값이나 문자열이 있는 경우도 상수로 선언하여 사용하면 이후에 그 값이 다른 값으로 대체해야 한다고 할 때, 처음 선언되거나 초기화 된 부분만 바꾸면 되는 편리함도 있습니다.

C, C++ 에서는 상수를 #define 이나 const 를 키워드를 이용하여 선언하고 자바에서는 final 키워드를 이용하여 선언합니다. 이러한 상수는 변수 처럼 이름을 가지게 됩니다. 그리고 프로그램에서 이 상수 이름을 쓰면 추후 대입된 값으로 치환이 이루어 집니다.

상수는 선언 이후 사용하기 전 반드시 초기화가 이루어져야 하고 초기화된 상수 값은 다른 값을 다시 대입할 수 없습니다. 

3. 리터럴

상수와 상수 값은 다른 의미입니다. (가령 같은 의미로 쓰여있는 책들이 있지만,) 상수는 이름을 가진 초기화 이후에 변경되지 않은 값을 저장한 메모리를 가리키고, 상수 값은 프로그램 내부에서 사용 되는 모든 숫자, 문자, 문자열이고, 이러한 상수 값들은 다른 말로 리터럴(literal) 이라고 합니다. 

그럼 프로그램에서 쓰는 리터럴들이 어떤것이 있을 까요?

for (int I =0; I<10; I++ ){…..}

위와 같은 코드에서도 정수 리터럴 0, 10 들이 사용된 것을 알 수 있습니다.

char* greeting = “Hello”; 

위에는 문자열 리터럴 “Hello” 가 사용되었네요 ( C 언어에서는 다른 말로 문자열 상수 라고 합니다.)

프로그램에서 사용 되는 모든 리터럴들은 프로그램이 메모리에 로드되어 프로세스가 되는 순간 데이터 영역에 위치하게 됩니다. 위에서 언급한 0, 10, Hello 등은 특정 위치에 그 값을 가지고 있는 것이지요. 우리가 프로그램에서 반복적으로 같은 리터럴을 사용하게 되면 같은 메모리의 값이 사용되는 것이죠.

자바의 다음 코드로 좀 더 이해를 도울 수 있을것 같습니다.

String str1 = new String(“abc”);

String str2 = new String(“abc”);

System.out.println(str1 == str2);   //false

String str3 = “abc”;

String str4 = “abc”;

System.out.println(str3 == str4);  //true

위 코드에서 첫번째 출력문은 flase 이고 두번째 출력문은 true가 됩니다.

new String() 에 의해 생성된 두 개의 문자열은 힙 메모리에 각각 다른 인스턴스로 생성되어 그 메모리의 위치가 다르지만, String str3 = “abc” 와 같이 문자열 리터럴을 참조 하는 경우는 str3와 str4가 같은 리터럴의 메모리를 가리키므로 true 가 출력되는 것을 알 수 있습니다. 반복적으로 사용되는 문자열은 new 하지 않고 상수 리터럴을  

사용하는 것이 훨씬 합리적 이랍니다.