(Java programming) 형 변환

soosoorim·2024년 2월 13일
0

형 변환

예)
4 byte 크기의 int 변수 값을 8 byte 크기의 long 변수에 할당하면 에러없이 잘 동작한다.

public static void main(String[] args) {
    int normalNumber = Integer.MAX_VALUE;
    long bigNumber = normalNumber;
    System.out.println(normalNumber);
    System.out.println(bigNumber);
}

그 이유는 메모리 크기 때문인데

long 형과 int 형의 2진수 범위를 보면 long 형이 int형보다 두 배 많은 정보를 담을 수 있게되어있다.

long의 범위가 훨신 크기때문에 int 값을 할당하는데 문제가 없다.
이런 특징을 “묵시적 형변환“ 이라고 한다.

byte -> short -> int -> long 은 모두 “묵시적 형변환"을 한다.

반면, 크기가 큰 long 형의 값을 비교적 작은 int형으로 자연스러운 변환은 불가능하다.

public static void main(String[] args) {
    long bigNumber = Long.MAX_VALUE;
    int normalNumber = bigNumber; <- 에러!
    System.out.println(bigNumber);
    System.out.println(normalNumber);
}
  • 위 코드에서 에러를 제거하려면 “명시적 형변환"을 해야만 하는데, “명시적 형변환" 이란 강제로 형을 변경하는 것을 말한다.
public static void main(String[] args) {

    long bigNumber = Integer.MAX_VALUE + 1L;
    int normalNumber = (int) bigNumber;
    System.out.println(bigNumber);
    System.out.println(normalNumber);
}

정수오버플로우

범위를 벗어난 수를 넣었을 때,
할당 값이 이상해지는 경우가 종종 발생할 수 있다.
할당할 수 있는 범위를 초과하는 버그가 발생하기 때문

public static void main(String[] args) {
    System.out.println(Integer.MAX_VALUE);
    int normalNumber = Integer.MAX_VALUE + 1;
    System.out.println(normalNumber);
}

음수로 나오는 버그가 발생하게 되는데, 그렇다고 명시적 형변환을 안써도 안된다. (치명적 보안 취약점)

이런 오류가 뜨는 이유는 2진법 때문 - 정수오버플로우

  • 만약 int 최대값 에 2를 더하면?

  • 따라서 아래 코드에서 normalNumber의 값은 -2,147,483,647이 된다.
public static void main(String[] args) {
    long longNumber = 2147483649L; <- int 최대 값보다 2큽니다.
    System.out.println(longNumber);
    int normalNumber = (int) longNumber;
    System.out.println(normalNumber);
}

명시적 형변환의 주의점
명시적 형변환을 할 때, 항상 정수 오버플로우가 발생하지 않도록 주의를 기울어야 한다.


정수 <-> 부동소수점의 변환 (진짜진짜많이씀)

  • 정수를 부동소수점으로 변환 (명시적 형변환)
public static void main(String[] args) {
    int num = 10;
    float fnum = num;
    double dnum = num;

    System.out.println(num); // 10
    System.out.println(fnum); // 10.0
    System.out.println(dnum); // 10.0
}
  • 정수 -> 부동소수점 변환에서 명시적 변환이 가능한 이유?
    부동소수점은 정수보다 표현하는 범위가 더 크다. (같은 byte를 사용하더라도)
    부동소수점 = 정수 + 소수점


  • 부동소수점을 정수로 변환 (묵시적 형변환)
public static void main(String[] args) {
    float fnum = 10.9f;
    int num = (int) fnum;
    System.out.println(fnum); // 10.9
    System.out.println(num); // 10

    double dnum = 11.15;
    num = (int) dnum;
    System.out.println(dnum); // 11.15
    System.out.println(num); // 11
}
  • 부동소수점 -> 정수 변환시 소수점 밑 데이터가 사라지는 이유?
    정수는 소수점 이하의 자릿수들을 표현하지 못한다.
    즉, 소수점 이하 자릿수는 모두 버려진다.

부동소수점 소수점 처리

public static void main(String[] args) {
    double dnum = 10.1;
    // 소수점 올림.
    dnum = Math.ceil(dnum);
    System.out.println(dnum); // 11.0
    // 소수점 버림.
    dnum = 10.9;
    dnum = Math.floor(dnum);
    System.out.println(dnum); // 10.0
    // 소수점 반올림.
    dnum = 15.18;
    dnum = Math.round(dnum);
    System.out.println(dnum); // 15.0
    dnum = 10.56;
    dnum = Math.round(dnum);
    System.out.println(dnum); // 11.0
}
public static void main(String[] args) {
    // 29.37 을 29.4로 올림 처리하기
    double dnum = 29.37;
    double dnum2 = dnum * 10;
    System.out.println(dnum2); // 293.7

    dnum2 = Math.round(dnum2);
    System.out.println(dnum2); // 294.0

    double dnum3 = dnum2 / 10;
    System.out.println(dnum3); // 29.4
}
  • Java는 소수점 자리 처리가 유연하지 않다.
    Java에서 소수점 자리 처리를 하려면 원하는 자릿수만큼 곱한 후 처리해야 한다.


문자열 형변환

  • 문자열을 byte, short, int, long, float, double, boolean으로 변환 (총 8가지 Primitive Type)
  • Java는 문자열을 Primitive Type으로 변경이 가능

문자열을 정수로 변환하려면 타입.parseType(문자) 를 사용

public static void main(String[] args) {
    String numberString = "10";
    byte byteNumber = Byte.parseByte(numberString);
    System.out.println(byteNumber);

    numberString = "10000";
    short shortNumber = Short.parseShort(numberString);
    System.out.println(shortNumber);

    numberString = "1000000";
    int intNumber = Integer.parseInt(numberString);
    System.out.println(intNumber);

    numberString = "1000000000";
    long longNumber = Long.parseLong(numberString);
    System.out.println(longNumber);
}

int 만 다르니 주의


  • 정수형이 아닌 문자열을 변환하려고 하면 에러가 발생한다.
public static void main(String[] args) {
    String numberString = "A";
    byte byteNumber = Byte.parseByte(numberString);
    System.out.println(byteNumber);
} // Exception in thread "main" java.lang.NumberFormatException: For input string: "A"
  • 부동소수점을 정수형으로 변환하려고 해도 에러가 발생한다.
public static void main(String[] args) {
    String numberString = "10.5";
    byte byteNumber = Byte.parseByte(numberString);
    System.out.println(byteNumber);
} // Exception in thread "main" java.lang.NumberFormatException: For input string: "10.5"

문자열을 부동소수점으로 변환하려면 타입.parseType(문자) 를 사용한다.

public static void main(String[] args) {
    String numberString = "10.5";
    float floatNumber = Float.parseFloat(numberString);
    System.out.println(floatNumber);

    numberString = "11.577777777";
    double doubleNumber = Double.parseDouble(numberString);
    System.out.println(doubleNumber);

    numberString = "12";
    double doubleNumber2 = Double.parseDouble(numberString);
    System.out.println(doubleNumber2);
}

문자열을 불린으로 변환하려면 Boolean.parseBoolean(문자) 를 사용한다.

public static void main(String[] args) {
    String str = "true";
    boolean bool = Boolean.parseBoolean(str);
    System.out.println(bool); // true

    str = "TRUE";
    bool = Boolean.parseBoolean(str);
    System.out.println(bool); // true

    str = "tRue";
    bool = Boolean.parseBoolean(str);
    System.out.println(bool); // true
}
public static void main(String[] args) {
    String str = "false";
    boolean bool = Boolean.parseBoolean(str);
    System.out.println(bool); // false

    str = "";
    bool = Boolean.parseBoolean(str);
    System.out.println(bool); // false

    str = "anystring";
    bool = Boolean.parseBoolean(str);
    System.out.println(bool); // false
}

이 불린 변환은 잘 쓰지 않음 그냥 참고만

0개의 댓글

관련 채용 정보