[Java]2강. 변수와 상수
1. 리터럴 (Literals)
우리의 일상생활을 둘러싼 모든 것은 어떠한 관점에서 보면 모두 정보라 볼 수 있다. 그러한 관점에서 우리는 변수와 상수를 나누어서 살펴볼 필요가 있다. 수학에서도 변수와 상수는 구분되어져 있다.
이 식은 우리가 중학교 때부터 봐온 이차식이다. 아주 간단한 식이다. 이 식에는 변수와 상수가 공존하고 있다. a, b, c는 상수이며, x는 변수이다. 너무 깊게 들어가지 말고 간단하게 짚고 넘어가도록 하자. 상수는 고정된 값이며, 변수는 변할 수 있는 수이다. 그래서 컴퓨터에서도 변수와 상수 두 개로 나누어져 있다. (원래 프로그래밍 자체가 학자를 위한 것이었으므로 그 기원을 생각하면 이렇게 설계된 것이 당연시 된다.)
하지만 컴퓨터에서는 하나의 개념이 더 추가된다. 바로 리터럴이다. 리터럴이란 데이터 자체의 값을 리터럴이라고 한다. 예를 들어 10이란 수가 있으면, 10 자체의 데이터를 의미하는 그 자체의 값을 리터럴이라 부른다. 예를 들어 보자.
final int a = 10
final을 붙이면 변수를 변경할 수 없게 된다. 그래서 우리가 이야기하는 상수가 된다. 변할 수 없는 값이므로 상수의 정의에 들어맞는다. 이러한 값을 초기에 한번은 정의를 해줘야 하는데, 그 값 자체를 의미하는 10은 리터럴이 된다.
다시 한번 정리하자면 10이란 숫자 자체는 리터럴이며, 10을 넣어서 값을 변하지 못하게 하는 한 값은 상수가 되는 것이다.
프로그래밍에서는
- 상수는 특정 공간에 넣은 변수인데, 변하지 않는 변수를 상수라 부를 것이며,
- 리터럴은 데이터 자체로써의 변하지 않는 어떤 값을 의미한다.
Java에서 문자 리터럴와 문자열 리터럴은 차이점이 있다.
문자 리터럴은 'a', 'b' 이렇게 하나짜리 따움표를 쓴다는 점
문자열 리터럴은 "a", "abc", "Hello"의 형태를 가진다는 점이다. 문자를 하나 쓴다고 문자 리터럴이 되지 않는다. " " 의 형태는 문자열 리터럴을 가지게 된다. 다만, 컴파일러가 똑똑해짐에 따라 알아서 바꿔주지만 그래도 조심해서 사용하도록 해야 한다.
마찬가지로 숫자 리터럴에서도 1_000_000 이러한 값은 숫자 리터럴이다. 문자가 아니다. 이렇게 사용하는 이유는 단위를 읽기 쉽게 만들어주기 위해서이다. (가독성) 저 숫자랑 같은 수는 1000000이다.
리터럴의 종류에는 다양한 종류가 있다. 우리가 생각하는 모든 변수는 모두 리터럴이 존재한다. 정수 리터럴, 문자 리터럴, 문자열 리터럴, 실수 리터럴, 논리 리터럴 등 다양한 종류가 존재한다. 이러한 리터럴의 차이점을 아는 것은 우리가 자바를 프로그래밍할 때, 나중에 객체지향프로그래밍을 할 때 중요한 초석이 된다. 리터럴로 생성된 객체의 주소값과 특정 메서드를 활용해서 비교하는 경우에가 다를 수 있다는 점을 이해할 수 있는 길이 되는 것이다. 이러한 점은 나중에 차분히 설명하도록 하자.
2. 변수
변수 - 메모리 상에 자리를 지정해주고 그 자리를 사용자가 사용할 수 있도록 알려주는 것이다.
예를 들어, 서울시 성북구 117번길 1에 사는 사람의 주소를 able이라 하면 다음부터 able이라 부르면 우리는 자연스럽게 서울시 성북구 117번길 1로 찾아가게 되는 것이다.
int able;
이렇게 지정해주면 int라는 자리만큼의 메모리를 배정하주고, 특정 주소지에 대한 이름을 able이라 하자 라고 선언하는 것이 변수이다. 이제 이 공간은 사용자가 사용할 수 있다.
able = 1;
사용할 수 있는 주소와 장소가 생겼으므로 여기에 1을 넣도록 할 것이다. 여기서 1은 리터럴로 생성이 된다. 메모리 어딘가에 생성된 상태가 되는 것이다. [차후에 이야기하겠지만, 리터럴이 생성되는 공간과 변수가 생성되는 공간은 다른 메모리 상에서 생성된다. ]
우리는 이러한 1을 able의 공간에 넣어주는 행위를 초기화한다고 한다. 그리고 이러한 초기화 과정은 여러번 일어날 수 있다.
able = 1;
able = 2;
able = 3;
이러한 코드가 온다면 초기화가 3번 일어난 것이다.
( * 그러면 왜 값을 대입하는 것을 할당이라 안 하고 '초기화'라 하는 것인가? => 이 부분에 대한 답은 메모리를 이루고 있는 하드웨어적 요소를 생각하면 초기화란 단어가 자연스럽게 와닿게 된다. RAM은 기본적으로 휘발성 메모리로 전기가 계속 인가되어 있는 동안에는 기존에 가지고 있던 정보가 유지된다. 하지만 전기가 끊기면 날라간다. 우리는 이러한 여러 특성을 활용해서 메모리를 지웠다 썼다 를 할 수 있는 것이다. 그러면 새로운 데이터가 와서 새롭게 저장하려면 리셋을 한 뒤에 다시 데이터를 써야 하지 않겠는가? 그러한 이유에서 메모리가 초기화된다고 이야기할 수 있다. ) - 이는 이해를 위해 생략된 부분이 많으므로 반드시 공부가 깊어짐에 따라 한번 다시 생각해보길 바란다.