
상속이란 자식 클래스가(sub class) 전부 구현할 수 없는 기능들을 부모 클래스(super classs)로부터 전달받아 쓰는 것, 일종의 확장을 말한다.
예시를 통해 구조 및 개념에 대해 이해해보자.
package kr.s20.object.extention;
//부모 클래스
class Parent{
int a = 100;
}
//자식 클래스
class Child extends Parent{
int b = 200;
}
public class ExtentionMain01 {
public static void main(String[] args) {
//객체 선언 및 생성
Child ch = new Child();
System.out.println(ch.a);
System.out.println(ch.b);
}
}
상속하는 클래스를 부모 클래스(super class), 상속받고자 하는 클래스를 자식 클래스(sub class)라 칭한다.
자식 클래스에 extends 키워드와 부모 클래스를 명시하면 상속 관계가 형성된다.
ex. class Child extends Parent{
부모 클래스는 자동으로 Object를 상속 받으며, 기본적으로는 생략된다.
ex. class Parent = class Parent extends Object
부모 클래스의 메서드와 변수는 상속 관계에 의해 메모리에 업로드되어 자식 클래스에서 호출해 사용 가능하다.
Child ch = new Child();
System.out.println(ch.a);
System.out.println(ch.b);
package kr.s20.object.extention;
//부모 클래스
class People{
public void eat() {
System.out.println("식사하다.");
}
}
//자식 클래스
class Student extends People{
public void study() {
System.out.println("공부하다.");
}
}
public class ExtentionMain02 {
public static void main(String[] args) {
Student s = new Student();
s.eat();
s.study();
System.out.println(s.toString());
}
}
s.eat();: 부모 클래스인 People의 메서드를 상속 받아서 호출s.study();: 자신이 가지고 있는(Student) 메서드 호출System.out.println(s.toString());: Object의 메서드를 상속 받아서 호출
출력)
식사하다.
공부하다.
kr.s20.object.extention.Student@28a418fc
이를 그림으로 표현하면 다음과 같다.

package kr.s20.object.extention;
//부모 클래스
class A{
int x = 100;
private int y = 200;
public int getY() {
return y;
}
}
//자식 클래스
class B extends A{
int z = 300;
}
public class ExtentionMain03 {
public static void main(String[] args) {
B bp = new B();
System.out.println(bp.x);
//System.out.println(bp.y);
System.out.println(bp.getY());
System.out.println(bp.z);
}
}
B bp = new B();
System.out.println(bp.x);
//System.out.println(bp.y); → 불가
public int getY() {
return y;
}
↓
System.out.println(bp.getY());
package kr.s21.object.extention;
public class Phone {
protected String number;
protected String model;
protected String color;
public String getNumber() {
return number;
}
public String getModel() {
return model;
}
public String getColor() {
return color;
}
}
package kr.s21.object.extention;
//자식 클래스
public class SmartPhone extends Phone{
private String os;
//생성자
public SmartPhone(String number, String model, String color, String os) {
this.number = number;
this.model = model;
this.color = color;
this.os = os;
}
public String getOs() {
return os;
}
}
package kr.s21.object.extention;
public class FeaturePhone extends Phone{
private int pixel; //사진 화소수
public FeaturePhone(String number, String model, String color, int pixel) {
this.number = number;
this.model = model;
this.color = color;
this.pixel = pixel;
}
public int getPixel() {
return pixel;
}
}
package kr.s21.object.extention;
public class PhoneMain {
public static void main(String[] args) {
SmartPhone sp
= new SmartPhone("010-1234", "A1001", "white", "안드로이드");
FeaturePhone fp
= new FeaturePhone("010-5432", "B1001", "black", 1000);
System.out.println("==========================");
System.out.println("번호\t\t모델\t색상\t특징(OS/화소수)");
System.out.print(sp.getNumber() + "\t");
System.out.print(sp.getModel() + "\t");
System.out.print(sp.getColor() + "\t");
System.out.println(sp.getOs());
//그냥 아래와 같이 출력해도 됨.
//System.out.println(sp.number);
System.out.print(fp.getNumber() + "\t");
System.out.print(fp.getModel() + "\t");
System.out.print(fp.getColor() + "\t");
System.out.println(fp.getPixel());
}
}
1) Phone 클래스를 상속 받은 SmartPhone 클래스는 자신의 멤버 변수인 os와 함께 phone의 protected 변수인 number, model, color를 자신의 멤버 변수인 것처럼 활용한다.
→ SmartPhone sp = new SmartPhone("010-1234", "A1001", "white", "안드로이드");
2) Phone 클래스를 상속 받은 FeaturePhone 클래스 역시 자신의 멤버 변수인 pixel과 함께 phone의 protected 변수인 number, model, color를 자신의 멤버 변수인 것처럼 활용한다.
→ FeaturePhone fp = new FeaturePhone("010-5432", "B1001", "black", 1000);
이처럼 '상속 관계'를 활용하면, 자식 클래스에서 공통적으로 구현해야 하는 기능들을 부모 클래스에서 1번만 구현함으로써 코드를 간단히 작성할 수 있는 장점이 있다.
다음 글에서는 상속 관계에서 필수로 알아야 할 메서드 오버라이딩에 대해 알아보겠다.