[Java] super() 메서드

dwkim·2023년 2월 26일
  • 모든 생성자의 첫 줄에는 반드시 this() 또는 super()가 있어야 한다.
  • 만약 아무것도 써주지 않으면 컴파일러가 super()를 자동으로 삽입한다. (=생성자를 호출할 때 항상 부모 클래스의 생성자가 한 번은 호출된다는 것)


문제1
정답1)

package org.example;

class Main {
    public static void main(String[] args) {
        new 사람();
    }
}

class 동물 {
    동물(String 이름) {
        System.out.println("동물(String 이름) 실행됨!");
        System.out.println("이름 : " + 이름);
    }
    동물(String 이름, int 나이) {
        System.out.println("동물(String 이름, int 나이) 실행됨!");
        System.out.println("이름 : " + 이름);
        System.out.println("나이 : " + 나이);
    }
}

class 사람 extends 동물 {
    // 이 안에 들어있는 모든 메서드의 수?
    // - Object 클래스의 생성자 : 1개
    // - 동물 클래스의 생성자 : 2개
    // - 사람 클래스의 생성자 : 2개
    사람() {
        this(23);
    }

    사람(int 나이) {
        super("홍길동", 나이);
    }
}

정답2)

class Main {
  public static void main(String[] args) {
    new 사람();
  }
}

class 동물 {
  동물(String 이름) {
    System.out.println("동물(String 이름) 실행됨!");
    System.out.println("이름 : " + 이름);
  }
  동물(String 이름, int 나이) {
    System.out.println("동물(String 이름, int 나이) 실행됨!");
    System.out.println("이름 : " + 이름);
    System.out.println("나이 : " + 나이);
  }
}

class 사람 extends 동물 {
  사람() {
    super("홍길동", 22); 
    /* 만약 이것을 쓰지 않으면 super()가 자동삽입될 것이다. 
    하지만 동물 클라스는 기본생성자가 없기 때문에 오류가 발생한다. 
    그러므로 이와 같이 사람 생성자 첫 줄에 매개변수를 입력받는 부모의 생성자를 명시적으로 호출해야 한다. */
  }  
}

문제2

  • 동물 클래스의 기본 생성자에 init() 메서드가 들어가야 한다는 것까지는 알았지만, 동물 클래스에 init() 메서드를 정의해서 오버라이딩되도록 만들 생각은 못함

정답)

class Main {
	public static void main(String[] args) {
		new 사람();
		// 출력 : 사람이 초기화 됩니다.
	}
}

class 동물 {

	// 이 생성자는 사람 클래스로 복사됨 (상속)
	동물() {
		//super(); - 부모 클래스의 생성자 실행, 생략가능
		
		init();
        /* 이 코드가 사람 클래스에서 실행되면 
        사람 클래스에는 이미 init();이 있기 때문에, 
        `동물`의 `init()` 이 아닌 `사람`의 `init()` 을 호출한다 
        (오버라이딩) */
	}
	
    // 이 메서드는 사람 클래스로 복사됨 (상속)
	void init() { }    
}

class 사람 extends 동물 {

	// 아래 생성자는 자동으로 만들어 집니다.
	/*
	사람() {
		super(); // 이 코드는 부모 클래스의 생성자 `동물()`을 실행, 생략가능
	}
	*/
	
	void init() {
		System.out.println("사람이 초기화 됩니다.");
	}
}
profile
예비 백엔드 개발자

0개의 댓글