[JAVA] Study-3 다양한 연산자


자바 스터디 3주차


산술연산자

  • 사칙연산에 사용된다.
  • int형으로 연산하면 소수점은 제거된다.
  • 소수점 연산은 double로 해야한다.
연산자설명
+더하기
-빼기
*곱하기
/나누기
%나머지
		System.out.println(3 + 2);
		System.out.println(3 - 2);
		System.out.println(3 * 2);
		System.out.println(3 / 2);
		System.out.println(3 % 2);

결과 출력

5
1
6
1
1

비트연산자

비트이동연산자

  • 데이터를 비트 단위로 연산한다.

  • 비트는 0과 1로 표현된다.

  • <<,>>,>>>등이있다.

  • 화살표가 가르키는 방향으로 옮겨간다고 생각하면된다.

    ​ ex) « 오른쪽에서 왼쪽으로 이동, » 왼쪽에서 오른쪽으로 이동

    ​ 즉, «는 숫자가 커지고 »는 작아진다.

  • >>>는 빈값이 채워지는 값을 반대로 변경한다.

    		//00000000 00000000 00000000 00000010
    		int a = 2;
    		//오른쪽에서 왼쪽으로 세칸 이동
    		//00000000 00000000 00000000 00010000
    		a = a << 3;
    		System.out.println(a);
    

    결과 출력

    16
    

비트논리연산자

  • boolean 타입일때는 논리연산자로 사용되지만 대상이 정수형이면 비트 논리 연산자로 활용된다.

    연산자논리설명
    &AND두 비트가 1일때만 1
    |OR두 비트가 다르거나 모두 1일경우 1
    ^XOR두 비트가 다르면 모두 1
    ~NOT비트의 반대
    		int a = 2;
    		a = a & a;
    		System.out.println(a);
    		a = 2;
    		a = a | a;
    		System.out.println(a);
    		a = 2;
    		a = a ^ a;
    		System.out.println(a);
    		a = 2;
    		a = ~a;
    		System.out.println(a);
    

    결과 출력

    2
    2
    0
    -3
    

관계연산자

  • 양쪽의 값을 비교할떄 사용한다.

  • true,false로 반환된다.

  • 주로 조건문에서 사용된다.

    연산자기능연산예제
    >왼쪽이 크면 true 반대면 false를 반환한다.2 > 3 : false
    <왼쪽이 작으면 true 반대면 false를 반환한다.2 < 3 : true
    >=왼쪽이 크거나 오른쪽과 같으면 true 오른쪽이 크면 false를 반환한다.2 >= 3 : false
    <=왼쪽이 작거나 오른쪽과 같으면 true 오른쪽이 작으면 false를 반환한다.2 <= 3 : true
    ==같다면 true 다르면 false를 반환한다.2 == 3 : false
    !=다르면 true 같으면 false를 반환한다.2 != 3 : true

논리연산자

  • 논리연산자는 &&, 가 있다.
  • &&가 보다 우선순위가 높다()를 잘써야한다.
  • 논리연산자도 반복문에서 자주 사용된다.

    연산자기능
    &&두 가지 모두 true면 true
    ||둘중하나라도 true면 true

instanceof

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

  • 연산자이다.

  • true면 형변환이 가능하다.

    A가 부모 B가 자식

    		class A {}
    		class B extends A{};
    		A a = new A();
    		B b = new B();
    		System.out.println(a instanceof A);
    		System.out.println(b instanceof A);
    		System.out.println(a instanceof B);//부모가 자식이 될 수 없다.
    		System.out.println(b instanceof B);
    

    결과 출력

    true
    true
    false
    true 
    

assignment(=) operator

대입연산자

  • 제일 자주 사용하는 연산자이다.

  • 값을 할당할떄 사용한다.

  • 위에서 나온 연산자들을 응용해서 사용한다.

    대입연산자설명
    =왼쪽의 피연산자에 오른쪽의 피연산자를 대입함.
    +=왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    -=왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    *=왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    /=왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    %=왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.
    &=왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    !=왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    ^=왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    «=왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    »=왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
    »>=왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

화살표(->)연산자

  • 람다식 식별자 없이 실행가능한 함수

  • 즉, 함수의 이름이 없다.(익명함수)

  • 함수형 인터페이스를 이용해서 만들 수 있다.

  • -> 문법을 사용하면 컴파일러 익명클래스로 변환한다.

  • @FunctionalInterface를 사용하면 함수를 하나만 만들 수 있다.

    	@FunctionalInterface
    	interface A {
    		public void get();
    	}
      
      
    	@Test
    	public void testPay() {
    		A a = () ->{
    			System.out.println("123");
    		};
    	}
    

3항연산자

  • 한줄로 표현하는 조건문이라고 생각하면된다.

  • (조건문) : ? 참 : 거짓 으로 이해하면된다.

  • 3항연산자를 중복해서쓰면 가독성이 떨어진다.

    		int a = 2;
    		int b = 3;
    		String c = a < b ? "b가 크다.":"a와 b가 같거나 a가 크다";
    		System.out.println(c);
    		c = (a < b ? "b가 크다.":"a와 b가 같거나 a가 크다").equals("b가 크다.")? "중복으로사용하면": "복잡하다";
    		System.out.println(c);
    

    결과 출력

    b가 크다.
    중복으로사용하면
    

연산자 우선 순위

우선순위이름연산자
1괄호(),[]
2부정 / 증감연산자!,~,++,–
3곱셈 / 나눗셈*,/,%
4덧셈 / 뺄셈+,-
5비트단위의 쉬프트 연산자«,»,»>
6관계연산자<, <=, >, >=
7 ==,!=
8비트단위의 논리연산자&
9 ^
10 |
11논리곱연산자&&
12논리합연산자||
13조건연산자?:
14대입 / 할당 연산자=, +=, -=, *=, /=, %=, «=, »=, &=, ^=, ~=

스위치연산자

  • 스위치 문은 break를 안쓰게되면 다음 분기로 넘어간다.

  • 자바 12에선 ->로 표현하면 break문이 없어도된다.

  • 자바 13에선 yield(예약어)로 사용한다.

            //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 + " ]");