◻️ DAY-04
◻️ 형 변환이란?
- 정수와 실수는 표현되는 방식이 전혀 다르다, 따라서 정수와 실수를 더할 때 그대로 연산을 수행할 수 없다.
- 하나의 자료형으로 통일한 후 연산을 해야 하는데, 이 때
형 변환(type conversion)
이 일어난다. - 형 변환이란 아래와 같이 각 변수의 자료형이 다를 때 자료형을 같게 바꾸는 것을 말한다.
1
2
| int n = 10; // int형 변수 n에 값 10을 대입
double dnum = n; // int형 변수 n의 값을 double 형 변수 dnum에 대입
|
묵시적 형 변환
- 바이트 크기가 작은 자료형에서 큰 자료형으로의 형 변환은 자동으로 이루어진다.
- 덜 정밀한 자료형에서 더 정밀한 자료형으로의 형 변환은 자동으로 이루어진다.
- [ 정수
byte(1바이트)
➡ short(2바이트)
, char(2바이트)
➡ int(4바이트)
➡ long(8바이트)
] ➡ [ 실수 float(4바이트)
➡ double(8바이트)
] - 위 상황과 반대로 형 변환을 하려면 강제로 변환해야 한다. (명시적 형 변환)
long
형이 8바이트
이고 float
형이 4바이트
인데 자동 형 변환이 되는 것은, 실수가 정수보다 표현 범위가 넓고 정밀하기 때문이다.
1
2
| int iNum = 20;
float fNum2 = iNum;
|
int
와 float
처럼 두 변수의 바이트 크기가 같더라도, 데이터를 더 정밀하게 표현할 수 있는 float
으로 변환된다.
1
2
3
| byte bNum = 10;
int iNum = bNum; // byte 형 변수 bNum 값을 int 형 변수 iNum에 대입한다
// byte 보다 큰 자료형 int로 자동으로 형변환됨
|
묵시적 형 변환 실습
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| /*
* Date: 2021-05-10
* Author: 이오니
* Project: [자바 초보탈출 30일]
* Section: 04일차
* Subject: "형 변환(Type Conversion)_(1)"
*/
/* 자동 형 변환(묵시적 형 변환)의 조건
1) 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환 자동
2) 덜 정밀한 자료형에서 더 정밀한 자료형으로 형 변환 자동
*/
package section_02.type_conversion1;
public class type_conversion1_0 {
public static void main(String[] args) {
byte bNum = 10;
int iNum2 = bNum; // byte 형 값이 int형 변수로 대입된 상황
// byte보다 int의 바이트 크기가 크므로 자동으로 형 변환이 이루어진다
System.out.println(iNum2);
System.out.println(bNum);
int iNum = 20;
float fNum = iNum; // int형 값이 float 형 변수로 대입된 상황
System.out.println(iNum); // int와 float의 바이트 크기는 동일하지만 float이 더 정밀한 자료형이므로 자동으로 형 변환이 이루어진다
System.out.println(fNum);
}
}
|
명시적 형 변환 실습
👀 명시적 형 변환의 조건
- 크기가 큰 바이트에서 작은 바이트로 대입하는 경우 강제로 명시적 형 변환을 해야 한다
- 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우 강제로 명시적 형 변환을 해야 한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| /*
* Date: 2021-05-10
* Author: 이오니
* Project: [자바 초보탈출 30일]
* Section: 04일차
* Subject: "형 변환(Type Conversion)_(2)"
*/
/* 명시적 형 변환의 조건(묵시적 형 변환의 반대 개념)
1) 바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우, 강제 형 변환 필요
2) 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우, 강제 형 변환 필요
*/
package section_02.type_conversion1;
public class type_conversion1_1 {
public static void main(String[] args) {
int iNum = 10;
byte bNum = (byte)iNum; // 강제로 형을 변환하려면, 변환할 형을 괄호로 명시해야 함
System.out.println(iNum);
System.out.println(bNum);
double dNum = 3.14;
int iNum3 = (int)dNum; // 실수 자료형 double을 정수자료형 int로 변환 (이 경우, 소수점 이하 부분은 생략되고 정수부분만 대입됨)
System.out.println(dNum);
System.out.println(iNum3);
}
}
|
연산 중 형 변환 실습
👀 연산 중 형 변환에서 주의해야 할 점은, 형 변환이 이루어지는 시점에 따라 결과값이 다르게 나타날 수 있다는 점이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| /*
* Date: 2021-05-10
* Author: 이오니
* Project: [자바 초보탈출 30일]
* Section: 04일차
* Subject: "형 변환(Type Conversion)_(3)"
*/
// 연산 중 형 변환
package section_02.type_conversion1;
public class type_conversion1_2 {
public static void main(String[] args) {
double dNum1 = 1.2;
float fNum2 = 0.9F;
int iNum3 = (int)dNum1 + (int)fNum2; // 두 실수가 각각 int로 형 변환되어 더해짐 (1 + 0 = 1)
int iNum4 = (int)(dNum1 + fNum2); // 두 실수의 합이 먼저 계산된 후 int로 형 변환 (1.2 + 0.9 = 2.1 = 2)
// 이처럼 형 변환이 언제 이루어지냐에 따라 그 결과 값이 다르게 나타날 수 있다.
System.out.println(iNum3);
System.out.println(iNum4);
}
}
|
1분 복습!
Q. 주석 내용에 맞게 코드를 완성하세요
1
2
3
4
5
6
7
8
9
| public class characterEx1 {
public static void main(String[] args) {
char ch1 = 'A';
System.out.println((int)ch1); // 문자에 해당하는 정수 값(ASCII) 출력
int ch2 = 67;
System.out.println((char)ch2); // 정수 값(ASCII)에 해당하는 문자 출력
}
}
|
Quiz
Q1. 바이트 크기가 작은 자료형을 더 큰 자료형으로 대입하는 형 변환은 자동으로 이루어진다 (예/아니오) > 예
Q2. 실수를 정수형 변수에 대입하는 경우 형 변환이 자동으로 이루어지고, 소수점 이하 부분만 없어진다 (예/아니오) > 아니오(더 정밀한 자료형을 덜 정밀한 자료형에 대입하는 경우, 강제 형 변환(명시적 변환)이 요구된다)
Q3. 더 많은 실수를 표현하기 위해 가수부와 지수부로 비트를 나누어 표현하는 방식을 (__) 라고 한다 > 부동 소수점 방식
Q4. 변수 두 개를 선언해서 10과 2.0을 대입하고 두 변수의 사칙 연산 결과를 정수로 출력해 볼 것
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/*
* Q. 변수 두 개를 선언해서 10과 2.0을 대입하고 두 변수의 사칙 연산 결과를 정수로 출력해볼 것
* Ref: Do it! 자바 프로그래밍 입문 69p 연습문제 Q4
*/
package section_02.type_conversion1;
public class type_conversion1_3 {
public static void main(String[] args) {
int iNum5 = 10;
float fNum5 = 2.0F;
int iSum = (int)iNum5 + (int)fNum5;
int iSub = (int)iNum5 - (int)fNum5;
int iDiv = (int)iNum5 / (int)fNum5;
int iTime = (int)iNum5 * (int)fNum5;
System.out.println(iSum);
System.out.println(iSub);
System.out.println(iDiv);
System.out.println(iTime);
}
}
|
Q5. ‘글’ 이라는 한글 문자의 유니코드 값을 찾아서 cahr 형으로 선언한 변수에 저장한 뒤 그 변수를 출력하여 확인해 볼 것 ASCII 코드 변환표.pdf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| /*
* Q. '글' 이라는 한글 문자의 유니코드 값을 찾아서 char 형으로 선언한 변수에 저장한 뒤 그 변수를 출력하여 확인해 볼 것
* Ref: Do it! 자바 프로그래밍 입문 69p 연습문제 Q5
* ASCII Ref: http://unicode.org/charts/PDF/UAC00.pdf
*/
package section_02.type_conversion1;
public class type_conversion1_4 {
public static void main(String[] args) {
char ch1 = '\uAE00'; // 작성방법: \(백슬래시)u + 해당 아스키코드
System.out.println(ch1);
}
}
|