[자바]상속-부모/자식 오버라이드 상황에서 문제점

been·2021년 2월 6일
0

개인공부

목록 보기
8/11
class Scratch {
	public static void main(string[] args){
		Bar b= new Bar();
        System.out.println(b);
    }
}
class Foo{//부모 클래스
    public Foo(){
        System.out.println("?");
        doSomething();
    }
    public void doSomething(){
        System.out.println("do something acceptable");
    }
}

class Bar extends Foo{ //자식 클래스(상속받음) 
	//부모 메소드 override구현에서 Zoom객체에 자식객체넣어서 생성(자식 클래스생성 -> 부모클래스 구현)
    public void doSomething(){ 
        System.out.println("yolo");
        Zoom zoom = new Zoom(this);// 초기화 완료가 보장되지 않은 상태에서 this를 통해 참조값을 넘기는 것은 위험한 방법
    }
}

class Zoom {
    public Zoom(Bar bar){
        System.out.println(bar);
    }
}

위 코드를 실행하면 다음과 같은 순서로 일이 진행됩니다.

1) main 메서드 진입
2) Bar 객체 생성 스타트
3) 객체를 생성하기 위해 생성자 탐색 -> 생성자 없음
4) 부모 클래스의 생성자 탐색 (Bar에 생성자가 있던 없던 이 과정은 무조건 진행됨) -> Foo 에서 생성자 발견
5) Foo의 생성자 메서드 진행. "?"를 출력하고 doSomething 메서드로 전진
6) doSomething 메서드를 실행 -> 그런데 자식 클래스 (Bar)에서 이를 오버라이드 하고 있으므로, "do something acceptable"이 아닌 "yolo"가 있는 doSomething 메서드로 진입
7) "yolo"를 출력하고 zoom 객체를 생성.
8) 그런데 zoom 객체는 생성자로 Bar를 받으며 이것의 주소값을 출력하고 있음.
9) Bar 객체가 생성 완료되고, main 메서드에서 (5번 라인) 해당 객체의 주소값 출력. 8과 같음

문제점 :

  • 동시성 차원에서보면 8과 9 사이에 간극이 있다 뿐만 아니라, 만약 Bar 클래스가 doSomething 메서드 이전에 초기화가 완료되지 않는다면 (ex. Db, 의존성 등), Zoom에서 어떤식으로 사용할지 보장이 안되기 때문에 위험합니다. 그리고, 추후 Bar에 기능 추가나 유지보수를 할때도 Bar뿐 아니라 Zoom도 신경쓰면서 개발을 해야할수도 있습니다.
  • 초기화 완료가 보장되지 않은 상태에서 this를 통해 참조값을 넘기는 것은 위험한 방법이다

초기화 완료가 보장되지 않은 상태에서 this를 통해 참조값을 넘기는 것 지양할 것

0개의 댓글