백기선님의 자바 라이브 스터디의 참여 및 학습 내용을 정리한 글입니다.
자바의 다양한 연산자를 학습해보자.
1. 단항, 이항 연산자
2. 산술/비트/관계/논리 연산자
3. instanceof
4. assignment(=) operator
5. 화살표(->) 연산자
6. 3항 연산자
7. 연산자 우선 순위
수학적인 계산 처리를 수행하는 문자 또는 기호라고 할 수 있다. 자바에서 연산자는 크게 단항/이항/삼항/대입 연산자로 분류할 수 있고, 이항 연산자에서는 산술, 비트, 비교, 논리, 관계 연산자로 나누어 볼 수 있다.
피연산자가 1개인 연산자를 말한다.
-
는 부호를 반대로 변경한다. (음수 => 양수, 양수 => 음수)int i = 5;
System.out.println(++i); // 전위형, 결과는 6을 출력
System.out.println(i++); // 후위형, 결과는 6을 출력, 이 코드 라인이 지나고 7로 증가됨
System.out.println(!true); // true
System.out.println(!false); // false
// int 타입은 4byte 크기를 가진다. 따라서 32bit(4 * 8)의 2진수를 표현하면 아래와 같다.
int a = 8; // 2진수: 0000 0000 0000 0000 0000 0000 0000 1000
// 2진수: 1111 1111 1111 1111 1111 1111 1111 0111
// -9 (10진수) 와 동일한 값
System.out.println(Integer.toBinaryString(~a));
// 위 비트반전 연산 결과에 +1 을 해주어야만 정수형의 반대 부호 값을 구할 수 있다. (2의 보수)
// 2진수 : 1111 1111 1111 1111 1111 1111 1111 1000
// -8 (10진수)
System.out.println(Integer.toBinaryString(~a + 1));
피연산자가 2개인 연산자.
연산자 : +, -, *, /, %
보통 수학적으로 자주 사용되는 사칙 연산을 할 때 사용하는 연산자.
/
, %
사용시 0으로 나눌 수 없다. 0으로 /
연산을 하면 INF(Infinity)로 '무한대'라는 의미의 결과값이 나오고, 0으로 %
연산을 하면 NaN(Not a Number) '숫자가 아님'와 같은 결과를 출력한다.연산자 : &, ^, |, ^(단항)
1
일 때 1을 반환, 그 이외에는 0을 반환한다.1
이면 결과로 1을 반환, 그 이외에는 0을 반환한다.연산자 : &&, ||, &, |, ^
연산자 : >, <, >=, <=, ==, !=
피연산자들이 숫자 형식일 때, 두 피연산자들의 크기 관계를 비교해 결과로 boolean형의 true, false를 반환하는 연산자.
객체 타입을 확인하는데 사용한다. 이 연산자를 통해 형변환의 가능 여부를 boolean 타입의 true/false로 결과를 반환한다. 주로 참조형 타입에서 부모 클래스의 자식 관계인지를 파악하기 위해서 사용하며, 또한 비교하려는 대상 객체가 특정 인터페이스를 구현화 시킨 것인지 파악하는 용로 사용 가능하다.
class Parent {}
class Child extends Parent {}
public Test {
public static void main(String[] args) {
Parent p = new Parent();
Child c = new Child();
System.out.println(p instanceof Parent); // true
System.out.println(p instanceof Child); // false, p 객체는 Child의 부모이기 때문에
System.out.println(c instanceof Parent); // true
// 아래와 같은 형태로도 객체 타입 확인이 가능
System.out.println((Integer)5 instanceof Integer); // true
System.out.println("b" instanceof String) // true
}
}
연산자 : ==, !=, +=, -=, /=, %=, <<=, >==, &=, ^=, |=
대입 연산자라고 부르기도 한다. ==
와 !=
를 제외한 나머지 연산자들은 복합 대입 연산자로 =
전위에 붙은 연산자로 먼저 피연산자와 변수를 계산한 뒤에 다시 변수에 대입하는 연산이다.
여기서 값 대입과 주소 대입 차이가 있는데 다르게 말하면 깊은 복사, 얕은 복사라고 부르며 앞서 말한 두 방식의 차이점에 대해서는 아래 링크를 참고하는 것이 좋을 것 같다.
참고 : https://kils-log-of-develop.tistory.com/336
(백기선님의 자바 스터디를 참여하시는 어떤 분의 블로그 내용에서 깊은 복사와 얕은 복사에 대한 내용이 너무 좋아서 참고하게 되었습니다. 감사합니다!!!🙏)
연산자 정리
위 표는 아래 글을 참고했습니다. https://medium.com/@katekim720/%EC%97%B0%EC%82%B0%EC%9E%90%EB%B6%80%ED%84%B0-%EC%A1%B0%EA%B1%B4-%EB%B0%98%EB%B3%B5%EB%AC%B8%EA%B9%8C%EC%A7%80-3d5cec6513d4
자바8에 람다가 생기면서 추가된 연산자이다. 화살표 연산은 좌항에 함수형 인터페이스의 메소드의 사용 할 매개 변수를 나열하고, 우항에 실제 처리 로직을 작성한 블록을 기술하면 된다.
다음 예시를 보자
// Functional interface인 Function 인터페이스의 apply 메소드를 람다식으로 다음과 같이 재정의했다.
// 람다식 사용 시 다음과 같이 화살표 연산자가 쓰인다.
Function<String, String> messsage = (s) -> {
s.toUpperCase();
};
형태 : (조건식) ? (조건이 true일 때 실행할 결과) : (조건이 false일 때 실행할 결과)
3항 연산자는 항이 3개라서 3항 연산자라 부른다. 위와 같은 형태로 쓰이기 때문에 가독성 측면에서 호불호가 갈린다고 들었다. 개인적으로는 간단한 if-else를 사용할 때에는 3항 연산자를 사용해서 코드 라인을 줄이려고 하는편이다.
int a = 10;
int temp = 0;
// a가 15보다 크면 a 를 그대로 return하고, 반대일 경우는 a에 5를 더한 값을 return
temp = (a > 15) ? a : a + 5;
위 표는 아래 글을 참고했습니다. https://medium.com/@katekim720/%EC%97%B0%EC%82%B0%EC%9E%90%EB%B6%80%ED%84%B0-%EC%A1%B0%EA%B1%B4-%EB%B0%98%EB%B3%B5%EB%AC%B8%EA%B9%8C%EC%A7%80-3d5cec6513d4