문제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()가 자동삽입될 것이다.
하지만 동물 클라스는 기본생성자가 없기 때문에 오류가 발생한다.
그러므로 이와 같이 사람 생성자 첫 줄에 매개변수를 입력받는 부모의 생성자를 명시적으로 호출해야 한다. */
}
}
정답)
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("사람이 초기화 됩니다.");
}
}