3주차 과제: 연산자

2020. 11. 25. 04:19
728x90

목표

자바가 제공하는 다양한 연산자를 학습하세요.

학습할 것

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

 

 


 

 

 

 

 연산자 operator 

 

    :     연산을 수행하는 기호 

 

 

 

*피연산자  :  연산자의 작업대상 

=>  대부분 연산자는 두개의 피연산자를 필요로 한다.

       연산자는 피연산자로 연산을 수행하고 나면 결과값을 반환한다.

 

 

 

 


 

 

 

 

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

 

 

 

 

 

 

  • * , / , % 연산자는 +, - 연산자 보다 우선순의가 높으므로 먼저 처리된다.
  • 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다. 만일 0으로 나눈다면 실행시 오류(ArtihmeticException)발생.
  • 나누기 연산자의 두 피연산자가 모두 int타입인 경우, 연산 결과 역시 int타입이다. 따라서 만약 연산결과가 3.5일지라도 int타입의 값인 3을 반환한다.
  •   =>  int타입은 소수점을 저장하지 못하므로 정수만 남기고 소수점이하는 버려진다. 이때, 반올림은 하지않음.
  • %(나머지 값을 반환하는 연산자) 는 나눗셈처럼 나누는 수로 0을 사용할 수 없다
  • 나머지 연산자의 나누는 수로 음수도 허용. 그러나 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 결과가 같다.

 

 

 


 

 

 

 

 

 비트연산자 ( & , | , ^ , ~ , << , >> ) 

 

 

 

  • 비트 연산자는 피연산자를 비트단위로 논리연산한다.
  • 피연산자로 실수는 허용하지 않고, 정수(문자 포함)만 허용.

 

 

| ( OR연산자 ) 피연산자 중 한 쪽값이 1이면, 1을 반환한다. 그 외에는 0 반환.
& ( AND연산자 ) 피연산자 중 양쪽이 모두 1이어야만 1을 반환한다. 그 외에는 0 반환.
^ ( XOR연산자 ) 피연산자의 값이 값이 서로 다를 때만 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
1 0
0 1

 

 

 

* 비트연산자 '~'에 의해 비트가 전환되고 나면 부호있는 타입의 피연산자는 부호가 반대로 변경된다.

  즉, 피연산자의 '1의보수'를 얻을 수 있다.

  그래서 비트전환연산자를 '1의보수 연산자'라고도 한다.

 

=> 10진수 10을 비트전환연산한 결과는 -11이고, 이 값은 10의 '1의보수' 이다.

 

 

 

 

쉬프트 연산자 ( << , >> )

 

:  피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동(shift) 한다고 해서         '쉬프트연산자'라고 한다.

 

 

 

 

ex)  '  8  <<  2  ' 는 왼쪽 피연산자인 10진수 8의 2진수를 왼쪽으로 2자리 이동한다.

         자리이동으로 저장범위를 벗어난 값들은 버려지고 빈자리는 0으로 채워진다.

 

 

1.  10진수 8을 2진수로 . 

2. 왼쪽으로 2자리 이동

3. 자리이동으로 저장범위를 벗어난 값을 버리고 빈자리는 0으로 채운다.

4. 결과  //  10진수로 32

 

 

 

 

* '<<'연산자의 경우 피연산자의 부호에 상관없이 각 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채우면           되지만, '>>'연산자는 오른쪾으로 이동시키기 때문에 부호있는 정수는 부호를 유지하기 위해 왼쪽 피연       산자가 음수인 경우, 빈자리를 1로 채운다. 양수일 때는 0으로 채운다.

 

더보기

x << n 은  x*2^n의 결과와 같다.

x >> n 은  x/2^n의 결과와 같다.

 

=>  나눗셈 '/'  또는 곱셈 '*' 연산자를 사용하는 것보다 더 빠르지만 가독성이 좋지 않다.

 

 

 

 

 


 

 

 

 

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

 

  :   두 피연산자를 비교하는데 사용되는 연산자.

      주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true, false 둘 중의 하나이다.

 

 

 

* 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰쪽으로 자동형변환하여 피연산자의     타입을 일치 시킨후에 비교한다.

 

 

 

 

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

 

  :   두 피연산자의 값의 크기를 비교하는 연산자.  참이면 true, 거짓이면 false

 

 

* 기본형 중 boolean형을 제외한 나머지 자료형에 사용할 수 있지만 참조형에는 사용할 수 없다.

 

 

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

 

 

 

 

 

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

 

  :  두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자. 

 

 

 

  • 모든 자료형에 사용할 수 있다.
  • 기본형의 경우 변수에 저장되어 있는 값이 같은지 알 수 있다.
  • 참조형의 경우 객체의 주소값을 저장하기 때문에 두개의 피연산자(참조변수)가 같은 객체를 가리키고 있는지를 알수있다.
  • 참조형과 기본형은 서로 형변환이 불가하기 때문에 비교할 수 없다.

 

 

연산자 연산결과
== 두 값이 같으면 true, 다르면 false
!= 두 값이 다르면 true, 같으면 false

 

 

 

 

 

* 문자열의 비교 

 

두 문자열을 비교할 때는 비교연산자 '==' 대신 equals()라는 메서드 사용

문자열의 내용이 같은지 비교하기 위해서 equals()를 사용하는 것,  같으면 true, 다르면 false

 

 

 

 

 


 

 

 

 

 논리연산자 ( == , != ) 

 

 

연산자 연산결과
|| (OR결합) 피연산자 중 어느 한쪽만 true이면 true를 결과로 얻는다.
&& (AND결합) 피연산자 양쪽 모두 true여야 true를 결과로 얻는다.

 

x y x||y x&&y
true true true true
true false true false
false true true false
false false false false

 

 

 

 

* 효율적인 연산

 

  • OR연산의 경우, 두 피연산자 중 어느 한쪽만 '참' 이어도 전체 연산 결과가 참이므로 좌측 피연산자가 '참(true)'이면 우측 피연산자의 값은 평가하지 않는다.
  •   =>  x가 true이면  x || y 는 항상 true 이다.
  • AND연산의 경우, 어느 한쪽만 '거짓'이어도 전체 결과가 거짓이므로 좌측 피연산자가 거짓이면, 우측 피연산자의 값은 평가하지 않는다.
  • OR연산의 경우 참일 확률이 높은 피연산자를 왼쪽이 놓고, AND연산의 경우 거짓일 확률이 높은 피연산자를 왼쪽에 놓는 것이 더 빠른 연산 결과를 얻을 수 있다.

=>  같은 조건식이라도 피연산자의 위치에 따라서 연산 속도가 달라질 수 있다.

 

 

 

 

 

 

 

 논리 부정 연산자 ( ! )

 

 

   :   피연산자가 true이면 false, false이면 true를 반환.   

 

 

x !x
ture false
false true

 

 

 

 

 


 

 

 

 

 

 instanceof 

 

   :   객체 타입을 확인하는데 사용한다.

 

 

 

  • 왼쪽에는 참조변수, 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.
  • 연산결과로 true 또는 false를 반환한다.
  • 연산결과로 true를 얻었다는 것은 참조변수가 검사함 차입으로 형변환이 가능하다는 것을 뜻한다.

 

 

 

 


 

 

 

 

 

 대입연산자 ( = , op= ) 

 

   :   변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용.

 

 

 

  • 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장
  • 연산자들 중 가장 낮은 우선순위를 가지고 있기 때문에 식에서 가장 나중에 수행된다.

 

 

 

* lvalue 와 rvalue

 

대입연산자의 왼쪽 피연산자를 lvalue(left value), 오른쪽 피연산자를 rvalue(right value)라고 한다.

 

 

 

 

 

lvalue : 변수처럼 값을 변경할 수 있는 것

rvalue : 변수, 상수, 식 모두 가능

 

 

 

 복합대입 연산자 ( op= )

 

  :   다른 연산자(op)와 결합하여 'op='와 같은 방식으로 사용될 수 있다.

      결합된 두연산 자는 반드시 공백없이 붙여 써야 한다.

 

 

 

ex)

i  +=  3 ; i  =  i  +  3 ;
i  -=  3 ; i  =  i  -  3 ;
i  *=  3 ; i  =  i  *  3 ;
i  /=  3 ; i  =  i  /  3 ;

 

 

 

 

 


 

 

 

 화살표(->) 연산자 

 

   :   자바에서는 화살표(->)기호를 사용하여 람다표현식을 작성할 수 있다.

 

 

 

람다표현식(lambda expression)

 

   :   메소드를 하나의 식으로 표현한것.

 

 

  • 메소드
int min(int x, int y){

	return x < y ? x : y ;
    
}

 

 

  • 람다식
( x , y ) -> x < y ? x : y;

 

 

=> 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다.

 

 

* 유의할 사항

 

1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있습니다.

2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.

3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다.                                (이때 세미콜론(;)은 붙이지 않음)

4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.

5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됩니다.                                       (이때 세미콜론(;)은 붙이지 않음)

 

 

 

 


 

 

 

 3항연산자 

 

  • 첫번째 피연산자인 조건식의 평가결과에 따라 다른 결과를 반환.
  • 조건식의 평가 결과가 true이면 식1, false이면 식2가 연산결과가 된다.

 

* 3항연산자는 조건문인 if문으로 바꿀 수 있다.

 

  • 3항연산자
result = ( x > y ) ? x : y;

 

 

  • if문
if ( x > y )   
	
    result = x ;         // x > y가 true일 때,
    
else 

	result = y ;         // x > y가 false일 때,

 

 

 

 

 

 


 

 

 

 

 연산자 우선순위 

 

 

 

 

 

  • 단항, 이항, 삼항 연산자 순으로 우선순위를 갖는다.
  • 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 갖는다.
  • 단항과 대입 연산자를 제외한 모든 연산방향은 왼쪽에서 오른쪽이다.
  • 복잡한 연산식에는 () 괄호를 사용해서 우선순위를 정해준다.

 

 

 

 

 


 

 

 

 

 Java 13. switch 연산자 

 

 

 

   :   java 13 스위치 표현식은 새키워드 yield를 추가하여 이전 표현식을 확장한다.

 

 

 

  • break 구문을  yield 대신 사용
  // value breaks are superseded by Java 13 'yield' statements.
    private static int getValueViaBreak(String mode) {
        int result = switch (mode) {
            case "a":
            case "b":
                break 1;
            case "c":
                break 2;
            case "d":
            case "e":
            case "f":
                break 3;
            default:
                break -1;
        };
        return result;
    }

 

 

  • yield를 값을 반환하는데 사용
   private static int getValueViaYield(String mode) {
        int result = switch (mode) {
            case "a", "b":
                yield 1;
            case "c":
                yield 2;
            case "d", "e", "f":
                // do something here...
                System.out.println("Supports multi line block!");
                yield 3;
            default:
                yield -1;
        };
        return result;
    }

 

 

 

  • 화살표(->) 연산자를 계속 지원한다.
    private static int getValueViaArrow(String mode) {
        int result = switch (mode) {
            case "a", "b" -> 1;
            case "c" -> 2;
            case "d", "e", "f" -> {
                // do something here...
                System.out.println("Supports multi line block!");
                yield 3;
            }
            default -> -1;
        };
        return result;
    }
728x90

BELATED ARTICLES

more