백엔드/자바

클래스의 상속(inheritance)

ksge7 2020. 7. 28. 01:23

상속이란?

기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 말함.

 

더 간단히 말해 두 클래스는 부모와 자식 관계로 맺어주는 것을 말함.

 

상속은 캡슐화, 은닉화와 더불어 객체지향프로그래밍을 구성하는 중요 요소 중 하나.

 

그림으로 간단히 나타내면 다음과같다.

 

상속의 장점

클래스 상속은 다음과 같은 특징을 갖는다.

 

- 자식 클래스는 부모 클래스의 모든 멤버(클래스 내 메서드, 변수)를 상속받는다.

 

- 단, 초기화 블록과 생성자는 상속받지 않는다.

 

- 결과적으로 모든 자식 클래스는 부모 클래스보다 같거나 더 많은 멤버를 가진다.

 

- 자손을 아무리 변경해도 조상에 영향을 주지 않는다. 반대로 부모는 자식에게 영향을 준다.

 

- 하나의 부모는 여러 자식 클래스를 거느릴 수 있지만, 반대로 자식은 여러 부모 클래스를 거느릴 수 없다.

 

- 부모 클래스의 접근제어자가 private, default일 경우 자식 클래스는 상속은 가능하나 접근은 불가하다.

상속 구현해보기

상속을 구현하는 건 어렵지 않다.

 

자식 클래스의 클래스명 뒤에 "extends + 부모 클래스명"을 입력해주기만하면 된다.

 

부모 클래스의 코드

 

 

class Parents{
	
	String name;
	
	Parents(){}
	
}

 

 

자식 클래스의 코드

 

class Son extends Parents{
	
	int age;
	
	Son(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public String call_name() {
		return super.name;
	}
}

 

 

실행해보기

 

public class Test {
	public static void main(String[] args) {
		
		Son person1 = new Son("손흥민", 15);
		System.out.println(person1.name);
		System.out.println(person1.call_name());
		
	}
}

 

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있다.

 

 

Son클래스는 Parents의 클래스를 상속받았기 때문에 부모가 가진 name 변수를 이용할 수 있었다.

 

이때 주의할 점은 this.name은 현재 Son클래스가 별도의 name변수가 없기 때문에 부모것을 쓴 것이다.

 

만약 Son클래스가 name이라는 변수를 가지고 있었다면, this.name은 Son클래스의 name변수를 가리킨다.

상속 주의점

- 상속한 뒤 자식 클래스에서 부모 멤버나 메서드의 새로운 선언(오버라이딩)이 없을 때는 그것은 그냥 부모 클래스의 것을 빌려쓰게 되는 것이다.

 

- 이때는 부모 클래스의 수가 변하면 자식 클래스에서 참조한 변수도 바뀌기 때문에 주의 해야 한다.

 

- 즉 초기화, 재정의 없이는 자식 클래스가 상속받은 멤버, 메서드는 내것이 되지 않는 것이다.