Operators (연산자)

2025. 4. 30. 13:33JAVA/JAVA 기초 문법

🖥️ Operators(연산자)란?

연산자는 특정 작업을 수행하는 특수 기호로, 하나, 둘 또는 셋의 피연산자에 대해 작업을 수행한 다음 결과를 반환한다.
자바 프로그래밍 언어의 연산자를 탐색하는 동안 연산자의 우선순위가 높은 것부터 미리 알고 있으면 도움이 될 수 있다.
다음 표에 나열된 연산자는 우선순위 순서대로 나열되어 있다.
표의 맨 위에 나타나는 연산자일수록 우선순위가 높다. 우선순위가 높은 연산자가 상대적으로 우선순위가 낮은 연산자보다 먼저 평가된다.
동일한 라인에 있는 연산자는 우선순위가 동일하다. 동일한 우선순위의 연산자가 동일한 표현식에 나타날 때 어떤 것이 먼저 평가될지를 결정하는 규칙이 필요하다. 할당 연산자를 제외한 모든 이항 연산자는 왼쪽에서 오른쪽으로 평가된다. 할당 연산자는 오른쪽에서 왼쪽으로 평가된다.

💻 Operator Precedence

Operators Precedence
postfix expr++  expr--
unary ++expr  --expr  +expr  -expr  ~  !
multiplicative *  /  %
additive +  -
shift <<  >>  >>>
relational <  >  <=  >=  instanceof
equality ==  !=
bitwise AND &
bitwise exclusive XOR ^
bitwise inclusive OR |
logical AND &&
logical OR ||
ternary ? :
assignment =  +=  -=  *=  /=  %=  &=  ^=  |=  <<=  >>=  >>>=

 

⌨️ Unary(단항 연산자)

단항 연산자(Unary Operator)는 하나의 피연산자에 대해 작용하는 연산자이다. 이 연산자는 단일 피연산자에 대해 수행하는 작업을 정의하며, 피연산자 하나를 가지고 단일 연산을 수행한다.

Unary목록 expr++   expr--   ++expr   --expr   +expr   -expr    ~    !

 

🖱️ Postfix(후위 증감 연산자)

자바에서 postfix 라는 용어는 보통 후위 연산자(Postfix Operator)를 의미한다. 후위 연산자는 변수의 값에 대한 연산이 먼저 수행된 후에 그 값을 증가시키거나 감소시키는 연산자를 말한다.

 

🖲️ 후위 증가(Post-Increment) 연산자 (x ++)

  • 이 연산자는 변수를 먼저 사용한 후에 그 값을 1 증가시킨다.
  • 예를 들어, int x = 5; int y =  x ++; 이코드에서 y의 값은 5가 되고, x의 값은 6이 됩니다.

🖲️ 후위 감소(Post-Decrement) 연산자 (x - -)

  • 이 연산자는 변수를 먼저 사용한 후에 그 값을 1 감소시킨다.
  • 예를 들어, int x = 5; int y = x --; 이 코드에서 y의 값은 5가 되고, x의 값은 4가 됩니다
public class PostfixExample {

    // Syntactic sugar 연산자 : ++, --
    // ++ (후위 증가(1씩) 연산자)
    // -- (후위 감소(1씩) 연산자)
	
    public static void main(String[] args) {
     // Post-Increment
        int a = 10;
        int b = a++; // b는 10이 되고, a는 11이 됩니다.
     // int b = a;   // a의 값을 먼저 b에 대입한다. : 원래 값으로 평가한다
     // a = a + 1;   // 그런 후[Postfix]에, a의 값을 1 증가함. 그래서 후위 증가라고 함.

     // Post-Decrement        
        int c = 10;
        int d = c--;  // d는 10이 되고, c는 9가 됩니다.
     // int d = c;
     // c = c - 1;
        	     
        System.out.println("a: " + a + ", b: " + b);
        System.out.println("c: " + c + ", d: " + d);
    }
}

이 예제에서, a++와 c--는 각각 a와 c의 값을 먼저 할당한 후에 1씩 증가하거나 감소시킨다.
따라서 출력 결과는 다음과 같다.

a : 11  b: 10
c : 9   d: 10

 

‼️ 후위 연산자는 변수의 현재 값을 사용하고 난 후에 변경하기 때문에, 다른 연산자나 명령문과 함께 사용될 때 그 동작을 잘 이해하고 있어야 한다.

 

🖱️ Prefix(전위 증감 연산자)

Prefix 연산자는 연산자가 피연산자 앞에 위치하는 연산자입니다.
즉, 연산을 먼저 수행한 뒤 그 결과 값을 사용합니다.

 

🖲️ 전위 증가(Pre-Increment) 연산자

  • 이 연산자는 먼저 값을 1 증가시키고, 그 증가된 값을 사용한다.
  • 예를 들어, int x = 5; int y =  ++x ; 이코드에서 y의 값은 6가 되고,x의 값은 6이 됩니다.

🖲️ 전위 감소(Pre-Decrement) 연산자

  • 이 연산자는 먼저 값을 -1 감소시키고, 그 감소된 값을 사용한다.
  • 예를 들어, int x = 5; int y = --x ; 이 코드에서 y의 값은 4가 되고, x의 값은 4가 됩니다
public class UnaryExample {

    public static void main(String[] args) {
        int a = 5, b = 10;

        // 전위 증감 연산자[prefix]
        int preA = ++a; // 값을 증가시키고, 그 결과를 리턴함..(=) 연산자에게
//      a = a + 1;      // 전위 증감 : a의 값을 먼저 1 증가 시킨 후
//      int preA = a;   //             preA 변수에 대입한다.

        int preB = --b; // 값을 감소시키고, 그 결과를 리턴함..(=) 연산자에게
//      b = b - 1;      // 전위 감소 : b의 값을 먼저 1 감소 시킨 후
//      int preB = b;   //             preB 변수에 대입한다

        System.out.println("unary: ++a = " + preA + ", --b = " + preB);
}

이 예제에서 ++a와 --b는 각각 a와 c의 값을 먼저 1씩 증가하거나 감소시킨 후 값을 대입한다.

출력 값은 다음과 같다.

unary: ++a = 6, --b = 9

 

🖱️ Unary Plus/Minus

  • + 는 아무 일도 안 일어나느 것처럼 보이지만, 명시적으로 정수를 표현할 때 사용
  • - 는 음수로 만들 때 사용
int a = 5, b = 10;
    int positive = +a; // a는 5
    int negative = -b; // b는 -10

 

🖱️ Logical Complement( !, 논리 부정 연산자)

  • True를 False로, False를 True로 바꿈
boolean x = true;
    boolean logicalNot = !x; // false

 

🖱️ Bitwise Complement( ~, 비트 반전 연산자)

  • 모든 비트를 반전시킴 (1을 0으로, 0을 1로)
  • 결과는 2의 보수 형식으로 계산됨
int a = 5;  // 0000101 (2진수)
int b = ~a; // 1111010 -> 6 (10진수)

 

⌨️ Binary(이항 연산자)

이항 연산자(Binary Operator)는 두 개의 피연산자를 필요로 하는 연산자입니다. 이 피연산자들은 연산의 좌항과 우항에 위치하며, 이항 연산자가 이들을 조작하여 새로운 값을 생성합니다.

 

🖱️ Arithmetic(산술 연산자)

산술 연산자(Arithmetic Operator)는 두 개의 숫자 값을 이용하여 수학적 계산을 수행하는 연산자다.

🖲️ + 덧셈(Addition) 연산자

  • + : 두 수를 더함

🖲️ - 뺄셈(Subtraction) 연산자

  • - : 두 수를 뺌

🖲️ * 곱셈(Multiplication) 연산자

  • * : 두 수를 곱함

🖲️ / 나눗셈(Division) 연산자

  • / : 첫 번째 수를 두번째 수로 나눔

🖲️ % 나머지(Modulus) 연산자

  • % : 두 수를 나눈 나머지를 구함
public class ArithmeticExample {
    public int a = 5, b = 10, c = 0;
    
    // Addition
    int add = a + b; // 15
    // Subtraction
    int sub = b - a; // 5
    // Multiplication
    int mul = a * b; // 50
    // Division 
    int div = b / a; // 2
    // Modulus
    int mod = b % a; // 나머지 값 0
}

 

🖱️ Comparison(비교 연산자)

비교 연산자는 두 개의 값을 비교하여 결과를 참(true) 또는 거짓(false)으로 반환하는 연산자다.

조건문(if, while 등)에서 자주 사용되며, 논리적 판단의 기준이 됩니다.

 

🖲️ == 같음(Equal to) 연산자

  • 두 값이 같으면 true, 다르면 false

🖲️ != 다름(Not equal to) 연산자

  • 두 값이 다르면 true, 같으면 false

🖲️ > 큼(Great than) 연산자

  • 왼쪽 값이 오른쪽보다 크면 true

🖲️ < 작음(Less than) 연산자

  • 왼쪽 값이 오른쪽보다 작으면 true

🖲️ >= 크거나 같음(Greater than or equal to)

  • 왼쪽이 크거나 같으면 true

🖲️ <= 작거나 같음(Less than to equal to)

  • 왼쪽이 작거나 같으면 true
class ComparisonDemo {

    public static void main(String[] args){
        int a = 1;
        int b = 2;
        if(a == b)
            System.out.println("a == b"); // a와 b의 값은 다르므로 false
        if(a != b)
            System.out.println("a != b"); // a와 b의 값은 다르므로 true
        if(a > b)
            System.out.println("a > b"); // a는 b보다 작아서 false
        if(a < b)
            System.out.println("a < b"); // b는 a보다 커서 true
        if(a <= b)
            System.out.println("a <= b"); // b는 a보다 커서 true
    }
}

출력시

a != b
a <  b
a <= b

 

🖱️ Conditional(논리 연산자)

논리 연산자는 두 개의 조건(또는 boolean 값)을 논리적으로 연결해서 결과를 참(true) 또는 거짓(false)으로 반환하는 연산자다.

 

🖲️ && AND 연산

  • 모든 조건이 참일 때만 전체 결과가 참
A B A && B
True True True
True False False
False False False

 

🖲️ || OR 연산

  • 하나라도 참이면 전체 결과가 참
A B A || B
True True True
True False True
False False False

 

 public static void main(String[] args){
        int a = 1;
        int b = 2;
        if((a == 1) && (b == 2))
            System.out.println("a is 1 AND b is 2"); // 둘다 true여서 true
        if((a == 1) || (b == 1))
            System.out.println("a is 1 OR b is 1"); // a==1이 true고 b==1은 false 지만 한개가 true이므로
                                                    // true
    }

출력시

a is 1 AND b is 2
a is 1 OR b is 1

 

🖱️ Bitwise(비트 연산자)

비트 연산자는 숫자를 2진수(비트 단위)로 벼노한하여, 각 비트에 대해 연산을 수행하는 연산자 입니다.
즉, 숫자의 내부 표현(0과 1)을 직접 다루는 연산입니다.

 

🖲️ & 비트 AND(Bitwise And) 연산자

  • 두 비트가 모두 1이면 1
  • ex) 0011 & 1001 -> 0001

🖲️ | 비트 OR(Bitwise OR) 연산자

  • 하나의 비트가 1이면 1
  • ex) 0011 | 1001 -> 1011

🖲️ ^ 비트 XOR(Bitwise XOR) 연산자

  • 두 비트가 다르면 1
  • ex) 0011 ^ 1001 -> 1010

🖲️ << 왼쪽 시프트(Left Shift) 연산자

  • 비트를 왼쪽 n칸 이동 (2의 n제곱 곱셈 효과)
  • ex) 0011 << 1 -> 0110

🖲️ >> 오른쪽 시프트(Right Shift) 연산자

  • 부호 유지하며 비트를 오른쪽 n칸 이동 (음수는 1유지)
  • ex) 0011 >> 1 -> 0001

🖲️ >>> 부호 없는 오른쪽 시프트(Unsigned Right Shift) 연산자

  • 부호 상관없이 오른쪽으로 0을 채워 이동
  • ex) 0011 >>> 1 -> 0001
public static void main(String[] args){
    int a = 5, b = 10; 

    // bitwise AND
    int andBit = a & b;
    System.out.println("bitwise AND: & = " + andBit);

    // bitwise XOR
    int xorBit = a ^ b;
    System.out.println("bitwise XOR: ^ = " + xorBit);

    // bitwise OR
    int orBit = a | b;
    System.out.println("bitwise OR: | = " + orBit);

    // bitwise shift
    int leftbit = a << 1;
    System.out.println("bitwise LeftShift: << = " + leftbit);
   
    int rightbit = a >> 1;
    System.out.println("bitwise RightShift: >> = " + rightbit);
    int negativeRightbit = -a >> 1;
    System.out.println("bitwise negativeRightShift: >> = " + negativeRightbit);

    int unsignedRightbit = b >>> 1;
    System.out.println("bitwise UnsignedRightShift: >>> = "+ unsignedRightbit);
    int negativeUnsignedRightbit = -b >>> 1;
    System.out.println("bitwise negativeUnsignedRightShift: >>> = "+ negativeUnsignedRightbit);
    }
}

출력시

bitwise AND: & = 0

bitwise XOR: ^ = 15

bitwise OR: | = 15

bitwise LeftShift: << = 10

bitwise RightShift: >> = 2
bitwise negativeRightShift: >> = -3

bitwise UnsignedRightShift: >>> = 2
bitwise negativeUnsignedRightShift: >>> = 2147483645

 

🖱️ Assignment(대입 연산자)

대입 연산자는 변수에 값을 저장하거나 계산 결과를 할당할 때 사용하는 연산자다.

 

🖲️ = 기본 대입 연산자

  • 오른쪽 값을 왼쪽 변수에 저장

🖲️ += 연산자

  • 더한 후 대입 한다.

🖲️ -= 연산자

  • 뺀 후 대입 한다

🖲️ *= 연산자

  • 곱한 후 대입

🖲️ /= 연산자

  • 나눈 후 대입

🖲️ %= 연산자

  • 나머지 후 대입

🖲️ &= 연산자

  • 비트 AND 후 대입

🖲️ |= 연산자

  • 비트 OR 후 대입

🖲️ ^= 연산자

  • 비트 XOR 후 대입

🖲️ <<= 연산자

  • 왼쪽 시프트 후 대입

🖲️ >>= 연산자

  • 오른쪽 시프트 후 대입

🖲️ >>>= 연산자

  • 부호없는 오른쪽 시프트 후 대입
int a = 5, b = 10, c = 0; 
	
// assignment
c = a;      // c에 a의 값을 대입합니다. (c = 5)
c += b;     // c = c + b;   → c = 5 + 10 = 15
c -= a;     // c = c - a;   → c = 15 - 5 = 10
c *= 2;     // c = c * 2;   → c = 10 * 2 = 20
c /= 2;     // c = c / 2;   → c = 20 / 2 = 10
c %= 3;     // c = c % 3;   → c = 10 % 3 = 1
c &= 7;     // c = c & 7;   → c = 1 & 7 = 1 (비트 AND: 0001 & 0111 = 0001)
c ^= 2;     // c = c ^ 2;   → c = 1 ^ 2 = 3 (비트 XOR: 0001 ^ 0010 = 0011)
c |= 1;     // c = c | 1;   → c = 3 | 1 = 3 (비트 OR: 0011 | 0001 = 0011)
c <<= 1;    // c = c << 1;  → c = 3 << 1 = 6 (비트를 왼쪽으로 1칸 이동: 0011 → 0110)
c >>= 1;    // c = c >> 1;  → c = 6 >> 1 = 3 (부호 유지하면서 오른쪽으로 1칸 이동: 0110 → 0011)
c >>>= 1;   // c = c >>> 1; → c = 3 >>> 1 = 1 (부호 비트 무시, 0으로 채우며 오른쪽으로 1칸 이동: 0011 → 0001)

 

⌨️ Ternary(삼항 연산자) 

삼항 연산자는 세 개의 피연산자를 사용하는 조건 기반 연산자로, 조건이 참인지 거짓인지에 따라 다른 값을 반환한다.
즉, 짧은 if-else 문을 한 줄로 표현할 수 있게 해주는 문법이다.
삼항 연산자는 단 한개의 연산자( ? : )만 가지고 있다.

(조건식) ? true 때 반환값 : false 때 반환값;

조건식은 boolean 타입으로 평가 된다. 반환값은 같은 타입이여야 한다.

❗ 타입 관련 주의

int x = true ? 1 : 2.0;  // ❌ 오류: int와 double은 호환되지 않음
double y = true ? 1 : 2.0;  // ✅ OK (1이 자동으로 double로 변환됨)

 

❓ int에는 double 대입이 안되고, double에는 int가 자동으로 들어갈 수 있을까?

‼️자바의 형변환 규칙(Type Conversion)‼️

 

1. 자동 형변환

  • 작은 타입 → 큰 타입으로 변환은 자동으로 이루어진다
  • 손실이 없기 때문에 안전함.
반환 예시 설명
int → double ✅ 가능 (자동)
int x = 3; double y = x; ✅ 가능

2. 강제 형변환

  • 큰 타입 → 작은 타입 변환은 명시적 캐스팅(형변환)이 필요하다.
  • 데이터 손실 가능성이 있어서 자동으로는 불가하다.
반환 예시 설명
double → int ❌ 자동 불가
double d = 3.14; int i = (int)d; ✅ 명시적 변환 필요

 

 
💬 삼항 연산자 예제
public class TernaryExample {
    public static void main(String[] args) {
        int a = 5, b = 10, c = 0;
        // ternary  ? :
        // (a > b) : ()안에서 사용되는 expression은 true 또는 false 값을 만듦.
        // (...) : ()안에 ... expression의 값이,
        //         1. true 이면(?),
        //            -> ? X : Y ----> ':' 기준으로 왼쪽에 있는 X가 선택된다
        //         2. false 이면(?),
        //            -> ? X : Y ----> ':' 기준으로 오른쪽에 있는 Y가 선택된다.
        int ternary = (a > b) ? a : b;

        // 쓸수 있는 코드지만 이렇게 쓰지 않는다
        int ternary2 = (true) ? a : b;

        System.out.println("ternary: (a > b) ? a : b = " + ternary );
        // (a > b) 조건식이 false므로 b 값 출력
    }
}

출력시

ternary: (a > b) ? a : b = 10

'JAVA > JAVA 기초 문법' 카테고리의 다른 글

Explicit(명시적)과 Implicit(암시적)  (0) 2025.05.14
Control Flow Statements  (1) 2025.05.14
Array(배열)  (0) 2025.04.23
자바에서 This  (0) 2025.04.15
Constructor (생성자)  (0) 2025.04.14