Day26 - 익명 객체(클래스) 내부클래스 와 람다식 , 반복자 스트림

2021. 3. 23. 22:25JAVA 공부

이번에는 익명 객체 를 알아 볼건데요

익명 클래스, 내부 클래스 전부 같은 말입니다

 

익명 객체

interface 를 떠올려 봅시다.

interface는 interface를 받는 클래스를 만들어서, 오버라이딩을 해야 하는 것 기억 하시나요?

이렇게 구체화(오버라이딩) 를 해주고 이 메서드를 사용하기 위해서, Car를 객체로 만들어서 사용했었죠?

그런데, 중간에 Tico 클래스가 없이 interface Car를 사용할 수가 있습니다 !

바로 익명 객체 라고 합니다

 

익명 객체는,

메서드의 기능 및 내용이 자주 바뀌거나

딱 1번 사용하고 말 interface 에 사용하는 것 입니다.

그 이유는, 익명 객체로 정의한 메서드 같은 경우에는 딱 거기서만 사용할 수 있기 때문이죠.

 

어떻게 사용하는지 한번 봅시다

바로 이렇게 사용해주면 됩니다. 뒤에 ;(세미콜론) 놓치지 말고 달아 주시기 바랍니다.

interface인 Car는 객체화 될 수 없지만, 익명 객체를 이용해서 이렇게 사용할 수 있습니다.

interface인 Car는 하위 클래스에서 구체화를 해줘야 사용할 수 있는데... 하위 클래스에서 구체화 하는 걸 대신해서, 바로 직접 구체화 해주는 것이죠

 

Main 에서는 어떻게 사용할까요?

이렇게 Car를 가지고 있는 Garage 를 객체화 하고 안에 있는 Car의 객체를 참조하고, 그 안에 있는 run() 메서드를 실행해 주면 됩니다.

 

그리고 저 익명객체는 어디에서나 사용할 수 있습니다.

 

익명 객체를 조금 더 확인 해 봅시다

interface 를 먼저 만들어 줍니다 ~

그리고 원래는 구체화를 해주어야 겠죠?

구체화한 클래스를 객체화 해주어야 겠죠?

생성자에서 객체화를 해줬습니다.

그런데 이거를 어떻게 한다구요? 익명 객체(내부클래스)를 사용해서 바로 사용한다구요

Computer 클래스는 멤버변수로 sound 를 가지고 있으니까, 당연히 Computer 클래스 내부에서는 사용할 수가 있습니다

 

이러한 익명객체를 왜 알아야 할까요?

그 이유는 람다식 때문 입니다.

람다식을 알아 봅시다

람다식

람다식은 성능이 좋습니다.

그래서 람다식을 사용하는 건데요

람다식은 interface 내에 메서드가 1개만 존재해야 사용할 수 있습니다. 이걸 바로 '함수적 인터페이스' 라고 해요

람다식을 사용하기 위해서 함수적 인터페이스를 만들어 봅시다

그리고 이제, Say01 인터페이스를 Person 클래스에서 사용하기로 해봅시다.

자 이 greeting 메서드를 사용하려면 어떻게 해야 할까요?

Main 에서 보시죠

Say01을 선언해서 익명객체를 만들어 주고, greeting에 매개변수로 넣어주면 됩니다.

그리고 줄여서 쓰면 이렇게 됩니다.

이렇게, Say01 객체 sa를 대신해서 new Say01() { .... 를 해주면 됩니다.

이거를 람다식으로 표현해 본다면?

코드가 확 쭐어 버렸죠...?

어차피 interface 내에 메서드가 1개이기 때문에, 메서드 이름을 생략하고 이렇게 사용해 주면 됩니다.

 

람다식은 어렵기 때문에, 조금 더 확인을 해 봅시다

반환형 o , 매개변수 x

talking은 String을 반환하기 때문에, String으로 받아줄 수 있겠죠?

위의 코드를 main에서 사용해 봅시다

위 코드는 익명객체를 사용 , 아래 코드는 람다식 사용

반환형 o , 매개변수 o

위 코드도 main에서 사용해 봅시다

위 코드는 익명개체를 사용, 아래 코드는 람다식 사용

매개변수가 있을 경우에는, 매개변수의 데이터타입은 쓰지 않고, 변수명만 적어주면 됩니다.

 

그리고 람다식에 코드 수가 늘어나게 되면 어떻게 될까요?

반환형 o, 매개변수 o

위 코드는 익명객체 , 아래 코드는 람다식 사용

이렇게 사용할 수 있습니다.

 

람다식은 쓰기도 어렵고, 쓸 상황을 설계하기도 어려워서 실무에서도 보기가 어렵다고 합니다.

하지만, 람다식이 성능이 좋기 때문에 람다식을 사용할 수 있으면 좋겠죠?

 

반복자 스트림

여기서 나오는 스트림은 파일입출력 스트림과는 전혀 다른 스트림 입니다.

반복자 스트림은 컬렉션의 값을 조금 더 빠르고, 간결하게 사용할 수 있도록 제공해주는  구조물 입니다
반복자 스트림은 함수적인터페이스를 받고 있기 때문에 람다식을 지원 합니다

asList 를 사용하면 배열을 리스트로 변환 할 수 있는데요

이 List를 또 Stream 으로 변환 할 수 있습니다

Stream 을 사용해서 반복하는 구문을 만들 수 있습니다

바로 forEach 를 사용하면 됩니다.

익명 객체랑 똑같이 생겼죠? 그렇다는 얘기는? 람다식 으로 사용할 수 있다는 겁니다

 

이렇게 익명객체(내부클래스) 와 람다식, 반복자스트림 에 대해서 알아 보았습니다.

 

고생하셨습니다