연산자

HWKoo·2023년 9월 2일

학습할 것

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


산술 연산자

  • 산술 연산자는 숫자 값을 이용하여 다양한 산술 연산을 수행하는데 사용됨
  • 이 연산자들은 기본적인 수학적 계산을 수행하며, 정수나 부동 소수점 숫자 등
    다양한 숫자 타입에 대해 사용할 수 있다.
연산자연산자의 기능
=연산자 오른쪽에 있는 값을 연사자 왼쪽에 있는 변수에 대입한다.
예) val = 20;
+두 피연산자의 값을 더한다.
예) val 4 + 3;
-왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다.
예) val = 4 - 3;
*두 피연산자 값을 곱한다.
예) val = 4 * 3;
/왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다.
예) val = 7 / 3;
%왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환한다.
예) val = 7 % 3;

비트 연산자

  • 비트 연산자는 byte, short, int, char 변수형에 대해서 사용 가능한 연산자
  • 비트 연산자와 관련된 모든 연산은 2진수 체계에서 처리됨
연산자기호설명
비트 NOT 연산자~2진수의 각 자릿수에 대해서 NOT 연산을 한다. 피연산자가 하나이기 때문에 단항 연산자처럼 사용하면 된다.
비트 AND 연산자&2진법으로 표시된 두 개의 피연산자가 필요하고 2진법 각 자릿수에 대해서 AND 연산을 실시한다.
비트 OR 연산자|2진법으로 표시된 두 개의 피연산자가 필요하며 2진법 각 자릿수에 대해서 OR 연산을 실시한다.
비트 XOR 연산자^2진법으로 표시된 두 개의 피연산자가 필요하며 2진법 각 자릿수에 대해서 XOR 연산을 실시한다.
XOR 연산은 피연산자의 두 값이 서로 다를 때만 true를 반환한다.

비트 NOT 연산자

  • 비트 보수 연산자라고도 불리는 비트 NOT 연산자는 2진수의 각 자릿수마다 NOT 연산을
    처리한다.

👉 예시 )

int i = 10;
System.out.println("Variavle i (Decimal) : " + i);
System.out.println("Variavle i (Binary) : " + Integer.toBinaryString(i));   // 2진수로 표시

i = ~i;	  // 비트 NOT 연산자
System.out.println("Variavle i (Decimal) : " + i);
System.out.println("Variavle i (Binary) : " + Integer.toBinaryString(i));   // 2진수로 표시

// 변수 i의 초기값은 10 이며, 10의 2진수로 표기하면 1010 이다.
// int 변수형의 메모리 크기는 32bit 이므로 32개의 각 자릿수에서 NOT 연산이 진행됨.
실행결과 :

Variavle i (Decimal) : 10
Variavle i (Binary) : 1010
Variavle i (Decimal) : -11
Variavle i (Binary) : 11111111111111111111111111110101

위의 예시와 같은 과정을 거치면 ~(NOT) 연산의 결과는 10진수로 -11이 된다.
만약 NOT 연산자를 사용하여 비트의 보수가 아닌 정수의 보수를 구하고 싶다면 ~i + 1 과 같이
'+1' 연산까지 거쳐야 한다.

👉 추가 예시 )

비트 AND, OR, XOR 연산자

  • AND, OR, XOR 연산자는 2진수로 표현된 2개의 피연산자의 각 자릿수끼리 연산을 수행한다.

👉 비트 AND, OR, XOR 연산자의 진리표

👉 예시 )

int b1 = 0B0010;
int b2 = 0B0101;
int b3 = 0b1111;

int rtAndOp = b1 & b3;   // 비트 AND 연산자
int rtOrOp = b1 | b2;    // 비트 OR 연산자
int rtXorOp = b1 ^ b3;   // 비트 XOR 연산자

System.out.println("b1 AND b3 : " + Integer.toBinaryString(rtAndOp)); 
System.out.println("b1 OR b2 : " + Integer.toBinaryString(rtOrOp));
System.out.println("b1 XOR b3 : " + Integer.toBinaryString(rtXorOp));
실행결과 :

b1 AND b3 : 10
b1 OR b2 : 111
b1 XOR b3 : 1101

👉 추가 예시 )


관계 연산자

  • 자바 관계 연산자는 두 개의 값을 비교하고 그 결과에 따라 참(true) 또는 거짓(false)을 반환
  • 조건문과 반복문 등에서 조건을 평가하거나 제어할 수 있음

동등 비교 연산자 (==)

  • 두 값이 같은 경우 참을 반환
int a = 5;
int b = 7;
boolean result = a == b;   // 결과: false

부등 비교 연산자 (!=)

  • 두 값이 다른 경우 참을 반환
int x = 10;
int y = 10;
boolean result = x != y;   // 결과: false

크기 비교 연산자 (> 또는 >=)

  • 왼쪽 피연산자가 오른쪽 피연산자보다 크거나 큰 경우 참을 반환
double num1 = 8.5;
double num2 = 6.3;
boolean result = num1 > num2;   // 결과: true

작기 비교 연산자 (< 또는 <=)

  • 왼쪽 피연산자가 오른쪽 피연산자보다 작거나 작은 경우 참을 반환
float value1 = 4.2f;
float value2 = 5.1f;
boolean result = value1 < value2; // 결과: true

논리 연산자

  • 논리 연산자는 true 또는 false 값을 갖는 boolean 형의 피연산자들을 판단하여 그 결과를
    true/false 로 반환

NOT 연산자 (!)

  • 조건을 반전시킨다.
  • 참은 거짓으로, 거짓은 참으로 바꿈
변수명 a!a 연산 결과
truefalse
falsetrue
boolean isSunny = false;

if( !isSunny ) {
    System.out.println("Bad Weather!");
} else {
    System.out.println("Good Weather!");
}

// Bad Weather 출력

AND 연산자 (&&)

  • 두 조건이 모두 참일 때 참을 반환
변수명 a변수명 ba && b 연산 결과
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse
int age = 25;
boolean hasLicense = true;

if( age >= 18 && hasLicense ) {
    System.out.println("운전 가능");
} else {
    System.out.println("운전 불가능");
}

// 운전 가능 출력

OR 연산자 (||)

  • 두 조건 중 하나 이상이 참일 때 참을 반환
변수명 a변수명 ba || b 연산 결과
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse
boolean isWeekend = true;
boolean hasFreeTime = false;

if( isWeekend || hasFreeTime ) {
    System.out.println("Free Day!");
} else {
    System.out.println("Busy Day!");
}

// Free Day! 출력

instanceof 연산자

  • 객체의 타입을 확인하기 위해 사용
  • 주어진 객체가 특정 클래스나 인터페이스의 인스턴스인지를 판별하는 데 사용됨

👉 instanceof 연산자의 구문

object instanceof Type

object 는 검사하려는 객체를 나타내고, Type은 클래스나 인터페이스의 타입을 나타낸다.
결과 값은 boolean 형태로 반환되며, 객체가 해당 타입의 인스턴스인 경우 true를 반환,
그렇지 않은 경우 false를 반환

Object obj = "Hello, Java!";
        
if(obj instanceof String) 
	System.out.println("obj is an instance of String");
else 
	System.out.println("obj is not an instance of String");
      
// obj is an instance of String 출력      

👉 instanceof 사용을 지양해야 하는 이유

  • instanceof 를 사용하는 경우, 각 객체가 무엇인지, 어떤 것을 리턴하는지 불필요한
    외부의 객체가 그 정보를 알게되므로 캡슐화가 보장되지 않는다.
  • 객체 지향 프로그래밍의 원칙을 어길 수 있으므로, 가능한 경우에는 다른 설계 패턴을 고려

대입 연산자

  • 대입 연산자는 변수에 값이나 연산 결과를 저장하는 연산자
  • 연산과 대입을 동시에 수행할 때 유용

= (등호)

  • 가장 기본적인 대입 연산자로, 변수에 값을 할당
int x = 5;	// x에 5를 할당

+= (덧셈 후 대입)

  • 변수의 현재 값에 다른 값을 더한 후, 그 결과를 변수에 할당
int y = 10;
y += 3;   // y = y + 3; 과 동일

-= (뺄셈 후 대입)

  • 변수의 현재 값에서 다른 값을 뺀 후, 그 결과를 변수에 할당
int z = 15;
z -= 5;   // z = z - 5; 과 동일

*= (곱셈 후 대입)

  • 변수의 현재 값에 다른 값을 곱한 후, 그 결과를 변수에 할당
int a = 8;
a *= 2;   // a = a * 2; 과 동일

/= (나눗셈 후 대입)

  • 변수의 현재 값을 다른 값으로 나눈 후, 그 결과를 변수에 할당
int b = 20;
b /= 4;   // b = b / 4; 과 동일

%= (나머지 연산 후 대입)

  • 변수의 현재 값을 다른 값으로 나눈 나머지를 변수에 할당
int c = 17;
c %= 5;   // c = c % 5; 과 동일

<<= (왼쪽 시프트 후 대입)

  • 변수의 비트를 왼쪽으로 시프트한 후, 그 결과를 변수에 할당
int d = 8;
d <<= 2;   // d = d << 2; 과 동일

>>= (오른쪽 시프트 후 대입)

  • 변수의 비트를 오른쪽으로 시프트한 후, 그 결과를 변수에 할당
int e = 16;
e >>= 3;   // e = e >> 3; 과 동일

&= (비트 AND 후 대입)

  • 변수의 비트와 다른 변수의 비트 AND 연산을 수행한 후, 그 결과를 변수에 할당
int f = 12;
f &= 3;   // f = f & 3; 과 동일

|= (비트 OR 후 대입)

  • 변수의 비트와 다른 변수의 비트 OR 연산을 수행한 후, 그 결과를 변수에 할당
int g = 9;
g |= 6;   // g = g | 6; 과 동일

^= (비트 XOR 후 대입)

  • 변수의 비트와 다른 변수의 비트 XOR 연산을 수행한 후, 그 결과를 변수에 할당
int h = 10;
h ^= 3;   // h = h ^ 3; 과 동일

>>>= (부호 없는 오른쪽 시프트 후 대입)

  • 변수의 비트를 오른쪽으로 시프트한 후, 그 결과를 변수에 할당
int i = -15;
i >>>= 2;   // i = i >>> 2; 과 동일

시프트 연산자

  • 시프트 연산자는 정수형 변수에서만 사용 가능한 연산자
  • 이진법으로 표기된 데이터의 자리를 이동시키는 역할을 하며 방향에 따라
    '<<' 혹은 '>>' 로 표기

👉 시프트 연산의 과정

<< 연산자

  • 데이터를 왼쪽으로 지정한 숫자만큼 자릿수를 점프한다.
  • 점프하고 남은 자릿수는 피연산자가 양수인 경우에는 0으로 채우고 피연산자가 음수인
    경우에는 1로 채운다.
  • 음수, 양수를 의미하는 맨 앞의 비트는 연산에 관여하지 않음

>> 연산자

  • 데이터를 오른쪽으로 지정한 숫자만큼 자릿수를 점프한다.
  • 점프하고 남은 자릿수는 피연산자가 양수인 경우에는 0으로 채우고 피연산자가 음수인
    경우에는 1로 채운다.
  • 음수, 양수를 의미하는 맨 앞의 비트는 연산에 관여하지 않음

>>> 연산자

  • 데이터를 오른쪽으로 이동한다.
  • 점프하고 남은 자릿수는 부호에 상관없이 0으로 채운다.
  • 항상 양수를 유지하므로 unsigned shift operator 이다.

👉 예시 )

int x = -5;
int y = 6;

int rt1 = x << 4;   // -5에 대한 left 시프트 연산
int rt2 = x >> 2;   // -5에 대한 right 시프트 연산
int rt3 = y << 3;   // 6에 대한 left 시프트 연산
int rt4 = y >> 1;   // 6에 대한 right 시프트 연산
int rt5 = y >>> 3;  // 6에 대한 unsigned right 시프트 연산

System.out.println("Binary x : " + Integer.toBinaryString(x));
System.out.println("Binary y : " + Integer.toBinaryString(y));

System.out.println("left : " + rt1 +", " + Integer.toBinaryString(rt1));
System.out.println("right : " + rt2 +", " + Integer.toBinaryString(rt2));
System.out.println("left : " + rt3 +", " + Integer.toBinaryString(rt3));
System.out.println("right : " + rt4 +", " + Integer.toBinaryString(rt4));
System.out.println("unsigned right : " + rt5 +", " + Integer.toBinaryString(rt5));
실행결과 :

Binary x : 11111111111111111111111111111011
Binary y : 110
left : -80, 11111111111111111111111110110000
right : -2, 11111111111111111111111111111110
left : 48, 110000
right : 3, 11
unsigned right : 0, 0

화살표(->) 연산자

  • 자바의 화살표(->) 연산자는 람다 표현식(lambda expressions)을 정의할 때 사용되는
    중요한 구문
  • 람다 표현식은 함수형 프로그래밍 개념을 자바에 도입하여 코드를 더 간결하게 표현할 수
    있게 해준다.
  • 화살표 연산자는 람다 표현식의 매개변수와 바디(body) 사이를 구분하는 역할

👉 예시 )

// 인터페이스 정의
interface MyFunction {
    int apply(int x);
}

public class Main {
    public static void main(String[] args) {

        MyFunction mf1 = new MyFunction() {
            @Override
            public int apply(int x) {
                return x + 1;
            }
        };

        // 람다 표현식으로 작성한 함수
        MyFunction mf2 = x -> x * 2;

        // 함수 사용
        System.out.println("value : " + mf1.apply(5)); // 출력: 6
        System.out.println("value : " + mf2.apply(3)); // 출력: 6
    }
}
실행결과 : 

value : 6
value : 6

x -> x * 2 와 같은 람다 표현식에서 x는 매개변수를 나타내며,
->는 매개변수와 표현식 바디를 연결하는 역할을 한다.


3항 연산자

  • 3항 연산자란 피연산자의 개수가 3개인 것을 의미
  • 조건 비교를 하여 그 결과를 반환하는 연산자

👉 시프트 연산의 과정

3항 연산자는 두 개의 연산자인 물음표(?)와 콜론(:) 그리고 3개의 피연산자로 구성
피연산자1의 결과값이 true 이면 피연산자2의 값이 반환되며, 피연산자1의 값이 false 이면
피연산자3의 값이 반환된다.

boolean isRound = false;
boolean ex1 = (isRound) ? true : false;

boolean isEnable = true;
int ex2 = (isEnable) ? 1 : 2;

int a = 3;
boolean ex3 = (a > 4) ? false : true;

int b = 3;
int ex4 = (b > 0) ? (b % 2) : 0;

System.out.println("ex1 : " + ex1);
System.out.println("ex2 : " + ex2);
System.out.println("ex3 : " + ex3);
System.out.println("ex4 : " + ex4);
실행결과 :

ex1 : false
ex2 : 1
ex3 : true
ex4 : 1

연산자 우선순위

우선순위연산자설명
1( ) (괄호)가장 높은 우선순위를 가지며, 괄호 안의 연산이 먼저 수행됩니다.
2[ ] (대괄호)배열 인덱스 접근 연산자.
3. (점)멤버(필드 또는 메서드) 접근 연산자.
4++, -- (증감 연산자)전위 증감 및 후위 증감 연산자.
5+, - (부호 연산자)양수/음수 부호 표시.
6! (논리 NOT)논리 NOT 연산자.
7~ (비트 NOT)비트 NOT 연산자.
8*, /, % (곱셈, 나눗셈, 나머지)산술 연산자.
9+, - (덧셈, 뺄셈)산술 연산자.
10<<, >>, >>> (비트 시프트)비트 시프트 연산자.
11<, <=, >, >= (비교 연산자)비교 연산자.
12==, != (등호 연산자)동등성 비교 연산자.
13& (비트 AND)비트 AND 연산자.
14^ (비트 XOR)비트 XOR 연산자.
15| (비트 OR)비트 OR 연산자.
16&& (논리 AND)논리 AND 연산자.
17|| (논리 OR)논리 OR 연산자.
18? : (삼항 연산자)조건식 연산자.
19= (대입 연산자)변수에 값 할당.
20+=, -=, *=, /=, %= 등 (복합 대입 연산자)산술 연산과 대입을 동시에 수행하는 연산자.
21instanceof (타입 검사)객체의 타입 검사 연산자.

switch 연산자

  • Java 13 부터 도입된 switch 연산자는 이전의 switch 문에 비해 화살표 연산자 (->)를 사용하여
    간결하고 유연하게 코드를 작성할 수 있다.

👉 switch 표현식의 기본 구문

result = switch (표현식) {
    case1 -> 표현식1;
    case2 -> 표현식2;
    // ...
    default -> 표현식N;
};
  • 표현식은 스위치 표현식의 입력 값이며, 각 case 레이블은 표현식과 일치하는 경우 실행할
    표현식을 정의
  • -> 화살표 연산자는 각 case 레이블과 표현식을 분리함
  • default 레이블은 모든 case 레이블과 일치하지 않을 때 실행할 표현식을 정의

👉 기존 switch문 활용 예)

int number = 5;

switch (number) {
  case 1:
    System.out.println("1입니다.");
    break;
  case 2:
    System.out.println("2입니다.");
    break;
  default:
    System.out.println("1 또는 2가 아닙니다.");
    break;
}

👉 java 13 switch 연산자 활용 예)

int number = 5;

int result = switch (number) {
  case 1 -> {
    System.out.println("1입니다.");
    yield 1;
  }
  case 2 -> {
    System.out.println("2입니다.");
    yield 2;
  }
  default -> {
    System.out.println("1 또는 2가 아닙니다.");
    yield -1;
  }
};

System.out.println(result);
  • break; 생략가능
  • yield 키워드를 사용하여 switch 표현식 내에서 결과 값을 반환
    ( return 값을 사용할 수 있음 )
profile
천천히 그리고 꾸준히

0개의 댓글