본문 바로가기
Study/Java_study

Java_study_3 (연산자)

by hjshims 2021. 7. 26.

♨학습내용

더보기

☞ 산술 연산자

☞ 비트 연산자

☞ 관계 연산자

☞ 논리 연산자

☞ instanceof

☞ assignment(=) operator

☞ 화살표(->)연산자

☞ 3항 연산자

☞ 연산자 우선 순위

☞ (optional) Java 13, switch 연산자

 

  • 산술 연산자

- 수학적인 계산에 사용되는 연산자로  + - * / 연산자가 있다.

- 숫자 피연산자 (byte, short, char, int, long, float, double)를 연산하며 결과도 숫자를 반환한다.

- int 타입보다 크기가 작은 타입들은 int로 프로모션 되어 연산된다.

- double → float → long → int 순으로 더 큰 타입이 있으면 프로모션 되어 연산된다.

 

<산술 연산자>

연산자 설명
+ 더하기 (Addition)
- 빼기 (Subtraction)
* 곱하기 (Multiplication)
/ 나누기 (Division)
% 나머지 (Modulo)

                                                       

  •  + 연산자

- 기본적으로 두 수를 더하는 연산이지만 문자열을 연결시키는데도 사용할 수 있다.

 

  •  - 연산자

- 첫 번째 피연산자에서 두 번째 피연산자를 빼는 연산자이다.

 

  •  * 연산자

- 첫 번째 피연산자와 두 번째 피연산자를 곱하는 연산자이다.

 

  •  / 연산자

- 첫 번째 피연산자를 두 번째 피연산자로 나누는 연산자이다.

 

  •  % 연산자

- 첫 번째 피연사자를 두 번째 피연산자로 나누고 남은 나머지를 정수로 리턴한다.

 


 

  • 비트 연산자

<<  >>  >>>  연산자가 있다.

- 비트 연산자는 정수 혹은 부울(boolean) 피연산자를 연산한다.

- 비트 단위로 연산하며 결과값은 정수 혹은 부울값을 반환한다.

 

<비트 이동 연산자 (쉬프트 연산자)>

연산자 설명
& 논리곱(AND)  비트를 비교하여 양쪽 모두 1이면 1, 아니면 0을 반환
| 논리합(OR) 각 비트를 비교하여 어느 한쪽이 1이면 1 아니면 0을 반환
^ 베타적 논리합(XOR) 각 비트를 비교하여 한쪽이 1이고 다른 한쪽이 0이면 1을, 아니면 0을 반환 
~ 1의 보수 표현(NOT) 각 비트를 반전시킨 값을 반환
<< 왼쪽 쉬프트 연산자 18<<2 , 18을 왼쪽으로 2비트만큼 이동
>> 오른쪽 쉬프트 연산자 18>>2, 18을 오른쪽으로 2비트만큼 이동  

 

  •  &  연산자

- 비트 AND 연산이나 논리 AND 연산을 한다. 정수 부울 피연산자를 연산한다.

- 비트 AND 연산 : 대응하는 비트가 모두 1이면 1을 반환하고, 다른 경우는 0을 반환한다.

- 논리 AND 연산 : 논리식이 모두 참이면 참을 반환한다.

  •   연산자

- 두 정수 피연산자를 OR 연산한다.

- 단항 연산자. 정수로 표현할 수 있는 피연산자를 연산한다.

  •   연산자

- 비트의 NOT 연산을 한다.

- 1이면 0, 0이면 1로 반전시킨다. 정수 값으로 ~a의 결과는 (-a) - 1과 같다.

  •   연산자

- 비트 XOR 연산이나 논리 XOR 연산을 한다. 정수와 부울 피연산자를 연산한다.

- 비트 XOR 연산 : 대응되는 비트가 다르면 1을 반환하고 같으면 0을 반환한다.

- 논리 XOR 연산 : 논리식이 같으면 거짓을 반환하고 다르면 참을 반환한다.

  •  <<  연산자

- 연산자는 비트를 왼쪽으로 두 번째 피연산자로 제시된 비트 수 만큼 이동 시킨다.

- 시프트 될 때 기존의 가장 왼쪽 비트는 삭제되고 가장 오른쪽 비트는 0으로 채워진다.

  •  >>  연산자

- 연산자는 왼쪽 시프트 연산과 반대로 오른쪽으로 두 번째 피연산자로 제시된 비트 수 만큼 이동 시킨다.

- 가장 오른쪽 비트는 삭제되고, 기존의 값이 양수인 경우, 가장 왼쪽 비트는 0으로 채워지고, 음수인 경우는 1이 채워진다.

  •  >>>  연산자

- 기본적으로는 오른쪽 시프트 연산과 동일하지만 부호에 관계없이 왼쪽 비트는 무조건 0으로만 채워진다.

- 그렇기 때문에 음수에  >>>  연산을 한다면 결과는 양수가 된다.

 


 

  • 관계 연산자

<  ,  >=  <=  ==  ,  !=  연산자가 있다.

- 관계연산자는 비교연산자라고도 하며, 쉽게 말하자면 부등호이다.

- 관계연산자의 결과는 true 또는 false의 값인 boolean 자료형으로 변환된다.

 

<관계 연산자>

연산자 설명
> 왼쪽이 크면 true 또는 false를 반환 num > 34;
< 왼쪽이 작으면 true 아니면 false를 반환 num < 34;
>= 왼쪽항이 오른쪽보다 크거나 같으면 true 아니면 false를 반환 num >= 34;
<= 왼쪽항이 오른족보다 작거나 같으면 true 아니면 false를 반환 num <= 34;
== 왼쪽항과 오른쪽항이 같으면 true 
아니면 false 반환 
num == 34;
!= 왼쪽항과 오른쪽항이 다르면 true
아니면 false 반환
num != 34;

 


 

  • 논리 연산자

- 논리 연산자는 boolean 형의 값 (true, false) 을 가질 수 있는 자료형에 대해서만 적용 가능하다.

 

<논리 연산자>

AND연산자 && 피연산자 중 양쪽 모두 true일 경우 true이다.
OR연산자 || 피연산자 중 어느 한 쪽이 true이면 true이다.
부정연산자 ! 피연산자가 true이면 false, false이면 true를 반환한다.

                                                                   

<논리연산자 반환값>

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

 

//논리 AND 연산을 한다.
boolean b = true && false;  //false 출력

//논리 OR 연산을 한다.
boolean c = true || false;  //true 출력

//단항 연산자. 논리 NOT 연산을 한다.
boolean a = !true;  //false 출력

 


 

  • instanceof

- 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용한다.

- 주로 조건문에 사용하고, instanceof의 왼쪽에는 참조변수를, 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.

- 연산의 결과로 boolean값인 true, false 중의 하나를 반환한다.

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

 

class ATest{
	
}

class BTest extends ATest{
	
}

public class InstanceofExam {
	public static void main(String[] args) {
		
		ATest a = new ATest();
		BTest b = new BTest();
		
		
		//객체 a는 자기 자신의 객체이기 때문에 형변환 가능.
		System.out.println(a instanceof A);  //true 출력
		
		//객체 b는 A의 자식객체이기 때문에 A로 형변환 가능.
		System.out.println(b instanceof A);  //true 출력
		
		
		//객체 a는 B의 부모객체이기때문에 형변환 불가능.
		System.out.println(a instanceof B);  //false 출력
		
		//객체 b는 자기 자신의 객체이기때문에 형변환 가능.
		System.out.println(b instanceof B);  //true 출력
		
	}
}

 

  • assignment(=) operator

- 대입 연산자 또는 할당 연산자라고 하며, 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장하고 그 값은 연산결과로 반환한다.

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

- '='은 항상 오른쪽에 위치해야한다.

 

<대입 연산자>

대입 연산자 설명
= 왼쪽의 피연산자에 오른쪽의 피연산자를 대입한다.
+= 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입한다.
-= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입한다.
*= 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입한다.
/= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입한다.
%= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입한다.

 


 

  • 화살표(->)연산자

- 람다표현식. 메소드를 하나의 식으로 표현한 것이다.

- java에서 람다를 사용하기 위한 조건은 단 한개의 추상메서드만 가지는 인터페이스가 필요하다.

- 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라고 한다.

- 자바에서 람다 표현식은 익명 클래스와 같다고 볼 수 있다.

참고) 익명 클래스는 Inner class로, 이름이 없는 클래스를 말한다. 클래스 정의와 동시에 객체를 생성할 수 있다.

 


 

  • 3항 연산자
int a = ( 5 < 3 ) ? 50 : 40;
//      (조건문) ? 참일때 : 거짓일때

 

- if/else 문과 비슷하지만 간단한 분기문을 처리하는데 특화되어 있는 연산자이다.

- if/else로 처리했을 때 보다 라인수를 훨씬 줄여준다.

- 다만, 삼항연산자를 사용하여 코드의 라인이 줄어들었다고 컴파일 속도가 빨라지는것은 아니다.

- 삼항연산자를 중복해서 사용하는 것은 가독성이 떨어질 수 있으므로 가급적 사용하지 않는 것이 좋다.


 

  • 연산자 우선 순위

- 단항, 이항, 삼항 연산자 순으로 우선순위를 갖는다.

- 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 갖는다.

- 단항과 대입 연산자를 제외한 모든 연산 방향은 왼쪽에서 오른쪽이다.

- 복잡한 연산식에는 ( ) 괄호를 사용해서 우선순위를 정해준다.

- 연산자 우선순위가 같으면, 연산 방향에 따라 달라진다.

 

<연산자 우선순위>

우선순위 연산자 피연산자 연산 방향
0 ( ) 괄호 속 연산자 다양 -
1 증감(++,--), 부호(+,-), 비트(~), 논리( | ) 단항
2 산술 ( * , / , % ) 이항
3 산술 ( + , - ) 이항
4 쉬프트 ( << , >> , >>> ) 이항
5 비교 ( < , > , <= , >= , intanceof ) 이항
6 비교 ( == , != ) 이항
7 논리 & 이항(단항)
8 논리 ^ 이항(단항)
9 논리 | 이항(단항)
10 논리 && 이항
11 논리 | 이항
12 조건 ( ? , : ) 삼항
13 대입 연산자들 이항

 


 

  • (optional) Java 13, switch 연산자

- Java 12 버전에서는 콜론(:) 대신 화살표(->) 연산자를 사용할 수 있다.

- Java 13 버전에서는 break 대신 yield를 사용한다.

 

// 기존의 switch 문
String result;

switch (input) {
    case 1:
        result = "a";
        break;
    case 2:
        result = "b";
        break;
    case 3:
        result = "c";
        break;
    case 4, 5:
        result = "f";
        break;
    default:
        result = "z";
}

// 변경된 switch 문
result = switch (input) {
    case 1:
        yield "a";
    case 2:
        yield "b";
    case 3:
        yield "c";
    case 4, 5:
        yield "f";
    default:
        yield "z";
}

// 화살표 연산자 이용하여 더욱 간략하게
result = switch (input) {
    case 1 -> "a";
    case 2 -> "b";
    case 3 -> "c";
    case 4, 5 -> "f";
    default -> "z";
};

 

- 콜론을 사용했을 경우, yield가 빠지면 런타임 에러가 발생하고,

- 화살표 연산자를 사용했을 경우, yield가 빠지면 컴파일 에러가 발생한다.