Java 상속(Inheritance)

jooog·2021년 9월 26일

상속(inheritance) 이란?

객체지향 프로그래밍을 하는 자바에서는 하위 클래스에서 부모(상위)클래스의 멤버를 물려받는 것을 의미한다

즉, 자식(하위클래스)이 부모(상위클래스)의 변수와 메소드를 선택해서 가져오는 것이며 생성자를 상속하는 것은 아니다


public class Name {
	int a;
    void run() {}

}


public class Student extends Name {

	String name;
    void method(){}

}

위의 코드에서 보는 것처럼 extends 키워드를 사용해서 Name 클래스를 상속받는다

상속을 하면 어떤 점이 좋을까?

먼저, 상속을 하면 부모 클래스의 필드와 메소드를 그대로 가져와 사용할 수 있기 때문에 새로은 코드를 작성할 필요가 없으며 유지 보수 또한 편리하다

그렇다면 모든 부모 클래스를 상속받을 수 있을까?

public class Date extends Student, Timetable {

}

먼저 자바는 다중 상속을 허용하지 않기 때문에 위의 코드처럼 Student와 Timetable이라는 복수의 클래스를 상속받을 수는 없다

반드시 하나의 부모 클래스만 상속받을 수 있으며 상속 받을 수 있는 부모 클래스에는 제한이 있다

private으로 설정된 필드와 메소드는 상속할 수 없으며 default 필드와 메소드도 다른 패키지에서는 상속할 수 없다

public class Tab {
	
	String model;
	String name;
	
	
	void runOn() {
		System.out.println("start");
	}
	
	void voiceOn() {
		System.out.println("start voice");
	}
	
	void sendMessage() {
		System.out.println("start message");
	}

}

부모클래스인 Tab을 만들고 하위 클래스인 SmartTab 에서 상속을 받아보자

public class SmartTab extends Tab {
	
	int year;
	
	//생성자 추가
	SmartTab(String model, String name, int year) {
		this.model = model;
		this.name = name;
		this.year = year;
		
	}
	
	void turnOnSmartTab() {
		System.out.println("start smart tab");
	}
	
	void turnOffSmartTab() {
		System.out.println("off smart tab");
	}
}

SmartTab 클래스는 extends 키워드로 부모 클래스인 Tab의 필드와 메소드를 그대로 상속받는다

상속과는 별개로 void turnOnSmartTab() 과 void turnOffSmartTab() 메소드도 추가했다

public class TabExample {

	public static void main(String[] args) {

		SmartTab myTab = new SmartTab("sam", "sam-tap", 2010);
		
		System.out.println(myTab.model);
		myTab.voiceOn();
		myTab.sendMessage();
	}

}

SmartTab 객체를 생성해서 Tab의 필드와 메소드를 그대로 호출할 수 있다

여기서 참조변수인 myTab은 자식객체인 SmartTab을 참조한다

부모 생성자 호출 super

public class People {
	
	public String name;
	public String job;
	
	public People(String name, String job) {
		this.name = name;
		this.job = job;
	}
}

위의 people 클래스는 기본생성자가 아닌 매개변수를 받는 생성자가 있다

public class Child extends People {
	
	
}

Child라는 하위 클래스를 생성하고 People 클래스를 상속받으면 이클립스에 다음과 같은 에러 메시지가 뜬다

Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor

이 에러메시지의 뜻은 부모클래스에 기본 생성자가 없다는 뜻이다

public class Child extends People {
	
	public Child() {
	   super("sally", "doctor");
	}
}

위의 코드처럼 부모 클래스 생성자의 매개변수를 확인해서 super 생성자를 따로 만들어 호출해야 한다

public class Child extends People {
	
	public int age;
	
	public Child(String name, String job, int age) {
		super("name", "job");
		this.age = age;
	}
}

super 생성자는 맨 첫줄에 와야한다

public class ChildExample {

	public static void main(String[] args) {
		
		Child c = new Child("Sally", "doctor", 10);
		System.out.println(c.name);
		System.out.println(c.job);
		System.out.println(c.age);

	}

}

실행을 하면 부모 클래스의 생성자가 먼저 실행되는 것을 확인할 수 있다

0개의 댓글