본문 바로가기

develop/Java

생성자 super

개어려븜

 

m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220961980579&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[JAVA/자바] 상속에서의 생성자

이전 포스팅에서 상속에 대해서 알아보았다. 상속은 부모 클래스의 메소드 및 필드를 물려받는다고 하였다....

blog.naver.com

이 분 블로그 참조하니 이해가 아주 잘됨

 

요약

1. 부모 클래스의 생성자는 상속되지 않고, 자식 클래스로 인스턴스를 생성할 때 자동적으로 부모의 기본 생성자가 호출된다.
2. 부모 생성자가 매개변수를 갖고 있다면 자식 클래스를 인스턴스화할 때 자동으로 호출되지 않는다.
3. 따라서 자식 생성자에서 명시적으로 부모 생성자를 호출해야 한다. 이때 사용되는 키워드가 super(); 이다. 단, super()를 사용할 때는 자식 생성자의 첫 줄에 위치하여야 한다.

 

위 링크에서 퍼왔어요 이 부분

========================================

 

 

 

 

주의 할 점!

생성자 this() 와 생성자 super()를 함께 사용 불가함

=> 두 코드 둘다 생성자 내의 첫줄에서 실행되어야 하기 때문

=> 그래서 this()를 사용하는 생성자에는 super()를 생성하지 않고 다른 생성자를 통해

간접적으로 생성자 super()이 호출되도록 해야함

 

* 그리고 항상 슈퍼클래스에서는 object라는 기본 생성자를 호출하는 코드가 생략되어 있음

(super()) 

 

class Parent{
	String name;
    
    //멤버변수 name을 전달받아 초기화하는 생성자 정의 파라미터 생성
    public Parent(String name){ 
    	super(); //Parent클래스의 부모인 Object의 기본생성자를 호출하는 코드(생략 가능)
        this.name = name;
    }

}

class Child extends Parent{
	//Child 클래스의 기본 생성자 정의
	public Child(){
    	super("홍길동");
        
        System.out.println("Child()생성자 호출됨!);
    }
	
    //이름을 전달받는 파라미터 생성자 정의
    public Child(String name){
    	//여기서 멤버변수를 초기화하면
        //슈퍼클래스의 파라미터 생성자와 초기화 코드가 중복된다.
        //따라서, 슈퍼클래스의 멤버변수를 초기화하는 생성자를 대신 호출해
        //데이터만 전달함으로써 슈퍼클래스 생성자에서 대신 초기회 = 중복제거
    	super("홍길동"); //슈퍼클래스의 파라미터 생성자를 통해 대신 초기화
        //또한, 슈퍼클래스의 생성자를 호출하게 되므로 오류 x
    }
    
    
}

출력하면 Child()생성자 호출됨 나옴
그 다음에 홍길동 <= 뒤에 자식클래스에서 멤버변수 초기화해서

2.

class Person{
	String name;
    int age;
    
    //1. 기본 생성자 정의
    public Person(){}
    
    //2. 파라미터 생성자 정의
    public Person(String name){
    	this(name,20);
    }
	
	public Person(String name, int age){
    	super();
        this.name=name;
        this.age=age;
    }

}

class Student extends Person{
	String id;
    
    //이름, 나이, 학번을 초기화하는 파라미터 생성자 호출해 초기화 대신 수행
    public Student(){
    	this("홍길동",20,"20111111");
        //생성자 super과 this를 한꺼번에 사용 불가하므로
        //생성자 super코드를 실행하지 않고 생성자 this()를 호출해
        //다른 생성자 내의 생성자 super()가 실행되도록 함
    }
    
    public Student(String name, int age, String id){
    	super(name,age);
        this.id=id;
        //슈퍼클래스의 Person 파라미터 생성자에서 이미 멤버변수 초기화 코드가 있으므로
        //서브클래스에서 직접 초기화할 경우 중복 발생
        //=> 슈퍼클래스의 멤버 id 만 서브클래스에서 초기화하고 
        //나머지는 생성자를 호출해 대신 초기화함
    }


}

 

 

 

 

 

'develop > Java' 카테고리의 다른 글