Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 우테코
- JDK
- Oracle JDK와 OpenJDK의 차이
- 제임스고슬링
- 인수테스트
- 방어적 복사
- 상근날드
- JXM
- 리스코프치환원칙
- ControllerTest
- 자판기미션
- 객체지향적인 설계
- 백준
- 윤년계산하기
- throw 와 throws 차이
- 자바로 만들수 있는 것
- 프로젝트 패키지 구조
- 테스트 성능 개선
- 우아한테크코스
- 자바 4334
- Getter Setter
- 블랙잭 회고
- There isn't anything to compare.
- PR 오류
- 자바 버전 다운 그레이드
- 자바의 종류
- java 1000번 A+B
- ServiceTest
- 상수와 Enum
- 우테코4기
Archives
- Today
- Total
개발새발
형변환(Casting) 과 오버 플로우(Overflow) 본문
개발을 하다보면, 타입에 대한 변환이 필요할 때가 있다.
이번 미션을 하면서도 아래와 같이 타입 캐스팅을 사용했다.
1
2
|
double result = gameResult.getBettingMoneyResult() * getBettingMoney();
addMoney((int) result);
|
cs |
그랬더니 아래와 같이 피드백이 왔다.
long 타입을 int 타입으로 강제 변경하면 오버플로우에 대한 대응이 어렵게 됩니다!! Math 클래스에 이를 처리해주는 메서드가 있는데 한번 참고해보시면 좋을 것 같아요!!!
이번 기회에 타입 캐스팅과 오버플로우에 대해서 공부해보고자 한다.
형변환이란?
큰 범위 -> 작은 범위로 하는 다운캐스팅과 작은 범위 -> 큰 범위로 하는 업캐스팅이 있다.
변수 저장 가능 범위
자료형 | 범위 | 크기(byte / bit) | 기본값 |
boolean | true, false | 1 / 8 | false |
char | 0~65,535(유니코드문자) | 2 / 16 | ‘\u0000’ |
byte | -128 ~ 127 | 1 / 8 | 0 |
short | -32,768 ~ 32,767 | 2 / 16 | 0 |
int | -2,147,483,648 ~ 2,147,483,647 | 4 / 32 | 0 |
long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 8 / 64 | 0L |
float | ±1.4E-45 ~ 3.4E38 | 4 / 32 | 0.0f |
double | ±4.9E-324 ~ 1.8E308 | 8 / 64 | 0.0 또는 0.0d |
1. 자동형변환(업 캐스팅)
표현 범위가 좁은 타입에서 넓은 타입으로 변환할 경우이다.
변환 시도 할 당시 int 의 범위가 double 에 포함되어 있기 때문에 자동으로 형변환이 된다.
1
2
|
int age = 10;
double = age;
|
cs |
2.강제형변환(다운 캐스팅)
1
2
|
double age = 10.5;
int = (int)age;
|
cs |
표현 범위가 넓은 타입에서 좁은 타입으로 변환할 경우이다. 변환 시도시 변환할 타입을 명시해주어야 한다.
3.오버 플로우(Ovrflow)
여기서 만약 다운 캐스팅을 시도하는 변수의 값이 해당 타입의 표현 범위보다 클 경우 오버플로우가 났다고 표현한다
1
2
|
byte age = (byte)129
|
cs |
오버 플로우가 된다면, 해당하는 타입의 표현 범위만큼만 값이 저장된다.
여기서 바이트는 127이 최대 표현 범위이기 때문에 129가 아니라 127이 저장된다.
오버 플로우 대처법
오버 플로우는 시스템 에러가 나지 않아, 파악하기 어렵기 때문에 다운 캐스팅을 할 때는 대응이 가능하도록 작성해야한다.
Math.xxxExact() 를 사용해서 오버플로우시, 예외를 던져보자.
Java 8 부터는 Math.xxxExact() 를 사용할 때 오버플로우가 나면, ArithmeticException라는 에러를 던져준다.
1
2
3
4
|
import static java.lang.Math.toIntExact;
long before = 100L;
int after = toIntExact(before);
|
cs |
- Math.incrementExact(long)
- Math.subtractExact(long, long)
- Math.decrementExact(long)
- Math.negateExact(long),
- Math.subtractExact(int, int
참고
- 형변환
'우아한테크코스 > level1' 카테고리의 다른 글
방어적 복사란? (0) | 2022.03.21 |
---|---|
[레벨1] 블랙잭 회고 (2) | 2022.03.21 |
객체지향 한걸음 (0) | 2022.03.21 |
리스코프 치환원칙 (0) | 2022.03.19 |
[레벨1] 자동차 경주 후기 (6) | 2022.02.21 |