Last Modified : 2011.01.02

자료형 (Data Type)과 형변환 (Casting)

리터럴과 변수

int yr = 2011;
여기서 2011 과 같이 쓰이는 프로그램 요소를 리터럴 ( Literal ) 이라 한다.
리터럴을 코드에서 단순하게 에 해당된다고 생각하면 된다.
변수는 값을 저장하기 위한 메모리 기억공간이다.
리터럴과 변수 모두 특정 자료형에 속하게 되어 사용된다.

자바의 자료형(Data Type)

자바에서 사용되는 자료형은 는 두 가지 종류가 있다.

  • 기본 자료형 (Primitive Type)
  • 참조 자료형 (Reference Type)

기본 자료형은 기존의 일반적인 프로그래밍 언어에서 보았던 자료형이다. 참조 자료형은 객체지향 프로그래밍 언어에서 추가된 자료형이다.

기본 자료형
타입 설명
boolean true 또는 false 를 나타내는 자료형 boolean isTruth = true;
char 2 바이트 문자 데이터
문자, 유니코드 문자, 제어 문자를 작은 따옴표(' ') 를 사용하여 표현
char grade = 'A'; // 문자
char ch = '\uFFFF'; // 16진수 FFFF값에 해당하는 유니코드 문자
char ech = '\n'; // new line(\u000a)
char ech = '\b'; // 백스페이스(\u0008)
char ech = '\t'; // 탭(\u0009)
char ech = '\t'; // 탭(\u0009)
char ech = '\\'; // 역슬래시(\u005c)
char ech = '\"'; // 큰따옴표(\u0022)
char ech = '\''; // 작은따옴표(\u0027)
byte 1 바이트 정수형 데이터 byte weight = 71;
short 2 바이트 정수형 데이터 short bill = 30000;
int 4 바이트 정수형 데이터 int balance = 56219618;
long 8 바이트 정수형 데이터
반드시 숫자 뒤에 L 를 붙인다.
long balance = 56219000L;
float 4 바이트 실수형 데이터
반드시 숫자 뒤에 F 나 f 를 붙인다.
float rate = 6.195F;
double 8 바이트 실수형 데이터 double rate = 6.195;

자바 코드내에서 10 과 같은 리터럴은 JVM 이 int로 인식하고, 72.5 와 같은 리터럴은 로 double로 인식한다.

참조 자료형
Student kim = new Student();

kim를 Student형 참조형 변수(레퍼런스)라 부른다.
위의 대입문을 통해서 kim에 저장되는 값은 생성된 객체의 메모리 주소값(4바이트)이지 생성된 객체 자체가 저장되는 것이 아니다.
kim을 가지고 생성된 Student 객체에 접근할 수 있게 된다. 객체의 멤버에 접근할 때는 .(도트)를 이용한다.

kim.name = "김태희";

만약 kim이 어떤 객체도 가르키지 않도록 하려면 null을 이용한다.

kim = null;

형변환(Casting)

형변환이란 변수가 저장하고 있는 값이나 리터럴을 원하는 자료형으로 변환시키는 작업을 의미한다.
형변환에는 JVM에 의한 자동 형변환과 프로그래머가 필요에 따라서 행하는 명시적 형변환이 있다.

자동 형변환(Up-Casting)
long money = 300;

리터럴 300은 int형이나 money 가 long형 변수이므로 300은 long형으로 자동 형변환 된 다음 money에 할당된다.
이런 과정은 JVM이 알아서 자동으로 해준다.

int x = 3 + 3.5 + 4; // 컴파일 에러!

자바 코드에서 3.5 이와같이 사용하면 JVM은 이를 double형으로 인식한다.
자바크드에서 3 과 4 과 같이 사용하면 JVM은 이를 int 형으로 인식한다.
예제처럼, int이상의 다른 자료형의 값들이 산술 연산에 참여할 때, 그 중 가장 큰 자료형으로 암묵적 형변환이 일어난다.
int x = 3.0 + 3.5 + 4.0
결과값이 10.5 인 dobule 형 값을 int 형 변수 x에 할당하지 못하기 때문에 컴파일 에러가 발생하는 것이다.

문제1) int x = 10; int y = 4; int z = x / y; 일때 z에 할당되는 값은?

10 을 4로 나누면 2.5 가 된다.
하지만 x 와 y 가 모두 int형 변수이므로 그 계산결과 역시 int 형이다.
그래서 2.5 가 아니고 2 가 z에 대입된다.

명시적 형변환(Down-Casting)
float f = 1.1; // 컴파일 에러!

변수에 값을 대입할 때 값의 자료형이 변수의 자료형보다 크면 컴파일 에러가 발생한다.
위에서 double 형의 값을 float형 변수에 대입하려고 하기 때문에 컴파일 에러가 발생하는 것이다.
컴파일 에러를 방지하려면 명시적 형변환을 하여야 한다.

float f = (float)1.1; // 대입되는 값의 자료형을 인위적으로 변수의 자료형에 맞게 형변환

문제2) 문제1에서 z 를 double 형으로 바꾸고 2.5 가 출력되게 하려면 ?

double z = (double)x / y;
또는
double z = x / (double)y;
x 나 y 둘 중에 하나만 double 형으로 명시적 형변환을 해주면 된다.

int 보다 작은 정수형 자료형에서 산술연산시 주의할 사항

int보다 작은 크기의 정수형 자료형에서의 산술연산은 수행할 때 int 형으로 변환되어 계산된다.

short s1 = 1;
short s2 = 2;
short sum = s1 + s2; // 컴파일 에러!

s1 , s2 가 저장하고 있는 값이 연산에 참여하게 되면 모두 int형으로 형변환 되므로 계산결과는 int형이 된다. 따라서 계산결과를 short형 변수에 저장하기 위해서는 아래와 같은 명시적 형변환이 필요합니다.

short sum = (short)(s1 + s2);

참조 자료형에서의 형변환

참조 자료형인 경우에도 암묵적 형변환과 명시적 형변환 개념이 있다.
만일 레퍼런스가 가리키는 객체들이 서로 상속 관계에 있다면 이들사이에 형변환이 가능하다.
상속에 대해서는 상속에서 자세히 다룬다.

부모클래스 parent = new 부모클래스();
자식클래스 child = new 자식클래스();

변수와 값 모두 같은 자료형인 정상적인 코드이다. 그런데 다음과 같은 코드가 가능하다.

부모클래스 parent = new 자식클래스(); // 자동 형변환

부모형의 참조형 변수가 자식 형의 객체의 참조값을 할당받을 수 있다.
부모클래스가 범위가 자식 클래스보다 더 넓기에 자동 형변환(Up-Casting)이 일어난다.
이럴 경우 레퍼런스 parent로 할 접근할 수 있는 자식 객체의 멤버는 부모로부터 상속받은 멤버와 오버라이딩 한 것까지 가능하다.
실제 생성된 객체는 자식형의 객체이다.
따라서 아래와 같이 명시적 형변환으로 child레퍼런스는 제약없이 객체를 엑세스할 수 있습니다.

부모클래스 parent = new 자식클래스();
자식클래스 child = (자식클래스)parent; // 명시적 형변환

String 클래스 : 자바 프로그램에서 문자열을 사용하려면

자바에서 문자열을 표현하는 방법은 String클래스로부터 String객체를 생성하여 사용하는 것이다.
String클래스는 자바 API 에 존재하는 클래스이다.
따라서 Strng형 레퍼런스를 선언하고 new 키워드를 사용해서 레퍼런스에 할당한 다음 사용해야 한다.
만약 우리의 프로그램에서 "안녕하세요" 라는 문자열이 필요하다고 하면 아래 코드처럼 String객체를 생성하고 레퍼런스에 할당하여 사용하면 된다.

String hello = new String("안녕하세요");

그런데 자바에서는 다음을 허용하고 있다.

String hello = "안녕하세요";

이는 문자열이 자주 사용되므로 마치 기본 자료형을 사용하는 것처럼 쓸 수 있도록 배려한 것이다.