JAVA

JAVA 데이터 타입 간의 형 변환 (타입 변환)

태로미 2023. 2. 2. 11:17

 

 

 

 

 

▶▶   자바 데이터 타입 간의 형 변환 (타입 변환)

– 어떤 데이터타입이 다른 데이터타입으로 변환되는 것.
기본 데이터타입 중 boolean타입을 제외한 나머지 타입간의 변환.

 

1.   자동 형변환

2.   강제 형변환 

 

 

 

 

 

 

 

▶   자바 데이터타입 크기 관계


byte   <   short   <   int   <   long   <   float   <   double
(        char        )

→   왜 long(8byte)보다 float(4byte)가 더 클까?  
      예를 들어, 0~1사이의 정수값은 없으나 0.0~1.0사이의 실수값은 아주 많으므로 
      long(정수 타입)보다 float(실수 타입)이 더 큰 값으로 취급됨.

 

 

 

 

 

 

 

▶   자동 형변환 ( = 묵시적 형변환)

–  작은 데이터타입의 데이터를 큰 데이터타입으로 변환하는 것.
–  아무런 문제가 생기지 않으므로 개발자가 신경쓸 필요 없이 자바 컴파일에 의해 자동으로 형변환이 일어남. 
–  정수 타입보다 실수 타입이 무조건 큰 타입으로 취급되기 때문에,
   메모리 크기가 long이 float보다 더 크더라도 float타입이 큼.
    ex  )   byte → int,   int → long,   long → float 등


EX   )   short → int

int a1 = 2000;		// 큰 데이터타입 	int   = 4byte
short a2 = 1000;	// 작은 데이터타입	short = 2byte

→   int타입의 변수 a1에 '2000'의 값을 저장하고, short타입의 변수 a2에 '1000'의 값을 저장함.

→   int타입이 short타입보다 큰 데이터타입.

 

a1 = a2;		// 작은 데이터타입 short → 큰 데이터타입 int

→   작은 데이터타입(short) 데이터를 큰 데이터타입(int)으로 이동.

→   컴파일러에 의해 자동으로 형변환이 일어나고, 변환 후에도 원본 데이터에는 아무런 영향이 없음.

→   int a1= short a2 원래는 타입에러 ( 4byte  > 2byte)
      그런데 오른쪽에껄 왼쪽에 넣는데 오른쪽공간이 더 커서 자바가 알아서 short를 int로 바꿔줌.

 

  변수에는 하나의 값만 들어감으로 a1에 원래 있던 2000은 사라지고 1000이 출력됨.

 

 

 

 

 

 

 

2.   강제 형변환 ( = 명시적 형변환) 

    ex   )   500ml용기에 강제로 1L를 넣는 것

 

–  큰 데이터타입의 데이터를 작은 데이터타입으로 변환하는 것.
–  작은 데이터타입 허용치보다 커서 Overflow(넘침)가 발생할 수 있기에 자바가 자동으로 형변환을 수행해주지 않음.
–  반드시 우변의 데이터 앞에 형변환 연산자를 사용하여 강제 형변환을 수행해야하며, 아래의 형식으로 지정함.


(좌변의 작은 데이터타입명) 우변의데이터

–  강제 형변환으로 인해 오류가 없어지더라도, 형변환 후의 데이터는 원본 데이터와 다를 수 있으나(= overflow)
    작은 데이터타입 허용치 이내의 데이터일 경우, 강제 형변환 후에도 원본 데이터가 유지 될 수 있음. 


EX   )   int → short  

int b1 = 9999999;	// 큰 데이터타입
short b2 = 32767;	// 작은 데이터타입

→   b1이 int형 큰 데이터타입, b2가 short형 작은 데이터타입.

 

b2 = b1;	// 오류 발생!

→  'Type mismatch: cannot convert from int to short' 오류 발생!  int타입을 short타입으로 변경할 수 없음!

      큰 데이터타입을 작은 데이터타입으로 이동할 때는 넘침(Overflow)의 위험성 때문에 자동으로 변환해주지 않음.    
→   개발자가 강제로 형변환 연산자를 사용하여 명시적 형변환(강제)을 수행해야 함.
      우변의 데이터 앞에 ()를 쓰고, 좌변의 작은 데이터타입을 명시해야 함.

 

b2 = (short)b1;

→   큰 데이터타입인 b1 앞에 (short)타입을 명시함으로써 강제 형변환을 수행함.

→   강제 형변환 후에는 Overflow에 의해 원본 데이터와 실제 변환되어 저장된 데이터가 다를 수 있음.

 

   b1 → b2 강제 형변환에는 성공했으나, 변환 후의 b2값이 뭔가 이상함.

     이는 '9999999'라는 값은 short타입의 범위에서 벗어나므로 Overflow에 의해 원본 데이터가 달라진 것.

     일단 이 부분에서는 여기까지만 이해하면 됨.

 

 

 

 

 

 

 

▸   정수 타입   ↔   실수 타입 변환


EX1   )   정수 타입 → 실수 타입   (자동 형변환)

→   변환전 d2의 값이 3.14가 아닌 3.140000으로 나오는 이유는 실수 표현법 때문이며,   

       3.140000 → 3.140000001도 3.14이기 때문에 실수 표현은 근사치값으로 나타남.

✓   d2 = d1은 double타입이 int타입보다 크므로 컴파일러에 의해 자동으로 변환됨.

 

 

EX2   )   실수 타입 → 정수 타입   (강제 형변환)

→   평범하게 e1 = e2를 하면 큰 데이타타입인 double이 작은 데이터타입인 int로 변환 할 수 없기에 오류 발생함.

→   double타입인 e2 앞에 (int)를 붙여줌으로써 강제 형변환을 하고 출력함.

    e2의 원래 값은 3.14였으나 강제 형변환을 통해 int타입으로 만든 결과, 정수 3이 출력됨.

 

 

 

 

 

 

 

▸   char타입 byte&short 타입간의 관계

 

   •   byte타입 (1Byte = 8bit)    :   -128 ~ +127

   •   short타입(2Byte = 16bit)  :   -32768 ~ +32767
   •   char타입 (2Byte = 16bit)  :   0 ~ 65535

–   char타입은 문자 표현을 위해 양수로만 표현하므로 byte타입과 short타입에 비해 양수 표현 범위가 큼.
–   byte타입과 short타입은 음수까지 표현이 가능하므로 char타입에 비해서 음수 표현 범위가 큼.
     →   따라서 char타입과 byte 또는 short타입 양방향간에는 자동 형변환이 일어나지 않고 반드시 강제 형변환 필수!

 

 

EX   )

byte b = 100;
short s = 65;
		
char ch;

→   byte타입인 변수 b와 short타입인 변수 s를 만들고 char타입인 변수 ch는 초기화하지 않고 선언만 해둠.

 

 

1 )   byte타입   →   char타입으로 변환

ch = b;			// 오답	X		byte ↔ char 강제 형변환 필수
ch = (char)b;		// 정답	O		char타입으로 강제 형변환

 

2 )   char타입   →   byte타입으로 변환

b = ch;			// 오답			byte ↔ char 강제 형변환 필수
b = (byte)ch;		// 정답 O		byte타입으로 강제 형변환

 

3 )   short타입   →   char타입으로 변환

ch = s;			// 오답 X		short ↔ char 강제 형변환 필수
ch = (char)s;		// 정답 O		char타입으로 강제 형변환

 

4   )   char타입   →   short타입

s = ch;			// 오답 X		char ↔ short 강제 형변환 필수
s = (short)ch;		// 정답O		short타입으로 강제 형변환

 

 

 

 

 


 

 

 

comment

오늘의 목표 끄읏~~~~~~~~~~!!!!!
딱 데이터타입까지만 정리하고 자려고 했는데 생각보다 시간이 많이 걸렸다ㅠ
막상 공부했을 때는 바로바로 이해하고 쉽게 넘어갔었는데
풀어서 이론적으로 설명하려니 어렵다ㅠㅜㅜ흠ㅠ
아무쪼록 블로그를 방문한 모든 사람들과 미래의 나에게 도움이 되는 정보이길❤️