자바가 제공하는 다양한 연산자를 학습하기
+
, -
, *
, /
등3 + 4
에서의 3
과 4
+
(덧셈), -
(뺄셈), *
(곱셈), /
(나눗셈), %
(나머지)%
나머지 연산 이란? 나눗셈을 하고 난뒤의 나머지를 뜻한다.10 % 3 = 1 // 3 * 3(몫) + 1(나머지) = 10
10 / 3 = 3
3.333 ...
을 얻으려면 실수형으로 형변환하여 연산해주어야한다.1 + 2.3 = 1.0 + 2.3 = 3.3
int
이기 때문에 정수형 끼리 연산해줄 때 피연산자가 int
미만의 자료형이라면 자동으로 int
로 타입 프로모션된다.1/0(0에 가까운 수)
를 계산하면 무한대로 발산한다. 프로그래밍에서는 어떻게 될까?0
으로 나눌 경우, 다음과 같은 에러를 발생시킨다.0.0
으로 나눌 경우, 다음과 같은 결과를 보여준다.Infinity
라는 특수한 값을 지원하기 때문이다.|
(OR) : 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.&
(AND) : 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.^
(XOR, eXclusive OR, 배타적 XOR) : 피연산자의 값이 서로 다를 때만(즉, 배타적 일때만) 1을 결과로 얻는다. 같을 때는 0을 얻는다.~
(비트 전환 연산자, 1의 보수 연산자) : 0은 1로, 1은 0으로 비트를 전환 시켜준다.<<
, >>
(shift 연산자) : 비트를 각각 왼쪽, 오른쪽으로 이동시켜준다.<<
(왼쪽 shift)>>
(오른쪽 shift)|
(OR) : 특정 비트의 값을 변경할 때10101011 | 00001111 = 110101111 // 마지막 4bit를 'F'로 변경
&
(AND) : 특정 비트의 값을 뽑아낼 때10101011 & 00001111 = 00001011 // 마지막 4bit를 뽑아냄
^
(XOR, eXclusive OR, 배타적 XOR) : 어떤 수에 똑같은 수로 XOR 연산을 두번 수행하면 원래의 값으로 돌아오는 특성을 이용하여, 간단한 암호화에 쓰인다.2*n
을 곱하거나 나눌 때 사용x << n // x * 2^n
x >> n // x / 2^n
toBinaryString()
을 이용하자.
- 비트(bit) : 0 or 1
❓ 산술 변환이란?
- int보다 작은 타입은 int타입으로 자동 변환
true
, false
중 하나이다.<
, >
, <=
, >=
==
(두 값이 같은가?), !=
(두 값이 다른가?)||
or |
: 피연산자 중 한 쪽의 값이 true
이면, true
를 결과로 얻는다. 그 외에는 false
을 얻는다.||
는 첫번째 조건이 참이면 두번째 조건은 확인하지 않는다.|
는 첫번째 조건이 참이어도 두번째 조건을 확인한다.&&
or &
: 피연산자 양 쪽이 모두 true
이어야만 true
를 결과로 얻는다. 그 외에는 false
을 얻는다.&&
는 첫번째 조건이 참이 아니면 두번째 조건은 확인하지 않는다.&
는 첫번째 조건이 참이 아니어도 두번째 조건을 확인한다.!
: true
는 false
로, false
는 true
로 전환 시켜준다.레퍼런스 변수 instanceof 타입(클래스 or 인터페이스)
class Parent {}
class Child extends Parent {}
Parent parent = new Child();
System.out.println(parent instanceof Child); //true
System.out.println(parent instanceof Parent); //true
System.out.println(parent instanceof Object); //true
if(parent instanceof Parent) {
Parent parentInstance = (Parent) parent;
}
lvalue = rvalue
x = y = z = 3 // z = 3 -> y = z -> x = y
a operator= b // a = a operator b와 같다.
(조건) ? (조건이 참 일 때 실행) : (조건이 거짓일 때 실행)
출처 : 자바의 정석 3rd Edition, 남궁성 지음
🤯 이걸 언제 다 외워?
- 사용하면서 저절로 외워지기 때문에, 처음에 연산자 우선순위를 완벽히 외우는 것을 추천하지 않는다.
- 그리고 괄호를 적지 않으면 다른 사람이 보기에 무척이나 헷갈린다.
- 따라서 괄호의 우선순위가 가장 높으므로, 괄호로 가독성을 최대한 확보하자!
- 또한, 연산자들을 여러 줄로 나눠서 적으면 가독성이 올라간다!
: 추상 메서드가 단 1개인 인터페이스
람다식이 나오기전에 익명 내부 클래스를 만들어 함수형 인터페이스를 사용하는 방법
@FunctionalInterface // 인터페이스가 두 개 이상의 추상 메서드를 가질 경우, 컴파일 에러
interface Calculator {
int cal(int a, int b);
}
Calculator calculator = new Calculator() {
@Override
int cal(int a, int b) {
return a + b;
}
};
단점 : 코드가 길어 가독성이 떨어짐
해결방법 : 람다식
Calculator calculator = (a, b) -> a + b;
calculator.cal(1, 2);
🤔 아직 헷갈리는 부분이 많지만, 나중에 람다식 배울 때 제대로 해보자!
switch
문은 if문에서 조건에 따라 분기해야 할 내용이 많아졌을 때, 가독성과 속도를 향상시키기 위한 목적으로 사용한다.
자바 12 버전부터 switch
문에 대해 바뀐 부분이 있어 이에 대해 알아보자.
기존 switch 문이다.
int result;
switch (str) {
case "a":
result = 1;
break;
case "b": case "c":
result = 2;
break;
default:
result = -1;
}
자바 12 버전 - ,
(콤마)를 사용하여 여러 case를 한 줄에 나열한다.
int result;
switch (str) {
case "a":
result = 1;
break;
case "b", "c":
result = 2;
break;
default:
result = -1;
}
자바 12 버전 - switch operator가 람다식을 통해 결과를 반환할 수 있다.
switch fall through
가 존재하지 않아 break
를 쓰지 않아도 된다.int result = switch (str) {
case "a" -> 1;
case "b", "c" -> 2;
default -> -1;
};
자바 13 버전 - switch operator가 yield
키워드를 사용하여 결과를 반환할 수 있다.
:
를 이용한 switch문에서도 사용가능하다.int result = switch (str) {
case "a"-> 1;
case "b", "c" -> {
System.out.println("{} 블록으로 멀티 라인 수행");
yield 2;
}
default -> -1;
};
int result = switch (str) {
case "a":
yield 1;
case "b", "c": {
System.out.println("{} 블록으로 멀티 라인 수행");
yield 2;
}
default:
yield -1;
};
Reference