JAVA의 가장 기본이 되는 내용

형변환, 형변환 시 오버플로우, 연산 시 형변환

cwchoiit 2024. 3. 25. 10:28
728x90
반응형
SMALL

참고 자료:

 

김영한의 실전 자바 - 중급 1편 | 김영한 - 인프런

김영한 | 실무에 필요한 자바의 다양한 중급 기능을 예제 코드로 깊이있게 학습합니다., [사진]국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바

www.inflearn.com

형변환

자바에서는 타입이라는 게 존재하는데 이는 다음과 같은 것들이다.

  • int
  • long
  • double
  • boolean
  • ...

그리고 자바에서는 작은것을 큰 곳에 넣을 수 있다. 같은 정수를 다루는 int, long은 int보다 long이 더 큰 범위를 가진다. 즉, 담는 그릇 자체가 더 크단 이야기인데 이 말은 int로 선언한 변수의 값은 long에 담을 수 있다. 그리고 이는 내가 명시적으로 작성하지 않아도 자동 형변환이 된다.

 

그렇다면 큰 것을 작은 그릇에 담으려면 어떻게 될까? 컴파일 오류가 발생한다.

 

그러나, 죽어도 변경해야 한다면 또는 값의 유실이 생기더라도 변경을 해야겠다면 명시적 형변환을 할 수 있다.

그리고 이 결과는 iv라는 int형 변수에 담긴 값은 3.5가 아닌 3이 된다. 왜냐하면 int라는 타입은 정수만을 취급하기 때문이다. 그래서 형변환 시 이런 경우를 조심해야 한다. 

 

형변환 시 Overflow

그럼 만약에 int가 다룰 수 있는 최대 범위를 초과하는 long 변수의 값을 int 변수에 담으려고 하면 어떻게 될까? Overflow가 발생한다.

int 형 변수가 다룰 수 있는 범위는 -2147483648 ~ 2147483647이다. 그리고 '2147483648' 이 값은 그 범위를 초과하기 때문에 Overflow가 발생해서 값의 역이 일어난다. 그러니까 결론은 이런짓을 하면 안된다.

 

 

연산 시 형변환

연산을 할 때 기억할 대원칙 2가지가 있다.

  • 같은 타입끼리 계산할 땐 같은 타입으로 계산이 된다.
  • 다른 타입끼리 계산하면 더 큰 타입으로 자동 형변환이 일어난다.

이 두가지만 알면 연산 시 발생하는 에러는 고민할 필요가 없다. 예를 들어 이 결과를 예측해보자.

3을 2로 나누면 1.5가 되는데 과연 이 결과는 뭐가 나올까? 1이 된다. 그 이유는 int / int 연산은 같은 타입이므로 int로 계산이 된다. 그럼 1.5는 1로 변경이 된다. 그리고 그 값을 int 타입 변수에 대입을 하면 역시나 int = int이므로 int 타입으로 대입이 된다. 그러므로 1이라는 값이 나온다. 즉, 만약 1.5를 기대했다면 잘못된 코드인것.

 

그럼 다음과 같이 작성하면 될까? 이 결과는 1.0이 된다. 

왜냐하면 int(3) / int(2)는 같은 int 타입끼리의 계산이므로 1이 된다. 그리고 그 값을 double이라는 변수에 대입하는데 double이 int보다 더 큰 타입이므로 자동 형변환이 되어 1.0이 변수에 들어가게 된다.

 

그러면 도대체 1.5가 나오게 하려면 어떻게 해야하는 걸까? 3을 2로 나눌 때 double 타입으로 만들면 된다.

즉, 3이라는 int형 변수를 double로 형변환을 해서 3.0을 만들면 된다. 그럼 3.0 / 2가 되고 double / int가 되니까 더 큰 타입으로 자동 형변환이 된다. double(3.0) / double(2.0) 이 계산되어 1.5라는 값이 나오고 그 값이 double 형 변수에 담기기 때문에 1.5가 출력된다.

 

그래서 연산 시 형변환은 딱 두가지만 기억하자.

  • 같은 타입끼리 계산할 땐 같은 타입으로 계산이 된다.
  • 다른 타입끼리 계산하면 더 큰 타입으로 자동 형변환이 일어난다.
728x90
반응형
LIST

'JAVA의 가장 기본이 되는 내용' 카테고리의 다른 글

객체 지향 프로그래밍  (0) 2024.03.26
NullPointerException  (0) 2024.03.25
Null / GC (Garbage Collection)  (0) 2024.03.25
JAVA는 항상 변수의 값을 복사해서 대입한다.  (0) 2024.03.25
JAVA란  (0) 2024.03.18