Java - Type Conversion

CYSSSSSSSSS·2024년 2월 11일
0

자바

목록 보기
6/26

Type Conversion

Type Conversion

자동 형변환

  • 작은 범위의 값을 큰 범위로 넣을 수 있다.
  • ex) int -> long -> double
  • 큰 범위에서 작은 범위로 넣을 때 문제가 발생 할 수 있다.
  • 소수점 버림 , 오버플로우 문제가 발생 할수 있다.
package casting;

public class Casting1 {
    public static void main(String[] args) {
        int intvalue = 10;
        long longValue;
        double doubleValue;

        longValue = intvalue; // int -> long
        System.out.println("longValue = " + longValue); // 작은 범위를 큰범위에 넣는것은 형변환에 문제가 없다.
        
        doubleValue = intvalue;
        System.out.println("doubleValue = " + doubleValue); // 형변환은 되지만 소수점 형태로 출력된다.

        doubleValue = 20L; // long -> double
        System.out.println("doubleValue2 = " + doubleValue);
    }
}
  • 자바는 기본적으로 같은 타입에 값에 대입할 수 있다.
  • int -> long 대입하려고 하면 long이 int보다 더 큰 숫자 범위로 표현하면 , 작은 범위 숫자 타입에서 큰 범위 숫자 타입에 대입하면 문제가 없다.
  • long -> double의 경우에도 double은 부동 소수점을 사용하기 때문에 더 큰 숫자 범위를 표현하다. 따라서 대입가능하다.
  • 정리하며 작은 범위에서 큰 범위로의 대입은 자바 언어에서 허용한다.

자동 형 변환

doublevalue = intvalue
doublevalue = (double) intvalue
doublevalue = (double) 10
doublevalue = 10.0 // 자동 형변환 
  • int의 값을 강제로 double로 바꾼다.

명시적 형변환

  • 큰 범위에서 작은 범위로 대입할 때 사용한다.
  • double은 실수를 표현하는 범위입니다. 그러면 1.5를 int를 표현할 수 없다.
  • 이 경우 어떻게 해야 할까?
package casting;

public class Casting2 {
    public static void main(String[] args) {
        double doublevalue = 1.5;
        int intvalue = 0;

        //컴파일 오류 발생
        // 1.타입 불일치 , 2.double -> int convert 불가능
        //intvalue = doublevalue;
        // 소수점 때고 서라도 보고 싶으면
        intvalue = (int)doublevalue;    // 직접 자료형을 지정해서 변환 (명시적 형변환)
    }
}
  • 데이터 손실이 일어나더라도 데이터 변환을 하고 싶으면 명시적으로 데이터 타입을 강제로 적어서 변경해야 한다.

명시적 형 변환

intvalue = (int) doublevalue;
intvalue = (int) 1.5;	
intvalue = 1;	//int형이기 때문에 변환

형변환과 오버플로우

  • 작은 숫자가 표현할 수 있는 범위를 넘어설 경우?
package casting;

public class Casting3 {
    public static void main(String[] args) {
        long maxIntValue = 2147483647; // int의 최대값 , 리터럴
        long maxIntOver = 2147483648L; // int의 최대값 + 1(초과) , 초과된 값을 표현하기 위해서는 L 표기법을 사용해야 한다.
        int intvalue = 0;
        
        intvalue = (int) maxIntValue; // 형변환 , int의 최고 범위까지 표현가능하기 때문에 가능하다.
        System.out.println("intvalue = " + intvalue);

        intvalue = (int) maxIntOver; // 형변환 , int의 범위를 넘어선 경우
        System.out.println("intvalue = " + intvalue);   //  int를 넘기면 제일 작은 범위이로 돌아간다 그 이후로 수가 증가하면 작은 범위에서 증가한다.
    }
}
  • int범위에서 표현하는 범위를 넘어갔는데 명시적 형변환으로 int로 바꿀 경우 가장 적은 범위로 넘어가서 초과한 값1마다 최소 범위에서 줄어드는것을 확인 할 수 있다.
  • 오버 플로우 발생시 범위에 맞는 형태를 사용하는 것이 베스트이다.

계산과 형변환

  • 계산시 발생하는 형변환
package casting;

public class Casting4 {
    public static void main(String[] args) {
        int div1 = 3/2; // 1.5
        System.out.println("div1 = " + div1); // 하지만 int 이기 때문에 1 이나온다
        
        double div2 = 3/2; // 1.5
        System.out.println("div2 = " + div2); // 1.0
        
        double div3 = 3.0 / 2;  // 1.5
        System.out.println("div3 = " + div3);   // 1.5
        
        double div4 = (double) 3/2;
        System.out.println("div4 = " + div4);   // 1.5

        int a = 3;
        int b = 2;
        double result = (double)a/b;
        System.out.println("result = " + result);   // 1.5
    }
}

  • 같은 타입의 연산은 같은 타입의 결과를 나타낸다.
  • int + int -> int / long + long -> long
  • 서로 다른 타입의 계산은 큰 범위의 자동 형변환이 일어난다.
  • int + long -> long으로 자동 형변환이 일어난다.
  • int + double -> double로 자동 형변환이 일어난다.
profile
개발자 되고 싶어요

0개의 댓글

관련 채용 정보