jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

공대 2호관  전산실 5번 문제: 다형성과 공변성, 메서드 오버라이딩
[NHN Academy]

공대 2호관 전산실 5번 문제: 다형성과 공변성, 메서드 오버라이딩

2022. 9. 2. 08:54

https://kizoo.gitlab.io/docs/archive/java/005/

 

5

class F { X m() { System.out.println("F"); return new X(); } } class G extends F { Y m() { System.out.println("G"); return new Y(); } public static void test() { F f = new G(); f.m(); } } G.test(); G G가 찍히도록 X와 Y를 정의하세요. 이와 같

kizoo.gitlab.io

class F {
    X m() { System.out.println("F"); return new X(); }
}

class G extends F {
    Y m() { System.out.println("G"); return new Y(); }

    public static void test() {
        F f = new G();
        f.m();
    }
}

G.test();
  • 부모의 서브 타입으로 메서드 오버라이딩한 경우 부모 타입의 메서드가 호출된다.
  • 리턴 타입의 공변성. 
  • G는 F가 될수 있다. 밑에서 g를 넘겨주면 g, f 다 될 수 있다. 

class F {
    F m() { System.out.println("F"); return new F(); }
}

class G extends F {
    G m() { System.out.println("G"); return new G(); }

    public static void test() {
        F f = new G();
        f.m();
    }
}

G.test();

클래스 F -> "F"를 출력하고 F 타입 객체를 생성해서 리턴해주는 F 타입 메서드를 생성 

클래스 G -> "G"를 출력하고 G 타입 객체를 생성해서 리턴해주는 G 타입 메서드를 생성 

 

F f = new G();

 

객체 f의 타입은 F지만, 담고 있는 내용은 G

G는 F 타입 참조 변수로 G 타입 인스턴스를 참조. 

G.test(); 하면 "G"가 출력됨


class F {
	F m() {System.out.println("F"); return new F(); }

    void method(){
    	System.aut.printin("실행됨");
    }

class G extends F{
	G m(){System.out.println("G"); return new G(); }
    void method(){
        System.aut.printin("실행됨");
     }
   }

	public static void test(){
	F f = new G() ;
	f.m();
    
	f.method();
    System.out.printin("f.getClass().getSimpleName()=" +f.getClass().getSimpleName());
    System.out.printin("f.getClass().getSimpleName()=" +f.getClass().getSimpleName());
    }
   }

class Main {
	public static void main(String[] args) {
		G. test();
       }
  }

이렇게 만든 경우,

F f = new G() ;
G g = f.m();

f.m을 G타입 변수에 담을 수 없다.  

-> 메서드 m의 반환으로 G타입 객체를 받는다는 건 잊어버려라. 컴파일 되는 시점에서 컴퓨터는 그걸 알지 못한다. 

f.m은 F 타입이기에 서브 타입인 G 타입 변수에 담을 수 없다. 

 

또한 메서드를 테스트 해보면,

 

class F {
	F m() {System.out.println("F"); return new F(); }
}

class G extends F{
	G m(){System.out.println("G"); return new G(); }
    void method(){
        System.aut.printin("실행됨");
     }
   }

이렇게 만든 후에 

F f = new G() ;
f.m();

이런 경우엔 오류가 난다. 

m 메서드가 슈퍼 클래스엔 없고, 서브 클래스에만 있는 상태인데, 슈퍼 클래스 참조 변수가 서브 클래스의 인스턴스를 가질 때 해당 참조 변수가 사용할 수 있는 메서드는 슈퍼 타입의 멤버만 사용할 수 있다. 


  • 클래스 계층에 존재하는 혼란스러운 유형 캐스트를 방지함. 가능하면 유형 캐스트가 적은게 좋다. 
  • 메스드를 재정의할 때 더 구체적인 반환 유형을 가질 수 있다. 
  • 반환 시 런타임 ClassCastException 방지한다. 

 

https://www.geeksforgeeks.org/covariant-return-types-java/

 

Covariant Return Types in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

    '[NHN Academy]' 카테고리의 다른 글
    • 스레드: 스레드 풀
    • 배열
    • 공대 2호관 전산실
    • 값 전달과 참조 전달

    티스토리툴바