[STUDY HALLE] 3주차 과제: 연산자

2 minute read

/* 실제로는 2021-01-11에 작성된 게시물입니다. */

학습 목표

자바가 제공하는 다양한 연산자를 학습하세요.

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (optional) Java 13. switch 연산자

Deadline: ~2020/11/28 15:00

산술 연산자

산술연산자는 사칙연산(+,-,*,/)와 나머지를 구하는 모듈러(%)연산이 있다. 이 중 ‘+’연산은 숫자가 아닌 문자열을 이어주는데도 사용될 수 있다. 문자열과 숫자형을 더하더라도 숫자형을 문자열로 바꾸어 연산이 가능하게 된다. 하지만 나머지 연산은 문자열에 적용할 수 없으며, 나눗셈이나 모듈러 연산을 할 때 에는 0으로 나누지 않도록 조심해야한다.(Divide By Zero Exception)

비트연산자

연산자 의미
& 비트 단위의 and 연산
| 비트 단위의 or 연산
^ 비트 단위의 xor 연산
~ 비트 단위의 not 연산
<< 비트 단위 왼쪽으로 shift
>> 비트 단위 오른쪽으로 shift
>>> 비트 단위 오른쪽으로 shift

사실은 코딩하면서 사용하는 상황이 많지는 않은 연산자이다. 나의 경험을 되돌아보더라도 정보보호 과목에서 과제를 할 때 사용했던 것 외에는 쓴 경우가 생각이 나질 않는다.
>> 연산자와 »> 연산자의 차이는 » 연산자의 경우 연산이 수행되는 값이 음수일 경우 빈 공간이 -1로 채워지는 반면, »> 는 그런 것과 상관 없이 무조건 0으로 채워진다.

관계연산자

연산자 의미
x > y x가 y보다 크면 true 반환
x >= y x가 y보다 크거나 같으면 true 반환
x < y x가 y보다 작으면 true 반환
x <= y x가 y보다 작거나 같으면 true 반환
x == y x가 y와 같으면 true 반환
x != y x가 y와 다르면 true 반환

여기서 equal연산자(==)와 not equal 연산자(!=)는 primative값을 비교할 때에는 값이 같은지에 대한 비교를 하고, 참조 타입을 비교할 때에는 같은 객체인지에 대한 비교를 한다.

논리 연산자

연산자 의미
&& and 연산
|| or 연산
! not 연산

&&와 || 연산을 사용하면 단락 회로 평가(Short Circuit Evaluation)를 하게 된다. and 연산을 할 경우 앞의 결과가 false일 경우 뒤를 볼 필요가 없고, or 연산의 경우에는 true가 있으면 뒤를 볼 필요가 없어서 확인하지 않는 것을 말한다.
비트 연산에 사용되었던 & 와 |가 boolean 타입의 논리연산을 할 때 같은 역할을 할 수 있지만, 이 때는 단락 회로 평가가 적용되지 않고 모두 확인한다.

instanceof

객체(Object)의 타입이 유형에 맞는 값인지를 평가하는 연산자이다. 필요에 따라 객체를 업/다운 캐스팅할 때 주로 사용된다. 특히 다운캐스팅을 하기 전에 상위 클래스로 형 변환 된 인스턴스의 원래 자료형을 확인할 수 있다.

class Animal {
}

class Human extends Animal {
}
Animal minsu = new Human();

if(minsu instanceof Human){
  Human newMinsu = (Human)minsu;
}

assignment(=)

대입연산자로 메모리에 값을 저장, 할당하겠다는 의미이다.

화살표(->) 연산자

c++로 알고리즘 문제를 풀다보니, 보자마자 포인터 접근부터 떠올랐다. 자바에서는 Java 8 부터 도입된 연산자로, 람다 표현식(Lamda Expression) 이라고 한다. 람다식의 사용 방법은 다음과 같다.

1. 람다는 매개변수 화살표(->) 함수몸체로 이용하여 사용 할 수 있다.
2. 매개변수가 하나일 경우 소괄호를 생략 할 수 있다.
3. 함수몸체가 단일 실행문이면 괄호{}를 생략 할 수 있다. 
4. 함수몸체가 return문으로만 구성되어 있는 경우 괄호{}를 생략 할 수 없다.

3항 연산자

if else 문을 하나의 연산자로 표현할 수 있고,
(조건문) ? (true일 때 결과) : (false일 때 결과)
의 형태로 사용된다. 하지만 굳이 사용하기 보다 차라리 if else 문을 사용해서 논리를 구성하는 것이 낫다는 것을 어디서 본 기억이 있다.(출처는 기억이…) 아마도 코드의 가독성 측면 때문이 아니었나 생각이 든다.

연산자 우선 순위

Operator Sequance

람다 표현식(->) 같은 경우 표의 모든 연산자보다 연산자 우선 순위가 낮다. 연산자 우선 순위가 헷갈릴 때, 소괄호를 이용해서 우선순위를 확실히 하는 것도 하나의 방법이 될 수 있겠다.

참고문헌

https://velog.io/@jaden_94/2%EC%A3%BC%EC%B0%A8-%ED%95%AD%ED%95%B4%EC%9D%BC%EC%A7%80 https://blog.baesangwoo.dev/posts/java-livestudy-3week/ https://cremazer.github.io/java-Types-of-Operators/

Leave a comment