Programming/Java \ Spring

🔥자바스터디🔥 instanceof / 화살표(->) 연산자 / (optional) Java 13. switch 연산자

1. instanceof 

 

 - 객체 타입을 확인하는데 사용한다. 속성은 이항연산자이고 형변환 가능여부를 가능하면 true 불가능하면 false로 리턴해준다.

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

 - null 은 어떤 것의 instance 도 아니다.

 

※ 주의할점  ( 뒤에 나오는 예제를 통해 확인 할 수 있다. )

  // 주의할점은 조건문의 순서는 가장 최하위 클래스 부터 작성해야한다.
  // 그이유는 최상위 클래스를 맨위에 적어버린다면 첫번째 조건문에서 true를 만족하기때문에 첫번째 조건만을 수행한다.

public class InstanceofExam { 
	public static void main(String[] args) { 
    	A a = new A(); 
        B b = new B(); 
        
        //객체 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 출력 
     } // end of main 
 } // end of class 
 
 class A{ } 
 class B extends A{ }

 

2. 화살표(->) 연산자

 

화살표 연산자는 Java 8 버전부터 추가된 것으로, 람다 표현식과 함께 사용된다.

람다표현식은 일종의 익명 함수라고 볼수 있는데, 익명 함수를 이해하기 위해서는 먼저 익명 클래스 Anonymous class의 개념을 먼저 이해해야 한다.

 

더보기

익명 클래스란?

익명 클래스란 클래스 instantiation과 동시에 클래스를 정의하는 클래스를 의미한다. 특정 클래스가 여러번 호출되지 않거나, 클래스 내부에 필드나 여러개의 메소드를 정의할 필요가 있는 경우 익명클래스로 정의해 사용할 수 있다.

interface Smartphone {
	void setOs();
    	void printOs(String osName);
}
 Smartphone iPhone = new Smartphone() {
            String os = "iOS";
            void setOs() {
                printOs(os);
            }
            
            void printOs(String osName) {
                os = osName;
                System.out.println("This is " + os);
            }
};

익명 클래스의 특징

  • new를 사용한다.
  • instantiation시 parameter가 없어야 한다.(빈 parenthesis)
  • parenthesis 뒤에 interface를 implement하거나 class를 extends하는 내용이 와야 한다.
  • 클래스 내에 static 변수를 선언할 수 없다.(static final은 가능)
  • Outer class의 멤버변수나 scope 내의 지역변수에 접근할 수 있다.

화살표 연산자는 Java 에서 람다 표현식의 syntax 일부이다.

(argument, ...) -> {expression}

람다식은 메소드를 변수처럼 다룰 수 있다는 측면에서 편리하다.

대부분의 메소드들은 클래스에 종속된 멤버함수의 형태로 제공되는 형태이지만,

람다식은 클래스에 종속되지 않는다.

 

인자를 0개부터 받아서 implementation 부분에서 활용할 수 있다.

argument list 부분의 인자가 하나라면 구현부의 소괄호를 생략할 수 있으며, statement 개수가 1개이면 중괄호를 생략할 수 있다.

람다식은 앞서 언급한 코드의 간결성 뿐 아니라, stream을 통한 데이터의 독립적 처리에도 많이 쓰인다.

 

3. (optional) Java 13. switch 연산자(Switch Expressions)

 

기존 switch 구문

public class SwitchExpressionsExample {
    public static void main(String[] args) {
        SwitchExpressionsExample example = new SwitchExpressionsExample();
        example.printDay(Day.FRI);
        example.printDay(Day.TUE);
        example.printDay(Day.SUN);
    }

    public void printDay(Day today) {
        switch (today) {
            case MON:
            case TUE:
            case WED:
            case THUR:
            case FRI:
                System.out.println(today.name() + " is Weekday");
                break;
            case SAT:
            case SUN:
                System.out.println(today.name() + " is Weekend");
                break;
        }
    }

    enum Day {
        MON, TUE, WED, THUR, FRI, SAT, SUN
    }
}

 

'break'의 위치에 따라 실행 결과가 달라질 수 있기 때문에 개발자가 의도적으로 'break'를 했는지 실수인지 파악하기 어렵다.


강화된 switch 표현식

 

public void printDay(Day today) {
    switch (today) {
        case MON, TUE, WED, THUR, FRI -> System.out.println(today.name() + " is Weekday");
        case SAT, SUN -> System.out.println(today.name() + " is Weekend");
    }
}

 

여러 조건에 따라 ','로 구분해서 한 번에 처리할 수 있다.

단일 실행으로 '->'만 추가했지만, '{}' 형태로 구문을 만들 수 있다.

'->' 대신 ':'을 사용해서 예전 방식으로 사용할 수도 있다.


반환값 받기

public String printDay(Day today) {
    String result = switch (today) {
        case MON, TUE, WED, THUR, FRI -> today.name() + " is Weekday";
        case SAT, SUN -> today.name() + " is Weekend";
    };
    return result;
}

표현식으로 변경되었기 때문에 결과값을 반환 받는 형식으로 만들 수 있다.

반환값의 타입을 Object로 설정하게 되면 표현식마다 다른 자료형을 반환할 수도 있다.

반환값이 있을 때 표현식이 void를 반환하면 컴파일 에러가 발생한다.


반환값이 있는 표현식을 블록('{}') 구문으로 사용

public String printDay(Day today) {
    String result = switch (today) {
        case MON, TUE, WED, THUR, FRI -> today.name() + " is Weekday";
        case SAT, SUN -> {
            System.out.print("Holiday! ");
            yield today.name() + " is Weekend";
        }
    };
    return result;
}

'yield' 키워드를 사용해서 반환(java 13에서 변경된 내용으로 java 12를 사용한다면 'yield'대신 'break'를 사용하면 된다.)

'return' 키워드를 사용하면 컴파일 에러가 발생한다. (반환값이 없는 경우라면 return을 사용할 수도 있다.)

 

 

출처

https://zzdd1558.tistory.com/124

https://velog.io/@maigumi/%EC%9E%90%EB%B0%94-%EC%97%B0%EC%82%B0%EC%9E%90-2

https://dev-kani.tistory.com/21