지난번 HashMap에 이어서 이번글에서
상속(Inheritance)에 대해서 알아보겠습니다.
상속은 객체지향(object-oriented) 언어에서 가장 중요하고
많이 쓰이는 개념입니다.
먼저 그럼 상속이 일어나는 상황을 한번 살펴보겠습니다.
상속(Inheritance)은 말 그대로 하위 객체가 상위 객체의
모든 속성을 상속받을 때 사용합니다.
영어로는 'is - a' relationship이라고 흔히 부릅니다.
예를 들어 'Truck is a car' 혹은 'Poodle is a dog' 과 같이
'is - a' 관계가 성립할 경우에 상속을 사용하게 됩니다.
아래 코드를 보면서 조금 더 자세히 살펴보겠습니다.
class Truck{
String name;
int wheelSize;
int wheelThickness;
int cargoCapacity;
Truck(String name, int wheelSize, int wheelThickness, int cargoCapacity){
this.name = name;
this.wheelSize = wheelSize;
this.wheelThickness = wheelThickness;
this.cargoCapacity = cargoCapacity;
}
}
class Sedan{
String name;
int wheelSize;
int wheelThickness;
int passengerCapacity;
Sedan(String name, int wheelSize, int wheelThickness, int passengerCapacity){
this.name = name;
this.wheelSize = wheelSize;
this.wheelThickness = wheelThickness;
this.passengerCapacity = passengerCapacity;
}
}
위와 같이 Truck과 Sedan이라는 Class가 있다고 가정해 봅시다.
이때 Truck과 Sedan은 자동차라는 공통점이 있고 변수로
name, wheelSize, wheelThickness을 공통적으로 가지고 있습니다.
그렇다면 여기서 부모(Super) 클래스인 Car를 만들어서
Truck과 Sedan을 Car클래스의 자식(Child)클래스로 만들 수 있습니다.
아래 코드로 자세히 살펴보겠습니다.
class Car{
// 접근제한자 protected
// private과 같은 역할이지만
// protected의 경우 child 클래스에서
// 자유롭게 사용가능합니다.
protected String name;
protected int wheelSize;
protected int wheelThickness;
Car(String name, int wheelSize, int wheelThickness){
this.name = name;
this.wheelSize = wheelSize;
this.wheelThickness = wheelThickness;
}
public void drive(){
System.out.println("Start driving");
}
}
// 상속할때는 extends 키워드 뒤에
// 부모클래스를 작성하여 상속합니다.
class Truck extends Car{
int cargoCapacity;
Truck(String name, int wheelSize, int wheelThickness, int cargoCapacity){
// super()로 부모클래스의 constructor 호출
super(name, wheelSize, wheelThickness);
this.cargoCapacity = cargoCapacity;
}
@Override
public void drive(){
System.out.println("Start driving");
}
}
class Sedan extends Car{
int passengerCapacity;
Sedan(String name, int wheelSize, int wheelThickness, int passengerCapacity){
super(name, wheelSize, wheelThickness);
this.passengerCapacity = passengerCapacity;
}
@Override
public void drive(){
System.out.println("Start driving");
}
}
먼저 상속을 하기 위해서는 "class 자식클래스 extends 부모클래스"와
같은 형식으로 작성하여야 합니다.
접근제한자 protected
또한 여기서 접근제한자(Access Modifier) 'protected'에 대해서 짚고 넘어가겠습니다.
'protected'는 기본적으로 'private'과 같이 외부에서의 변수에 대한 접근을
차단하는 역할을 합니다.
다시 말해서 'protected'로 설정할 경우 다른 클래스에서
클래스.변수명 과 같은 방식으로 변수를 불러올 수 없습니다.
하지만 부모클래스의 모든 변수를 private으로 설정할 경우
자식클래스에서 부모클래스의 변수를 사용해야 할 경우에
그때마다 get~~() 와 같은 메서드를 호출해야하는 번거로움이 있습니다.
따라서 Java에서는 'private'이지만 자식클래스에서는 자유롭게
사용가능한 'protected' 접근제한자를 제공하고 있습니다.
상속 Constructor
자식클래스의 constructor 안에서는 super() 메소드를 사용해서
부모클래스의 constructor를 호출하는 것이 가능합니다.
상속 메소드 Override(오버라이드)
또한 부모클래스의 메소드를 가져올 경우에
위에 '@Override' 키워드를 통해 부모클래스의 메소드임을
알릴 수 있습니다.
상속의 장점
마지막으로 상속(Inheritance)을 사용하는 장점에 대해서
알아보겠습니다.
상속을 사용함에 있어서 가장 큰 장점으로는 코드의 재사용을
뽑아볼 수 있습니다.
상속이라는 것도 큰 틀을 만드는 개념이기에 하위 객체를 만들 때
모든 코드를 다 작성할 필요 없이 코드를 재사용할 수 있다는 장점이
있습니다.
또한 확장성과 계층적인 코드 구조를 만들 수 있다는 것이
다른 장점입니다.
기존 코드를 수정하지 않고도 새로운 기능을 추가하거나
기존 기능을 발전시키는 것을 가능하게 합니다.
상속을 통한 계층적인 코드 구성은 객체를 자연스럽고
직관적으로 구성하는데 큰 도움을 줍니다.
지금까지 상속(Inheritance)에 대해서 알아보았습니다.
객체지향(object-oriented) 언어에서 가장 중요한 개념인 만큼
개념에 대한 이해는 물론 이를 활용하는 것도 중요하다고
생각합니다!
그럼 다음 글에서는 예외처리(Exception)에 대해서 알아보겠습니다
'자바(JAVA) 기초 함께 알아보자' 카테고리의 다른 글
자바(JAVA) 기초 함께 알아보자(21) - 상수(Constant) / static (0) | 2025.01.08 |
---|---|
자바(JAVA) 기초 함께 알아보자(20) - 예외처리(Exception) (2) | 2025.01.02 |
자바(JAVA) 기초 함께 알아보자(18) - HashMap (2) | 2024.12.29 |
자바(JAVA) 기초 함께 알아보자(17) - Array(배열)과 ArrayList의 차이 (2) | 2024.10.19 |
자바(JAVA) 기초 함께 알아보자(16) - ArrayList(배열) (0) | 2024.10.07 |