자바(Java)에서 상속(Inheritance)은 객체 지향 프로그래밍의 핵심 개념 중 하나입니다. 상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장할 수 있습니다. 이 글에서는 상속의 기본 개념, 상속의 장점, 상속의 구현 방법, 상속과 관련된 주요 키워드와 개념을 자세히 살펴보겠습니다.
1. 상속이란 무엇인가?
상속은 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받는 기능입니다. 이를 통해 기존 클래스를 기반으로 새로운 클래스를 만들 수 있으며, 코드의 재사용성과 확장성을 높일 수 있습니다.
예시
public class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
public class Dog extends Animal {
void bark() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // 출력: This animal eats food.
myDog.bark(); // 출력: The dog barks.
}
}
위 예시에서 Dog 클래스는 Animal 클래스를 상속받아 eat() 메서드를 사용할 수 있습니다.
2. 상속의 장점
1. 코드 재사용성
상속을 통해 기존 클래스의 코드를 재사용할 수 있습니다. 중복 코드를 줄이고, 유지보수성을 높일 수 있습니다.
public class Animal {
void breathe() {
System.out.println("This animal is breathing.");
}
}
public class Bird extends Animal {
void fly() {
System.out.println("This bird is flying.");
}
}
2. 코드의 확장성
기존 클래스를 확장하여 새로운 기능을 추가할 수 있습니다. 새로운 클래스를 만들 때 기본적인 동작을 상속받아 코드의 일관성을 유지할 수 있습니다.
public class Vehicle {
void start() {
System.out.println("Vehicle is starting.");
}
}
public class Car extends Vehicle {
void drive() {
System.out.println("Car is driving.");
}
}
3. 다형성(Polymorphism)
상속을 통해 다형성을 구현할 수 있습니다. 상위 클래스 타입의 변수로 하위 클래스 객체를 참조할 수 있어, 코드를 더 유연하게 작성할 수 있습니다.
public class Animal {
void makeSound() {
System.out.println("Some sound...");
}
}
public class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof");
}
}
public class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // 출력: Woof
myCat.makeSound(); // 출력: Meow
}
}
3. 상속의 구현 방법
기본 상속 구문
자바에서 클래스는 extends 키워드를 사용하여 다른 클래스를 상속받습니다. 상속받은 클래스는 하위 클래스(Subclass) 또는 자식 클래스(Child Class), 상속해주는 클래스는 상위 클래스(Superclass) 또는 부모 클래스(Parent Class)라고 합니다.
public class Parent {
// 부모 클래스의 멤버
}
public class Child extends Parent {
// 자식 클래스의 멤버
}
예제
public class Animal {
void sleep() {
System.out.println("This animal is sleeping.");
}
}
public class Dog extends Animal {
void bark() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.sleep(); // 출력: This animal is sleeping.
myDog.bark(); // 출력: The dog barks.
}
}
4. 상속과 관련된 주요 키워드와 개념
super 키워드
super 키워드는 부모 클래스의 멤버(변수, 메서드)에 접근할 때 사용됩니다. 주로 오버라이딩된 메서드 내에서 부모 클래스의 메서드를 호출하거나, 부모 클래스의 생성자를 호출할 때 사용됩니다.
부모 클래스의 메서드 호출
public class Animal {
void eat() {
System.out.println("Animal is eating.");
}
}
public class Dog extends Animal {
@Override
void eat() {
super.eat();
System.out.println("Dog is eating.");
}
}
부모 클래스의 생성자 호출
public class Animal {
public Animal() {
System.out.println("Animal is created.");
}
}
public class Dog extends Animal {
public Dog() {
super();
System.out.println("Dog is created.");
}
}
final 키워드
final 키워드는 클래스, 메서드, 변수에 사용할 수 있으며, 변경할 수 없음을 의미합니다. final 클래스는 상속할 수 없고, final 메서드는 오버라이딩할 수 없습니다.
final 클래스
public final class FinalClass {
// 내용
}
// 다음 코드는 오류를 발생시킴
// public class SubClass extends FinalClass {
// // 내용
// }
final 메서드
public class Animal {
public final void eat() {
System.out.println("Animal is eating.");
}
}
public class Dog extends Animal {
// 다음 코드는 오류를 발생시킴
// @Override
// public void eat() {
// System.out.println("Dog is eating.");
// }
}
5. 상속의 제한
자바에서는 다중 상속을 지원하지 않습니다. 즉, 한 클래스는 오직 하나의 클래스만 상속받을 수 있습니다. 이는 다이아몬드 문제(Diamond Problem)를 방지하기 위함입니다. 다중 상속이 필요할 경우 인터페이스를 사용할 수 있습니다.
인터페이스
인터페이스는 클래스가 구현해야 하는 메서드의 집합을 정의합니다. 한 클래스는 여러 인터페이스를 구현할 수 있습니다.
interface Drivable {
void drive();
}
interface Flyable {
void fly();
}
public class FlyingCar implements Drivable, Flyable {
@Override
public void drive() {
System.out.println("Driving");
}
@Override
public void fly() {
System.out.println("Flying");
}
}
결론
이 글에서는 자바의 상속(Inheritance)에 대해 자세히 살펴보았습니다. 상속은 코드의 재사용성과 확장성을 높여주고, 다형성을 구현하는 데 중요한 역할을 합니다. 상속을 통해 코드의 중복을 줄이고, 유지보수성을 향상시킬 수 있습니다. 추가적인 질문이 있으면 언제든지 댓글로 남겨주세요!
'자바' 카테고리의 다른 글
자바 인터페이스 완벽 가이드 (0) | 2024.06.28 |
---|---|
오버로딩과 오버라이딩 완벽 가이드 (0) | 2024.06.27 |
객체 지향 프로그래밍(OOP) 가이드 (0) | 2024.06.25 |
자바 메서드 가이드 (0) | 2024.06.24 |
자바 배열 가이드 (0) | 2024.06.23 |