-
Java | Casting 형변환JAVA/JAVA 2020. 1. 16. 21:41
Casting 형변환
데이터를 변수에 저장하거나 연산 중간에 데이터의 자료형을 변환하는 것
객체 형변환과 연관(Swing)
종류
- 자동 형변환(묵시적)
- 바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우
ex) byte → short - 덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는 경우
ex) int → float, float는 실수값을 표현하기 때문에 int보다 더 정밀함 - 서로 다른 자료형을 가진 데이터들이 연산될 경우
저장 공간이 더 큰 자료형으로 자동 형변환 - 단점 : 메모리 낭비가 심함
- 바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우
- 강제 형변환(명시적) : 변수 앞에 형변환 연산자 작성
- 바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우
- 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우
- 서로 다른 자료형을 가진 데이터들을 연산하는 경우
바이트 크기가 더 작은 자료형을 가진 변수에 저장하기 위해서는
강제 형변환으로 자료형을 맞춰 주어야 함 - 단점 : 강제로 자료형을 변경하다보니 데이터 손실이 발생할 수 있음
ex 1) int i = (int)3.5; → 0.5가 탈락되고 3만 저장됨
ex 2) int iNum = 1000;
byte bNum = (byte)iNum;
1000이 byte 저장 용량을 초과해 데이터 손실이 발생하기 때문에
대입된 값 -24가 저장됨
※ boolean은 형변환에서 사용하지 않음
형변환 연산자
(dataType) : 괄호 안에 형변환을 원하는 자료형을 작성하면 됨
ex) (int), (char), (float),,,
사용례_자동 형변환
public class Op5Cast { public static void main(String[] args) { // 자동 형변환 // 1. 데이터를 그보다 큰 자료형에 저장 short s = 12; // 2진수로 저장됨 | short에 저장된 12의 경우 00000000 00001100 int i = s; // 00000000 00000000 00000000 00001100 → 메모리 낭비가 심해짐 // 2. 서로 다른 자료형이 연산될 경우 char c = 'A'; int n = c + 1; /* char(2byte) + int(4byte) → int(4byte) + int(4byte) int 저장 공간이 더 크기 때문에 int 자료형으로 저장해야함 */ System.out.println("n :" + n); // n: 66 int x = 123; float y = x + 12.3f; // int + float → float + float → float System.out.println("y: " + y); // y: 135.3 byte s2 = 12; short s3 = 45; int re = s2 + s3; /* 산술연산자 사용시 s2와 s3가 int로 자동 형변환되기 때문에 변수의 자료형으로 int를 사용해야함 */ System.out.println("re: " + re); // re: 57 } }
사용례_강제 형변환
public class Op5Cast { public static void main(String[] args) { char c = 'A'; int n = c + 1; System.out.println("(char)n:" + (char)n); // (char)n: B // 변수 n의 자료형을 강제로 int에서 char로 형변환해서 출력 byte s2 = 12; short s3 = 45; short re2 = (short) (s2 + s3); /* s2, s3가 연산 과정에서 int로 작동하기 때문에 괄호로 묶어 연산을 먼저 실행한 뒤에 (short)를 작성해주어야 함, int -> short */ System.out.println("re2: " + re2); // re2: 57 } }
사용례_System.out.printf() 활용 (1)
System.out.printf() : 문자열에 양식을 지정해서 출력하는 함수
형식) printf("출력문자열, 출력양식", 출력대상,,,)
출력양식 기호 : %d(정수값), %c(문자), %s(문자열), %f(소수점)
※ 출력양식 기호와 출력대상이 1:1로 대응하기 때문에 개수가 같아야 함public class Op6Cast2 { public static void main(String[] args) { int num1 = 20, num2 = 30; System.out.printf("첫 번째 숫자=%d, 두 번째 숫자=%d", num1, num2); // 첫 번째 숫자=20, 두 번째 숫자=30 System.out.println(); // 줄바꿈 System.out.print('\n'); // 줄바꿈 특수기호 사용 char ch = 'A'; System.out.println("ch: "+ch); // ch: A // println은 내부에 저장된 ASCII 값을 문자로 변환해서 출력 System.out.printf("문자 %c의 ASCII 값 : %d\n", ch, (int) ch); // 문자 A의 ASCII 값 : 65 /* printf의 %d는 숫자를 그대로 출력하기 때문에 ch를 int로 형변환 해주어야 함 */ int ch2 = ch; // ch에 담겨있던 문자의 ASCII 코드 값이 정수로 ch2에 저장됨 System.out.println("ch2: "+ch2); // ch2: 65 } }
사용례_System.out.printf() 활용 (2)
public class Op6Cast2 { public static void main(String[] args) { int java = 90, jsp = 85, oracle = 70; int sum = java + jsp + oracle; System.out.printf("sum=%d입니다.\n", sum); int avg = sum/3; double avg2 = sum/3; System.out.println("avg: "+avg+", avg2: "+avg2); // avg: 81, avg2: 81.0 /* avg2: sum/3 에서 int로 변환돼서 계산된 뒤에 double에 저장되기 때문에 81.0으로 출력됨 */ double avg3 = (double)sum/3; System.out.println("avg3: "+avg3); // avg3: 81.66666666666667 // sum/3 계산시에 sum을 double로 형변환 해주어야 소수점까지 저장됨 System.out.printf("avg3: %.2f", avg3); /* avg3: 81.67, %f로 출력될 소수점 자리수 설정 형식) "%.소수점자리수f" */ } }
자료형이 철저하게 정해져있는 Java에서는 서로 다른 자료형의 연산이나 저장시에
자료형을 바꿔주어야 하는 경우가 생기기 때문에 형변환에 대해서는 꼭 알고 있어야 합니다.'JAVA > JAVA' 카테고리의 다른 글
Java | Switch~Case 선택문 추가 (0) 2020.01.17 Java | 제어문_조건문, 선택문 (0) 2020.01.16 Java | Operator 연산자 (0) 2020.01.16 Java | Data Type 자료형 (0) 2020.01.15 Java | Variable 변수, Scope, Constant 상수 (0) 2020.01.15 - 자동 형변환(묵시적)