고래씌
[JAVA] 2. 자료형 변환, printf 문 본문
1. 형 변환
1) 형 변환 : 값의 자료형을 바꾸는 개념
2) 컴퓨터상에서 값 처리 규칙
2-1. 대입연산자(=) 기준으로 왼쪽과 오른쪽은 같은 자료형이어야함. 즉, 같은 자료형에 해당하는 값만 대입이 가능하다.
만약, 다른 자료형의 값을 대입하고자한다면 "형변환"이라는 과정이 필수다.
[표현법]
자료형 변수형 = (바꿀 자료형) 값;
2-2. 같은 자료형끼리만 연산이 가능하다. => 즉, 다른 자료형끼리 연산을 수행하고 싶으면 한 구문은 "형변환"을 해야함
[표현법]
값 + (바꿀자료형) 값
<형변환의 종류>
1) (암시적)자동형변환 => 자동으로 형변환이 진행되는 케이스로 내가 직접 형변환할 필요가 없다.
작은바이트의 자료형 -> 큰바이트의 자료형으로 변환시 발생
2) (묵시적)강제형변환 => 자동형변환이 되지 않아 내가 직접 강제로 형변환을 해야하는 케이스.
큰바이트의 자료형 -> 작은바이트의 자료형 바꿀 때 발생
(바꿀 자료형) == 형변환 연산자 == cast 연산자라고 불림
※ boolean은 형변환 불가
※ 특이케이스 long(8byte) -> float(4byte)
정수가 실수로 담길때에는 큰 사이즈의 정수여도 작은 사이즈의 실수 변수에 대입 가능.
4byte의 float 자료형이 long 자료형보다 표현할 수 있는 값의 범위가 훨씬 더 크기 때문
※ 특이케이스 char(2byte) <-> int(4byte) : 양방향 형변환 가능
char ch = 65; // ASCII 코드 => 'A' 출력됨
System.out.println("ch : " + ch); => 출력값 ch : A
☞ char의 범위 0~65xxx : 각 문자마다 고유의 10진수값(정수값)이 정해져있다.
따라서 정해진 표를 통해 양방향 변환이 가능하다. (단, 음수값 제시시 오류발생)
* 참고 : 아스키코드(0~127, 영문자 대소문자, 숫자, 특수문자)
* 유니코드(0 ~ 65xxx, 영어 숫자특수문자, 한글, 한자 등등)
※ 특이케이스 byte와 short간의 연산(강제형 변환)
byte b1 = 1;
byte b2 = 2;
☞ byte로 연산시 연산결과의 정수값은 무조건 int로 취급한다!!! 따라서, 강제형변환이 필요하다
☞ byte b3 = b1+b2; => 에러 발생. byte 간에 연산이지만 연산결과는 int로 나옴.
byte b3 = (byte)(b1+b2) => O (강제형 변환)
package com.kh.variable;
public class C_Cast {
// 자동형변환 : 작은바이트의 자료형이 큰바이트의 자료형으로 형변환되는 케이스
public void autoCasting() {
//1. int(4byte)-> double(8byte)
int il = 10;
double dl = il; //자동형변환
System.out.println("dl :" + dl); // 10.0
int l2 = 12;
double d2 = 3.3;
double result = /* (double) */ l2 + d2; // 12.0 + 3.3 => 15.3
System.out.println("result : " + result);
//2. int(4byte) -> long(8byte)
int i3 = 1000;
long l3 = /* (long) */ i3;
System.out.println("l3 : " + l3);
long l4 = 2000L; // L을 붙이지 않아도 되는 이유 ? 자동형변환이 가능하기 때문
//3. 특이케이스 long(8byte) -> Float(4byte)
/*
* 정수가 실수로 담길때에는 큰사이즈의 정수여도 작은사이즈의 실수변수에 대입 가능
* 4byte의 float자료형이 long 자료형보다 표현할 수 있는 값의 범위가 훨씬 더 크기 때문
*/
long l5 = 10000000000L;
float f5 = /* (float) */ l5;
System.out.println("f5 : " + f5);
//4. 특이케이스 char(2byte) <-> int(4byte) : 양방향 형변환 가능
char ch = 65; // ASCII 코드 => 'A' 출력됨
System.out.println("ch : " + ch);
int num = 'A';
System.out.println("num : " + num); // ASCII 코드 => 65 출력됨
/*
* char의 범위 0~65xxx : 각 문자마다 고유의 10진수값(정수값)이 정해져있다.
* 따라서 정해진 표를 통해 양방향 변환이 가능하다. (단, 음수값 제시시 오류발생)
* 참고 : 아스키코드(0~127, 영문자 대소문자, 숫자, 특수문자)
* 유니코드(0 ~ 65xxx, 영어 숫자특수문자, 한글, 한자 등등)
*/
System.out.println((int)'경');
char sum = 'A' + 10; // 65 + 10
//5. 특이케이스 : byte와 short간의 연산(강제형 변환)
byte b1 = 1;
byte b2 = 10;
// byte로 연산시 연산결과의 정수값은 무조건 int로 취급한다!!!!! 따라서, 강제형변환 시켜줘야함!!!!!
// byte b3 = b1+b2; =>에러 발생함. byte간에 연산이지만 연산결과는 int로 나온다!
byte b3 = (byte)(b1+b2);
}
<강제(명시적)형변환 : 큰 크기의 자료형을 작은 크기의 자료형으로 형변환 할 경우>
public void forceCasting() {
//1. double(8byte) -> float(4byte)
float f1 = 4.0f; // 반드시 f 붙여줘야함
double d2 = 8.0;
float f2 = (float) d2;
//2. double(8byte) -> int(4byte)
double d3 = 10.89;
int i3 = (int) d3; // 10.89 -> 10 (소수점 제거)
System.out.println("i3 : " + i3);
int iNum = 10;
double dNum = 5.89;
//1. 연산결과를 int형으로 맞춰서 강제형변환시키기
// double iSum = iNum + dNum; // => int 형이 나옴. 10.0 + 5.89 이지만, 결과는 int형으로 나와서 15 출력
System.out.println("iSum : " + iSum);
int iSum1 = (int)(iNum + dNum);
System.out.println("iSum1 : " + iSum1);
int iSum2 = iNum + (int) dNum; // 10 + 5 => 15
// 실수값을 정수형으로 강제형변환 할때는 데이터손실이 무조건 발생한다!!!
/* 데이터 손실 테스트 */
int iNum2 = 290;
byte bNum2 = (byte)iNum2;
System.out.println("bNum2 : " + bNum2);
}
2. prinf 문
- System.out.println("출력하고자 하는 값") => 값을 출력 + 줄바꿈 처리
- System.out.print("출력하고자 하는 값") => 값을 출력
- System.out.printf("출력하고자 하는 형식", 출력하고자 하는 값, 출력하고자 하는값,...);
=> f 는 format(형식)을 의미
=> 형식에 맞춰서 값들이 출력된다.
=> 문자열 안에 출력하고자 하는 값들을 다음과 같은 미리 위치를 잡아줘야 한다.
- %d : 정수
- %f : 실수
- %c : 문자
- %s : 문자열
package com.kh.variable;
public class D_Printf {
public void printFtest() {
// 정수테스트
int iNum1 = 10;
int iNum2 = 20;
// iNum1 : xx, iNum2 : xx를 출력
//1. println문 사용
System.out.println("iNum1 : " + iNum1 + ", iNum2 : " + iNum2);
//2. printf문 사용 => 정수값의 형식인 %d를 사용해서 완성. 줄바꿈 기능이 없기 때문에 직접 개행문자 추가할 것
System.out.printf("iNum1 : %d, iNum2 : %d\n", iNum1, iNum2);
// 10 + 20 =30을 출력해보기
//1. println문 사용해서 출력
System.out.println(iNum1 + " + " + iNum2+"=" +(iNum1+iNum2));
//2. printf문 사용해서 출력
System.out.printf("%d + %d = %d\n", iNum1, iNum2, iNum1+iNum2);
System.out.printf("%5d\n", iNum1); // %5d : 5칸의 공간중 오른쪽 정렬
System.out.printf("%-5d\n", iNum1); //%-5d : 5칸의 공간중 왼쪽 정렬
// 실수 테스트
double dNum = 4.27546789;
System.out.printf("dNum : %f\n", dNum);
// %f : 소수점 아래 7번째 줄에서 반올림되어 소수점아래 6번째값까지만 출력됨(기본값)
System.out.printf("dNum : %.1f\n", dNum);
// %.1f : 소수점 아래 2번째에서 반올림하여 소수점 아래 1번째까지만 출력해라는 의미
// 문자와 문자열 테스트
char ch = 'a';
String str = "Hello";
System.out.printf("%c %s \n", ch, str);
System.out.printf("%C %S \n", ch, str); // ctrl + shift + x/y => 대문자/소문자 변환 시킴
// ↑ 무조건 대문자 출력됨
3. printf문 특징
- printf : 포맷한번으로 가독성좋게 출력이 가능. 단, 지정한 포맷의 갯수와 종류, 뒤에 오는 변수의 갯수와 종류가 정확하게 일치해야함
4-1. 실습1
Q. 실수형으로 국어, 영어 수학 세 과목의 점수를 입력 받아 총점과 평균을 출력하세요. 이때 총점과 평균은 정수형으로 처리하세요.
package com.kh.practice2.func;
import java.util.Scanner;
public class CastingPractice {
public void test1() {
Scanner sc = new Scanner(System.in);
System.out.print("국어 : ");
double korean = sc.nextDouble();
System.out.print("영어 : ");
double english = sc.nextDouble();
System.out.print("수학 : ");
double math = sc.nextDouble();
int allSum = (int)(korean + english + math);
System.out.println("총점 : " + allSum);
System.out.println("평균 : " + allSum / 3);
}
}
4-2. 실습2
package com.kh.practice2.func;
public class CastingPractice2 {
public void test2() {
int iNum1 = 10;
int iNum2 = 4;
float fNum = 3.0f;
double dNum = 2.5;
char ch = 'A';
System.out.println(iNum1/iNum2 ); // 2
System.out.println((int)dNum); // 2
System.out.println(iNum2 * dNum ); // 4*2.5 => 4.0* 2.5로 자동형변환되어 계산됨. 10.0
System.out.println((double)iNum1); // 10.0
System.out.println((double)iNum1 / iNum2); // 둘중 하나 형변환(실수로)하면 하나는 강제형변환(실수로)이 이루어짐. 2.5
System.out.println(dNum); // 2.5
System.out.println((int)fNum); // 3
System.out.println((int)(iNum1 / fNum)); // 3
System.out.println(iNum1 / fNum); // 3.3333333
System.out.println((double) iNum1 / fNum); // 3.3333333333333335
System.out.println(ch); // 'A'
System.out.println((int)ch); // 65
System.out.println(ch + iNum1 ); // 75
System.out.println((char)(ch + iNum1)); // 'K'
}
}
'JAVA > JAVA 기초' 카테고리의 다른 글
[JAVA] 4. 제어문(if) (0) | 2023.10.04 |
---|---|
[JAVA] 3. 연산자(산술연산자, 증감연산자, 복합연산자, 논리부정연산자, 비교연산자, 논리연산자, 삼항연산자) (0) | 2023.10.04 |
[JAVA] 1-3. Scanner 클래스 (0) | 2023.09.27 |
[JAVA] 1-2. 변수 (0) | 2023.09.26 |
[JAVA] 1-1. 메소드 (0) | 2023.09.26 |