[자바 무료 강의] 형 변환 - 코드라떼
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의형 변환최종수정일 2021-11-21
아이콘약 5분

자바의 형 변환에 대해서 알아봅시다. 자바의 형 변환은 암시적 형변환과 명시적 형 변환이 있는데요. 변수의 메모리 공간이 한정되어 있기 때문에 리터럴 값이 변수에 저장될 때 특정한 상황에서는 형 변환이 발생합니다. 그럼 자바의 형 변환에 대해서 알아봅시다.

추가 노트

목차


  1. 형 변환

  2. [실습해보기] 형 변환을 느껴보자

1. 형 변환


형 변환은 기존의 자료형에서 다른 자료형으로 변환하는 것을 형 변환이라고 합니다.

byte a = 32;

// 1 byte로 저장된 값을 2 byte로 변환
short b = a;

이러한 형 변환에는 암시적 형 변환(Implicit Conversion)과 명시적 형 변환(Explicit Conversion)이 있습니다.


1-1. 암시적 형 변환(Implicit Convercion)

암시적 형 변환은 직접 형 변환 접두사(구문)을 사용하지 않아도 자동적으로 형 변환되는 것을 말합니다.


정수의 암시적 형 변환

byte a = 32;

// 1 byte로 저장된 값을 2 byte로 변환
short b = a;

// 2 byte로 저장된 값을 4 byte로 변환
int c = b;

// 4 byte로 저장된 값을 8 byte로 변환
long d = c;

더 큰 범위의 자료형으로 변환하기 때문에 표현할 수 있는 값의 범위에 대한 제약이 없습니다.


실수의 암시적 형 변환

float a = 1.12F;

// 단정도(4byte)로 저장된 부동소수점을 배정도(8 byte)로 변환
double b = a;

자료형과 암시적 형 변환의 규칙

image 암시적 형 변환은 메모리 공간 크기를 기준으로 변환하지 않고 값의 표현 범위를 기준으로 변환됩니다. 정수만 표현할 수 있는 것 보단 정수와 실수를 둘다 표현 가능 한 것이 값의 표현 범위가 더 넓습니다.

그리고 실제로 단정도(4 byte) float는 int (4 byte) 보다 더 큰 정수를 표현할 수 있습니다.


1-2. 명시적 형 변환(Explicit Convercion)

암시적 형 변환은 직접 형 변환 접두사(구문)을 사용하지 않아도 자동적으로 형 변환되는 것을 말합니다. 명시적 형 변환은 데이터의 손실이 발생할 수 있다는 것을 인지하고 형 변환을 한다고 명시하는 것이기 때문에 명시적 형 변환이라고 합니다. 예시로 8 byte로 표현되는 1000억의 리터럴 값이 4 byte로 표현을 하려고 하면 데이터의 변질이 발생합니다.


명시적 형 변환 구문

[자료형] [변수명] = (자료형) [변수명 또는 리터럴];
int a = (int) 100000000000L;

long b = 1000;
int a = (int) b;

정수의 명시적 형 변환

long a = 100000;

// 8 byte로 저장된 값을 4 byte로 변환
// 다만 100000은 4 byte로 표현이 가능하기 때문에 손실이 없음
int b = (int) a;

// 4 byte로 저장된 값을 2 byte로 변환
// 다만 100000은 2 byte로 표현할 수 없기 때문에 데이터 손실 및 변질
short c = (short) b;

실수의 명시적 형 변환

double a = 1.42;

// 배정도(8byte)로 저장된 부동소수점을 단정도(4 byte)로 변환
float b = (float)a;

정수에서 실수로 명시적 형 변환

float a = 32.123F;

// 단정도(4 byte) 부동소수점을 정수로 변환
int b = (int)a;

// 변수 b에 실제로 저장된 값 : 32

정수에서 실수로 명시적 형 변환을 할 경우 int로 표현할 수 있는 정수의 범위를 넘지 않는 이상 일반적으론 정수부만 추출합니다. 그러나 표현할 수 있는 정수의 범위를 넘으면 데이터가 변질됩니다.


정수에서 실수로 명시적 형 변환(변질)

float a = 10000000000.0F;

// 단정도(4 byte) 부동소수점을 정수로 변환
int b = (int)a;

// 변수 b에 실제로 저장된 값 : 2147483647

a 변수는 int로 표현할 수 있는 정수의 값의 범위를 넘었기 때문에 int로 표현할 수 있는 최대 값인 2147483647를 저장합니다. 그러므로 데이터가 변질될 수 있을 가능성을 염두에 두어야 합니다.


1-3. 연산시 형 변환

연산 과정에서도 형 변환이 발생할 수 있습니다.

image

기본적으로 정수형 끼리의 산술 연산은 4 byte로 암시적 형 변환을 한 후 계산을 합니다.

image

정수와 실수의 산술 연산은 실수형으로 암시적 형 변환을 합니다. 실수의 값의 표현 범위가 더 넓기 때문입니다.


2. [실습해보기] 형 변환을 느껴보자


실습도구에 해당 코드를 작성해 봅시다


2-1. 정수의 암시적 형 변환

2-1-1. byte -> short

코드 작성

byte byteNum = 32;
short shortNum = byteNum;

System.out.println(shortNum);

출력

32

2-1-2. short -> int

코드 작성

short shortNum = 10000;
int intNum = shortNum;

System.out.println(intNum);

출력

10000

2-1-3. short -> long

코드 작성

short shortNum = 10000;
long longNum = shortNum;

System.out.println(longNum);

출력

10000

2-1-4. int -> double

코드 작성

int intNum = 26;
double doubleNum = intNum;

System.out.println(doubleNum);

출력

26.0

2-2. 정수의 명시적 형 변환

2-2-1. long -> int (무손실)

코드 작성

long longNum = 12345678;
int intNum = (int)longNum;

System.out.println(intNum);

출력

12345678

2-2-2. long -> int (손실 및 변질 발생)

코드 작성

long longNum = 10000000000L;
int intNum = (int)longNum;

System.out.println(intNum);

출력

1410065408

2-3. 실수의 암시적 형 변환

2-3-1. float -> double

코드 작성

float floatNum = 10.321F;
double doubleNum = floatNum;

System.out.println(doubleNum);

출력

10.321000099182129

2-4. 실수의 명시적 형 변환

2-4-1. double -> float

코드 작성

double doubleNum = 32.1234567891234;
float floatNum = (float)doubleNum;

System.out.println(floatNum);

출력

32.123455

2-4-2. float -> int

코드 작성

float floatNum = 32.1234F;
int intNum = (int)floatNum;

System.out.println(intNum);

출력

32

2-4-3. float -> int (손실 및 변질 발생)

코드 작성

float floatNum = 3212312312.0F;
int intNum = (int)floatNum;

System.out.println(intNum);

출력

2147483647
도전자 질문
아이콘규루규루(2022-01-18 20:58 작성됨)
형 변환 중에 byte > char로 변환이 불가능한 부분에 대해 언급하면 더 좋을 것 같습니다.
char은 음수값을 저장할 수 없기에,

byte a = -50;
char b = a;

위와 같은 코드를 컴파일하면 에러가 발생합니다.
아이콘코드라떼(2022-01-19 23:50 작성됨)
안녕하세요. 코드라떼입니다 :)

설명이 부족한 부분을 확인했습니다.

감사합니다 :)
아이콘resCogitans(2021-06-24 23:54 작성됨)
강의 45초 정도에 명시적 형변환 영어 표기 변경 필요합니다
아이콘코드라떼(2021-06-28 14:30 작성됨)
안녕하세요. 코드라떼입니다.

영상을 확인했습니다. 수정해서 다시 올리겠습니다.

확인해 주셔서 감사합니다^^

---------

2021-06-25일 자로 수정되었습니다.
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io
사업자등록번호 : 824-06-01921
통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호
파일
파일파일
Root
파일

Output
root$
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의형 변환최종수정일 2021-11-21
아이콘약 5분

자바의 형 변환에 대해서 알아봅시다. 자바의 형 변환은 암시적 형변환과 명시적 형 변환이 있는데요. 변수의 메모리 공간이 한정되어 있기 때문에 리터럴 값이 변수에 저장될 때 특정한 상황에서는 형 변환이 발생합니다. 그럼 자바의 형 변환에 대해서 알아봅시다.

추가 노트

목차


  1. 형 변환

  2. [실습해보기] 형 변환을 느껴보자

1. 형 변환


형 변환은 기존의 자료형에서 다른 자료형으로 변환하는 것을 형 변환이라고 합니다.

byte a = 32;

// 1 byte로 저장된 값을 2 byte로 변환
short b = a;

이러한 형 변환에는 암시적 형 변환(Implicit Conversion)과 명시적 형 변환(Explicit Conversion)이 있습니다.


1-1. 암시적 형 변환(Implicit Convercion)

암시적 형 변환은 직접 형 변환 접두사(구문)을 사용하지 않아도 자동적으로 형 변환되는 것을 말합니다.


정수의 암시적 형 변환

byte a = 32;

// 1 byte로 저장된 값을 2 byte로 변환
short b = a;

// 2 byte로 저장된 값을 4 byte로 변환
int c = b;

// 4 byte로 저장된 값을 8 byte로 변환
long d = c;

더 큰 범위의 자료형으로 변환하기 때문에 표현할 수 있는 값의 범위에 대한 제약이 없습니다.


실수의 암시적 형 변환

float a = 1.12F;

// 단정도(4byte)로 저장된 부동소수점을 배정도(8 byte)로 변환
double b = a;

자료형과 암시적 형 변환의 규칙

image 암시적 형 변환은 메모리 공간 크기를 기준으로 변환하지 않고 값의 표현 범위를 기준으로 변환됩니다. 정수만 표현할 수 있는 것 보단 정수와 실수를 둘다 표현 가능 한 것이 값의 표현 범위가 더 넓습니다.

그리고 실제로 단정도(4 byte) float는 int (4 byte) 보다 더 큰 정수를 표현할 수 있습니다.


1-2. 명시적 형 변환(Explicit Convercion)

암시적 형 변환은 직접 형 변환 접두사(구문)을 사용하지 않아도 자동적으로 형 변환되는 것을 말합니다. 명시적 형 변환은 데이터의 손실이 발생할 수 있다는 것을 인지하고 형 변환을 한다고 명시하는 것이기 때문에 명시적 형 변환이라고 합니다. 예시로 8 byte로 표현되는 1000억의 리터럴 값이 4 byte로 표현을 하려고 하면 데이터의 변질이 발생합니다.


명시적 형 변환 구문

[자료형] [변수명] = (자료형) [변수명 또는 리터럴];
int a = (int) 100000000000L;

long b = 1000;
int a = (int) b;

정수의 명시적 형 변환

long a = 100000;

// 8 byte로 저장된 값을 4 byte로 변환
// 다만 100000은 4 byte로 표현이 가능하기 때문에 손실이 없음
int b = (int) a;

// 4 byte로 저장된 값을 2 byte로 변환
// 다만 100000은 2 byte로 표현할 수 없기 때문에 데이터 손실 및 변질
short c = (short) b;

실수의 명시적 형 변환

double a = 1.42;

// 배정도(8byte)로 저장된 부동소수점을 단정도(4 byte)로 변환
float b = (float)a;

정수에서 실수로 명시적 형 변환

float a = 32.123F;

// 단정도(4 byte) 부동소수점을 정수로 변환
int b = (int)a;

// 변수 b에 실제로 저장된 값 : 32

정수에서 실수로 명시적 형 변환을 할 경우 int로 표현할 수 있는 정수의 범위를 넘지 않는 이상 일반적으론 정수부만 추출합니다. 그러나 표현할 수 있는 정수의 범위를 넘으면 데이터가 변질됩니다.


정수에서 실수로 명시적 형 변환(변질)

float a = 10000000000.0F;

// 단정도(4 byte) 부동소수점을 정수로 변환
int b = (int)a;

// 변수 b에 실제로 저장된 값 : 2147483647

a 변수는 int로 표현할 수 있는 정수의 값의 범위를 넘었기 때문에 int로 표현할 수 있는 최대 값인 2147483647를 저장합니다. 그러므로 데이터가 변질될 수 있을 가능성을 염두에 두어야 합니다.


1-3. 연산시 형 변환

연산 과정에서도 형 변환이 발생할 수 있습니다.

image

기본적으로 정수형 끼리의 산술 연산은 4 byte로 암시적 형 변환을 한 후 계산을 합니다.

image

정수와 실수의 산술 연산은 실수형으로 암시적 형 변환을 합니다. 실수의 값의 표현 범위가 더 넓기 때문입니다.


2. [실습해보기] 형 변환을 느껴보자


실습도구에 해당 코드를 작성해 봅시다


2-1. 정수의 암시적 형 변환

2-1-1. byte -> short

코드 작성

byte byteNum = 32;
short shortNum = byteNum;

System.out.println(shortNum);

출력

32

2-1-2. short -> int

코드 작성

short shortNum = 10000;
int intNum = shortNum;

System.out.println(intNum);

출력

10000

2-1-3. short -> long

코드 작성

short shortNum = 10000;
long longNum = shortNum;

System.out.println(longNum);

출력

10000

2-1-4. int -> double

코드 작성

int intNum = 26;
double doubleNum = intNum;

System.out.println(doubleNum);

출력

26.0

2-2. 정수의 명시적 형 변환

2-2-1. long -> int (무손실)

코드 작성

long longNum = 12345678;
int intNum = (int)longNum;

System.out.println(intNum);

출력

12345678

2-2-2. long -> int (손실 및 변질 발생)

코드 작성

long longNum = 10000000000L;
int intNum = (int)longNum;

System.out.println(intNum);

출력

1410065408

2-3. 실수의 암시적 형 변환

2-3-1. float -> double

코드 작성

float floatNum = 10.321F;
double doubleNum = floatNum;

System.out.println(doubleNum);

출력

10.321000099182129

2-4. 실수의 명시적 형 변환

2-4-1. double -> float

코드 작성

double doubleNum = 32.1234567891234;
float floatNum = (float)doubleNum;

System.out.println(floatNum);

출력

32.123455

2-4-2. float -> int

코드 작성

float floatNum = 32.1234F;
int intNum = (int)floatNum;

System.out.println(intNum);

출력

32

2-4-3. float -> int (손실 및 변질 발생)

코드 작성

float floatNum = 3212312312.0F;
int intNum = (int)floatNum;

System.out.println(intNum);

출력

2147483647
도전자 질문
아이콘규루규루(2022-01-18 20:58 작성됨)
형 변환 중에 byte > char로 변환이 불가능한 부분에 대해 언급하면 더 좋을 것 같습니다.
char은 음수값을 저장할 수 없기에,

byte a = -50;
char b = a;

위와 같은 코드를 컴파일하면 에러가 발생합니다.
아이콘코드라떼(2022-01-19 23:50 작성됨)
안녕하세요. 코드라떼입니다 :)

설명이 부족한 부분을 확인했습니다.

감사합니다 :)
아이콘resCogitans(2021-06-24 23:54 작성됨)
강의 45초 정도에 명시적 형변환 영어 표기 변경 필요합니다
아이콘코드라떼(2021-06-28 14:30 작성됨)
안녕하세요. 코드라떼입니다.

영상을 확인했습니다. 수정해서 다시 올리겠습니다.

확인해 주셔서 감사합니다^^

---------

2021-06-25일 자로 수정되었습니다.
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io|운영시간 09:00 - 18:00(평일)
사업자등록번호 : 824-06-01921|통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호(경기창조혁신센터)
파일
파일파일
Root
파일

Output
root$