컴퓨터(java)에서 상수
한 번만 저장(기록)할 수 있는 메모
상수 선언 및 초기화
final int AGE; 변수 선언 앞에 final
관례적으로 모두 상수명은 대문자로 표기!
1) final int NUM = 100;
2) final int NUM; NUM = 100;
초기화 이후 다른 데이터(값)을 대입할 수 없음.
public void testFinal() {
// 상수 테스트
int size; // 변수
final int SIZE; // 상수
size = 10;
SIZE = 10;
System.out.println("=== 값 변경 전 ===");
System.out.println("size : " + size);
System.out.println("SIZE : " + SIZE);
// 변수 값 변경
size = 20;
// SIZE = 20; ERROR. 상수는 초기화 이후 다른 데이터 대입 불가
System.out.println("=== 값 변경 후 ===");
System.out.println("size : " + size);
System.out.println("SIZE : " + SIZE);
}
결과
size : 10
SIZE : 10
=== 값 변경 후 ===
size : 20
SIZE : 10
데이터 오버플로우
1byte -128~127 까지 나타낼 수 있음
127 + 1 = -128 (범위 초과)
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
↓
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
첫자리: 부호비트 (0 - 음수, 1 - 양수 표시)
형변환(casting)
Data의 자료형을 바꾸는 것 (boolean 제외)
값 처리 원칙
같은 종류 자료형만 대입, 계산이 가능
계산의 결과도 같은 종류의 값이 나와야 함 (int는 int끼리.. 결과도 int)
그렇지 않을 경우 형변환 필요
- 123456789 (int) → 123456789.0 (double)
- 'A' (char) → 65 (int)
- 3.14f (float) → 3 (int)
자동 형변환
컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환
| byte | short char |
int | long | float | double |
| 1byte | 2byte | 4byte | 8byte | 4byte | 8byte |
오른쪽에 위치한 자료형으로 형변환 가능. float는 long보다 비트수가 적지만 표현가능한 수의 범위가 큼.
문자형 char: 문자에 해당하는 수(유니코드)
byte와 short 자료형 값의 계산 결과는 무조건 int로 처리
double d = 3.3;
double result = a + d;
결과) a + d = 12.0 + 3.3 = 15.3
강제 형변환
값의 범위가 큰 자료형을 범위가 작은 자료형으로 변환. 데이터 손실 발생 가능 → 변형, 손실 감수하고 강제 변환
double temp;
int name = (int)temp;
오버플로우
public void testOverflow() {
//데이터 오버플로우 테스트
System.out.println("byte의 최대값 : " + Byte.MAX_VALUE);
System.out.println("byte의 최소값 : " + Byte.MIN_VALUE);
//byte bnum = 128; //저장 가능 범위 벗어남. error
byte bnum = 127;
bnum += 1;
System.out.println("byte의 최대값 + 1 : " + bnum);
bnum = -128;
bnum -= 1;
System.out.println("byte의 최소값 -1 : " + bnum);
int num1 = 100000;
int num2 = 30000;
//int의 저장 가능 범위는 약 21억이므로 30억이라는 값을 대입하면 오버플로우 발생
//int result = num1*num2; 실행 - 계산 결과 : -1294967296
long result = (long)num1*num2;
System.out.println("계산 결과 : " + result);
}
결과
byte의 최소값 : -128
byte의 최대값 + 1 : -128
byte의 최소값 -1 : 127
계산 결과 : 3000000000
형변환
public void testCasting() {
// 형변환 테스트
boolean bool = true;
// bool = 1; error. 형변환 불가 (참 거짓만 가능)
// char -> int : 자동 형변환
int num = 'A';
System.out.println("num : " + num);
// char에 정수값 저장 가능(숫자에 해당하는 유니코드 문자가 저장됨)
char ch = 66;
System.out.println("ch : " + ch);
// ch = -66; error. 음수 불가능
// int -> char : 강제 형변환
char ch2 = (char) num;
System.out.println("ch2 : " + ch2);
}
결과
num : 65
ch : B
ch2 : A
연산 형변환
public void testCasting2() {
// int와 long의 연산
int inum = 4;
long lnum = 8L;
// 1. int 결과
int isum = (int) (inum + lnum);
isum = inum + (int) lnum;
System.out.println("isum : " + isum);
// 2. long 결과
long lsum = inum + lnum;
System.out.println("lsum : " + lsum);
// byte와 short의 연산 결과: int형이 됨
byte bnum = 1;
short snum = 2;
int sum1 = bnum + snum;
System.out.println("sum1 : " + sum1);
// byte or short의 결과를 얻기 위해서는 강제 형변환
short sum2 = (short) (bnum + snum);
System.out.println("sum2 : " + sum2);
}
결과
lsum : 12
sum1 : 3
sum2 : 3
데이터 손실
public void testDataLoss() {
// 데이터 손실 테스트
// 정수 -> 실수 : 자동 형변환. 데이터 손실 x
long lnum = 100;
float fnum = lnum;
System.out.println("fnum : " + fnum);
// 실수 -> 정수 : 강제 형변환
// 소수점 이하 절삭 -> 데이터 손실
double dnum = 10.5;
int inum = (int) dnum;
System.out.println("inum : " + inum);
//강제 형변환으로 인해 예상치 못한 데이터 손실 발생에 주의
int num = 290;
System.out.println("num : " + num);
byte bnum = (byte) num;
System.out.println("bnum : " + bnum);
}
결과
fnum : 100.0
inum : 10
num : 290
bnum : 34
'TIL > JAVA' 카테고리의 다른 글
| Java 기초 - 반복문, 분기문 (0) | 2022.07.19 |
|---|---|
| Java 기초 - 조건문 (0) | 2022.06.20 |
| Java 기초 - 연산자(Operator) (0) | 2022.06.18 |
| Java 기초 - 출력메소드, 입력받기 (0) | 2022.05.26 |
| Java 기초 - 변수(Variable) (0) | 2022.05.25 |