14장에서 람다식에 대해 공부하다보면 "사실 람다식은 익명 클래스의 객체와 동등하다"(p.797) 는 설명이 나옵니다.
저는 람다식을 처음 공부하는 중이라 안 그래도 새로운 개념이 생소했습니다. 메서드와 비슷한 무언가라고 감을 잡아가고 있었는데, 그게 아니라 익명 객체와 동일하다니!
얼른 지나간 개념인 익명 클래스와 객체에 대해 다시 찾아보았지만 두 페이지 채 되지 않는 분량이라 정석만으로는 이해하기 어려웠습니다.
익명 클래스를 이해하지 못 했는데, 람다와 익명 객체가 동등한 이유가 이해될리 없었구요.
자바에서 람다식을 새로 접한 다른 팀원분들도 저와 같은 문제를 겪으셨을 수 있을 것 같았습니다.
그래서 익명 클래스의 개념에 대한 책의 내용을 좀 더 풀어서 공유합니당.
익명 클래스
익명 클래스에 대한 내용이 책으로는 간략하게 나와있지만 남궁성 저자님의 강의에서는 더 자세하게 다루고 있었습니다. 한 번 보시는거 추천드려요. (그냥 책 보시고 아래 설명 보시면 대충 이해될 수도 있음)
문법
//(소괄호) 뒤에 세미콜론 대신 {중괄호}가 따라오는 생김새임.
new 조상클래스이름() {
// 멤버 선언
}
또는
new 구현인터페이스이름() {
// 멤버선언
}
//코드 출처 : 자바의 정석(남궁성)
익명 클래스는 클래스의 선언과 동시에 객체의 생성을 동시에 하는 클래스입니다.
선언과 생성이 동시에 이루어지기 때문에 익명 객체를 단 한 번만 만들 수 있습니다.
클래스를 만들어 놓고 객체를 여러 번 생성할 수 있는 기존 방식과 다릅니다.
예시로 이해하기
//두 예시는 똑같이 기능하는 코드입니다.
class InnerEx1{
public static void main(String[] args) {
Button b = new Button("Start”);
b.addActionListener(new EventHandler());
}
}
class EventHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.printin("ActionEvent occurred!!!”);
}
}
class InnerEx2 {
public static void main(String[] args) {
Button b = new Button("Start");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.printin(”ActionEvent occurred!!!");
}
}
);
}
}
//코드 출처 : 자바의 정석(남궁성)
두 예시에서 addActionListener() 함수는 매개변수로 "ActionListener를 상속 받아 actionPerformed()함수를 구현한 클래스"를 받고 있습니다.
예시 1에서는 우리가 지금껏 해왔 듯이 클래스를 따로 만들어줬습니다.
그런데 예시 2에서는 추가적으로 일반 클래스를 선언하지 않고, 익명 클래스를 만들어 해결하고 있습니다.
예시 1의 코드를 어떻게 예시 2처럼 바꿀 수 있을지 고민해보면 익명 클래스에 좀 더 익숙해질 수 있습니다.
EventHandler 클래스를 만들지는 않았지만 클래스 안에 있던 구현을 {중괄호}안에 그대로 넣은 모습입니다.
new 뒤에는 조상 클래스의 이름을 넣어주었구요. 참고로 문법적으로 조상클래스의 이름을 넣을 뿐, new로 생성되는 객체가 조상 클래스인 것은 아닙니다.
이렇게 하면 한 번만 쓰고 버릴 임시 객체를 따로 클래스를 만들 필요 없이 바로 정의 할 수 있습니다. 만들어진 객체는 물론 매개변수로 넣어줄 수도 있고요.
객체를 한 번만 만들 거라면 클래스를 따로 만드는 1번 예시보다 2번 예시가 훨씬 깔끔하게 보입니다.
개인적으론 p.797에서 함수형 인터페이스를 설명할 때부터 익명 클래스 개념이 잡히지 않으니 어려움을 겪었습니다.
익명 클래스를 어느 정도 이해하고 해당 부분을 다시 보니 훨 나았어요!
익명 클래스, 익명 객체 이해하기
14장에서 람다식에 대해 공부하다보면 "사실 람다식은 익명 클래스의 객체와 동등하다"(p.797) 는 설명이 나옵니다.
저는 람다식을 처음 공부하는 중이라 안 그래도 새로운 개념이 생소했습니다. 메서드와 비슷한 무언가라고 감을 잡아가고 있었는데, 그게 아니라 익명 객체와 동일하다니!
얼른 지나간 개념인 익명 클래스와 객체에 대해 다시 찾아보았지만 두 페이지 채 되지 않는 분량이라 정석만으로는 이해하기 어려웠습니다.
익명 클래스를 이해하지 못 했는데, 람다와 익명 객체가 동등한 이유가 이해될리 없었구요.
자바에서 람다식을 새로 접한 다른 팀원분들도 저와 같은 문제를 겪으셨을 수 있을 것 같았습니다.
그래서 익명 클래스의 개념에 대한 책의 내용을 좀 더 풀어서 공유합니당.
익명 클래스
익명 클래스에 대한 내용이 책으로는 간략하게 나와있지만 남궁성 저자님의 강의에서는 더 자세하게 다루고 있었습니다. 한 번 보시는거 추천드려요. (그냥 책 보시고 아래 설명 보시면 대충 이해될 수도 있음)
문법
익명 클래스는 클래스의 선언과 동시에 객체의 생성을 동시에 하는 클래스입니다.
선언과 생성이 동시에 이루어지기 때문에 익명 객체를 단 한 번만 만들 수 있습니다.
클래스를 만들어 놓고 객체를 여러 번 생성할 수 있는 기존 방식과 다릅니다.
예시로 이해하기
두 예시에서 addActionListener() 함수는 매개변수로 "ActionListener를 상속 받아 actionPerformed()함수를 구현한 클래스"를 받고 있습니다.
예시 1에서는 우리가 지금껏 해왔 듯이 클래스를 따로 만들어줬습니다.
그런데 예시 2에서는 추가적으로 일반 클래스를 선언하지 않고, 익명 클래스를 만들어 해결하고 있습니다.
예시 1의 코드를 어떻게 예시 2처럼 바꿀 수 있을지 고민해보면 익명 클래스에 좀 더 익숙해질 수 있습니다.
EventHandler 클래스를 만들지는 않았지만 클래스 안에 있던 구현을 {중괄호}안에 그대로 넣은 모습입니다.
new 뒤에는 조상 클래스의 이름을 넣어주었구요. 참고로 문법적으로 조상클래스의 이름을 넣을 뿐, new로 생성되는 객체가 조상 클래스인 것은 아닙니다.
이렇게 하면 한 번만 쓰고 버릴 임시 객체를 따로 클래스를 만들 필요 없이 바로 정의 할 수 있습니다. 만들어진 객체는 물론 매개변수로 넣어줄 수도 있고요.
객체를 한 번만 만들 거라면 클래스를 따로 만드는 1번 예시보다 2번 예시가 훨씬 깔끔하게 보입니다.
개인적으론 p.797에서 함수형 인터페이스를 설명할 때부터 익명 클래스 개념이 잡히지 않으니 어려움을 겪었습니다.
익명 클래스를 어느 정도 이해하고 해당 부분을 다시 보니 훨 나았어요!