보통사람

[Study-3주차] 연산자 본문

Study

[Study-3주차] 연산자

pej4303 2020. 11. 28. 03:39
  • 목표
    • 자바가 제공하는 다양한 연산자를 학습하세요.

  • 학습할 것
    • 산술 연산자

    • 비트 연산자

    • 관계 연산자

    • 논리 연산자

    • instanceof

    • assignment(=) operator

    • 화살표(->) 연산자

    • 3항 연산자

    • 연산자 우선순위

 

1. 연산자(Operator)란?

 

  • 연산자는 연산을 수행하는 기호를 의미

  • 다양한 연산자의 종류가 있으며 사칙연산에도 우선순위가 있듯이 연산자에도 우선순위가 있음

출처 : Java의 정석

  • 연산자의 우선순위

    • 산술 연산자 > 관계(비교) 연산자 > 논리 연산자 > 대입 연산자순으로 우선순위가 높음

    • 단항 연산자 > 이항 연산자 > 삼항 연산자순으로 우선순위가 높음

    • 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽

※ 산술 변환(Usual Arithmetic Conversion)

  • 연산 전에 타입을 일치시키기 위해 자동 형변환되는 것

  • 데이터 타입이 일치해야 연산이 가능하며 만약 서로 다르다면 형변환 연산자로 타입을 일치시켜야 연산 가능함

  • 모든 연산에서 산술 변환이 일어나지만 쉬프트 연산자(<<, >>) , 증감 연산자(++,--)는 예외

 

2. 산술 연산자

 

  • 정수형인 경우 0으로 나누면 실행 시 에러 발생함
  • 증감 연산자
    • 연산자의 값을 1씩 증가 또는 1씩 감소시키는 연산자

    • 전위형(preifx)과 후위형(postfix)이 있으며 독립적으로 사용되는 경우 둘의 차이는 없음

      • 전위형 : 값이 참조되기 전에 증가 또는 감소

      • 후위형 : 값이 참조된 후 증가 또는 감소

int i = 1;
int j = 2;

System.out.println(i++);    // 1
System.out.println(++j);    // 3

System.out.println(i);      // 2
System.out.println(j);      // 3

 

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

 

  • 대소 비교 연산자(<,>, <=,>=)는 참조형 타입 변수에서 사용할 수 없음

  • 등가 비교(==,!=) 연산자는 모든 타입에서 사용할 수 있음

4. 논리 연산자

 

  • || (OR) : 조건 중 하나만 true이면 true를 반환함

  • &&(AND) : 2개의 조건 모두 true이면 true를 반환함

 단락 회로 평가(Short Circuit Evaluation) 

  • || 연산자는 조건 중 하나만 true이면 true를 반환하기 때문에 좌측 조건 결과가 true로 판단되면 우측 조건을 판단하지 않고&& 연산자는 조건 모두 true여야 true를 반환하기 때문에 좌측 조건 결과 false이면 우측 조건을 판단하지 않는 평가 기법

  • 좀 더 빠른 연산을 보장한다고 함 

int i = 100;
int j = 0;

// 단락회로평가때문에 변수 j의 값이 변하지 않음
System.out.println(i >= 100 || ++j >= 1 );    // true
System.out.println(i);                        // 100
System.out.println(j);                        // 0

// 조건을 바꾸거나 |, & 연산자를 이용하면 됨
System.out.println(i >= 100 | ++j >= 1 );     // true
System.out.println(i);                        // 100
System.out.println(j);                        // 1

 

5. 비트 연산자

 

  • 비트 단위로 논리 연산 시 사용하는 연산자

  • 정수(문자 포함)만 허용됨

  • 비트 연산자 규칙

    • |(OR) : 한쪽 값이 1이면 1을 반환

    • &(AND) : 양쪽 값이 1이면 1을 반환

    • ^(XOR) : 서로 값이 다를 때만 1을 반환

    • ~(NOT) : 현재 값의 반대되는 값을 반환
  • 쉬프트 연산자(>>,<<)
    • << 연산자 : 2의 n승으로 나눈 결과값과 동일함

    • >>연산자 : 2의 n승으로 곱한 결과값과 동일함

System.out.println(8<<2);      // 32
System.out.println(8*2*2);     // 32

System.out.println(8>>2);      // 2
System.out.println(8/(2*2));   // 2

 

6. 삼항 연산자

 

  • if문 대신 삼항 연산자를 사용하면 코드가 간결해짐 하지만 중첩 사용하면 가독성이 좋지 않으니 한 번만 사용할 것

  • 결과1, 결과2의 데이터 타입이 다른 경우 산술 변환이 발생함

조건식 ? 결과1 : 결과2
결과1 => 조건식이 true인 경우
결과2 => 조건식이 false인 경우

 

7. 대입 연산자

 

  • 연산자들 중에서 낮은 우선순위를 가지고 있음

8. instanceof 연산자

 

  • 변수의 실제 타입을 확인할 때 사용함
  • 참조형 타입 변수만 사용 가능하며 기본형 타입 변수는 다른 방식으로 해야 함
  • 해당 결과가 true라는 것은 검사한 타입으로 변수가 형변환이 가능하다는 것을 의미함
// 참조형 타입 변수
StringBuffer sb = new StringBuffer();

System.out.println(sb instanceof Object);             // true

// 기본형 타입 변수
// 방법1)
int num = 100;
System.out.println(Integer.class.isInstance(num));    // true
System.out.println(Double.class.isInstance(num));     // false
// 방법2)
Integer num2 = 1000;
System.out.println(num2 instanceof Integer);          // false


9. 화살표(->) 연산자

  • 화살표 연산자는 Java 8에 추가된 람다식에서 사용함

  • 람다식은 메소드를 식으로 표현한 것으로 익명 함수(Anonymous Function)이라고도 함
// 람다식 이용 전
int sum(int a, int b) {
    return a + b;
}

// 람다식 이용
(a, b) -> { a + b }

 

  • 람다식은 익명 클래스의 객체여서 타입이 없음

  • Object 타입으로 형변환은 할 수 없고 오직 함수형 인터페이스로만 형변환이 가능함

 

※ 참조

Java의 정석
https://velog.io/@foeverna/Java-%EC%97%B0%EC%82%B0%EC%9E%90-%EA%B4%80%EA%B3%84-%EB%85%BC%EB%A6%AC-%EC%A1%B0%EA%B1%B4-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90 
http://w7c.blogspot.com/2015/12/javascript-short-circuit-evaluation.html