본문 바로가기

정리 카테고리/토비s Spring Vol.1

[동영상 시청/메모]토비의 봄 TV 1회 - 재사용성과 다이나믹 디스패치, 더블 디스패치_2

Toby Lee - 토비의 봄 TV 1회 - 재사용성과 다이나믹 디스패치, 더블 디스패치

22:43~42:00

https://youtu.be/s-tXAHub6vg?t=42m



-Method Dispatch 

    원하는 Method를 정하고 호출하여 실행하는 과정/작업

    -Static과 Dynamic 으로 있다.


-컴파일이 되는시점에서 어느메소드가 호출될지 알수 있는 상태(Static Dispatch)


*예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static class CallService{            //static은 class파일을 따로 작성할때는 필요없고 
    void talkToMe(){                 //다른 클래스안에서 독립적인 클래스 작성이
        System.out.println("Hi.");   //복사붙여넣기용 이여서 이렇게 예제를 만듬.
    }                                //즉 이 예제는 메인이될 클래스 안에 모두 넣음.
    void talkToMe(int tNumber){
        System.out.println("Hi"+tNumber+".");
    }
    void talkToMe(String msg){
        System.out.println("Hi"+msg+".");
    }
 
}
 
public static void main(String[] args){
    new CallService().talkToMe();
    new CallService().talkToMe(7);
    new CallService().talkToMe("World");
}
cs

코드작성-https://colorscripter.com




*예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
static abstract class CallService{//추상 클래스
    abstract void talkToMe();
}
 
static class MyService extends CallService{//상속
    @Override //서브 크래스에서 다시 정의시 붙이도록 권장함
    void talkToMe(){
        System.out.println("Hi");
    }
}
 
static class MyService2 extends CallService{//상속2
    @Override//서브 크래스에서 다시 정의시 붙이도록 권장함
    void talkToMe(){
        System.out.println("Hi2");
    }
}
 
public static void main(String[] args){
    MyService svc1 = new MyService();
    svc1.run();
    MyService2 svc2 = new MyService2();
    svc2.run();
 
    CallService svc = new  MyService();
    svc.run();//컴파일되었어도 어느것을 실행되어야 되는지 알수 없는 
              //현재 이 시점의 run()은 MyService들중 어느것을
              //실행해야 되는 상황인지 정해져 있지 않은 상황
              //CallService의 추상클래스의 메소드를 가져오는 것처럼 되어있다.
}
 
cs

코드작성-https://colorscripter.com



-우리가 쓰는 this에 해당하는 오브젝트가 recevier parameter에 들어가 있다.

*예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static abstract class CallService{//추상 클래스
    abstract void talkToMe();
}
 
static class MyService extends CallService{//상속
    @Override //서브 크래스에서 다시 정의시 붙이도록 권장함
    void talkToMe(){
        System.out.println("Hi");
    }
}
 
static class MyService2 extends CallService{//상속2
    @Override//서브 크래스에서 다시 정의시 붙이도록 권장함
    void talkToMe(){
        System.out.println("Hi2");
    }
}
 
public static void main(String[] args){
    List<CallService> svc = Array.asList(new MyService(), new MyService2());
    //어느 Class의 오브젝트가 들어갈지 한눈에 안보이게 된다.
    svc.forEach(s->s.run());
    //동적으로 잡아 런타임이 정한다.
}
 
cs






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static abstract class CallService{//추상 클래스
    abstract void talkToMe();
}
 
static class MyService extends CallService{//상속
    @Override //서브 크래스에서 다시 정의시 붙이도록 권장함
    void talkToMe(){
        System.out.println("Hi");
    }
}
 
static class MyService2 extends CallService{//상속2
    @Override//서브 크래스에서 다시 정의시 붙이도록 권장함
    void talkToMe(){
        System.out.println("Hi2");
    }
}
 
public static void main(String[] args){
    List<CallService> svc = Array.asList(new MyService(), new MyService2());
    //어느 Class의 오브젝트가 들어갈지 한눈에 안보이게 된다.
    svc.forEach(CallService::run);//메소드 레퍼런스
    //타입이 일치하면 가져다 쓸수 이
}
 
cs

코드작성-https://colorscripter.com






-Method Signature

-오버라이딩시 중요함 (name, parameter Types   -  이두가지가 같아야 오버라이딩 할 수 있다.)

-이두가지가 같은 메소드는 두개 이상 정의 할 수 없다. (한 클래스 안에)

-리턴타입을 넣는 사람도 있는데 이것은 아니다.

-위 이야기는 제너릭 이야기는 뺀상태의 이야기

-Method Type 

-람다를 할때 이야기 할때

-(return type, method type parameter,method argument type, exception) => Method Reference

-관련 도서 링크  Java 8 in Action