[22.10.28] 7일차 [백엔드] Java 형변환

W·2022년 10월 28일
0

국비

목록 보기
13/119
  • 기본자료형 : 기억장소 값을 저장
  • 참조형 : 기억장소 주소를 저장
    String 참조형, 문자열 관련
    "" 큰따옴표 안에 문자 1개 이상 ~
String str="안녕";
System.out.println("문자출력 :" + 100);
System.out.println("문자출력 :" + str);
System.out.println("문자출력 :" + "하다");
  • 이스케이프 문자 줄바꿈(\n), 탭(\t)
    다음줄 이동 \n
    탭만큼 이동 \n
    "" 모양 출력 \"
    \ 모양 출력 \
System.out.println("\"출력\"");
System.out.println("\'A\'");
System.out.println("\\A\\");
  • 예제) Hello 다음줄
    "Java" 탭 \programming
✍ 입력
System.out.println("Hello\n\"Java\"\t\\programming");

🧾 출력 
Hello
"Java"	\programming

🎈 형변환, 타입 변환

자바의 기본 데이터 타입을 변환
boolean타입을 제외한 기본 데이터 타입 간의 변환
정수와 실수 연산 → 연산 수행 안됨
하나의 자료형으로 통일한 후 연산

1. 묵시적 형변환(자동 형변환)

작은 데이터 타입 큰 데이터 타입으로 변환
형변환을 명시적으로 하지 않음
수형 변수에 정수형 변수값을 저장 // 자동으로 형변환
실수 = 정수, 큰 데이터 타입 변수 = 작은 데이터 타입변수
byte → short(char) → int → long → float → double
실수형은 정수형보다 무조건 큰 타입

int n = 10;
double d = n;
System.out.println(d); // 출력 10.0

byte a1 =10;
short a2=256;
a2=a1; // 오른쪽 값이 왼쪽 형식으로 넘어가는듯?
System.out.println(a2); // 출력 : 10

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

큰 데이터 타입 → 작은 데이터 타입으로 변환
형변환 연산을 사용해서 강제적으로 형변환
강제적으로 형변환시 기존 데이터가 아닌 다른 데이터 저장
작은 데이터 타입 = (작은 데이터 타입) 큰 데이터 타입

double d2 = 3.4;
int n2 = (int)d2; //(int)형변환 연산
System.out.println(n2); // 3으로 출력
byte b1=10;
short b2=256;
b1=(byte)b2; 
//(byte)형변환 연산 기억장소 범위 넘어감 → overflow
System.out.println(b1); // 관련없는 0으로 출력
int i=100;
float f=i; // 묵시적 형변환
System.out.println(f); // 100.0
// long 8byte, float 4byte
// 실수형은 정수형보다 무조건 큰 타입으로 취급
long l=83983L; // long은 8byte지만 정수형이다
float f2=l; // float는 4byte지만 실수형이라 범위가 더 넓다.
System.out.println(f2); // 23983.0 [묵시적 형변환]

float f3=3.14f;
long l2= (long)f3;
System.out.println(l2); // 3

byte(1), short(2) <-> char(2) 형변환

char = byte
byte, short 타입의 음수 범위가 char 타입(양수만 가능)보다 크므로 자동 형변환 불가능 (명시적 형변환 해야 됨)

char ch=65;
short sh=65;
byte by=65;
ch = (char)by;
System.out.println(ch); // A

ch = (char)sh;
System.out.println(ch); // A

형이 맞지 않으면 자동 형변환 불가능

by=(byte)ch;	
System.out.println(by); // 65
sh=(short)ch;
System.out.println(sh); // 65

int(큰)4byte = char(작은)2byte 자동으로 형변환

int i1 = ch;
System.out.println(i1); //65

long(큰) = int(작은) 자동으로 형변환

int i2=1234;
long l22=i2;

int(작은) = long(큰) 명시적으로 형변환

i2=(int)l22;
long l3=10000000000L;
int i3=(int)l3;
System.out.println(i3); // 범위가 넘어가서 오버플로 발생  
// 출력 1410065408
  • 주의사항
    float = double 자동 형변환
    근사치 표현에 의해 정상적인 데이터가 아닌 데이터 전달
    부족한 자릿수를 채울 때 근사치 표현에 의해 이상한 값 추가 오버플로우
float f5 =1.1f;
double d5=f5;
System.out.println(d5); //1.100000023841858

연산 과정에서 자동 형변환

연산을 수행할 때 데이터 타입을 일치 시킨 후 연산을 수행(자동으로 형변환)

  1. int 타입보다 작은 타입끼리 연산 → int 변환 연산
  2. int 타입보다 큰 타입 연산 → 큰 타입 변환 연산
byte b1=10, b2=20,b3;
System.out.println(b1+b2); // 30
// b1+b2 → byte+byte → int
// byte=(byte)int 명시적 형변환
b3=(byte)(b1+b2); // 30
  1. char형 int형 연산
char ch='A'; // 65
// ch+3 → char + int → int (자동)
System.out.println(ch+3); // 68
char ch2=(char)(ch+3); (명시적)
System.out.println(ch2); // D
  1. int형 long형 연산
int i1=100;
long l1=200L;
// int+long => long
System.out.println(i1+l1);
int i2=(int)(i1+l1);
System.out.println(i2);
  1. float형 double형 연산
float f2=0.1f;
double d2=0.1;
// float + double => double 
// 0.20000000149011612 근사치 표현 -> 잘못된 결과
System.out.println(f2+d2);
// double -> float 강제적으로 변환 후 연산
System.out.println(f2+(float)d2); // 0.2

리터럴끼리의 연산은 형변환 발생하지 않는다.

byte b5=100+20;
//  byte b6=100+30; 범위 넘어감
byte b6=(byte)(100+30);
System.out.println(b6); // -126(오버플로우)

double형 float형 연산후 int형으로 변환하기

double d5=1.2;
float f5=0.9F;
int i5= (int)d5 + (int)f5;
int i6= (int)(d5+f5);
System.out.println(i5); // 1
System.out.println(i6); // 2

char형 int형 형변환하기

char ch1 = 'A';
System.out.println((int)ch1); //65
int ch3 = 67;
System.out.println((char)ch3); //C

연습문제) 변수 두 개를 선언해서 10과 2.0을 대입하고 두 변수의 사칙 연산 결과를 정수로 출력해보세요.

int i7=10;
double d1 = 2.0;
int i8 = (int)(i7+d1);
System.out.println(i8); // 더하기 12
int i9 = (int)(i7-d1);
System.out.println(i9); // 빼기 8
int i10 = (int)(i7*d1);
System.out.println(i10); // 곱하기 20
int i11 = (int)(i7/d1);
System.out.println(i11); // 나누기 5

연습문제) '글'이라는 한글 문자의유니코드 값을 찾아서 char형으로 선언한 변수에 저장한 뒤 그 변수를 출력하여 확인해 보세요.

char ch4 ='\uAE00';
System.out.println(ch4); // 글

0개의 댓글