[whiteship/live-study]3주차 과제: 연산자

산술 연산자

사칙 연산을다루는 연산자.

모두 두개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽

산술 연산자 설명
+ 왼쪽의 피연산자에 오른쪽의 피연선자를 더함.
- 왼쪽의 피연산자에서 오른쪽의 피연섡라를 뺌.
* 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함
/ 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔
% 왼쪽의 피연산자를오른쪽의 피연산자로 나눈 후, 그 나머지를 반환

비트 연산자

피연산자를 비트 단위로 논리 연산한다.

| (OR 연산자)     : 두 비트 중 하나라도 1일 경우에 연산 결과로 1 반환

& (AND 연산자) : 두 비트 모두 1일 경우에 연산 결과로 1 반환

^ (XOR 연산자)  :  두 비트 중 하나만 1일 경우에 연산 결과로 1반환

A 0 0 0 0 1 1 1 1
B 0 0 0 1 1 0 0 1
A | B 0 0 0 1 1 1 1 1
A & B 0 0 0 0 1 0 0 1
A ^ B 0 0 0 1 0 1 1 0

~ (비트 전환 연산자) : 2진수로 표현 했을 때, 각 비트의 값을 1은 0으로, 0은 1로 전환한다.

A 0 0 0 0 1 0 1 0
~A 1 1 1 1 0 1 0 1

<< , >>, >>> (쉬프트 연산자) : 피연산자의 각 비트를 왼쪽 또는 오른쪽으로 이동한다.

A << 2 : A를 이루는 비트를 각 2칸씩 왼쪽으로 이동한다.

A >> 2 : A를 이루는 비트를 각 2칸씩 오른쪽으로 이동한다.(빈칸은 MSB의 값으로 채워진다.)

A >>> 2 : A를 이루는 비트를 공백은 0으로 채우며 각 2칸씩 이동한다. (MSB를 비롯한 공백 비트의 값이 0이 된다.)

A 1 1 1 1 1 0 0 0
A << 2 1 1 1 0 0 0 0 0
A >> 2 1 1 1 1 1 1 1 0
A >>> 2 0 0 1 1 1 1 1 0

관계 연산자

연산의 결과로 true 또는 false의 boolean 타입을 반환한다.

연산자 기능 예시
> 왼쪽 항이 크면 참을, 아니면 거짓을 반환 3 > 4 (false)
>= 왼쪽 항이 크거나 같으면 참을, 아니면 거짓을 반환 3 >= 4 (false)
< 오른쪽 항이 크면 참을, 아니면 거짓을 반환 3 < 4 (true)
<= 오른쪽 항이 크거나 같으면 참을, 아니면 거짓을 반환 3 <= 4(true)
== 두개 항의 값이 같으면 참을, 아니면 거짓을 반환 3 == 4 (false)
!= 두개 항의 값이 다르면 참을, 아니면 거짓을 반환 3 != 4 (true)

논리 연산자

연산자 기능 예시
&& 두개 항의 값이 모두 참이면 참을, 그렇지 않으면 거짓을 반환 (5 > 3) && (5 > 2) (true)
|| 두개 항 중 하나라도 참이면 참을, 그렇지 않으면 거짓을 반환 (5 < 3) || (5 < 2) (true)
! 단항 연산자. 참인 경우 거짓, 거짓인 경우 참으로 반환 !(5 < 3) (true)

(참고) 단락회로평가

논리 연산자를 사용할 때, 두항 중 앞의 항(왼쪽 항)에서 결과가 정해질 경우, 뒤의 항(오른쪽 항)의 값이 참인지 거짓인지 평가하지 않는 것을 단락회로평가라고 한다. 이는 뒤의 항에 연산식이 있을 경우, 해당 연산식 또한 수행되지 않을 수 있음을 의미한다.

public class OperatorEx3 {

	public static void main(String[] args) {

		int num1 = 10;
		int i = 2;
		
		boolean value = ((num1 = num1 +10)<10) && ((i = i+2)<10);
		//num1의 값은 20, i의 값은 4가 됐을 거라고 생각 할 수 있음
		
		System.out.println(num1);	// 20
		System.out.println(i);  	// 2
        // value의 초기화에서 왼쪽항 봐도 평가가 되기 때문에 오른쪽 항을 평가하지 않아 i의 값은 2 그대로이다.

		System.out.println(value); //false

		
		int num2 = 10;
		int i2 = 2;
		
		boolean value2 = ((num2 = num2 +10)<10) || ((i2 = i+2)<10);
		
		System.out.println(num2);	//20
		System.out.println(i2);		//4
        // 왼쪽항이 false여도 오른쪽항까지 체크해야 되기 때문에 i2는 4
		// 만약 왼쪽항이 true였다면 이번에도 계산안됨
        
		System.out.println(value2); //true

instanceof

객체 타입을 확인하는데 사용하며, 형변환이 가능한지에 대한 참, 거짓 값을 반환한다.

class A{}
class B extends A{}

class Example{
	public static void main(String args[]){
    	A a = new A();
        B b = new B();
        
        system.out.println("a instance of A : " + (a instanceof A));	// true
        system.out.println("b instance of A : " + (b instanceof A));	// true
        system.out.println("a instance of B : " + (a instanceof B));	// false
        system.out.println("b instance of B : " + (b instanceof B));	// true
    }
}

위 코드에서 유일하게 false가 나온 a instance of B의 경우는 부모 클래스를 참조하는 a 객체가 자식 클래스인 B로 형변환할 순느 없기 때문이다.

assignment(=) operator

변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.

복합 대입 연산자의 경우, 위에서 언급한 산술연산자와 비트연산자를 포함하는 이항 연산자와 합쳐 연산 결과를 왼쪽 항에 저장한다. 

화살표(->) 연산자

람다 표현식. 이는 메소드를 하나의 식으로 표현한 것을 의미한다. 이는 일회성 객체의 선언과 같은 불필요한 코드를 줄여주고 코드의 가독성을 높여준다.

그런데 자바에서는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라고 한다.

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

익명 클래스
new Object() {
// 일반적인 메소드
    int min(int x, int y) {
        return x < y ? x : y;
    }
}

// 람다 표현식
(x, y) -> x < y ? x : y;

람다 표현식 작성

(매개변수목록) -> { 함수몸체 }
ex (x) -> {system.out.println(x);}

람다 표현식을 사용할 때 유의할 점

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

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

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

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

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

함수형 인터페이스

람다 표현식을 사용할 때는 람다 표현식을 저장하기 위한 참조 변수의 타입을 결정해야만 한다.

이는 아래와 같은 문법으로 나타낼 수 있다.

참조변수의타입 참조변수의이름 = 람다 표현식

위의 문법처럼 람다 표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 부른다.

 

함수형 인터페이스는 추상 클래스와는 달리 단 하나의 추상 메소드만을 가져야 한다.

또한, FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있다.

FunctionalInterface 어노테이션을 적용한 interface의 경우, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식한다.

자바 컴파일러는 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메소드가 선언되면 오류를 발생시킨다.

@FunctionalInterface
interface Calc { // 함수형 인터페이스의 선언
    public int min(int x, int y);
}
 
public class Lambda02 {
public static void main(String[] args){
        Calc minNum = (x, y) -> x < y ? x : y; // 추상 메소드의 구현
        System.out.println(minNum.min(3, 4));  // 함수형 인터페이스의 사용
    }
}

3항 연산자

조건 연산자. 유일한 삼항 연산, '조건식?결과1:결과2;' 로 표현. 이때 조건식이 참이면 결과1을, 거짓이면 2를 실행한다.

public class Example {

	public static void main(String[] args) {

		int num1 = (5>3)?10:20;
		
		System.out.println(num1);	// 10
		
		int num2 = 10;
		int	num3 = 20;
			
		int max = (num2 > num3)?num2:num3;
		
		System.out.println(max);	//20
	}
}

연산자 우선 순위

수식 내에 여러 연산자가 함께 등장할 때, 어느 연산자가 먼저 처리될 것인가를 결정

 

연산자의 우선순위표

우선 순위 연산자 설명 결합 방향
1 [] 첨자 연산자 왼쪽에서 오른쪽
  . 멤버 연산자 왼쪽에서 오른쪽
2 ++ 후위 증가 연산자 왼쪽에서 오른쪽
  -- 후위 감소 연산자 왼쪽에서 오른쪽
3 ! 논리 NOT 연산자 오른쪽에서 왼쪽
  ~ 비트 NOT 연산자 오른쪽에서 왼쪽
  + 양의 부호 (단항 연산자) 오른쪽에서 왼쪽
  - 음의 부호 (단항 연산자) 오른쪽에서 왼쪽
  ++ 전위 증가 연산자 오른쪽에서 왼쪽
  -- 전위 감소 연산자 오른쪽에서 왼쪽
  - 음의 부호 (단항 연산자) 오른쪽에서 왼쪽
  ++ 전위 증가 연산자 오른쪽에서 왼쪽
  (타입) 타입 캐스트 연산자 오른쪽에서 왼쪽
4 * 곱셈 연산자 왼쪾에서 오른쪽
  / 나눗셈 연산자 왼쪽에서 오른쪽
  % 나머지 연산자 왼쪽에서 오른쪽
5 + 덧셈 연산자 (이항 연산자) 왼쪽에서 오른쪽
  - 뺄셈 연산자 (이항 연산자) 왼쪽에서 오른쪽
6 << 비트 왼쪽 시프트 연산자 왼쪽에서 오른쪽
  >> 부호 비트를 확장하면서 비트 오른쪽 시프트 연산자 왼쪽에서 오른쪽
  >>> 부호 비트까지 모두 비트 오른쪽 시프트 연산자 왼쪽에서 오른쪽
7 < 관계 연산자 (보다 작은) 왼쪽에서 오른쪽
  <= 관계 연산자 (보다 작거나 같은) 왼쪽에서 오른쪽
  > 관계 연산자 (보다 큰) 왼쪽에서 오른쪽
  >= 관계 연산자 (보다 크거나 같은) 왼쪽에서 오른쪽
  instance of 인스턴스의 실제 타입 반환 왼쪽에서 오른쪽
8 == 관계 연산자 (와 같은) 왼쪽에서 오른쪽
  != 관계 연산자 (와 같지 않은) 왼쪽에서 오른쪽
9 & 비트 AND 연산자 왼쪽에서 오른쪽
10 ^ 비트 XOR 연산자 왼쪽에서 오른쪽
11 | 비트 OR 연산자 왼쪽에서 오른쪽
12 && 논리 AND 연산자 왼쪽에서 오른쪽
13 || 논리 OR 연산자 왼쪽에서 오른쪽
14 ?: 삼항 조건 연산자 오른쪽에서 왼쪽
15 = 대입 연산자 및 복합 대입 연산자
(=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=)
오른쪽에서 왼쪽

(optional) Java 13. switch 연산자

switch statement switch operator
다수의 case,break가 존재하게 된다.
break; 를 빼먹을 경우 다음 분기로 넘어가게 됨.
return값이 존재할수없다.
break를 사용하지 않아도 된다.
yield 존재함
return값 존재해도됨
case -> A 같은 람다 형식으로 표현가능
switch의 반환값이 따로 필요하지 않거나 case가 switch 들어오는 모든 인자를 커버하는 경우
default 항목을 넣어주지 않아도 되나 그렇지 않은 경우는 default -> code를 작성해야 한다.
public class Main {
    public static void main(String[] args) {

        //Java 12 이전
        int num = 1;
        int returnNum = 0;
        switch(num){
            case 1:
                returnNum = 1;
                System.out.println("1들어옴");
                break;
            case 2:
                returnNum = 2;
                System.out.println("2들어옴");
                break;
            case 3:
                returnNum = 3;
                System.out.println("3들어옴");
                break;
        }
        System.out.println("returnNum : [ " + returnNum + " ]");

        //Java 12
        returnNum = switch(num){
            case 1 -> 1;
            case 2 -> 2;
            default -> throw new IllegalStateException("Unexpected value: " + num);
        };
        System.out.println("returnNum : [ " + returnNum + " ]");


        //Java13
        returnNum = switch(num){
            case 1 : yield 3;
            default : throw new IllegalStateException("unexpected value : " + num);
        };

        System.out.println("returnNum : [ " + returnNum + " ]");

    }
}


// 1 들어옴
// returnNum : [ 1 ]
// returnNum : [ 1 ]
// returnNum : [ 3 ]

ref {

  http://www.tcpschool.com/java/java_operator_arithmetic

  https://staticclass.tistory.com/25

  https://velog.io/@foeverna/Java-연산자-관계-논리-조건-비트-연산자

  https://improver.tistory.com/140

  http://www.tcpschool.com/java/java_lambda_concept

  https://castleone.tistory.com/6

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

자바(Java) instanceof 사용방법

instanceof는 객체타입을 확인하는데 사용한다. 속성은 연산자이고 형변환이 가능한 지 해당 여부를 true 또는 false로 가르쳐준다. 객체 타입이라 하니 어려운 개념 같은데, 주로 부모 객체인지 자식

improver.tistory.com

 

[Java] 연산자 - 관계, 논리, 조건, 비트 연산자

비교 연산자라고도 하며 우리가 수학시간에 배웠던 부등호를 생각하시면 됩니다. 관계연산자의 결과는 true 혹은 false 값인 boolean 자료형으로 반환이 됩니다. 뒤에서 배울 제어문에서 많이 사용

velog.io

 

07. [자바] 비트 연산자 &, |, ^, ~, <<, >>

비트 연산자란? 비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이진수로 표현했을 때의 각 자리를 알아보자 |(OR연산자) 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다.

staticclass.tistory.com

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

}

댓글