익명 클래스

  • 이름 없는 일회용 클래스
  • 클래스 정의와 생성을 동시에 

 

익명클래스는 본인의 클래스 이름이 없으므로, 상속받을 부모클래스 또는 인터페이스에 대해서는 어딘가에 명시 필요

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는 해당 클래스 가리킨다

새로운 클래스를 만드는게 아니고 그냥 메서드 만다는 람다는, 메서드 즉 람다가 있는 클래스를 가르킨다

 

 

 

 

 

 

 

우선,

@Controller와 @RestController 둘 다 spring에서 controller를 지정하기 위한 어노테이션이다

 

 

@Controller

Spring MVC의 Controller

View 반환

 

<과정>

1) Client에서 보낸 요청은 DispatcherServlet을 거쳐 HandleMapping을 통해 Controller 찾고 요청 수행

2) Controller는 받은 요청을 처리하고 난 뒤 ViewName 반환

3) DispatcherServlet은 ViewReslver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반

 

<but Date 반환하고 싶을때>

ResponseEnity의 Body를 사용해야하는데, 이 때 @Controller와 함께 @ResponseBody 어노테이션 사용하면

JSON 형태의 데이터 반환 가능

ResponseEnity로 감싸서 객체 반

 

 

@RestController

RESTful웹 서비스의 Controller

간단하게 말하자면 @Controller + @RequestBody 합쳐진 어노테이션

JSON 형태의 객체 데이터 반환

ResponseEntity로 감싸서 반환

 

 

+ Recent posts