형변환

민범·2023년 12월 14일

Java -기본-

목록 보기
9/18

📌 형변환(Casting)

  • 자바에서 값을 넣을때 작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.
  • 예) int -> long
  • 큰 범위에서 작은 범위로는 값을 넣지 못하고, 다음과 같은 문제가 발생한다.
    ▶️ 소수점 버림
    ▶️ 오버플로우(overflow): 컴퓨터의 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류이다.
  • 하지만 결국은 대입하는 형(타입)을 맞추어야 하기 때문에 개념적으로는 다음과 같이 동작한다.
int value = 10;
double value = value;
double value = (double) value; //형 맞추기 
double value = (double) 10; //변수 값 읽기
double value = 10.0; //형 변환
  • 이렇게 (double)과 같이 적어주면 int형이 double형으로 형이 변한다. 이렇게 형이 변경되는 것을 형변환이라 한다. 작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 직접 형 변환을 하지 않아도 된다. 이런 과정이 자동으로 일어나기 때문에 자동 형변환 또는 묵시적 형변환이라 한다.

명시적 형 변환

  • double은 실수(실제 수)를 표현할 수 있다. 그러나 int는 실수가 아닌 정수를 표현하는데 이 경우 double -> int로 대입한다면 어떻게 될까?
double doubleValue = 1.5;
int intValue = 0;
intValue = doubleValue; //컴파일 오류 발생
intValue = (int) doubleValue; //형변환
  • intValue = doubleValue 이 부분은 컴파일 오류가 발생하는데 int형은 double형 보다 숫자의 표현 범위가 작기 때문에 이 경우 숫자가 손실되는 문제가 발생하는데, 큰 컵에 담긴물을 작은 컵에 담으려 하니 손실이 발생할 수 도 있다는 것이기 때문에 컴파일에서 값의 손실이 발생해 오류가 나타나는 것이다.
  • 이런 위험을 직접 감수하고 데이터 타입을 강제로 변경할 수 있는데
  • intValue = (int) doubleValue; //명시적 형변환
  • 이 경우는 개발자가 직접 코드를 입력해 바꾼다해서 명시적 형변환이라고 한다.

📌 형변환과 오버플로우

  • 형 변환을 할 때 만약 작은 숫자가 표현하는 범위를 넘어서면 어떻게 될까?
long maxIntValue = 2147483647; //int 최고값
long maxIntOver = 2147483648L; //int 최고값 + 1(초과)
int intValue = 0;
intValue = (int) maxIntvalue; //형변환
intValue = (int) maxIntOver; //형변환

▶️ 정상 범위: long maxIntValue = 2147483647을 보면 int로 표현하는 가장 큰 숫자인 2147483647을 입력했다. 이 경우 int로 표현하는 범위에 포함 되기 때문에 long -> int로 형변환을 해도 아무런 문제가 없다.
▶️ 초과 범위: long maxIntOver = 2147483648L을 보면 int로 표현하는 가장 큰 숫자인 2147483647보다 1큰 숫자를 입력했다. 이 숫자는 int범위를 넘어가기때문에 마지막에 L을 붙여 long형을 사용해야 한다. 이 경우 int로 표현하는 범위를 넘기 때문에 형 변환을 할시 문제가 발생한다.

int Value = 2147483647; // maxIntvalue를 대입
int Value = -2147483648; // maxIntOver를 대입
  • 결과를 보면 -2147483648이라는 전혀 다른숫자가 보인다. 이렇게 기존범위를 초과해서 표현하게 되면 전혀 다른 숫자가 표현되는데, 이런 현상을 오버플로우 라고 한다.
  • 참고로 -2147483648int의 가장 작은 숫자이다.
  • 중요한 것은 오버플로우가 발생하는 것 자체가 문제다. 오버플로우발생 시 결과가 어떻게 되는지 계산하는데 시간을 낭비하면 안된다! 오버플로우자체가 발생하지
    않도록 막아야 한다. 이 경우 단순히 대입하는 변수의 타입을 int -> long으로 변경해서 사이즈를 늘리면 오버플로우 문제가 해결된다.

📌 계산과 형변환

  • 형변환은 대입 뿐만 아닌, 계산을 할 때도 발생한다.
int div1 = 3/2; //1
double div2 = 3/2; //1.0
double div3 = 3.0/2; //1.5
double div4 = (double) 3 / 2; //1.5
int a = 3;
int b = 2;
double result = (double) a / b; //1.5
  • 자바에서 계산은 2가지만 기억하자
  1. 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
  • int + intint를, double+doubledouble의 결과가 나온다.
  1. 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
  • int + longlong+long으로 자동 형변환이 일어난다.
  • int + doubledouble+double로 자동 형변환이 일어난다.
profile
웹 백엔드 개발자를 지향하고 있습니다.

0개의 댓글