자바스터디 3주차

기석·2022년 6월 5일
0
post-thumbnail

3주차 과제: 연산자


산술 연산자

사칙 연산을 다루는 연산자로, 가장 기본적이면서도 가장 많이 사용되는 연산자 중 하나이다.
산술 연산자는 모두 두 개의 피연산자는 이항 연산자이며, 결합 방향은 왼쪽에서 오른쪽이다.

연산자의 우선순위

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

연산자의 결합 방향

연산자의 결합 방향은 수식 내에 우선순위가 같은 연산자가 둘 이상 있을 때, 먼저 어느 연산을 수행 할 것인가를 결정

자바 연산자의 우선순위, 결합 방향 표

https://www.cs.bilkent.edu.tr/~guvenir/courses/CS101/op_precedence.html


논리 연산자

주어진 논리식을 판단하여 참과 거짓을 결정하는 연산자

  • && (AND): 논리식이 모두 참이면 참을 반환
  • || (OR): 논리식 중에서 하나라도 참이면 참을 반환
  • ! (NOT): 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환

비트 연산자

논리 연산자와 비슷하지만, 비트 단위로 연산을 할 때 사용하는 연산자
비트 단위로 왼쪽 오른쪽으로 전체 비트를 이동하거나 1의 보수를 만들 때도 사용된다.

  • & (AND): 대응되는 비트가 모두 1이면 1을 반환
  • | (OR): 대응되는 비트 중 하나라도 1이면 1을 반환
  • ^ (XOR): 대응되는 비트가 서로 다르면 1을 반환
  • ~ (NOT): 비트가 1이면 0을, 0이면 1을 반환
  • << (LEFT SHIFT): 명시된 수만큼 비트들을 모두 왼쪽으로 이동.
    • 값이 2배씩 증가
  • >> (RIGHT SHIFT): 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동
    • 실행 결과를 보면 값이 2배씩 감소하며 부호가 유지됨
  • >>> : 지정한 수만큼 비트를 모두 오른쪽으로 이동시미켜, 새로운 비트는 모두 0이 됨

관계 연산자

피연산자 사이의 상대적인 크기를 판단하는 연산자
왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여 어느쪽이 더 큰지, 작은지, 같은지 등을 판단
두 개의 피연산자를 가지는 이항 연산자, 결합 방향은 왼쪽에서 오른쪽

  • ==
    왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참
  • !=
    왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참
  • 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 참

  • =
    왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 참

  • <
    오른쪽의 피연산자가 왼쪽의 피연산자보다 크면 참
  • <=
    오른쪽의 피연산자가 왼쪽의 피연산자보다 크거나 같으면 참

증감 연산자

피연산자를 1씩 증가 혹은 감소 시킬 때 사용하는 단항 연산자

  • ++x
    먼저 피연산자의 값을 1증가시킨 후에 해당 연산을 진행
  • x++
    해당 연산을 수행하고 나서, 피연산자의 값을 1증가시킴
  • --x
    먼저 피연산자의 값을 1감소시킨 후에 해당 연산을 진행
  • x--
    해당 연산을 수행하고 나서, 피연산자의 값을 1감소시킴

나는 지금까지 --x, x-- 가 행을 기준으로 행을 시작할때 -1, 끝날 때 -1인줄 알았다.


대입 연산자

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


화살표 연산자

람다 표현식을 구성하는 데 사용되는 연산자

(parameters) -> { statements; }

람다 표현식은 Java8에서 도입되었으며 Java의 익명 클래스 코드를 보다 간결하고 읽기 편하게 만든다.

Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.print("Run method");
        }
};

to

Runnable r = ()-> System.out.print("Run method");

람다 함수

  • 익명 함수를 지칭하는 용어
  • 현재 사용되고 있는 람다의 근간은 기초 컴퓨터 과학 분야에서의 람다 대수이다.
  • 두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다 대수로 단순화 될 수 있다.(Curring)
  • 익명 함수들은 공통으로 일급 객체라는 특징을 가지고 있다.
    • 일급 객체: 일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체.
    • 함수를 값으로 사용할 수 있으며, 파라미터로 전달 및 변수에 대입 등 연산이 가능하다.

람다의 장단점

장점

  • 코드를 간결하게 표현
  • 지연연산 수행
  • 병렬처리 가능

단점

  • 람다식의 호출이 까다로움
  • 람다 stream 사용시 단순 반복문 사용 시 성능이 떨어짐
  • 오히려 가독성을 떨어뜨릴 수 있음

람다 표현식

  • 함수 몸체가 단일 실행문이면 괄호 {}를 생략할 수 있다.
  • 함수 몸체가 return 문으로만 구성되어 있는 경우 괄호 {}를 생략할 수 없다.

FunctionalInterface, 람다에 대한 자세한 내용은 따로 포스팅을 해야겠다.


자바12, 13, 14의 새로운 스위치 연산자

자바 12 이전 Switch문

  • C, C++ 에서 사용하는 형태의 Switch 형식을 따른다.
  • 다수의 case와 break가 존재
  • 개발자의 실수로 break를 빼먹을 경우 다음 분기로 넘어감
  • 에러 발생 시 디버깅 어려움

새로운 Switch문

  • Switch 내에서 라벨이 일치하는 경우, case -> A 와 같은 형식으로 표현
  • 단일 수행 혹은 블록 수행이 가능
  • Switch 블록 수행 내에서 계산된 값을 반환하는 yield 키워드
  • 여러 조건을 쉼표로 구분하여 한 라인으로 처리 가능

기존 Switch문 코드

switch (day) {
	case MONDAY:
	case FRIDAY:
	case SUNDAY:
		System.out.println(6);
		break;
	case TUESDAY:
		System.out.println(7);
		break;
	case THURSDAY:
	case SATURDAY:
		System.out.println(8);
		break;
	case WEDNESDAY:
		System.out.println(9);
		break;
}

새로운 Switch문 코드

switch (day) {
	case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
	case TUESDAY                -> System.out.println(7);
	case THURSDAY, SATURDAY     -> System.out.println(8);
	case WEDNESDAY              -> System.out.println(9);
}
//or
System.out.println(
	switch (day) {
		case MONDAY, FRIDAY, SUNDAY -> 6;
		case TUESDAY                -> {
        	int k = 7*77*778;
            yield k;   // yield는 switch 블록 수행 내 return이라고 생각하면 편하다.
        }
		case THURSDAY, SATURDAY     -> 8;
		case WEDNESDAY              -> 9;
});

삼항 연산자

자바에서 유일하게 피연산자를 세개 가지는 연산자

// 조건식 ? 반환값1 : 반환값 2
result = num1 > num2 ? num1 : num2;

instanceof 연산자

참조 변수가 참조하고 있는 인스턴스의 실제 타입을 반환해준다.
즉, 해당 객체가 어떤 클래스나 인터페이스로부터 생성되었는지를 판별

// 인스턴스이름 instanceof 클래스 이름 혹은 인터페이스 이름
A a = new A();
B b = new B();
a instanceof A // True
b instanceof A // False

출처
http://www.tcpschool.com/java/java_operator_arithmetic
https://www.delftstack.com/ko/howto/java/java-arrow-operator/
https://velog.io/@nunddu/Java-Switch-Expression-in-Java-14

profile
개바라자

0개의 댓글