: 데이터 타입을 다른 데이터 타입으로 변환하는 것
byte a = 10;
int b = a;
- 원래 10 byte 타입의 값이었으나, 복사해서 저장할 때 int 타입의 값으로 변환되었다
---> 타입변환
자동으로 타입변환이 일어나는 것 -> 자동 타입 변환(promotion)
=> 값의 허용범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생
- 자동 타입 변환은 프로그램 실행 도중에 자동으로 타입변환이 일어나는 것을 말함
기본 타입 - 허용 범위 크기순
byte < short < int < long < float< double
byte(1byte) --> short(2byte) --> int(4byte) --> long(8byte)
개미 병아리 강아지 사람
개미집 병아리집 강아지집 안방
float(4byte) --> double(8byte)
--> 정수타입은 실수타입으로 자동형변환이 발생한다.
char(2byte)
--> char타입은 int형으로 자동형변환이 발생한다.
큰 허용 범위 타입을 작은 허용 범위 타입으로 자동 타입 변환될 수 없지만 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것
강제 타입 변환은 캐스팅 연산자 괄호()
를 사용하는데 괄호 안에 들어가는 타입을 나누는 단위
작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입
큰 허용 범위 타입 -> 작은 허용타입 => 강제 타입 변환
(byte) 캐스팅 연산자를 사용해서 byte 타입으로 강제 변환할 수 있다
ex)
int intvalue = 10;
byte byteValue = (byte) intValue; //강제 타입 변환
소수점 이하 부분은 버려지고, 정수 부분만 저장
된다double doubleValue - 3.14;
int intValue = (int) doubleValue; //intValue는 정수 부분인 3만 저장
실수를 정수로 강제적으로 형변환하는 것을 말한다.
소수부는 무조건 절삭을 해버리고 정수만 나온다.
정수 = (정수)실수
[byte 타입 변수가 피연산자로 사용된 경우
byte x = 10;
byte y = 20;
byte result = x+y; // 컴파일 에러
int reult = x + y; // int 타입으로 변환되어 연산되므로 연산 결과를 int 변수에 저장해야한다
[int 타입 변수가 피연산자로 사용된 경우]
int x = 10;
int y = 20;
int result = x+y;
처음부터 x,y 를 int 타입으로 선언 한 것이다
정수 연산식에서 모든 변수가 int 타입으로 변환되는 것은 아니다 두 피 연산자중 허용 범위가 큰 타입으로 변환되어 연산을 수행한다
예를 들어 int 타입보다 허용 범위가 더 큰 long 타입이 피연산자로 사용되면 다른 피연산자는 무조건 long 타입으로 변환하고 연산을 수행한다
연산결과를 long 타입 변수에 저장한다
long result
= long 타입
(연산자 +,-,*,/,%) -> byte 타입, char 타입, short 타입, int 타입
실수 타입 변수가 산술 연산식에서 피연산자로 사용될 경우 두 피연산자가 동일한 타입이라면 해당 타입으로 연산되지만, 피연산자중 하나가 double 타입이라면 다른 피연산자도 double 타입으로 자동 타입 변환되어 연산을 수행한다
연산 결과는 double 타입이 된다
int 타입과 double 타입을 연산해도 동일한 과정을 거친다
먼저 int 타입의 피연산자가 double 타입으로 자동 변환되고 연산을 수행한다
꼭 int 타입으로 연산을 해야 한다면 double 타입을 int 타입으로 강제 변환하고 덧셈 연산을 수행하면 된다
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue; //result에 15가 저장됨
double result = 1.5 + 2.3;
float result = 1.5 + 2.3; <- 컴파일 에러
float 타입으로 저장하고 싶다면 실수 리터럴 뒤에 소문자 f나 대문자 F를 붙여 컴파일러가 float 타입임을 알도록 해야함
float result = 1.5f + 2.3f;
숫자 + 숫자 -> 덧셈연산 -> 숫자
"문자열" + 숫자 -> "문자열"+"숫자" -> 결합연산 -> "문자열 숫자"
숫자 + "문자열" -> "숫자"+"문자열" -> 결합연산 -> "숫자 문자열"
int value = 3+7; -> int value = 10;
String str = "3" + 7; -> String str = "3"+"7"; -> String str ="37"
String str = 3 + "7" -> String str = "3"+"7"; -> String str ="37";
앞에서 순차적으로 + 연산을 수행한다
먼저 수행된 연산이 덧셈 연산이라면 덧셈 결과를 가지고 그 다음 + 연산을 수행한다
만약 먼저 수행된 연산이 결합 연산이라면 이후 + 연산은 모두 결합 연산이 된다
int value = 1+2+3; -> int value = 3+3; -> int value = 6;
String str = 1+2+"3"; -> String str = 3+"3"; -> String str ="33"
String str = 1 + "2" + 3 -> String str = "12"+3; -> String str ="123";
String str = "1"+2+3; -> String str = "12"+3; -> String str="123";
String str2 = 10 + "2" + 8;
System.out.println("str2:" + str2);
// 1028
String str3 = "10" + 2 = 8;
System.out.println("str3:" + str3);
// 1028
기본 타입(byte, short, int, long, float, double, boolean)의 값을 문자열로 변경하는 경우도 있음
이 경우는 간단히 String.valueOf() 메소드를 이용하면 된다
String str = String.valueOf(기본타입값);
ex) String.valueOf(3)을 실행하면 문자열 "3"을 얻을 수 있다
String hakbun;
short total = kor + eng + math -> 이렇게 하면 안됌
* byte, short 안됌, int, long 가능함
자바에서 그 데이터 타입이 byte 또는 short 또는 char 인 변수가 사칙연산(+ - * /)을 만나면
자동적으로 그 변수의 데이터 타입은 int 로 변하게 되어있다.!!!!
즉, int total = kor + eng + math; 은
int total = (int)kor + (int)eng + (int)math; 으로 되어진다.
그래서 short 타입인 total 변수에는 int 타입의 값을 담을 수가 없다.
[⭐]
(int)kor 의 뜻은 byte 타입인 kor 을 int 타입으로 형변환(casting)하라는 말이다
int avg1 = total/3; // 10/4 => 2
// 정수/정수 => 몫(정수)
// 10.0/4 => 2.5
// 10/4.0 => 2.5
// 10.0/4.0 => 2.5
// (float)10/4 => 2.5 10/(float)4 => 2.5 (float)10/(float)4 => 2.5
// (double)10/4 => 2.5 10/(double)4 => 2.5 (double)10/(double)4 => 2.5
// 자바는 char 타입을 표현할 때 unicode 를 사용한다
// 아스키(ASCII : American Standard Code for Information Interchange )
// 2진수(0,1), 8진수 (0-7), 10진수(0-9), 16진수(00-FF)
// digital 신호 --> 2진수 (0,1) == Binary Digit == Bit
// A B ... Z a b c ... z 0 1 2 ... 9
// A는 10진수로 65로 보자. a는 10진수로 97로 보자
// B는 10진수로 66로 보자. b는 10진수로 98로 보자
// C 는 10진수로 67로 보자. c는 10진수로 99로 보자
// ...
// Z 는 10진수로 90로 보자. z는 10진수로 122로 보자
// 대문자와 소문자의 간격 차이는 32이다
// 0은 10진수로 48로 보자.
// 1은 10진수로 49로 보자.
// 2은 10진수로 50로 보자.
// ...
// 9은 10진수 50로 보자
// ...
// 9은 10진수로 57로 보자.
// !은 10진수로 33로 보자.
// @은 10진수로 64로 보자.
문자열 (String)을 byte 타입으로 형변환 시켜주는 메소드
byte n = (byte)(Byte.parseByte(inputStr) + 10); // "123" ==> 123+10 // 사칙 연산
문자열 (string)을 int 타입으로 형변환 시켜주는 메소드
int n = Integer.parseInt(inputStr) + 10 ; // "123" ==> 123 + 10
문자열 (string)을 long 타입으로 형변환 시켜주는 메소드가 있다
long n = Long.parseLong(inputStr)
`
`