Conversion과 Casting
Conversion이라는 것은 말 그대로 데이터의 유형(자료형)을 변환시키는 것입니다.여기에는 Widening conversion과 Narrowing conversion, 두 가지가 있는데요.
가령 다음과 같은 구문이 있다고 합시다.
float x = 35.5F;
double y = x;
double y = x;
이는 float 자료형으로 선언 된 변수 x에 35.5 라는 데이터를 입력한 후,
이 데이터를 double 자료형으로 선언 된 변수 y에 입력하는 것으로,
이 경우에는 float 보다 double의 자료형이 더 크기 때문에,
별 다른 조치를 취하지 않아도 컴파일러가 알아서 자료형을 변환시키게 됩니다.
이와 같은 과정을 (Implicit) Widening conversion이라고 하며,
일반적으로 이 과정에서는 별도의 명시적인 Casting을 할 필요가 없습니다.
반면, 다음과 같은 구문을 살펴 보도록 합시다.
int x = 64;
byte y = x;
byte y = x;
byte 자료형이 가질 수 있는 데이터 값의 범위는 -128 ~ 127 까지로,
64라는 값은 byte 자료형에도 충분히 들어갈 수 있습니다.
언뜻 보면 아무런 문제 없이 컴파일 될 것 처럼 보입니다.
하지만 이 구문은 컴파일이 되지 않습니다.
그 이유는 이미 int 형으로 선언된 변수 x에 들어간 64 라는 값을,
byte 형으로 선언된 변수 y에 집어넣으려 하기 때문입니다.
이 문제를 해결하기 위해서는...
1. 변수 y의 자료형을 byte가 아닌, int 혹은 그 보다 더 큰 범위의 자료형으로 변경
2. Casting 을 통한 해결
2. Casting 을 통한 해결
이와 같이 두 가지 해결 방법이 있습니다.
여기서는 2의 해결 방법을 선택하도록 하겠습니다.
int x = 64;
byte y = (byte) x;
byte y = (byte) x;
이와 같이 명시적으로 Casting을 하여, 보다 큰 자료형 변수에 있는 데이터를 보다 작은 자료형 변수에 데이터에 넣는 것을 Narrowing Conversion이라고 합니다.
다만, 이 경우에는 비트 수를 반드시 염두에 두어야 합니다.
만약 다음과 같은 연산을 하게 된다면 결과값이 어떻게 나오게 될까요?
byte y = (byte) (127 + 1);
산술적으로 계산해 본다면 y 에는 128이라는 값이 있어야 할 것입니다.
하지만 byte 데이터 타입은 -128 부터 127 까지의 값만을 가질 수 있죠.
자, 이 경우에는 어떻게 될까요?
결론부터 이야기 하자면...
y의 값은 전혀 엉뚱하게도 -128이 출력되게 됩니다.
그 이유는 앞서 언급한 대로 비트 수에 따른 문제인데요.
byte 변수의 경우 총 8비트로 구성되어 있습니다.
ex)
byte x = | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
여기에서 가장 앞에 존재하는 비트(27)는 부호를 나타내는 것으로,
실질적인 데이터는 20부터 26까지입니다.
127을 이와 같이 표기하면 다음과 같습니다.
0 | 1 | 1 | 1 |
1 |
1 |
1 |
1 |
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
이 상태에서 1을 더하게 되면 다음과 같이 되어 버립니다.
1 | 0 |
0 |
0 |
0 |
0 |
0 |
0 |
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
위에서도 언급 하였듯, 27의 비트는 부호를 뜻합니다.
이 비트가 0일 경우의 부호는 +, 1일 경우는 - 를 의미하죠.
부호가 -가 되었을 경우에 값을 구하는 방법은,
부호를 제외한 26부터 20까지의 값을 모두 더한 후, 그 값을 최소값(여기서는 -128) 에서 빼는 것입니다.
몇 가지 예를 더 들어보도록 하겠습니다.
-126 = -128 - (-2)
1 | 0 |
0 |
0 |
0 |
0 |
1 |
0 |
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
-80 = -128 - (-48)
1 | 0 |
1 |
1 |
0 |
0 |
0 |
0 |
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
이와같이 Narrow conversion 을 할 때에는 데이터의 손실이 발생할 수 있으므로
각별히 주의하여야 합니다.
Implicit Narrowing Conversion
위에서 살펴보면 알 수 있듯, 자바는 매우 엄격한 언어입니다.Implicit Narrowing Conversion에 대해서도 다음과 같은 경우에만 적용이 됩니다.
1. 유형에 바로 값을 대입하는 형식으로만 사용 가능
다음과 같이 변수를 통해서 값을 대입하려 하면 컴파일 에러가 나타납니다.
int a = 64;
byte b = a;
byte b = a;
2. 값이 범위 안에 들어와야 함
byte a = 64; // 표현 가능
byte b = 128; // 에러
byte b = 128; // 에러
3. 매서드 사용 불가
Book의 구조가 String title, String author, byte value 일 때,
Book b = new Book("title", "author", 62); // 에러, casting 을 해 주어야 함
Book b = new Book("title", "author", 62); // 에러, casting 을 해 주어야 함
'컴퓨터' 카테고리의 다른 글
[프로그래밍 언어론] 구문분석의 모호성 (0) | 2011.03.20 |
---|---|
[프로그래밍 언어론] 구문 분석 방법 (2) | 2011.03.20 |
[프로그래밍 언어론] 파스트리(Parse tree)의 개요 (2) | 2011.03.20 |
[프로그래밍 언어론] BNF (Backus-Naur Form) 란? (0) | 2011.03.20 |
Base64 인코딩에 대한 잡설 (0) | 2011.03.20 |
[Java] Primitive data type (원시 자료형) (0) | 2011.03.19 |
[Flash] Base64 Encoder & Decoder for flash (0) | 2011.03.18 |
[Flash] 플래시 슬라이드 이미지 뷰어 (AS3) (0) | 2011.03.18 |
티스토리 모바일 웹 스킨기능 살펴보기 (0) | 2011.03.15 |
Visual Studio 2010 Express Edition (0) | 2011.03.11 |
IE9 이상으로 브라우저를 업그레이드하거나, 크롬, 파이어폭스 등 최신 브라우저를 이용해주세요.