자격증/정보처리기사

[JAVA/자바] 프로그래밍 - 생성자, 오버라이딩

행복한라이언 2023. 10. 1. 21:53
728x90
반응형

참고

https://m.blog.naver.com/PostView.naver?blogId=heartflow89&logNo=220961980579&referrerCode=0&searchKeyword=%EC%83%9D%EC%84%B1%EC%9E%90 

 

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

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

blog.naver.com


핵심

1. Child의 show()메서드와 print()메서드가 Parent의 show()메서드, print()메서드를 오버라이딩

→ 부모의 print(), show()메서드를 쓰기위해서는 super.print(), super.show()라고 사용해야함.

→ print(), show()는 Child의 메서드를 의미함

→ super.print() 했을 때 출력값

부모 print() 메서드 실행! - 3번
자식 print() 메서드 실행! - 4번

→ System.out.println("부모 print() 메서드 실행! - 3번") 로 "부모 print() 메서드 실행! - 3번" 출력

→ print()는 Child의 print()메서드를 의미 : "자식 print() 메서드 실행! - 4번 출력"

 

2. 부모클래스의 생성자가 매개변수가 없다면 자식 인스턴스 생성했을 때 부모클래스의 생성자는 자동호출!

→ 매개변수 있는 부모클래스의 생성자는 자동호출되지 않음.

→ new Child("End") 출력값

부모 생성자 호출! - 0번
매개변수 있는 자식 생성자 호출 : End- 0번

→ 부모클래스에 생성자가 2개 있는 경우 : 매개변수 없는 생성자 + 매개변수 있는 생성자

     → new 부모클래스() or 자식 생성자 안의 super() ▷ 매개변수 없는 생상자 호출

     → new 부모클래스("매개변수") or 자식 생성자 안의  super("매개변수") 매개변수 있는 생상자 호출

     → new 자식클래스() ▷ 매개변수 없는 생성자 호출

 

3. 부모클래스의 생성자가 매개변수가 있는 생성자 존재할 경우

→ 매개변수 있는 부모클래스의 생성자는 자동호출되지 않음. 컴파일 에러 발생! 

→ 2번의 경우는 매개변수가 없는 생성자가 존재했기 때문에 에러 발생 안함.

→ 이 경우 자식 생성자 안에 super("매개 변수 있는 부모 생성자") 넣어야함.

 

class Child extends Parent{
	Child(){
    	super("매개변수 있는 부모생성자"); // 자식 생성자 안의 매개변수가 존재하는 부모생성자 
		System.out.println("자식 생성자 호출! - 1번");
	}
	Child(String msg){
		System.out.println("매개변수 있는 자식 생성자 호출 : " + msg + "- 0번");
	}
	public void show(){
		System.out.println("자식 show() 메서드 실행! - 2번");
		super.print();
	}
	public void print(){
		System.out.println("자식 print() 메서드 실행! - 4번");
	}
}

예제코드

class Parent{
	Parent(){
		System.out.println("부모 생성자 호출! - 0번");
	}
	Parent(String msg){
		System.out.println("매개변수 있는 부모 생성자 호출 : " + msg + "- 0번");
	}
	public void show(){
		System.out.println("부모 show() 메서드 실행!");
	}
	public void print(){
		System.out.println("부모 print() 메서드 실행! - 3번");
		print();
	}
}

class Child extends Parent{
	Child(){
		System.out.println("자식 생성자 호출! - 1번");
	}
	Child(String msg){
		System.out.println("매개변수 있는 자식 생성자 호출 : " + msg + "- 0번");
	}
	public void show(){
		System.out.println("자식 show() 메서드 실행! - 2번");
		super.print();
	}
	public void print(){
		System.out.println("자식 print() 메서드 실행! - 4번");
	}
}

public class Main{
	public static void main(String[] args){
	new Parent("Start");
	System.out.println("-------------- 1");
	Parent pa = new Child();
	pa.show();
	System.out.println("-------------- 2");
	new Child("End");
	}
}

//출력
매개변수 있는 부모 생성자 호출 : Start- 0번
-------------- 1
부모 생성자 호출! - 0번
자식 생성자 호출! - 1번
자식 show() 메서드 실행! - 2번
부모 print() 메서드 실행! - 3번
자식 print() 메서드 실행! - 4번
-------------- 2
부모 생성자 호출! - 0번
매개변수 있는 자식 생성자 호출 : End- 0번
728x90
반응형