ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 타입 변환
    언어/Java 2020. 12. 26. 20:12

    자동 타입 변환

    자바에서는 값의 허용 범위가 작은 타입에서 큰 타입으로 저장될 때 자동으로 타입이 변환됩니다.

    허용 범위 순서

    • byte < short < int < long < float < double

    예시

    byte var1 = 10;
    int var2 = var1; // 자동 변환 byte -> int
    
    
    long var3 = 100000000L;
    float var4 = var3; // 1.0E8f
    double var5 = var3; //1.0E8
    
    
    char var6 = 'A';
    int var7 = var6; // 65
    
    
    byte var8 = 65;
    char var9 = var8; // char는 음수를 허용하지 않으므로 컴파일 에러

    강제 타입 변환

    허용 범위가 큰 타입에서 작은 타입으로 변환하고자 할 때엔 강제로 지정을 해줘야 합니다.

    int var1 = 10;
    byte var2 = (int) var1;
    
    
    double var3 = 3.14;
    int var4 = (int) var3; // 정수 3만 저장

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

    연산을 수행할 때, int 보다 작은 byte, short 타입의 변수가 피연산자로 사용되면 자동으로 int로 변환되어 식을 수행합니다.

    • byte, char, short int 타입끼리의 연산은 int로 자동 타입 변환이 됨
    • int result = (정수 타입) +,-,/,*,% (정수 타입)
    // 1번째
    byte x = 1;
    byte y = 2;
    
    byte result = x + y; // 컴파일 에러
    int result1 = x + y;
    
    
    // 2번째
    int x1 = 1;
    int y1 = 2;
    int result2 = x1 + y1;


    위의 두 케이스를 컴파일하면 동일한 바이트 코드가 나오기 때문에 2번째와 같은 형태로 진행해 타입 변환 시간을 줄이는 것이 효율적입니다.

    실행 성능을 위해 컴파일 단계에서 연산이 가능합니다.

    • byte result = 10 + 20;

    컴파일 단계에서 10 + 20을 미리 연산해 30이란 결과를 만들고 result 변수에 저장하도록 바이트 코드를 생성합니다. 피연산자 변수가 아니므로 int 타입으로 변환하지 않습니다.


    여기서 만약 int 타입보다 더 큰 허용범위의 타입이 피연산자로 사용되면 int를 포함하여 모두 허용 범위가 더 큰 타입으로변환이 됩니다.

    int x = 1;
    byte y = 2;
    long z = 1000L;
    
    long result = x + y + z;

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

    자바에서는 피연산자가 모두 숫자일 경우, 덧셈 연산을 하고 피연산자 중, 하나가 문자열이면 나머지 피연산자가 숫자여도 문자열로 자동 변환해 문자열 결합 연산을 합니다.

    숫자 + 숫자 → 덧셈 연산 → 숫자

    "문자열" + 숫자 → "문자열" + "숫자" → 결합 연산 → "문자열숫자"

    숫자 + "문자열" → 숫자 + "문자열" → 결합 연산 → "숫자문자열"


    파이썬에서는 1 + "1"의 경우 타입이 서로 맞지 않아 오류를 발생시키지만 자바에서는 위와 같은 규칙으로 인해 오류가 발생하지 않습니다.

    int var1 = 1 + 1; // 11
    String var2 = "1" + 1; // "11"
    String var3 = 1 + "1"; // "11"
    String var4 = "AA" + 1; // "AA1"


    댓글