타입변환

kxsxh·2024년 1월 24일
0

JAVA

목록 보기
9/16

: 데이터 타입을 다른 데이터 타입으로 변환하는 것

  • 두 변수의 타입이 동일할 경우 한쪽 변수값을 다른쪽 변수에 복사해서 저장할 수 있다
    - a 변수에 저장된 값을 b변수에 복사해서 저장하는 코드
byte a = 10; 
int b = a;
- 원래 10 byte 타입의 값이었으나, 복사해서 저장할 때 int 타입의 값으로 변환되었다
---> 타입변환

자동으로 타입변환이 일어나는 것 -> 자동 타입 변환(promotion)
=> 값의 허용범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생
- 자동 타입 변환은 프로그램 실행 도중에 자동으로 타입변환이 일어나는 것을 말함

기본 타입 - 허용 범위 크기순

byte < short < int < long < float< double
  • int 타입이 byte 타입보다 허용 범위가 더 크기 때문에 자동 변환이 일어난다
  • 허용 범위가 작은 타입은 자동 타입 변환이 될 수 없다
    --> 데이터 타입의 크기가 작은 것에서 크기가 큰 쪽으로는 자동적으로 형변환이 발생한다
byte(1byte) --> short(2byte) --> int(4byte) --> long(8byte)
   개미             병아리            강아지           사람   
  개미집            병아리집           강아지집          안방

float(4byte) --> double(8byte) 

--> 정수타입은 실수타입으로 자동형변환이 발생한다.

char(2byte)
--> char타입은 int형으로 자동형변환이 발생한다.

강제 타입 변환(casting)

큰 허용 범위 타입을 작은 허용 범위 타입으로 자동 타입 변환될 수 없지만 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것
강제 타입 변환은 캐스팅 연산자 괄호()를 사용하는데 괄호 안에 들어가는 타입을 나누는 단위

작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입
큰 허용 범위 타입 -> 작은 허용타입 => 강제 타입 변환

(byte) 캐스팅 연산자를 사용해서 byte 타입으로 강제 변환할 수 있다

ex) 
int intvalue = 10;
byte byteValue = (byte) intValue; //강제 타입 변환
  • 실수 타입(float, double)은 정수 타입 (byte, short, int, long)으로 자동 변환되지 않기 때문에 강제 타입 변환을 사용해야한다
    이 경우 소수점 이하 부분은 버려지고, 정수 부분만 저장된다
double doubleValue - 3.14;
int intValue = (int) doubleValue; //intValue는 정수 부분인 3만 저장
실수를 정수로 강제적으로 형변환하는 것을 말한다.
     소수부는 무조건 절삭을 해버리고 정수만 나온다.
     정수 = (정수)실수      

정수 연산에서의 자동 타입 변환

  • 산술 연산식에서 피연산자로 사용되면 작은 byte, short 타입의 변수는 int타입으로 자동 타입 변환이 되어 연산이 된다
    int result = byte 타입, char 타입, short 타입, int 타입
    연산자(+, -, *, /, %) : byte 타입, short 타입, int 타입
[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 타입으로 변환되는 것은 아니다 두 피 연산자중 허용 범위가 큰 타입으로 변환되어 연산을 수행한다

  • 예를 들어 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가 저장됨
  • 자바에서는 소문자 f 또는 대문자 F가 없는 실수 리터럴을 double 타입으로 해석한다
    그렇기 때문에 연산 결과는 double 타입 변수에 저장해야한다
double result = 1.5 + 2.3;


float result = 1.5 + 2.3; <- 컴파일 에러

float 타입으로 저장하고 싶다면 실수 리터럴 뒤에 소문자 f나 대문자 F를 붙여 컴파일러가 float 타입임을 알도록 해야함
float result = 1.5f + 2.3f;
  • 정수 타입을 실수 타입으로 변환하는 방법
    float floatValue = (float) 정수;
    double doubleValue = (double) 정수;

+ 연산에서의 문자열 자동 타입 변환

  • 연산자는 두 가지 기능을 가지고 있다
    피연산자가 모두 숫자일 경우에는 덧셈 연산을 수행하지만, 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다
숫자 + 숫자 -> 덧셈연산		-> 숫자
"문자열" + 숫자	-> "문자열"+"숫자" -> 결합연산 -> "문자열 숫자"
숫자 + "문자열"	-> "숫자"+"문자열"	-> 결합연산 -> "숫자 문자열"
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
  • 특정 부분을 우선 연산하고 싶을 때 해당 부분을 괄호()로 감싸준다

문자열을 기본 타입으로 강제 변환

  • 문자열이 숫자가 아닌 알파벳이나 특수문자, 한글 등을 포함하고 있을 경우 숫자 타입으로 변환 하면 숫자 형식 예외(NumberFormatException)가 발생함

기본 타입(byte, short, int, long, float, double, boolean)의 값을 문자열로 변경하는 경우도 있음
이 경우는 간단히 String.valueOf() 메소드를 이용하면 된다
String str = String.valueOf(기본타입값);
ex) String.valueOf(3)을 실행하면 문자열 "3"을 얻을 수 있다

  • Integer.parseInt(): 문자열을 정수 int 타입으로 변환
  • Double.parseDouble(): 문자열을 실수 double 타입으로 변환
  • String hakbun;
    // null 학번 981234 201234 001234 091234
    // 주의사항 ==> 모두 숫자로 입력한다고 해서 정수형 타입은 byte, short, int, long 을 사용하면 안되는 경우도 있다.
    // 예를 들어, 학번에 091234 을 입력하는 경우 정수형 타입을 사용하면 맨 앞의 0 은 없어지고 91234 되어지므로
    // 비록 모두 숫자이지만 맨 앞에 0 이 들어올수 있는 경우라면 반드시 String 타입으로 해야 한다.
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)


`

`

0개의 댓글