개발자 미니민의 개발스터디

[JAVA] 자바 - 상속과 생성자 (super, this)

by mini_min

[JAVA]
자바 - 상속과 생성자

✔️ 상속에서 생성자

자바에서 오브젝트 클래스를 제외한 모든 클래스의 생성자 필수!

- this(인수) 를 이용해 본인 클래스에 정의된 다른 생성자 or

- super(인수) 를 이용해 상위 클래스 생성자를 반드시 호출해야한다!

+ 생성자 호출할 때는 무조건 최상단에서 한 번만 가능

 

💡 다른 생성자나 상위클래스 생성자를 호출하지 않으면 컴파일러가 자동으로 'super();' 를 추가해서 인자 없는 상위클래스 생성자를 호출한다.

⭐⭐ 상위클래스에 인자가 '있는' 생성자만 있을 경우, 반드시 하위클래스에서 'super(인자있음)' 생성자를 호출해야한다.

 

 

 

✔️ 하위클래스의 객체 만들기

◾ 상위클래스와 하위클래스가 있다는 전제하에, main 클래스에서 하위클래스 객체를 생성한다.

public static void main(String[] args) {
	Test3 tt = new Test3();
	tt.disp();
	}
}

 

1) 상위클래스 필드 메모리 할당, 기본값으로 초기화, (초기화 블럭 실행)
2) 하위클래스 필드 메모리 할당, 기본값으로 초기화, (초기화 블럭 실행)

3) 상위클래스 생성자 몸체 실행
4) 하위클래스 생성자 몸체 실행

= 상위클래스부터 필드 메모리를 할당하고 생성자 몸체를 실행한다. 

 

 

 

class Demo3 { //상위
	int a = 10;
    
    public Demo3() {
    	System.out.println("Demo3 생성자-인자없음");
    }
    
    public void print() {
    	System.out.println(a);
    }
    
}


class Test3 extends Demo3 {
	int x = 100;
    
//하위클래스의 생성자이며, 자기 자신의 생성자 또는 상위클래스의 생성자를 꼭 호출해야한다.
    public Test3() {
    	super();
    	System.out.println("Test3 생성자");
    }
	
    public void disp() {
    	System.out.println(a + "," + x);
    
    }

}

 

객체 생성된 하위클래스의 생성자는 Test3() 이다.
생성자 메소드 안에는 super(); <- 상위클래스 생성자가 있다.
상위클래스 생성자 실행 결과 : "Demo3 생성자-인자없" 출력
다시 하위클래스 생성자 실행 : "Test3 생성자" 출력
💡 하위클래스의 생성자에서 상위클래스의 생성자를 꼭 호출해야한다.
생성자 없으면 디폴트 생성자 만들어주니까 주의!!

 

 

 

✔️ 상위클래스에 인자있는 생성자만 있을 때

상위클래스에 인자가 있는 생성자 1개만 존재하는 경우, 하위클래스는 생성자를 만들고 인자가 있는 상위클래스 생성자를 'super(인자)' 형태로 반드시 호출해야한다.

 

class Demo4 {
	int a;
	
	public Demo4(int a) {		//인자있는 생성자 1개뿐
		this.a = a;
		System.out.println("Demo4 생성자...");
	}
	
	public void print() {
		System.out.println(a);
	}

}

class Test4 extends Demo4{
	int x = 10;
    
    public Test4() {
		super(5); // 슈퍼클래스의 생성자를 명시적으로 호출
		
		System.out.println("Test4...");
	}
	
	public void disp() {
		System.out.println(a+","+x);
	}
}

 

💡 인자 있는 생성자 public Demo4(int a) 가 상위클래스에서 보일 때,
하위클래스의 생성자에 명시적으로 인자가 있는 슈퍼클래스의 생성자를 호출한다.

만약, public Test4() 생성자에 'super()' 를 호출하면 안된다. 상위클래스에 인자없는 생성자가 없기 때문에.

 

 

 

✔️ this 로 다른 생성자 호출

super 는 상위클래스 생성자 호출할 때 사용, 그럼 this는? this 는 같은 클래스 안에 있는 다른 생성자를 찾아서 호출한다. 그리고 그 생성자에 있는 super 나 this 를 통해 다른 생성자를 또 호출하거나, 상위클래스를 호출하겠지?

 

public static void main(String[] args) {
	
		Test5 tt = new Test5(100);
		
	}
}

class Demo5 {
	int x;
    public Demo5() {
    	x = 0;
        System.out.println("상위-인자없는 생성자");
    }
	
    pulbic Demo5(int x) {
    	this.x = x;
        System.out.println("상위-인자 하나 생성자");
    }

	public void print() {
    	System.out.println(x);
    }
}


class Test5 extends Demo5 {
	int a;
    
    public Test5() {
    	//생략으로 super(); 호출
        // 결과 : 인자없는 생성자
        a = 0;
        System.out.println("인자없는 생성자");
    }
    
    public Test5(int a){
    	this(a,10);
        //this(인수) 호출로 super(인수) 호출불가
        //this(인수) 가 가리키는 다른 생성자로 찾아간다.
        System.out.println("인자하나인 생성자");
    }
    
    public Test5(int a, int x){
		super(x);
		this.a=a;
		System.out.println("인자 둘인 생성자");
	}
    
    public void disp() {
		System.out.println(x + "," + a);
	}
    
}

 

💡 new Test5(100) 객체 생성시 발생과정
- 인자있는 Test5 하위클래스 생성자 실행
- this(인자) 만나고 Test5(int a, int x) 생성자 실행
- super(x) 만나고 인자있는 Demo5(int x) 생성자 실행
⭐ 출력 : 상위-인자 하나 생성자 !!!

⭐ 다시 돌아와 출력 : 인자 둘인 생성자!!!
⭐ 다시 돌아와 출력 : 인자하나인 생성자!!!

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기