[JAVA] 연산자 3 - 논리 연산자, 관계 연산자, 삼항연산자

김민기·2021년 5월 22일
0

Java

목록 보기
8/20
post-thumbnail

논리 연산자

논리 연산자는 두 boolean 형 피연산자의 값의 비교를 통해 true 혹은 false 를 반환합니다.

AND( && ), OR( || ) 연산자

&& 연산은 두 피연산자가 모두 truetrue 아니면 false 를 반환합니다. || 연산자는 두 피연산자 중 하나라도 truetrue , 아니면 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

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 으로 식별하지 않고 상태값을 그대로 작성하면 그 값이 반환됩니다.

  • 람다식에 대해서는 추후 학습하여 게시할 예정입니다.

연산자 우선순위

연산자는 수식 내에 우선순위로 수행 순서가 결정되며, 같은 레벨의 우선순위를 갖는다면 왼쪽에 있는 연산자부터 수행합니다.

profile
민기1

0개의 댓글