청야에몽
청야의 개발 일기
청야에몽
전체 방문자
오늘
어제
  • 분류 전체보기 (153)
    • os (4)
      • Linux (4)
    • Language (32)
      • Python (15)
      • C# (6)
      • Java (11)
    • BaekJoon (92)
      • 단계별로 풀어보기 (81)
      • 누적합 (11)
    • Test (6)
      • 코딩테스트 (6)
      • 42 SEOUL (0)
    • Project (9)
      • 충돌, 피하기 게임 (8)
      • Unreal engine5 CICD 구축 (1)
    • Git & GitHUB (9)
    • Cloud (0)
      • AWS (0)
      • Azure (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c#
  • 재귀 함수
  • Revert
  • Reset
  • 연산자
  • java
  • Python
  • 파이썬
  • 논리 연산자
  • Rebase
  • pygame
  • 리눅스
  • git
  • for문
  • 중첩for문
  • 백준
  • Linux
  • 자료형
  • 누적 합
  • 누적합

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
청야에몽

청야의 개발 일기

Language/Java

[Java] 타입 변환

2022. 9. 27. 23:31
728x90

1. 자동 타입 변환

자동 타입 변환(promotion)이란 말 그대로 자동으로 타입 변환이 일어나는 것을 말하며, 보통 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.

기본 타입을 허용 범위 순으로 나열하면 아래와 같다.

더보기

byte < short, char < int < long < float < double

char 타입의 경우 int 타입으로 자동 변환되면 유니코드 값이 int 타입에 대입된다.

char charValue = 'A';
int intValue = charValue;	//65가 저장됨

자동 타입 변환에서 예외가 존재한다. byte 타입은 char 타입보다 허용 범위가 작음에도 불구하고 자동 변환될 수 없다. 왜냐하면 char 타입의 허용 범위는 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문이다.

byte byteValue = 65;
char charValue = byteValue;		//컴파일 에러 발생

아래는 자동 타입 변환을 이용하여 작성한 코드이다.

package ch02.sec07;

public class PromotionExample {
    public static void main(String[] args) {
        byte byteValue = 10;
        int intValue = byteValue;
        System.out.println("intValue: " + intValue);		//intValue: 10 출력

        char charValue = '가';
        intValue = charValue;
        System.out.println("가의 유니코드: " + intValue);		//가의 유니코드: 44032 출력

        intValue = 50;
        long longValue = intValue;
        System.out.println("longValue: " + longValue);		//longValue: 50 출력

        longValue = 100;
        float floatValue = longValue;
        System.out.println("floatValue: " + floatValue);	//floatValue: 100.0 출력

        floatValue = 100.5F;
        double doubleValue = floatValue;
        System.out.println("doubleValue: " + doubleValue);	//double: 100.5 출력
    }
}

 

2. 강제 타입 변환

큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환될 수 없다. 하지만 큰 허용 범위  타입을 작은 허용 범위 타입으로 쪼개에서 저장하는 것이 가능한데 이것을 강제 타입 변환(casting)이라고 한다. 강제 타입 변환은 캐스팅 연산자로 괄호()를 사용하는데, 괄호 안에 들어가는 타입은 쪼개는 단위이다.

단, 강제 타입 변환의 목적은 원래 값이 유지되면서 타입만 바꾸는 것이기 때문에 작은 허용 범위 타입에 저장될 수 있는 값을 가지고 강제 타입 변환을 해야한다.

int -> byte

int는 4byte, byte는 1byte이다. 고로 int 값이 -128 ~ 127인 값만  원래 값을 보존할 수 있다.

int intValue = 10;
byte byteValue = (byte) intValue;

int -> char

int는 4byte, char는 2byte 그 중에서도 양수만을 가지고 있다. 고로 int 값이 0~65535인 값만 원래 값을 보존할 수 있다.

int intValue = 65;
char charValue = (char) intValue;

long -> int

long은 8byte, int는 4byte이다. 8byte 중에서 앞 4byte는 버려지고 끝 4byte만 int 타입 변수에 저장이 된다.

long longValue = 300;
int intValue = (int) longValue;

실수 -> 정수

실수 타입(float, double)은 정수 타입(byte, short, int, long)보다 항상 큰 허용 범위를 가진다. 이 경우에는 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.

double doubleValue = 3.14;
int intValue = (int) doubleValue;	//intValue는 정수 부분인 3만 저장

 

3. 연산식에서 자동 타입 변환

다음은 자동 타입 변환을 연산식에서 사용한 경우이다.

package ch02.sec09;

public class OperationPromotionExample {
    public static void main(String[] args) {
        byte result1 = 10 + 20;         //컴파일 단계에서 연산
        System.out.println("result1: " + result1);

        byte v1 = 10;
        byte v2 = 20;
        //정수 리터럴이 아니라 변수가 피연산자로 사용되면 실행 시 연산을 수행한다.
        //정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은
        //byte, short 타입의 변수는 int타입으로 자동 타입 변환된다.
        int result2 = v1 + v2;          //int 타입으로 변환 후 연산
        System.out.println("result2: " + result2);

        byte v3 = 10;
        int v4 = 100;
        long v5 = 1000L;
        //만일 long 타입이 피연산자로 사용되면 다른 피연산자는 long 타입으로 변환된다.
        long result3 = v3 + v4 + v5;    //long 타입으로 변환 후 연산

        char v6 = 'A';
        char v7 = '1';
        int result4 = v6 + v7;          //int 타입으로 변환 후 연산
        System.out.println("result4: " + result4);
        System.out.println("result4: " + (char)result4);

        int v8 = 10;
        int result5 = v8/4;             //정수 연산의 결과는 정수임을 확인
        System.out.println("result5: " + result5);

        int v9 = 10;
        double result6 = v9 / 4.0;      //double 타입으로 변환 후 연산
        //실수는 피연산자가 동일한 실수 타입이라면 해당 타입으로 연산이 된다.
        //하지만 하나라도 double 타입이면 다른 피연산자도 double 타입으로 변환되어 연산 된다.
        //int와 같은 정수 타입들도 마찬가지로 double 타입으로 자동 변환이 된다.
        System.out.println("result6: " + result6);

        //double을 int로 변형하고 싶다면 double 타입을 int 타입으로 강제 변환하면 사용이 가능하다.
        int v10 = 1;
        int v11 = 2;
        double result7 = (double) v10 / v11;    //double 타입으로 변환 후 연산
        System.out.println("result7: " + result7);
    }
}

 

4. 문자열을 기본 타입으로 변환

프로그램에서 문자열을 숫자 타입으로 변환하는 경우가 매우 많다. 예를 들어 '27'와 '10,5'를 정수 및 실수 타입으로 변환해서 숫자 연산을 하는 경우이다. 자바에서 문자열을 기본 타입으로 변환하는 방법은 아래와 같다.

변환 타입 사용 예
String -> byte String str = "27";
byte value = Byte.parseByte(str);
String -> short String str = "135";
short value = Short.parseShort(str);
String -> int String str = "470000";
int value = Integer.parseInt(str);
String -> long String str = "60000000000";
long value = Long.parseLong(str);
String -> float String str = "12.345";
float value = Float.parseFloat(str);
String -> double String str = "12.345";
double value = Double.parseDouble(str);
String -> boolean String str = "true";
boolean value = Boolean.parseBoolean(str);

반대로 기본 타입의 값을 문자열로 변경하는 경우도 있는데, 이 경우는 간단히 String.valueOf(기본타입값) 메소드를 이용하면 된다.

아래는 문자열을 기본 타입으로, 기본 타입을 문자열로 변환한 예시 코드이다.

package ch02.sec10;

public class PrimitiveAndStringConversionExample {
    public static void main(String[] args) {
        int value1 = Integer.parseInt("10");            //String -> int
        double value2 = Double.parseDouble("3.14");     //String -> double
        boolean value3 = Boolean.parseBoolean("true");  //String -> boolean

        System.out.println("value1: " + value1);		//value1: 10 출력
        System.out.println("value2: " + value2);		//value2: 3.14 출력
        System.out.println("value3: " + value3);		//value3: true 출력

        String str1 = String.valueOf(10);               //int -> String
        String str2 = String.valueOf(3.14);             //double -> String
        String str3 = String.valueOf(true);             //boolean -> String

        System.out.println("str1: " + str1);			//str1: 10 출력
        System.out.println("str2: " + str2);			//str2: 3.14 출력
        System.out.println("str3: " + str3);			//str3: true 출력
    }
}
728x90
저작자표시 비영리 변경금지

'Language > Java' 카테고리의 다른 글

[Java] 키보드 입력 데이터를 변수에 저장  (0) 2022.10.04
[Java] 변수 사용 범위와 콘솔로 변수값 출력  (0) 2022.09.28
[Java] 변수에 대한 이해_2 (논리, 문자열 타입)  (1) 2022.09.21
[Java] 변수에 대한 이해_1 (정수, 문자, 실수 타입)  (2) 2022.09.20
[Java] 자바 시작하기  (0) 2022.09.14
    'Language/Java' 카테고리의 다른 글
    • [Java] 키보드 입력 데이터를 변수에 저장
    • [Java] 변수 사용 범위와 콘솔로 변수값 출력
    • [Java] 변수에 대한 이해_2 (논리, 문자열 타입)
    • [Java] 변수에 대한 이해_1 (정수, 문자, 실수 타입)
    청야에몽
    청야에몽
    개인적으로 학습을 하여 까먹지 않기 위해 올리는 블로그입니다.

    티스토리툴바