상속
상속이란 기존 클래스를 확장하는 개념으로 부모 클래스(parent class)의 속성과 기능을 자식 클래스(child class)에 물려주는 것이다. 즉 자식 클래스에서는 부모 클래스의 인스턴스 변수와 인스턴스 메소드를 사용할 수 있다. 단 부모 클래스의 인스턴스 변수와 인스턴스 메소드의 접근지정자가 private
이거나, default
인데 패키지가 다르다면 자식 클래스에서 접근이 안된다. 부모 클래스가 아니라 슈퍼 클래스(super class), 자식 클래스가 아니라 서브 클래스(sub class)라고도 한다.
상속을 통해서 기반 클래스에 있는 멤버 변수와 멤버 함수를 그대로 사용할 수 있으니 파생 클래스에서는 멤버 변수와 함수를 간결하게 작성할 수 있고, 클래스들 간 구조적 관계를 파악하기도 용이하다는 장점이 있다. 또한 클래스 재사용도 쉬워진다.
상속의 기본 문법은 다음과 같다.
class ChildClass extends ParentsClass {
....
}
메소드 오버라이딩
자식 클래스에서 메소드를 재정의하는 것을 말한다.
예를 들어 아래와 같은 클래스 관계가 있다고 가정하자.
class Person {
protected int age;
protected String name;
public void printInfo() {
System.out.println(age);
System.out.println(name);
}
}
class Student extends Person {
public String id;
}
Student 클래스는 Person 클래스를 상속받았기 때문에 printInfo 메소드를 사용 가능하다. 그런데 printInfo 메소드로는 나이와 이름만 출력하기 때문에 id는 출력할 수 없다. 만약 id를 출력하고 싶어 또 다른 메소드를 만들 수도 있겠지만, 같은 메소드 이름을 사용해야 관리 및 사용이 용이할 것이다. 이때 자식 클래스에서 printInfo를 다시 정의해주면 자식 클래스로 만들어진 객체에서 printInfo를 사용할 때 부모 클래스의 메소드가 아니라 자식 클래스에서 재정의된 메소드가 실행된다.
즉 아래와 같이 재정의하여 사용해줄 수 있다.
class Person {
protected int age;
protected String name;
public void printInfo() {
System.out.println(age);
System.out.println(name);
}
}
class Student extends Person {
public String id;
public void printInfo() {
System.out.println(age);
System.out.println(name);
System.out.println(id);
}
}
상속과 생성자 및 super
상속받아 만들어진 자식 클래스의 객체가 생성되면 자식 클래스의 생성자만 실행되는 것이 아니라 부모 클래스의 생성자 역시 실행된다.
부모 클래스의 생성자를 따로 만들지 않았다면 자식 클래스의 생성자가 실행되면서 암묵적으로 부모 클래스의 디폴트 생성자가 실행되는데, 만약 따로 지정해야 한다면 super
키워드를 사용하면 된다. super
키워드는 부모 클래스를 가리키는 키워드로, 이를 이용하여 부모 클래스의 변수, 메소드, 생성자를 사용할 수 있다.
생성자 실행 순서는 상위 클래스부터 하위 클래스 순이다. 예를 들어 아래와 같은 코드가 있다고 하자.
class SuperClass {
SuperClass() {
System.out.println("Super");
}
}
class SubClass extends SuperClass {
SubClass() {
System.out.println("Sub");
}
}
public class Main {
public static void main(String[] args) {
SubClass sub = new SubClass();
}
}
그렇다면 출력은 다음과 같다.
Super
Sub
'Language > Java' 카테고리의 다른 글
[Java] abstract 키워드를 통한 추상 클래스와 추상 메소드 (0) | 2024.11.14 |
---|---|
[Java] 업캐스팅(upcasting)과 다운캐스팅(downcasting) (0) | 2024.11.12 |
[Java] 접근 지정자(access modifier) (0) | 2024.11.11 |
[Java] 클래스(class)와 객체(object) 선언 (0) | 2024.11.03 |
[Java] Scanner 클래스를 이용한 입력 (0) | 2024.10.29 |