본문 바로가기

JAVA WHITESHIP LIVE STUDY

산술 연산자

+, -, *, /, %

비트 연산자

&, |, ^

관계 연산자

<, >, ≤, ≥, ==, ≠

논리 연산자

&&, ||

instanceof

instanceof 란 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용하는 연산자이다.

[참조변수] instanceof [타입/클래스명]

연산 결과는 boolean이다.

결과가 true이면 참조 변수가 검사한 타입으로 형 변환이 가능하다는 것을 뜻한다.

참고로, 값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false를 결과로 얻는다.

조상타입의 참조변수로 자손 타입의 인스턴스를 참조할 수 있기 때문에, 참조 변수의 타입과 인스턴스의 타입이 항상 일치하지는 않는다.

때문에 조상 타입의 참조변수로는 실제 인스턴스의 멤버들을 모두 사용할 수 없기 때문에, 실제 인스턴스와 같은 타입의 참조변수로 형변환을 해야한 인스턴스의 모든 멤버들을 사용할 수 있다.

class InstaceofTest {
    public static void main(String args[]) {
        FireEngine fe = new FireEngine();

        if (fe instanceof FireEngine) {
            System.out.println("This is a FireEngine instance.");
        }
        if (fe instanceof Car) {
            System.out.println("This is a Car instance.");
        }
        if (fe instanceof Object) {
            System.out.println("This is an Object instance.);
        }
        // 클래스의 이름을 출력
        System.out.println(fe.getClass().getName()); 
    }
}
class Car {}
class FireEngine extends Car {}
This is FireEngine instance.
This is a Car instance.
This is an Object instance.
FireEngine

생성된 인스턴스는 FireEngine 타입인데도, Object 타입과 Car타입의 instanceof연산에서도 true를 결과로 얻었다.

그 이유는 FireEngine클래스는 Object클래스와 Car클래스의 자손 클래스이므로 조상의 멤버들을 상속 받았기 때문에, FireEngine인스턴스는 Object인스턴스와 Car인스턴스를 포함하고 있는 셈이기 때문이다.

요약하면, 실제 인스턴스와 같은 타입의 instanceof연산 이외에 조상 타입의 instanceof연산에도 true를 결과로 얻으며, instanceof연산의 결과가 true라는 것은 검사한 타입으로의 형변환을 해도 아무런 문제가 없다는 뜻이다.

assignment(=) operator

대입 연산자라고도 한다.

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

또한, 자바에서는 대입 연산자를 다른 연산자와 결합하여 만든 다양한 복합 대입 연산자를 제공한다.

https://tcpschool.com/java/java_operator_assignment

화살표(→) 연산자

람다 표현식(lambda expression)이라고도 한다.

람다 표현식이란 간단히 말해 메소드를 하나의 식으로 표현한 것이다.

// 메소드
int min(int x, int y) {
    retrun x < y ? x : y;
}
// 람다 표현식
(x, y) -> x < y ? x : y;

메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다.

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

 

익명 클래스

일반적인 인스턴스 생성법 (new)와 다르게 중괄호가 마지막에 붙어있는 구조이다.
익명, 즉, 이름이 없는 클래스이다.

이름이 없다는 건 무슨 의미일까? 예를 들어 알아보자

  public class Peseon {
      void whoAmI() {
          System.out.println("나는 Person이다.");
      }
  }
  public class Child extends Person {
      @Override
      void whoAmI() {
          System.out.println("I'm Child");
      }
  }

위는 익명 클래스가 아닌 일반적인 클래스이다.

이런 보통의 경우, 우리는 부모 클래스를 상속 받아 처리하려면 부모 클래스(Person)를 상속받는 클래스(Child)를 별도로 만들어서 처리한다.

💡 Override
부모 클래스로부터 상속 받은 메소드의 내용을 변경하는 것
Overloading
같은 이름의 메서드에 매개변수의 타입, 개수를 다르게 한것. (너무 많이 적재했다라는 뜻)상속 받은 클래스가 재 사용되면 모를까, 그냥 한번 쓰고 버려진다면 굳이 클래스 파일을 만들 필요는 없다.

그런데 만약 Person를 상속받아 처리해야하는 클래스가 또 필요한 경우, 매번 Child2 Child3 ... 등의 클래스를 만드는 것은 낭비이다.

상속 받은 클래스가 재 사용되면 모를까, 그냥 한번 쓰고 버려진다면 굳이 클래스 파일을 만들 필요는 없다.

이럴 경우 익명 클래스를 사용하면 된다.

  public static void main(String[] args) {
      Person p = new Person() {
          String name = "Kim";
          @Override
          void whoAmI() {
              System.out.println("나는 " + name + "이다.");
          }
      };
      p.whoAmI();
  }

위는 익명 클래스의 예이다.

인스턴스 생성시, 일반적인 경우와 다르게 중괄호가 더해져 그 안에 처리구문이 들어갔다.

따로 상속 받을 자식 클래스를 생성하지 않고, 인스턴스 생성 부분에서(new) 중괄호 내에 자식 클래스의 내용을 선언하는 것이다.

// 람다 표현식
(x, y) -> x > y ? x : y;
// 익명 클래스
new Object() {
    int min(int x, int y) {
        return x < y ? x : y;
    }
}

3항 연산자

(조건) ? 참일 때 : 거짓일 때

연산자 우선 순위

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

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

https://toma0912.tistory.com/66

Java 13. switch 연산자

Java 12 부터 프리뷰로 추가되었다.

기존의 switch/case 문을 좀 더 간결하게 쓸 수 있다.

String str = "A";

    switch(str){
        case "A": 
            System.out.println("1");
        case "B":
            System.out.println("2");
        case "C" :
            System.out.println("3");
        default :
            System.out.println("그 외의 숫자");
    }

기존의 switch 문에서 콜론(:)을 화살표()로 변경하여 사용할 수 있고 break문을 생략할 수 있다.

String str = "A";

switch (str) {
    case "A" -> System.out.println("1");
    case "B" -> System.out.println("2");
    case "C" -> System.out.println("3");
    default -> System.out.println("그 외의 숫자");
}

식(expression)으로 사용될 수 있어서 바로 변수로 할당할 수 있다.

String result = switch(n) {
    case "A" -> System.out.println("1");
    case "B" -> System.out.println("2");
    case "C" -> System.out.println("3");
    default -> System.out.println("그 외의 숫자");
}

break로 반환하는 문법이 JAVA 12에 있었으나,

JAVA 13에선 yield로 변경되었다.

yield는 '내다', '산출/생산하다' 등의 의미를 가지고 있다.

String result = switch(n) {
    case "A" -> {
        System.out.println("1");
        yield 1;
    }
    case "B" -> {
        System.out.println("2");
        yield 2;
    }
    case "C" -> {
        System.out.println("3");
        yield 3;
    }
    default -> {
        System.out.println("그 외의 숫자");
        yield 100;
    }
}

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | 자기계발 | 미라클 모닝 | 일상