byte _1b_byte = 1;
short _2b_short = 2;
int _4b_int = 3; // ⭐️ 일반적으로 널리 사용
long _8b_long = 4;
대부분의 컴퓨터에서 1바이트는 8비트이다.
// ⚠️ 자료형의 범주 외의 수를 담을 수 없음
byte overByte1 = 127;
byte overByte2 = 128;
byte overByte3 = -128;
byte overByte4 = -129
위 코드에서 overByte2와 overByte4 는 바이트의 범위를 넘어가기 때문에 오류가 난다.
// 큰 자료형에 작은 자료형의 값을 넣을 수 있음
// 💡 묵시적(암시적) 형변환
_2b_short = _1b_byte;
_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의 범위를 벗어나는 수에는 리터럴에도 명시 필요
// 끝에 l 또는 L을 붙여 볼 것
long _8b_long1 = 123456789123456789;
// 💡 가독성을 위해 아래와 같이 표현 가능 (자바7부터)
int _4b_int2 = 123_456_789;
long _8b_long2 = 123_456_789_123_456_789L;
int를 넘어가는 수에는 L을 붙여줘야지 long에 담을 수가 있다. 소문자는 숫자1과도 헷갈릴 수가 있으니 대문자 L을 써주는게 좋다.
위에서 봤듯이 큰 자료형에 있는 것을 작은 자료형에 넣으려면, 형변환, 즉 casting이 필요하다.
byte byteNum;
int smallIntNum = 123;
// 명시적(강제) 형변환
// - 개발자 : "내가 책임질테니까 그냥 넣으세요."
byteNum = (byte) smallIntNum;
만약 자료형의 값이 변환하려는 자료형의 범위를 넘어서면 어떻게될까.
int intNum = 12345;
// ⚠️ 강제로 범주 외의 값을 넣을 경우 값 손실
byteNum = (byte) intNum; // 💡 12345 % 128
이렇게 값 손실이 일어난다.
+: 더하기
-: 빼기
*: 곱하기
/: 나누기
%: 나머지
int a = 1 + 2;
int b = a - 1;
int c = b * a;
int d = a + b * c / 3;
int e = (a + b) * c / 3;
int f = e % 4;
여기서 부수효과 없음이 무엇이냐면 만약 a에 2를 넣고 b에 a+1을 한다고 해도 a의 값에는 변화가 없다는 뜻이다.
int a = 1;
int b = 2;
// int끼리 연산은 int 반환
int c = a + b;
long d = a + b;
short e = a + b; // ⚠️ 묵시적으로는 불가
short f = (short) (a + b);
연산을 사용한 자료형도 똑같다. 위처럼 더 큰 자료형이 작은 자료형으로 들어가려고 하면 형변환이 필요하다.
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;
위에 코드가 조금 중요한 내용이다. byte들끼리 더한 값도 byte에는 들어가지 못하고, byte보다 큰 short에도 들어가지 못한다. 왜그럴까? 이 b1과 b2를 더한 값이 int를 반환하기 때문이다.
메모리를 크게 아껴야 되는 상황이 아니고서는 거의 int를 사용한다.
int를 사용하는 이유
- 자바(및 다수의 언어들)에서 기본 자료형으로 지정됨
- 다른 언어들과 호환(널리 사용되는 자료형)
- 연산 속도가 타 자료형보다 빠름
- 32비트(4바이트):대부분의 CPU에서 처리하기 적합한 크기
그렇다면 long끼리의 연산도 int를 반환할까? 아니다. long을 반환한다.
long l1 = 1;
long l2 = 2;
// long끼리의 연산은 long 반환
long l3 = l1 + l2;
// ⚠️ 정수 자료형의 계산은 소수점 아래를 '버림'
byte int1 = 5/2;
int int2 = 10;
int int3 = 3;
int int4 = int2 / int3;
이 연산자는 부수효과를 일으키는 연산자이다.
a+=b>a = a+b
a-=b>a = a-b
a*=b>a = a*b
a/=b>a = a/b
a%=b>a = a%b
위의 연산은 왼쪽과 오른쪽이 동일하다. 오른쪽처럼 길게 쓰는것을 왼쪽처럼 간단하게 바꾼 것이다.
int a = 1;
a = a + 2;
a += 3; // 🔴
// 값을 반환하기도 함
int b = a += 4; // 🔴
디버그 중 다음 브레이크포인트로 넘어가는 법
- 맥: command + alt + R
// 💡 추가
// - 일반 대입 연산자도 값을 반환함
int i1 = 0;
int i2 = 1;
int i3 = (i1 = i2); // 괄호 제거해도 같음
String s1 = "ABC";
String s2 = "가나다";
String s3 = (s1 = s2);
디버그과정중 다음 브레이크 포인트로 넘어가는 것이 아니라 한줄한줄 넘어가고 싶을때는 F8을 누르면 된다. 윈도우와 맥 모두 마찬가지이다.
// 💡 자료형의 범위를 넘어가도록 숫자를 더하거나 뺄 경우
byte x = 127;
x += 1;
// -128
byte y = -128;
y -= 1;
// 127
위에 경우를 보자. 만약 더하기나 빼기를 했는데 자료형의 범위를 벗어나면 어떻게될까? 일단 컴파일은 된다. 하지만 값이 달라진다.
주석처럼 제일 큰값에서 1을 더했는데 제일 작은값이 나오고, 제일 작은값에서 1을 뺐는데 제일 큰값이 나온다.
x
++> 반환값: 값그대로 / 부수효과: 1증가
++x > 반환값: 1 증가한 값 / 부수효과 1 증가
x--> 반환값: 값그대로 / 부수효과: 1감소
--x > 반환값: 1감소한 값 / 부수효과 : 1감소
int int1 = 3;
int int2 = int1++; // 🔴
int int3 = ++int1;
int int4 = -(int2-- * --int3);
앞에 ++를 붙이는 것이나 뒤에 ++를 붙이는 것 두 경우 모두가 코드를 넘어가면 값을 증가시키게 되지만, 그 값이 사용되는 시점에서, ++가 뒤에 붙은 것은 기존값을 반환하고, ++가 앞에 붙은 것은 증가된 값을 반환한다.
int x = 1;
// 메서드 안으로도 '반환'되어 사용되는 것
System.out.println(x++); //1
System.out.println(++x); //3
System.out.println(x); //3
// ⚠️ 리터럴에는 사용 불가
int int5 = 3++;
int int6 = --3;
증감연산자는 리터럴에는 사용 불가하다.
a
==b -> a와 b는 같다.
a!=b -> a와 b는 다르다.
a>b -> a가 b보다 크다.
a>=b -> a가 b보다 크거나 같다.
a<b -> a가 b보다 작다.
a<=b -> a가 b보다 작거나 같다.
앞으로 계속 자바를 정리할 것이다. 학부시절에 이미 다 배웠던 내용이고, 기본적으로도 다 알고 있는 내용이지만 알고 있는 것과 정리해서 나중에도 편하게 볼 수 있는 지식으로 만든 것은 다르다는 것을 요새 많이 느끼고 있다.
많은 것을 배웠습니다, 감사합니다.