[Java] 연산자
Web/Java

[Java] 연산자

목차 (클릭시 해당 목차로 이동)


     

     

     

     

     

     

    연산자


     

    연산자, 연산을 수행하는 기호

     

     

    연산자

    연산을 수행하는 기호

     

     

    피연산자

    연산자의 작업 대상

     

     

     

    예시

    x + 3 이라는 식이 있을 때, '+'는 두 피연산자를 더해서 그 결과를 반환하는 덧셈 연산자 이고, 변수 x리터럴 3피연산자 입니다.

     

     

     

     

     

    산술 연산자


    산술 연산자에는 사칙 연산자와 나머지 연산자가 있습니다.

     

    사칙 연산자

    • +
    • -
    • *
    • /

     

    나머지 연산자

    • %

     

     

     

    특징

     

    1.

     

     

    피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없습니다. (오류 - "ArithmeticException" 발생)
    하지만 0.0f, 0.0d로 나누는 경우 오류가 발생하지 않고 Infinity를 반환합니다.

     

    System.out.println(3/0); // 실행시, 오류 (ArithmeticException) 발생
    System.out.println(3/0.0); // Infinity 출력

     

     

     

     

     

     

    2.

     

    두개의 피연산자가 int형보다 작다면 연산자는 두 개의 피연산자들의 자료형을 int형으로 변환한 다음 연산을 수행합니다.

    그래서 아래 예제 int형을 byte형인 c에 담으려고 하여 오류가 발생합니다.

     

    byte a = 10;
    byte b = 20;
    
    byte c = a + b; // 컴파일 에러 발생
    byte c = byte(a + b); // 정상 작동
    
    System.out.println(c);

     

     

     

     

    비트 연산자


    비트 연산자는 피연산자를 비트단위로 논리 연산합니다.

     

     

     

    | 피연산자 중 한쪽의 값이 1이면, 1을 결과로 얻습니다. 그 외에는 0을 얻습니다.
    & 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻습니다. 그 외에는 0을 얻습니다.
    ^ 피연산자의 값이 서로 다를 때만 1을 결과로 얻습니다. 그 외에는 0을 얻습니다.

     

     

    x y x | y x & y x ^ y
    1 1 1 1 0
    1 0 1 0 1
    0 1 1 0 1
    0 0 0 0 0

     

     

     

    연산자 설명
    ~ 피연산자를 2진수로 표현했을때, 0은 1로, 1은 0으로 바꿉니다.

     

    x ~x x << 1 x >> 1
    10010100 : 148 01101011 : 107 1 00101000 : 296 01001010 : 74

     

     

     

    x << n 피연산자의 각 자리를 왼쪽으로 이동합니다. 빈자리는 0으로 채워집니다.  
    x * 2^n 하는 것과 같습니다.
    x >> n 피연산자의 각 자리를 오른쪽으로 이동합니다. 빈자리는 0으로 채워집니다.
    x / 2^n 하는 것과 같습니다.
    x x << 1 x << 4 x >> 1 x >> 4
    10010100 : 148
    1 00101000 : 296 1001 01000000 : 2368 01001010 : 74 1001 : 9

     

     

     

     

     

     

    관계 연산자 (비교 연산자)


     

    대소비교 연산자 <, >, <=, >=

    비교연산자 연산결과
    > 좌변 값이 크면 true / 아니면 false
    < 좌변 값이 작으면 true / 아니면 false
    >= 좌변 값이 크거나 같으면 true / 아니면 false
    <= 좌변 값이 작거나 같으면 true / 아니면 false

     

     

    등가비교 연산자 ==, !=

    비교연산자 연산결과
    == 두 값이 같으면 true / 아니면 false
    != 두 값이 다르면 true / 아니면 false

     

     

     

     

     

    논리 연산자


    || (OR결합) 피연산자 중 어느 한 쪽이라도 true 이면 true / 아니면 false
    && (AND 결합) 피연산자 양쪽 모두 true 이어야 true / 아니면 false
    x y x || y x && y
    true true true true
    true false true false
    false true true false
    false false false false

     

     

    논리 부정 연산자 !

     

    ! 연산자는 피연산자가 true이면 false를, false 이면 true를 반환합니다.

    x !x
    true false
    false true

     

     

     

     

     

     

    instanceof


    instanceof 연산자는 객체 타입을 확인하는 연산자 입니다.

    피연산자로 객체와 클래스를 사용하며 해당 객체의 타입이 해당 클래스가 맞는지 확인합니다.

    (형 변환 가능 여부로 판단해 true / false로 결과를 반환합니다.)

     

     

     

     

    주로 상속관계에서 부모객체인지 자식객체인지 확인하는데 사용합니다.

     

     

     

    package javastudy.instanceofTest;
    
    class Parent{}
    class Child extends Parent{}
    
    public class InstanceofTest {
    
        public static void main(String[] args) {
            Parent parent = new Parent();
            Child child = new Child();
    
            System.out.println(parent instanceof Parent);
            System.out.println(child instanceof Parent);
            System.out.println(parent instanceof Child);
            System.out.println(child instanceof Child);
    
        }
    }
    

     

     

    Child 가 Parent를 상속받는 관계에서 부모클래스는 자식클래스로 형변환 될 수 없기 때문에 false가 반환됩니다.

    parent intanceof Parent true
    child instanceof Parent true
    parent instanceof Child false
    child instanceof Child true

     

     

     

     

     

    assignment(=) operator


     

     

    = (assignment) 연산자는 다른 연산자와 묶어서 사용이 가능합니다.

     

     

    += A += B 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 A와 B를 &연산한 값을 A에 할당합니다.
    ^= A ^= B A와 B를 XOR연산한 값을 A에 할당합니다.
    |= A |= B A와 B를 OR연산한 값을 A에 할당합니다.
    <<= A <<= B A와 B를 left shift한 값을 A에 할당합니다.
    >>= A >>=B A와 B를 right shift한 값을 A에 할당합니다.

     

     

    주의

    참조변수에서 = 연산자로 할당하면 주소값을 할당합니다.

     

    obj1, obj2 변수 둘 다 주소값이 들어있고, obj1에 obj2를 = 연산하면 둘 다 obj2의 주소를 가리키게 됩니다.

    package javastudy.operator;
    
    class A{}
    
    public class AssignOperator {
        public static void main(String[] args) {
            A obj1 = new A();
            A obj2 = new A();
    
            System.out.println("obj1 = " + obj1);
            System.out.println("obj2 = " + obj2);
    
            obj1 = obj2;
            System.out.println("=====");
            System.out.println("obj1 = " + obj1);
            System.out.println("obj2 = " + obj2);
        }
    }
    

     

     

     

     

     

     

     

    화살표 (->) 연산자


    화살표 연산자는 java 8.0버전부터 적용된 람다(lambda) 표현식의 일부입니다.

     

     

    기존 메서드 작성법

    반환타입 메서드이름 (매개변수 선언) {

        문장들

    }

     

    람다식 작성법

    반환타입 메서드이름 (매개변수 선언) -> {

        문장들

    }

     

    반환 타입과 메서드를 생략하고 매개변수와 실행되는 코드블럭을 화살표(->)로 연결해줍니다.

     

    람다식에 대한 자세한 포스팅은 15주차에서 다루므로 여기서는 화살표 operator만 설명하고 넘어가겠습니다.

     

     

     

     

    3항 연산자 ( ?: )


    조건 연산자라고 불리는 ?: 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 3항연산자 입니다.

     

     

     

     

    사용예시

     

    package javastudy.operator;
    
    public class ConditionOperator {
        public static void main(String[] args) {
            int x = 5;
            int y = 3;
    
            boolean result;
    
            result = x > y ? true : false;
            System.out.println("result = " + result);
    
        }
    }
    

     

     

    x > y 조건이 참이므로 result에는 true가 담기게 됩니다.

     

     

     

     

     

    연산자 우선 순위


    지금까지 다룬 연산자가 많은데, 이 연산자들이 한번에 나온다면 우선순위가 어떻게 결정되는지 알아봅니다.

     

    아래 규칙만 잘 기억하고 있어도 대부분의 연산자 우선순위를 파악할 수 있습니다.

     

    1. 산술 > 비교 > 논리 > 대입
    2. 단항(1) > 이항(2) > 삼항(3)
    3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽

     

    종류 결합규칙 연산자 우선순위
    단항 연산자 <- ++, --, +, -, ~, !, (type) 높음























    낮음
    산술 연산자 -> *, /, %
    -> +, -
    -> <<, >>
    비교 연산자 -> <, >, <=, >=
    -> ==, !=
    논리 연산자 -> &
    -> ^
    -> |
    -> &&
    -> ||
    삼항 연산자 -> ?:
    대입 연산자 <- =, +=, -=, *=, /=, %=
    <<=, >>=, &=, ^=, |=

     

     

     

    예시 식

    설명
    x << 2 + 1 비트연산자(<<)는 산술연산자(+)보다 우선순위가 낮습니다.
    x << (2+1)
    data & 0xFF == 0 논리연산자(&)는 비교연산자(==)보다 우선순위가 낮습니다.
    data & (0xFF == 0)
    x < -1 || x > 3 && x < 5 비교연산자가 논리연산자보다 우선순위가 높습니다.
    또한, && 연산자가 || 연산자보다 우선순위가 높습니다.
    x < -1 || (x > 3 && x < 5)