익명 클래스
- 이름 없는 일회용 클래스
- 클래스 정의와 생성을 동시에
익명클래스는 본인의 클래스 이름이 없으므로, 상속받을 부모클래스 또는 인터페이스에 대해서는 어딘가에 명시 필요
new 연산자로 객체 생성과 동시에 { } 안에 클래스 내용을 정의합니다.
// 부모 클래스
class Animal{
public String cry(){
return "동물이 운다";
}
}
// 자식 클래스
class Dog extends Animal{
@Override
public String cry(){
return "개가 짖는다";
}
}
public class Main{
public void main(String[] args){
Animal a = new Dog();
a.cry();
}
}
1) 익명 클래스 생성
위의 코드를 익명클래스로 변경한다면
아래와 같이 객체를 생성하지 않고 부모 클래스의 이름을 적은 후 클래스 내용 작성
// 부모 클래스
class Animal{
public String cry(){
return "동물이 운다";
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Animal() {
@Override
public String cry() {
run(); // 새로 정의한 메소드로 내부에서만 사용 가능
System.out.println("개가 짖는다");
return "개가 짖는다";
}
public void run() {
//return "개가 달린다";
System.out.println("개가 달린다");
}
};
System.out.println(dog.cry());
dog.cry();
//dog.run(); // 오류 발생 ! - 외부에서 호출 불가능
}
}
2) 익명 클래스 사용 시 주의 사항
- 익명 클래스 방식으로 선언한다면 오버라이딩 한 메소드 사용만 가능
- 새로 정의한 메소드는 외부에서 사용이 불가하고 익명 클래스 내부에서만 사용 가능
- 예제에서 새로 정의한 메소드인 run은 외부에서 사용이 불가하며 내부에서만 동작
3) 그 외
해당 코드를 돌리면 아래의 결과가 나오는데 내 생각에서는
'개가 달린다 개가 짖는다 개가 달린다 개가 짖는다'가 나와야하지 않을까 생각을 한다.
이유는
run(); 개가 달린다 -> sysout 개가 짖는다
-> dog.cry(); 실행 cry 메소드 안에서 새로 정의한 run 메소드를 불러 개가 달린다 -> sysout 개가 짖는다
라고 생각하는데 dog.cry(); 실행 시 '개가 달린다'는 찍히지 않고 ' 개가 짖는다'만 찍힌다.
dog.cry(); 외부에서 실행하였지만 cry 내부에 있는 run은 실행되어야하는거 아닐까 ? 오류도 발생하지 않는다
<결과 값>
개가 달린다
개가 짖는다
개가 짖는다
람다
- 익명 메소드만 전달, 인터페이스를 구현한 익명 클래스의 인터페이스 생성 방법
- 익명 클래스를 람다로 변경하면 훨씬 간결
익명 클래스와 람다식 차이
1. 익명 클래스 : 새로운 클래스 생성 / 람다 : 새로운 메서드 생성
2.익명 클래스 this : 새로 생성된 클래스 / 람다 : 람다식 포함 클래스
익명 클래스는 새로운 클래스를 생성하기 때믄에 this는 해당 클래스 가리킨다
새로운 클래스를 만드는게 아니고 그냥 메서드 만다는 람다는, 메서드 즉 람다가 있는 클래스를 가르킨다
'SpringBoot > 공부' 카테고리의 다른 글
build.gradle dependencies 추가할 경우 주의 사항 (2) | 2023.12.06 |
---|---|
@Conditional 어노테이션이란 ? (2) | 2023.11.30 |
[스프링 부트] 의존성 확인하기 (0) | 2023.11.29 |
Spring Boot test 테스트시 Unable to find 오류 (0) | 2023.11.22 |
@Controller와 @RestController 차이 (2) | 2023.11.15 |