논리 연산자는 두 boolean
형 피연산자의 값의 비교를 통해 true
혹은 false
를 반환합니다.
&&
), OR( ||
) 연산자&&
연산은 두 피연산자가 모두 true
면 true
아니면 false
를 반환합니다. ||
연산자는 두 피연산자 중 하나라도 true
면 true
, 아니면 false
를 반환합니다.
**&&
과 ||
연산 수행 시 왼쪽 피연산자의 값에 따라서 오른쪽 피연산자를 확인하지 않고도 결과가 결정된다면 오른쪽 피연산자는 확인하지 않는 과정을 이야기합니다.**
&&
연산에서는 왼쪽 연산자가 false
면 오른쪽 연산자와 관계 없이 false
이므로 확인하지 않습니다.
||
연산은 왼쪽 연산자가 true
면 오른쪽 연산자과 관계 없이 true
입니다.
//true 반환, 오른쪽 연산자 미수행
System.out.println(true || myMethod());
//false 반환, 오른쪽 연산자 미수행
System.out.println(false && myMethod());
&, |, ^
연산자&, |, ^
연산자들은 비트연산에서도 사용하지만 boolean
값을 통한 논리연산에도 사용됩니다.
&
와 |
는 각각 &&
와 ||
연산과 동일한 결과를 반환하지만, 단락회로 평가가 사용되지 않습니다.
//false
System.out.println(true ^ true);
//false
System.out.println(false ^ false);
//true
System.out.println(true ^ false);
instanceof
연산자는 reference
값의 객체 타입 평가를 위해 사용됩니다.
왼쪽 피연산자의 레퍼런스가 가르키고 있는 실제 객체의 타입이 오른쪽 피연산자의 클래스 타입과 같다면 true
를 반환합니다.
해당 객체가 상속 관계일 경우 부모의 객체를 포함하고 있으므로 이 경우에도 true
값을 반환하는 비교를 할 수 있습니다.
Object o = new Integer(1);
System.out.println(o instanceof Integer);
//true 반환
System.out.println(o instanceof Object);
//상속관계이므로 true
Object o2;
System.out.println(o instanceof Object);
//null을 포인팅하므로 false
=
)대입 연산자는 왼쪽 피연산자에 오른쪽 피연산자의 값을 대입하는 연산을 수행합니다.
기본형은 기본형끼리 연산이 가능하고 레퍼런스는 레퍼런스끼리 연산이 가능합니다. 이 때 왼쪽 피연산자의 범위가 더 큰 경우의 프로모션이 가능한 범위 내에서만 수행이 가능하며 그렇지 않다면 컴파일 에러를 발생시킵니다.
대입 연산자 왼쪽에 산술연산자 및 비트연산자를 사용할 수 있습니다.
이 때는 왼쪽 피연산자의 값과 오른쪽 피연산자의 값을 산술 및 비트연산한 결과가 다시 왼쪽피연산자에 대입되게 됩니다.
int temp = 1;
//temp = temp * 2;
temp *= 2;
//temp = temp | 1;
temp |= 1;
//temp = temp << 2;
temp <<= 2;
삼항 연산자는 boolean ? val1 : val2
와 같은 형식으로 표현됩니다.
첫 번째 피연산자의 boolean
값이 true
면 두 번째 피연산자 값 반환, false
면 세 번째 피연산자의 값이 반환됩니다.
삼항연산자의 우선순위는 매우 낮기 때문에, 연산 시 괄호를 적절하게 작성해야합니다.
// 2와 8이 반환되는 것이 아닌 2 또는 3 +5가 적용
int a = isTrue() ? 2 : 3 + 5;
// ->
int b = isTrue() ? 2 : (3 + 5);
→
, 람다식)JVM 8에서 추가된 익명 클래스를 표현하는 방법인 람다식을 위한 연산자입니다.
인터페이스의 상속 관계에서 한번만 사용되고 버려지는 클래스를 새로 선언하기 위해 클래스 작성 및 객체를 구현하는 과정은 번거로웠으나 람다식 사용으로 간결해질 수 있습니다.
Integer[] myArr = new Integer[3];
//익명 클래스 구현
Arrays.sort(myArr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
//람다식 사용
Arrays.sort(myArr, (o1, o2) -> o1 - o2);
이 때 람다식을 사용하려는 클래스 혹은 인터페이스는 @FuncionalItererface
어노테이션이 추가되어야 합니다.
람다식은 ()
를 통해 매개변수들을 감싸고 {}
으로 코드블럭을 작성합니다.
만약 코드불럭이 한 줄로 작성된다면 {}
를 생략할 수 있으며, 이 때 반환을 return
으로 식별하지 않고 상태값을 그대로 작성하면 그 값이 반환됩니다.
연산자는 수식 내에 우선순위로 수행 순서가 결정되며, 같은 레벨의 우선순위를 갖는다면 왼쪽에 있는 연산자부터 수행합니다.