본문 바로가기
Programming 기초/Java

[Java] super와 생성자

by 뭉제 2023. 4. 20.
목차
1. super
2. 자식클래스의 생성자

 

super 키워드


인스턴스를 가리키는 this 키워드와 비슷하게 부모 클래스를 가리키는 super라는 키워드도 있다.

 

super

· 부모 클래스에 대한 레퍼런스

· 자식 클래스에서만 사용 -> 부모 클래스의 멤버 호출

 

=> 자식 클래스에서 super를 이용해 접근 권한이 부여된 부모 클래스의 변수와 메소드에 접근 가능

 

class Cal{
	public int sum(int n, int m) {
		return n+m;
	}
	//overloading
	public int sum(int n, int m, int o) {
		return this.sum(n, m)+o;
	}
}

class Cal3 extends Cal{
	//overriding
	public int sum(int n, int m) {
		System.out.println("Cal3!!");
		return super.sum(n, m);
	}

	public int sub(int n, int m) {
		return n-m;
	}
}

· Cal3에서 Cal의 변수와 메소드에 접근하기 위해서 super 이용

-> 오버라이딩하는 메소드에서 기존의 작업 앞 뒤로 손쉽게 추가적인 작업을 더 넣을 수 있다.

 

 

자식 클래스의 생성자


부모 클래스에 생성자가 있는 경우에 자식 클래스의 생성자는 무엇을 호출할까?

 

자식 클래스에서 부모 클래스 생성자 선택

· 원칙: 자식 클래스 생성자에서 부모 클래스 생성자를 명시적으로 선택

 

1. 명시적으로 부모 클래스 생성자 선택X

· 자식 클래스 생성자에 상관없이 컴파일러가 자동으로 부모 클래스의 기본 생성자 호출

 

2. 명시적으로 부모 클래스 생성자 선택

· 자식 클래스 생성자에서 super()를 이용

 

 

상속관계에 있는 클래스에 인자를 받는 생성자를 사용하는 경우 주의가 필요하다.

 

class Cal {
	int n, m;
	
	Cal(int n, int m){
		this.n=n;
		this.m=m;
	}
	...
}

※ 부모 클래스에 인자를 받는 생성자만 있는 경우

· 자식 클래스에서 생성자를 호출하는 경우(인스턴스 생성) 정의한 생성자가 없으면 부모 클래스의 기본 생성자를 호출

· 부모 클래스에 명시적으로 인자를 받는 생성자만 있는 경우

-> 자식 클래스에서 생성자를 명시적으로 만들지 않으면 컴파일 불가

 

=> 부모 클래스에 인자를 받는 생성자만 있는 경우, 자식 클래스에도 인자를 받는 생성자가 필요하다.

 

 

class Cal{
	int n, m;
	
	Cal(int n, int m){
		this.n=n;
		this.m=m;
		System.out.println("Ca1!!");
	}
	
	public int sum() {
		return this.n+this.m;
	}
}

class Cal3 extends Cal{
	Cal3(int n, int m) {
		super(n, m);
		System.out.println("Cal3!!");
	}

	public int sub() {
		return this.n-this.m;
	}
}

public class InheritanceApp {
	public static void main(String[] args) {
		Cal3 c3=new Cal3(2, 1);
	}
}

실행결과

 

자식 클래스의 생성자 호출 및 실행

· 자식 클래스의 객체가 생성될 때 부모 클래스 생성자와 자식 클래스 생성자 모두 실행

· 호출 순서: 자식 클래스 생성자 -> 부모 클래스 생성자

· 실행 순서: 부모 클래스 생성자 -> 자식 클래스 생성자 

 

생성자 호출 및 실행 순서

· 컴파일러는 new 문장이 실행되면 Cal3의 생성자를 호출

· Cal3의 생성자는 자신의 코드를 실행하기 전, 먼저 부모 클래스인 Cal의 생성자를 호출

· Cal의 생성자 코드가 실행되고, 리턴하여 Cal3의 생성자 코드가 실행된 후 main 메소드로 돌아온다.

 

 

super()

· 부모 클래스의 생성자를 호출하는 코드

· 자식 클래스의 생성자에서 super()를 이용해 명시적으로 부모 클래스의 생성자를 선택

· super(parameter)

  - 인자를 이용해 부모 클래스의 생성자 호출

  - 반드시 생성자의 첫 라인에 입력

 

 

this, this(), super, super()

· this와 super는 레퍼런스

  - this: 현재 객체의 모든 멤버를 접근 가능

  - super: 현재 객체 내에 있는 부모 클래스 멤버를 접근 가능

 

· this()와 super()는 메소드 호출

  - this(): 생성자에서 다른 생성자를 호출할 때 사용

  - super(): 자식 클래스의 생성자에서 부모 클래스 생성자를 호출할 때 사용

 

 

 

'Programming 기초 > Java' 카테고리의 다른 글

[Java] 예외 클래스  (0) 2023.05.04
[Java] 예외  (0) 2023.04.23
[Java] overloading vs overriding  (0) 2023.04.17
[Java] 상속  (0) 2023.04.14
[Java] 생성자와 this  (0) 2023.04.11

댓글