JAVA

[JAVA] 3. 변수와 상수 그리고 리터럴

조회 수 4788 추천 수 0 2014.04.07 19:38:18

■ 변수

수학적인 의미의 변수(변하는 수)와 같은 맥락이다.

하지만, 컴퓨터에서의 변수는 "수" 를 변수라 부르지 않고 "메모리 공간" 을 변수라 한다.

즉, 변수라는 메모리 공간에 존재하는 값은 변할 수 있다.

이러한 변수는 자바 뿐만 아니라 모든 프로그래밍 언어에서 필수적인 요소이다.

그렇다면, 메모리 공간을 의미하는 이 변수는 어떻게 생겼을까?


1
2
3
4
5
6
7
class VariableExam
{
    public static void main(String[] args)
    {
        int i;
    }
}


위 예제의 5번째 줄이 변수이다.

우선 i 라는 단어를 먼저 보자.

i 는 내가 임의로 만든 변수의 이름이다.

이렇듯 변수의 이름은 프로그래머가 나름대로 만들 수 있다.

위 5번째 줄이 실행됨으로써 메인 메모리에 변수를 위한 메모리 공간이 할당된다.

이때 할당되는 공간에 이름을 i 라고 부여하는것이다.

그렇다면 왜 굳이 변수에 이름을 부여해야할까?

프로그램을 개발한다는것은 데이터를 저장하고 계산한다는것과 같은 말이다.

즉, 모든 프로그램은 데이터의 저장과 계산으로 시작하고 끝나게 되어있다.

그런데, 데이터를 메모리에 저장했다면 저장한 데이터를 언제든지 다시 불러올수 있어야할것 아니겠는가?

만약 메모리 공간에 이름이 부여되지 않았다면, 불러올 방법이 없는것이다.

하지만 이름이 부여되었다면, 그 이름을 통해서 데이터를 불러올 수 있다.


현재 우리는 변수를 할당하는 방법까지만 알고 있다. (일반적으로 변수의 할당이라고 하지않고 변수의 선언이라고 한다 이유는 소스코드상에 int i 를 입력했다고 해서 메인 메모리에 변수가 할당되는게 아니라, 소스코드가 가상머신에 의해서 실행될때 할당되기 때문이다)

그럼 이제 변수에 데이터를 저장하는 방법을 보이겠다.


1
2
3
4
5
6
7
8
class VariableExam
{
    public static void main(String[] args)
    {
        int i;
        i=5;
    }
}


매우 간단하다.

앞서 말했듯이, 변수(메모리 공간)에 접근 하는 방법은 변수의 이름을 통해서 접근한다.

6번째 문장을 보면 i=5 라는 문장이 있는데, 지금 여러분이 생각하는것과 동일하게 변수 i에 5라는 데이터를 저장하라는 명령문이다.

만약 가상머신이 위 소스코드를 실행하게 되면 변수 i 를 할당하고, i에 5를 저장한다. (참고로 위에서 아래로 순서대로 실행된다.)

그리고 이는 한 문장으로 줄여서 표현도 가능하다.


1
2
3
4
5
6
7
class VariableExam
{
    public static void main(String[] args)
    {
        int i=5;
    }
}


5번째 문장을 변수를 선언함과 동시에 데이터를 저장한다.

이는 이전의 소스코드와 완전히 동일한 동작을 한다.

이렇듯, 변수는 선언과 동시에 데이터를 저장할수 있다.

그리고 변수에 최초로 데이터를 저장하는 일을 초기화라고 부른다.


그런데 아직 int 에 대한 설명은 전혀 하지 않았다.

지금 설명하기에는 이른감이 있는데, 간단하게 int에 대해서만 소개하겠다.

int 는 선언할 변수(메모리 공간)의 크기와 변수에 저장되는 데이터를 알리는 키워드이다.

참고로 int 는 4byte 크기를 가지며, 10진수 정수를 뜻한다.

따라서 int i; 는 4byte 크기를 가지고 이름은 i 이며, 할당된 후 저장될 데이터는 10진수 정수인 메모리 공간을 할당해달라는 요청이다.

10진수 정수는 소숫점이 없는 수를 의미한다.


1
2
3
4
5
6
7
class VariableExam
{
    public static void main(String[] args)
    {
        int i=1.2;
    }
}


분명 앞서 설명한 내용대로라면 위 소스코드는 적절하지 않다.

왜냐하면, int형 변수를 선언했기 때문에 변수에는 10진수 정수만 저장할수 있기 때문이다.

맞다. 위 소스코드를 컴파일하면 에러가 발생한다.

int 외에도 다양한 키워드들이 존재한다. (키워드란, 자바에서 이미 역할을 정해놓은 단어를 의미한다.)

그리고 int 와 같은 (변수의 형태를 알리는) 키워드들을 자료형(Data Type) 이라고 하며, 이러한 자료형들은 나중에 따로 설명을 할것이다.

변수에 대한 설명을 마치면서 마지막으로 변수를 사용할때 주의해야할 점을 설명하겠다.


1
2
3
4
5
6
7
8
class VariableExam
{
    public static void main(String[] args)
    {
        i=5;
        int i
    }
}


위 소스코드는 컴파일 시 에러를 발생시킨다.

어디가 잘못되었을까?

첫번째로, 가상머신은 위에서 아래로 실행한다.

따라서, 5행이 먼저 실행될것이고 가상머신은 "i라는 변수는 내가 할당한적이 없는데? 그럼 메모리 공간에서 i를 어떻게 찾아?" 라고 불만을 토할것이다.

그렇기 때문에 컴파일러가 미리 에러를 발생시키는 것이다.

만약 에러를 해결하려고 한다면 5행과 6행의 위치를 바꿔야할것이다.

두번째로, 메소드 내에 존재하는 문장들은 모두 반드시 세미콜론으로 문장의 끝을 나타내줘야한다.

이쯤되면 변수는 별로 어렵지 않다고 느낄것이다.



■ 상수

상수도 변수처럼 메모리 공간을 의미하지만, 이 메모리 공간에는 한번 데이터가 저장되면 두번다시는 바뀔수 없다.

즉,


1
2
3
4
5
6
7
8
9
class VariableExam
{
    public static void main(String[] args)
    {
        int i;
        i=5;
        i=10;
    }
}


이것은 가능하다. (6행에 의해서 변수 i 에는 5가 저장되고 7행에 의해서 변수 i 에는 5라는 데이터는 없어지고 10이 저장된다)

하지만 상수는 위 소스코드처럼 구성이 불가능하다.

상수를 선언하는 방법은 변수를 선언하는 방법에 final 이라는 키워드만 붙이면 된다.


1
2
3
4
5
6
7
class ConstExam
{
    public static void main(String[] args)
    {
        final int i;
    }
}


5번째 문장이 상수를 선언하는 문장이다.

이렇게 final 키워드를 이용해서 상수를 선언하면, 이 상수에는 딱 한번 데이터를 저장할수 있는 기회가 주어진다.


1
2
3
4
5
6
7
8
class ConstExam
{
    public static void main(String[] args)
    {
        final int i=5;
        i=10;
    }
}


그렇기 때문에 위 소스코드는 6행에서 에러가 발생한다.

이유는, 5행에서 이미 선언과 동시에 초기화를 한번 했으므로 상수의 이름을 통해서 더 이상 데이터를 바꿀수 없다.



■ 리터럴

자바에서 말하는 리터럴이 바로 수학에서 말하는 상수와 100% 일치하는 의미를 가진다.

바로 위 소스코드를 가지고 예를 들겠다.


1
2
3
4
5
6
7
8
class ConstExam
{
    public static void main(String[] args)
    {
        final int i=5;
        i=10;
    }
}


5번째 문장에서 5라는 숫자가 바로 리터럴이다.

즉, 프로그램상(소스코드상)에서 표현되는 모든 숫자,문자등이 리터럴인것이다. (물론 키워드는 제외다)

위 소스코드에서 5,10과 같은 리터럴은 프로그램이 실행될때 메모리에 할당된다. (여기서 5와 10도 10진수 정수이다. 따라서 int형 리터럴이다. 그럼 이 리터럴들은 메모리 공간을 얼마나 차지할까?)

하지만, 이름이 없기 때문에 값의 변경은 커녕 접근 조차도 못한다.

참고로 리터럴이 왜 메모리에 할당되냐고 묻는다면, 상식적으로 변수에 데이터를 저장하려는데 메모리에 저장할 데이터가 없다면 무엇을 어떻게 저장할수있겠는가?


profile

HUB

2014.04.07 23:28:40
*.222.20.180

변수, 리터럴에대한 제대로된 설명이군요. 언제나 좋은 설명 감사합니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
» [JAVA] 3. 변수와 상수 그리고 리터럴 [1] 레온 2014-04-07 4788
8 [JAVA] 2. 자바의 다양한 영역 + 공부방법 [2] 레온 2014-04-06 6807
7 [JAVA] 1. 자바의 모토 [1] 레온 2014-04-06 2587
6 [안드로이드] 각종 intent 활용 HUB 2014-01-16 9166
5 한글 제외한 문자들 (정규식) HUB 2014-01-13 4935
4 html 태그 제거 함수 HUB 2014-01-13 4578
3 replaceLast 함수 정규식으로 코딩 HUB 2014-01-12 3313
2 개행문자 정규식 HUB 2014-01-09 6534
1 자바 정규표현식 문법 HUB 2013-12-17 2640

로그인

로그인폼

로그인 유지