Java/Java 문법

상속 관계와 생성자

열심히 해 2024. 12. 26. 17:00

 

자바에는 상속(Inheritance)이 존재합니다.

상속 관계에서는 상위 클래스와 하위 클래스가 있습니다. 하위 클래스는 상위 클래스를 상속하여 그 부모의 멤버-필드와 메서드-를 받아 사용할 수 있습니다.

 

 

예를 들어 아래와 같이 사용할 수 있습니다.

class SuperClass {
	int age;
	int height;
	String name;
	Sex sex;
    
    sc.eat("사랑스러운 소고기");
}

class SubClass extends SuperClass{
	public SubClass() {
	}
}
public class Main {
	public static void main(String[] args) throws InterruptedException {

		SubClass sc = new SubClass();
		sc.age = 20;
		sc.height = 180;
		sc.name = "John";
		sc.sex = Sex.MALE;
	}
}

 

 


 

서브 클래스 타입의 객체를 생성하면서 필드를 넣어줄 수는 없을까요 ??

 

class SuperClass {
    public SuperClass(int age, int height, String name, Sex sex) {
       this.age = age;
       this.height = height;
       this.name = name;
       this.sex = sex;
    }

    int age;
    int height;
    String name;
    Sex sex;

    void eat(String food) {
       System.out.println(food + "를 먹었다.");
    }
}

class SubClass extends SuperClass{
    public SubClass(int age, int height, String name, Sex sex) {
       super(age, height, name, sex);
    }
}

 

1. 상위 클래스에서 필요로 하는 `필드를 매개변수로 갖는 생성자`를 만들어줘야 합니다.

 

2. 하위 클래스에서 `super` 키워드를 사용합니다. 

 

** 이때 super 키워드가 생성자의 최상단에 위치하게 합니다. **

 

상위 클래스 객체가 먼저 생성된 후,  하위 클래스 객체가 생성되기 때문입니다.

 


 

근본적인 물음 : 상속은 왜 하는 건데 ?

 

SuperClass 를 Human 이라고 바꾸고, 그 아래 SubClass 를 두 개 두어서 남성과 여성을 나타내는 class를 만들었습니다. 이런 식으로 상속의 강력함을 확인하실 수 있습니다.

 

public class Main {
    public static void main(String[] args) throws InterruptedException {

       Male male = new Male(20, 180, "John");
       Female female = new Female(19, 165, "Anna");

       male.eat("어머니가 싫다고 하신 짜장면");
       System.out.println(male.sex);

       female.eat("탕수육");
       System.out.println(female.sex);
    }
}

class Human {
	public Human(int age, int height, String name) {
		this.age = age;
		this.height = height;
		this.name = name;

	}

    int age;
    int height;
    String name;

    void eat(String food) {
       System.out.println(food + "를 먹었다.");
    }
}

class Male extends SuperClass{
    Sex sex = Sex.MALE;
    public Male(int age, int height, String name) {
       super(age, height, name);
    }
}
class Female extends SuperClass{
    Sex sex = Sex.FEMALE;
    public Female(int age, int height, String name) {
       super(age, height, name);
    }
}


남성과 여성의 공통된 특징은 Human 클래스의 멤버로 두고, 차이점을 각각의 클래스의 멤버로 둔다면 확장성 및 유지보수성 모두 챙길 수 있습니다.