[제대로 파는 자바 (Java)-by 얄코] 정수 자료형들과 관련 연산자
해당 게시물은 [제대로 파는 자바 (Java) - by 얄코]를 수강한 내용을 바탕으로 작성하였습니다.
정수 자료형의 크기와 범위
자료형
|
크기
|
표현 범위
|
byte
|
1바이트 (= 8비트)
|
-128 ~ 127 (-2^7 ~ 2^7-1)
|
short
|
2바이트
|
-32,768 ~ 32,767
|
int
|
4바이트
|
-2,147,483,648 ~ 2,147,483,647
|
long
|
8바이트
|
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
|
▶ 자료형의 범주 외의 수를 담을 수 없음
// ⚠️ 자료형의 범주 외의 수를 담을 수 없음
byte overByte1 = 127;
// byte overByte2 = 128; //불가!!!
byte overByte3 = -128;
// byte overByte4 = -129; //불가!!!
※ 자료형의 범위를 넘어가도록 숫자를 더하거나 뺄 경우 문제 발생!
→ 변수 초기화 시에는 범위를 넘어가는 값은 컴파일러 선에서 넣지 못하게 했는데
위의 예시처럼 초기화 후에는 컴파일러가 감히 판단하지 않아서 범위를 넘어가서 예상과 다른 값을 가져도
컴파일 상으로 오류는 나타나지 않게되므로 주의해야함!
▶ 큰 자료형에 작은 자료형의 값을 넣을 수 있지만 (묵시적 형변환)
작은 자료형에 큰 자료형의 값을 '그냥' 넣을 수는 없음 → 형변환 필요!
// 큰 자료형에 작은 자료형의 값을 넣을 수 있음
// 💡 묵시적(암시적) 형변환
_2b_short = _1b_byte;
// byte였던 1이 short 변수의 값으로 들어가 short 자료형의 1로 바뀜
// 값은 동일하지만 담기는 통의 크기가 달라졌다는 의미
_4b_int = _1b_byte; _4b_int = _2b_short;
_8b_long = _1b_byte; _8b_long = _2b_short; _8b_long = _4b_int;
// ⚠️ 작은 자료형에 큰 자료형의 값을 '그냥' 넣을 수 없음
// 들어있는 값의 크기와 무관
// _1b_byte = _2b_short; _1b_byte = _4b_int; _1b_byte = _8b_long; //불가!!!
// _2b_short = _4b_int; _2b_short = _8b_long; //불가!!!
// _4b_int = _8b_long; //불가!!!
▶ int 범위를 벗어나는 수에는 리터럴에도 명시해줘야 함
long _8b_long = 4; //사실 int인 4가 묵시적 형변환으로 들어가 있는것.
//끝에 L이 안붙으면 long이 아님
// ⭐ int의 범위를 벗어나는 수에는 리터럴에도 명시 필요
// 끝에 l 또는 L을 붙이기 (L 권장)
long _8b_long1 = 123456789123456789L;
▶ 자바 7부터는 가독성을 위해 _를 사용하여 아래와 같이 표현 가능 (리터럴 쪽)
int _4b_int2 = 123_456_789;
long _8b_long2 = 123_456_789_123_456_789L;
형변환 casting
▶ 명시적(강제) 형변환 : 작은 자료형에 큰 자료형의 값을 '형변환'하여 넣음
byte byteNum;
int smallIntNum = 123;
// byte보다 int가 큰데 int를 강제로 byte로 형변환
byteNum = (byte) smallIntNum;
※ 강제로 범주 외의 값을 넣은 경우에는 값이 손실됨!
정수 자료형의 연산
▶ byte와 short의 연산은 byte나 short가 아닌 int를 반환함!
byte b1 = 1;
byte b2 = 2;
short s1 = 1;
short s2 = 2;
// ⚠️ 아래는 모두 불가
// byte b3 = b1 + b2;
// short s3 = b1 + b2;
// short s4 = b1 + s2;
// short s5 = s1 + s2;
// ⭐ byte와 short의 연산들은 int 반환
// 그냥 int를 많이 쓰는 이유 중 하나
int i1 = b1 + b2;
int i2 = s1 + s2;
int i3 = b1 + s1;
💡 int를 널리 사용하는 기타 이유들
- 자바 (및 다수 언어들) 에서 기본 자료형으로 지정됨
→ 라이브러리와 API 등에서 사용됨
- 다른 언어들과 호환 (널리 사용되는 자료형)
- 연산 속도가 타 자료형보다 빠름
→ 32비트 ( 4바이트 ) : 대부분의 CPU에서 처리하기 적합한 크기
▶ 정수 자료형의 나누기 계산은 소수점 아래를 '버림'
▶ '%2' 연산을 사용하여 홀수와 짝수 구분에 많이 사용함
연산자 우선순위
postfix | expr++ expr-- |
unary | ++expr --expr +expr -expr ~ ! |
multiplicative | * / % |
additive | + - |
shift | << >> >>> |
relational | < > <= >= instanceof |
equality | == != |
bitwise AND | & |
bitwise exclusive OR | ^ |
bitwise inclusive OR | | |
logical AND | && |
logical OR | || |
ternary | ? : |
assignment | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
출처 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html