1. 상수
- 수학 : 변하지 않는 값
- 컴퓨터(JAVA) : 한 번만 저장할 수 있는 메모리 의미
1-1. 선언방법
final int AGE;
* (상수명 -> 모두 대문자로 표기)
1-2. 상수초기화 방법
변수와 동일
* (초기화 이후 데이터(값)을 대입할 수 없다.)
2. 데이터 오버플로우 : 메모리에 표현범위를 초과하는 값을 저장하려는 경우
자료형의 크기에 따라 저장할 수 있는 데이터 범위가 달라진다.
컴퓨터의 데이터는 0,1로 구분되며 크기는 1bit이다.
1byte는 8bit이며, 원칙적으로 각 bit마다 0,1 두 개의 숫자를 넣어 8자리의 이진수를 나타낼 수 있다.
즉 0~255까지 나타낼 수 있지만 음수도 표현해야하므로 "부호비트"(제일 앞의 bit)를 사용하여 -128~127까지 범위를 나타낸다.
1byte 가 저장할 수 있는 정수의 범위 : - 128 ~ 127
그렇다면 아래와 같이 최대범위인 127을 초과하여 byte에 저장하려고 한다면 어떻게 될까?
아래와 같이 오버플로우가 일어나 128이 아닌 범위 중 가장작은 값인 -128이 된다.
127 +1 => -128
전자시계를 예로 하여 이해해 볼 수 있다.
23:59:59(나타낼 수 있는 가장 큰 값)일 때 1초가 지나면 24:00:00이 아닌
00:00:00(나타낼 수 있는 가장 작은 값)로 돌아간다.
즉 1,2,3, ... , 125, 126, 127, -128, -127, -126, -125, ... 0,1,... 이렇게 가장작은 값과 가장 큰 값이
서로 맞물려 있다.
* 부호비트
- 0 : 양수
- 1 : 음수
0111 1111 : 양수에서 최대값 = 127
1000 0000 : 128 부호비트 침범 -> 나머지 다 0 -> -값이 됨
* int범위로 인한 오버플로우 발생
위와같이 int저장범위 초과로 인해 오버플로우가 발생하여
생뚱맞은 값이 결과로 나왔다.
이는 아래와 같이 long자료형으로 강제 형변환해줄 경우 해결이 가능하다.
3. 형변환(casting)
값(Data)의 자료형을 바꾸는 것. (boolean제외한다.)
3-1. 형 변환 예시
* 123456 -> 123456.0
(int) (double)
* 'A' -> 65
(char) (int)
* 3.14f -> 3
(float) (int)
3-2-1. 자동 형변환 (형변환 생략 가능)
컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환해주는 경우.
크게 문제될 일이 없으므로 아래와 같이 자동으로 큰 자료형으로 변환이 된다.
int a = 12;
double b = 3.5;
System.out.println(a + b); //(15.5) int형과 double형의 연산결과가 double형으로 자동변환됨.
[ char -> int ] 자동형변환 됨
문자에 해당하는 유니코드 숫자로 변환
int num = 'A';
System.out.println("num : "+ num); //65
long은 8byte이고 float은 4byte인데 어떻게 자동 형변환이 되는거지?
-> float의 비트수가 더 적지만 나타낼 수 있는 수의 범위가 더 커서 자동변환 가능하다.
short(양수,음수 모두) -> char(양수만)로 전환 X
==> int로만 해야함
* 단, byte와 short자료형 값의 계산 결과는 무조건 int로 처리
--> 따라서 byte, short자료형의 계산 결과를 int가 아닌, byte나 short로 얻고 싶은 경우
(byte) / (short)를 통해 강제 형변환을 해줘야 한다.
3-2-2. 강제 형변환 (형변환 생략 불가능)
값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환
강제 형변환 시 데이터 손실이 발생할 수 있음 -> 데이터의 변형, 손실을 감수하고 강제 변환
double temp;
int n =(int)temp; //()안 변환하고 싶은 자료형 명시
출처: kh정보교육원 예습영상, www.hanumoka.net/2017/09/08/java-20170908-java-datatype-orverlow/
'Java > 정리' 카테고리의 다른 글
7회차_제어문(switch문_return/break 차이) (0) | 2021.04.19 |
---|---|
[Java] 연산자 (0) | 2021.04.12 |
2회차_출력메소드(printf) (0) | 2021.04.10 |
1회차_클래스 import, println단축키 (0) | 2021.04.10 |
1회차_콘솔창, explorer창 (0) | 2021.04.10 |