본문 바로가기
Programming/Java

자바 기본형과 참조형 차이, 형변환

by hyunipad 2021. 1. 5.
반응형

기본형


구분

자료형

예시

문자

char

char exAlpha = 'A';

char gender = '남';

숫자

정수형

byte, short, int, long

int age = 20

long l = 450000000L;

실수형

float, double

float f = 180.5f;

double d = 80.9;

논리

boolean

boolean isPowerOn = true;

나머지

Date, Person, String

Date today = new Date();

Person p = new Person();

String name = "홍길동"

 

자바는 기본적으로 char, byte, short, int long, float, double, boolean에 해당하는 8개의 기본형(Primitive Type)을 가지고 있고

나머지 Date, Person, String 등을 참조형이라고 한다.

그렇다면 기본형과 참조형은 무엇이 다른 걸까?

 

기본형 vs 참조형


 

 

변수의 메모리 할당

 

기본형은 실제 값인 10 또는 'A' 또는 1.5 등을 가지고 있지만 참조형은 person의 객체인 Person을 참조할 수 있는 0x300이라는주소 값을 가집니다.

 

기본형의 크기


기본형의 메모리의 크기는 다음과 같습니다.

 

구분

1byte

2byte

3byte

4byte

논리형

boolean

 

 

 

문자형

 

char

 

 

정수형

byte

short

int

long

실수형

 

 

float

double

 

1byte = 8 bit로 각각의 기본형 메모리 크기는 정해져 있습니다.

그렇다면 메모리 크기보다 큰 값을 할당하게 되면 어떻게 될까요?

 

Exception

 

 

Type mismatch: cannot convert from int to short

타입이 맞지 않아 int형으로 컨버트를 해달라고 오류가 발생하게 됩니다.

따라서 기본형 메모리 크기에 맞는 데이터 값을 할당해 줘야 합니다.

구분

byte

-128 ~ 127

short

-32768 ~ 32767

int

-21억 ~ 21억

long

-922경 ~ 922경

char

0 ~ 65535

 

 

형 변환


변수를 그릇이라고도 하는데, 실생활에서는 그릇에 음식이 담겨 있을 때 음식을 다른 그릇으로 옮기곤 합니다.

자바에서 변수의 타입을 바꾸는 것을 형 변환이라고 하고 형 변환에는 묵시적(자동) 형 변환, 명시적(강제) 형 변환이 있습니다.

 

 

묵시적(자동) 형 변환 vs 명시적(강제) 형 변환


변수의 데이터 타입을 크기별로 나열해 보면,

byte < short < int < long < float < double , char입니다.

char 는 값의 범위에 음수 부분이 없기 때문에 구별해놓았고 float와 double은 각각 int와 long과 메모리의 크기는 같지만, 실수형은 값의 표현이 정수형과 다르므로 모든 정수형보다 실수형이 더 큰 타입입니다.

묵시적 형 변환은 작은 데이터 타입에서 큰 데이터 타입으로 명시적 형 변환은 큰 데이터 타입에서 작은 데이터 타입으로 형 변환하는 것을 뜻합니다. 묵시적 형 변환은 Oerflow(넘침)의 가능성이 없기 때문에 아무런 발생하지 않고 자바 컴파일러가 자동으로 형 변환을 처리해 줍니다.

하지만 명시적 형 변환은 Overflow가 발생할 수 있기 때문에 개발자가 형 변환 연산자를 통해 명시해 줘야 합니다.

만약 명시적 형 변환을 수행한 뒤 Overflow가 발생하게 되면 원본 데이터와 다른 데이터가 저장될 수 있습니다.

 

package hyuni;

public class VariableEx {

	public static void main(String[] args) {		
		
		int i = (short)32768; // int(큰거) => short(작은거) 명시적(강제) 형변환 and Overflow 발생
		System.out.println(i);	
	}

}

Overflow에 의해 데이터 손상(32768 => -32768)

 

묵시적 형 변환 코드 예시

package hyuni;

public class CastingEx {

	public static void main(String[] args) {

		int a = 32768;  // 큰 데이터 타입
		short s = 32767;  // 작은 데이터 타입
		
		// 묵시적 형변환 : 작은 데이터 타입 (short)=> 큰 데이터 타입(int) 형변환
		a = s; // 아무런 명시를 해줄 필요가 없다 ! 컴파일러가 자동으로 해줌
		System.out.println(a);
		
		
	}

}

 

 

명시적 형 변환 코드 예시

 

1. Overflow 발생하는 경우

package hyuni;

public class CastingEx {

	public static void main(String[] args) {

		int a = 32768;  // 큰 데이터 타입
		short s = 32767;  // 작은 데이터 타입
		
		// 명시적 형변환 : 큰 데이터 타입(int) => 작은 데이터 타입(short)
		s = (short) a;
		System.out.println(s); // short의 표현 범위는 +32767 까지인데 32768을 할당 해줬기 때문에 Overflow 발생 !
		
	}

}

Overflow에 의해 데이터 손상(32768 => -32768)

 

 

2. Overflow 발생하지 않는 경우

package hyuni;

public class CastingEx {

	public static void main(String[] args) {

		int a = 100;  // 큰 데이터 타입
		short s = 32767;  // 작은 데이터 타입
		
		// 명시적 형변환 : 큰 데이터 타입(int) => 작은 데이터 타입(short)
		s = (short) a;
		System.out.println(s); // short의 표현 범위는 +32767 까지인데 100을 할당 해줬기 때문에 Overflow 발생하지 않음 !
		
	}

}

Overflow가 발생하지 않아 할당한 100이 나오는 모습

 

char 타입과 byte, short 타입 간의 형 변환


 

byte(1Byte) : -128 ~ 127

short(2Byte) : -32768 ~ 32767

char(2Byte) : 0 ~ 65535

 

char 타입은 문자 표현을 하기 때문에 음수의 표현이 필요 없어서 양수의 표현 범위만 가지고 있습니다.

따라서, char 와 short, byte 타입 간에는 명시적 형 변환이 필수입니다.

package hyuni;

public class CastingEx {

	public static void main(String[] args) {

		byte b = 60;
		short s = 61;
		
		char ch;
		
//		ch = b; // 오류 발생 ! char <=> byte 간 강제 형변환 필수 !
		ch = (char)b;
		System.out.println(ch); // 아스키코드의 60에 해당하는 문자를 출력합니다.
		
//		ch = s; // 오류 발생 ! char <=> short 간 강제 형변환 필수 !
		ch = (char) s;
		System.out.println(ch); // 아스키코드의 61에 해당하는 문자를 출력합니다.
	}

}

반응형

댓글