상속(inheritance)은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장할 수 있습니다. Java에서 상속은 extends 키워드를 사용하여 구현됩니다.
기본 개념
- 부모 클래스 (Parent Class, Superclass): 다른 클래스에 속성과 메서드를 제공하는 클래스입니다.
- 자식 클래스 (Child Class, Subclass): 부모 클래스를 상속받아 부모 클래스의 속성과 메서드를 사용할 수 있는 클래스입니다.
자식 클래스는 부모 클래스의 모든 공용(public) 및 보호(protected) 멤버를 상속받습니다. 또한, 자식 클래스는 부모 클래스의 메서드를 재정의(오버라이딩)하거나 새로운 멤버를 추가할 수 있습니다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// 부모 클래스
class Animal {
// 부모 클래스의 메서드
public void eat() {
System.out.println("This animal eats food.");
}
}
// 자식 클래스
class Dog extends Animal {
// 자식 클래스의 메서드
public void bark() {
System.out.println("The dog barks.");
}
// 부모 클래스의 메서드 오버라이딩
@Override
public void eat() {
System.out.println("The dog eats dog food.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // "The dog eats dog food."
dog.bark(); // "The dog barks."
}
}
|
cs |
주요 개념
- 단일 상속 (Single Inheritance)
- Java는 단일 상속만 지원합니다. 즉, 한 클래스는 하나의 부모 클래스만 가질 수 있습니다.
123class A { }class B extends A { }cs - 메서드 오버라이딩 (Method Overriding)
- 자식 클래스는 부모 클래스의 메서드를 재정의(오버라이딩)할 수 있습니다. 재정의된 메서드는 부모 클래스의 메서드와 동일한 시그니처(메서드 이름, 매개변수 타입 및 개수)를 가져야 합니다.
12345678910111213class Parent {public void display() {System.out.println("Parent display method");}}class Child extends Parent {@Overridepublic void display() {System.out.println("Child display method");}}cs - super 키워드
- super 키워드는 부모 클래스의 멤버에 접근할 때 사용됩니다.
- 부모 클래스의 생성자를 호출할 때도 사용됩니다.
1234567891011121314class Parent {public void display() {System.out.println("Parent display method");}}class Child extends Parent {@Overridepublic void display() {super.display(); // 부모 클래스의 display() 호출System.out.println("Child display method");}}cs - protected 접근 제어자
- protected 접근 제어자는 같은 패키지 내에 있는 다른 클래스 또는 상속받은 자식 클래스에서 접근할 수 있습니다.
123456789101112class Parent {protected void display() {System.out.println("Protected display method");}}class Child extends Parent {public void show() {display(); // 부모 클래스의 protected 메서드 호출 가능}}cs - 생성자와 상속
- 자식 클래스의 생성자는 항상 부모 클래스의 생성자를 호출합니다. 명시적으로 호출하지 않으면 기본 생성자가 자동으로 호출됩니다.
12345678910111213class Parent {public Parent() {System.out.println("Parent constructor");}}class Child extends Parent {public Child() {super(); // 부모 클래스의 기본 생성자 호출System.out.println("Child constructor");}}cs
다형성 (Polymorphism)
상속을 사용하면 다형성을 구현할 수 있습니다. 다형성은 동일한 타입의 객체가 여러 다른 형태를 가질 수 있는 능력입니다. 예를 들어, 부모 클래스 타입의 참조 변수가 자식 클래스 객체를 참조할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
@Override
public 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(); // "Bark"
myCat.makeSound(); // "Meow"
}
}
|
cs |
상속은 코드 재사용성을 높이고, 계층적인 클래스 구조를 만들며, 다형성을 통해 유연한 코드 작성을 가능하게 합니다. 상속을 적절히 사용하면 객체지향 프로그래밍의 강력한 기능을 효과적으로 활용할 수 있습니다. 다만, 과도한 상속은 코드의 복잡성을 증가시킬 수 있으므로 주의가 필요합니다.