Java 상속(Inheritance)

jooog·2021년 9월 26일
0

상속(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개의 댓글