Work/Java

[Head First Java] 3_1. 원시변수와 레퍼런스

kevin. 2007. 7. 16. 08:55

이번에는 변수 이야기 입니다.

변수는 "변하는 수"라는 이야기인데.. 이놈들은 어떤때에 사용할까요?

네.. 값을 저장하고 저장한 값을 사용할 때 사용합니다.

앞서서 2. 클래스와 객체 에서 Music 클래스를 살펴보면 title과 artist가 있었죠?

이것들이 바로 변수입니다. (요놈들은 String type의 변수이죠..)

어떨때 사용한다는건 대강 감이 오시나요?

그럼.. 원시변수를 이번시간에 살펴보고 다음에 레퍼런스 변수를 살펴보도록 합시다.

 

다음과 같은 변수를 원시 변수라 합니다.

boolean, char, byte, short, int, long, float, double

각 원시 변수의 크기와 범위를 살펴보면 아래와 같습니다.

 유형 비트수 범위
 boolean  it depends on jvm  true or false
 char

 16

 0~65535
 byte  8  -128 ~ 127
 short  16  -32768 ~ 32767
 int  32  -2147483648 ~ 2147483647
 long  64  - 큰값 ~ 큰값
 float  32  바뀔 수 있음
 double  64  바뀔 수 있음

변수에는 유형과 이름이 있습니다.

유형은 위에서 살펴보았고요.. 이름은 그냥 알맞게 맘에 들게 나중에 알아보기 쉽게 지어주시면 되요..

예를 들어 어떤 사람의 특징을 표현하는 클래스에서 변수 이름은..

"이름", "성별", "나이", "키".. 등등이 될 수 있겠죠~?

단! 변수 이름으로 자바에서 먼저 사용하고 있는 키워드를 사용하시면 안됩니다. 

원시변수를 선언하고 사용하는 것은 아래와 같이 하시면 됩니다.

 

int x = 10;

byte b = 2;

char c = 'c';

boolean tof = true;

long big = 3456789;

float f = 3.14f;

 

 위에서 빨간거 보이시죠? float는 반드시 뒤에 'f' 를 붙여주셔야 합니다.

아니하시면 소수점이 찍힌 수는 모두 double로 간주되어 버리거든요..

 

그럼 마지막으로 변수의 크기에 대해서 말해볼까요?

여기 소주잔과 맥주잔이 있습니다. 소주잔에 맥주잔을 넣어보세요. ㅋㅋ 안되죠?

그럼 맥주잔안에 소주잔을 넣어보세요.. 이건 되죠? 

변수도 똑같답니다. 위의 표에서 비트수가 바로 이 크기와 같다고 보시면 됩니다.

큰 비트수를 가진 유형에는 작은 비트수를 가진 유형을 넣을 수 있습니다.

예를 들어볼께요.. 

 

int x = 10;

byte b = 20;

x = b; // 요거 됩니다.

b = x; // 요거 안됩니다.

 

 조금 더 발전 시켜서.. 아래 코드를 한번 보세요..

class Main {
    public static void main(String[] args) {
        int a= 10;
        byte b= 3;

        a = b;
        System.out.println("a = "+a);

        b = (byte)a;
        System.out.println("b = "+b);

        a = 127;
        b = (byte)a;
        System.out.println("b = "+b);

        a = 128;
        b = (byte)a;
        System.out.println("b = "+b);
    }
}

 

실행결과가 어떻게 될까요? 변수의 크기(비트 수) 표를 보시면서 한번 생각해보세요..

코드에서 (byte) 요렇게 한 부분을 "캐스팅 한다" 라고 하는데요..

저부분을 빼고 컴파일 하시면 다음과 같은 에러가 납니다.

Main.java:9: possible loss of precision
found   : int
required: byte
        b = a;
            ^
1 error

 

즉,  정밀도를 잃을 수 있다는 말인데요.. int가 byte보다 큰데 작은 곳에 넣으려고 하니까 안된다는 말이에요..

그래서 명시적으로 큰 값을 작은 값으로 줄여주는 과정이 캐스팅입니다.

하지만 잘못 사용하면 원하지 않는 결과를 불러올 수 도 있습니다. 바로 위의 예처럼요..

위의 코드의 실행 결과는 다음과 같습니다.

 

a = 3
b = 3
b = 127
b = -128

 

 마지막 값이 조금 이상하죠? 128을 넣었는데 엉뚱한 값이 나옵니다.

그 이유는 byte의 범위가 127까지 인데 int 변수에서 128의 값을 byte로 캐스팅한 후 byte 변수에 넣은 것이 문제입니다.

소주잔이 아무리 좋다고 하더라도 맥주 500cc를 담을 순 없으니까요..

(맥주 500cc잔에도 사실 500cc가 안들어 간다죠~? 사기꾼들!!)

 

그럼 다음에는 레퍼런스 변수를 한번 살펴보도록 하죠~

이 글은 스프링노트에서 작성되었습니다.