목표
  • 자바가 제공하는 다양한 연산자를 학습합니다.
학습할 것
  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • 대입 연산자
  • instanceof
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (optional) Java 13. switch 연산자

연산자

우선 연산자에 대해서 알아봅시다.

  • 연산자는 변수의 값을 변경하거나 대입하는데 사용됩니다.
  • 자바에서는 연산자에 따라 연산 대상이 될 수 있는 데이터 타입이 정해져 있습니다. (정수나 실수만 가능)
  • 오버플로(overflow) 또는 언더플로(underflow) 등 범위를 벗어나는 연산들에 대해서는
  • 연산 결과에 불필요한 값이 저장됩니다.
  • 0으로 나눌 경우는 오류가 발생합니다.

산술 연산자 ( +, -, *, /, % )

  • 산술 연산자는 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자입니다.
  • 산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
  • 나머지 연산은 결과가 항상 정수입니다.

관계 연산자 ( <, <=, >, >=, ==, != )

  • 비교 연산자의 결과 값은 크기 값을 비교하여 조건을 만족하면 true 그렇지 않으면 false를 반환합니다.
  • 만약 비교되는 숫자의 데이터 타입이 다를 경우 기본적으로 크기가 큰 데이터 타입에 맞추어 비교 연산을 실행합니다.

비트 연산자

비트 연산자 ( &, |, ^ )

  • 비트 연산자는 두 수를 각각 2진수로 변환하여 두 수의 각 비트 연산을 수행합니다.
    • & (비트곱): 두 비트가 1일 때 1, 나머지는 0.
    • | (비트합): 두 비트 중 하나 이상이 1이면 1, 두 비트 모두 0이면 0.
    • ^ (xor 배타적 논리합): 두 비트가 다르면 1, 같으면 0.

비트 이동 연산자 ( <<, >> )

  • 왼쪽 항의 값을 2진수로 변환하여 오른쪽 항의 값만큼 비트를 왼쪽(<<), 오른쪽(>>)으로 이동시키는 연산을 수행합니다.

논리 연산자 ( &, |, &&, || )

  • & : 연산을 수행하여 양쪽 항이 모두 true일 때만 true를 반환합니다.
  • | : 연산을 수행하여 양쪽 항 중 한쪽만 true를 만족해도 true를 반환합니다.
  • && : 만일 왼쪽 항이 false일 경우에는 오른쪽 항을 수행하지 않고 무조건 false를 반환합니다. (양쪽 항을 모두 검사하는 & 보다 속도가 빠름)
  • || : 만일 왼쪽 항이 true일 경우에는 오른쪽 항을 수행하지 않고 무조건 true를 반환합니다. (양쪽 항을 모두 검사하는 | 보다 속도가 빠름)

대입 연산자 (=, +=, -=, *=, /=, %=)

  • 대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽입니다.
  • 또한, 앞서 살펴본 산술 연산자와 결합한 다양한 복합 대입 연산자가 존재합니다.

3항 연산자

  • 단순한 IF문일 경우 라인수를 획기적으로 줄여주는 방식이 바로 3항 연산자입니다.
  • 삼항연산자는 (조건문) : ? 참 : 거짓 이라는 문법을 가지게 됩니다.
//IF ELSE
int a;
if(5<4) {
    a = 50;
}else {
    a = 40;
}
System.out.println(a); //결과 = 40 

//삼항연산자
int b = (5 < 4) ? 50 : 40; 
System.out.println(b); //결과 = 40
  • 위와같이 삼항연산자가 할수있는 것은 IF ELSE문을 통해서도 처리가 가능합니다.
  • 삼항연산자를 사용하여 코드의 라인이 줄어들었다고 컴파일 속도가 빨라지는 것은 아닙니다.
  • 삼항연산자를 중복해서 처리할 경우. 가독성이 떨어질 수 있으므로 중복처리는 피하는것이 좋습니다.

산술, 관계, 비트, 대입, 3항 연산자 정리

구분 연산자 사용예 설명
산술 연산자 + a + b 덧셈
- a - b 뺄셈
* a * b 곱셈
/ a / b 나눗셈
% a % b 나머지
++ ++a 연산전에 변수값 1증가
a++ 연산후에 변수값 1증가
-- --a 연산전에 변수값 1감소
a-- 연산후에 변수값 1감소
관계 연산자 > a > b a 가 b 보다 크면 true
>= a >= b a 가 b 보다 크거나 같으면 true
< a < b a 가 b 보다 작으면 true
<= a <= b a 가 b 보다 작거나 같으면 true
== a == b a 가 b 와 같으면 true
!= a != b a 가 b 와 같지 않으면 true
비트 연산자 && a && b a, b 모두 true 이면 true
|| a || b a,b 둘 중 하나라도 true 이면 true
! !a a 가 true 이면 false, false 이면 true
대입 연산자 = a = 9; 변수 a 에 값 9 를 할당
+= a += b; a = a + b;
-= a -= b; a = a - b;
*= a *= b; a = a * b;
/= a /= b; a = a / b;
%= a %= b; a = a % b;
3항 연산자 max = a > b ? a : b; a 가 b 보다 크면 a의 값을 max 에 할당
a 가 b 보다 크지 않다면 b의 값을 max 에 할당

instanceof

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용합니다.
  • 주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치합니다.
  • 연산의 결과로 boolean값인 true, false 중의 하나를 반환 합니다.
  • instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻합니다.

화살표(->) 연산자

람다식에 사용되는 연산자입니다.

  • 람다식이란 식별자없이 실행가능한 함수를 의미합니다.
  • 함수인데 함수를 따로 만들지 않고 코드한줄에 함수를 써서 그것을 호출하는 방식입니다.
(매개변수, ...) -> { 실행문 ... }

(매개변수, ...)는 오른쪽 중괄호 { } 블록을 실행하기 위해 필요한 값을 제공하는 역할을 합니다. 매개 변수의 이름은 개발자가 자유롭게 지정할 수 있으며 인자타입도 명시하지 않아도 됩니다. -> 기호는 매개 변수를 이용해서 중괄호 { } 바디를 실행한다는 뜻으로 해석하면 됩니다.

람다식 장점

  1. 코드를 간결하게 만들 수 있습니다.
  2. 코드가 간결하고 식에 개발자의 의도가 명확히 드러나므로 가독성이 향상됩니다.
  3. 함수를 만드는 과정없이 한번에 처리할 수 있기에 코딩하는 시간이 줄어듭니다.
  4. 병렬 프로그래밍이 용이합니다.

람다식 단점

  1. 람다를 사용하면서 만드는 무명함수는 재사용이 불가능합니다.
  2. 디버깅이 다소 까다롭습니다.
  3. 람다를 남발하면 코드가 지저분해질 수 있습니다. (비슷한 함수를 계속 중복생성할 가능성이 높음)
  4. 재귀로 만들경우에는 다소 부적합한면이 있습니다.

연산자 우선 순위

  1. 최우선연산자 ( ., [], () )
  2. 단항연산자 ( ++,--,!,~,+/- : 부정, bit변환>부호>증감)
  3. 산술연산자 ( *,/,%,+,-,shift) < 시프트연산자 ( >>,<<,>>> ) >
  4. 비교연산자 ( >,<,>=,<=,==,!= )
  5. 비트연산자 ( &,|,,~ )
  6. 논리연산자 (&& , || , !)
  7. 삼항연산자 (조건식) ? :
  8. 대입연산자 ( =,*=,/=,%=,+=,-= )

(optional) Java 13. switch 연산자

Java 12부터 프리뷰로 추가되었습니다.

: 대신 -> 를 사용할 수 있습니다.
int a = 1;

switch(a){
    case 1 -> System.out.println("case1");
    case 2 -> System.out.println("case2");
}
yield 기능을 이용해 값을 리턴 할 수 있습니다.
int a = 1;
int b = switch (a) {
  case 1 ->{
    System.out.println("case1");
    yield 10;
  }
  case 2 ->{
    System.out.println("case2");
    yield 12;
  }
}
출처

+ 따끈한 최근 게시물