자바 - 상속: 초보자의 가이드
안녕하세요, 미래의 자바 마법사들! 오늘, 우리는 자바 상속의 흥미로운 세계로 떠날 여정을 시작할 거예요. 프로그래밍에 새로운 사람이라도 걱정 마세요 – 저는 여러분의 친절한 가이드로, 모든 것을 단계별로 설명해 드릴 거예요. 그럼, 커피 한 잔을 마셔볼까요? (또는 차라도 좋으면) 그리고 함께 빠져들어볼까요!
상속이란 무엇인가요?
가족 트리를 만드는 것을 상상해 보세요. 아이들이 부모님那里에서 특정 특성을 상속받는 것을 발견할 수 있을 거예요 – 아마도 아빠의 눈이나 엄마의 미소가 그럴 거예요. 자바에서의 상속도 비슷하지만, 가족 회원 대신 클래스를 사용합니다!
상속은 오브젝트-지향 프로그래밍(OOP)에서의 기본 개념으로, 새로운 클래스가 기존 클래스에 기반하여 만들어질 수 있게 합니다. 새로운 클래스는 기존 클래스의 필드와 메서드를 상속받습니다.
우리는 왜 상속이 필요한가요?
- 코드 재사용성: 같은 코드를 반복적으로 작성하는 대신, 기존 코드를 재사용할 수 있습니다.
- 향상된 구성: 명확하고 منطق적인 클래스 계층 구조를 만드는 데 도움이 됩니다.
- 메서드 오버라이딩: 상속받은 메서드의 동작을 수정할 수 있습니다.
이를 더 잘 이해하기 위해 간단한 예제를 살펴보겠습니다.
자바 상속 구현
자바에서는 extends
키워드를 사용하여 상속을 구현합니다. 다음은 기본 구조입니다:
class ParentClass {
// 부모 클래스 멤버
}
class ChildClass extends ParentClass {
// 자식 클래스 멤버
}
이제 더 구체적인 예제를 살펴보겠습니다:
class Animal {
void eat() {
System.out.println("This animal eats food");
}
}
class Dog extends Animal {
void bark() {
System.out.println("The dog barks");
}
}
public class InheritanceExample {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // Animal에서 상속받음
myDog.bark(); // Dog에서 정의됨
}
}
이 예제에서, Dog
은 Animal
의 eat()
메서드를 상속받고 있습니다. 이 프로그램을 실행하면 다음과 같은 출력이 나옵니다:
This animal eats food
The dog barks
멋지지 않나요? 우리의 Dog
클래스는 이제 Animal
의 eat()
메서드와 자신만의 bark()
메서드를 가질 수 있습니다!
'super' 키워드
이제, 자식 클래스 내에서 부모 클래스를 참조하고 싶다면 어떻게 해야 하나요? 이 때 super
키워드가 매우 유용합니다. 부모님께 도움이 필요할 때 전화를 걸는 것과 마찬가지입니다!
우리의 예제를 수정해 보겠습니다:
class Animal {
void eat() {
System.out.println("This animal eats food");
}
}
class Dog extends Animal {
void eat() {
super.eat(); // Animal의 eat() 메서드 호출
System.out.println("The dog eats dog food");
}
}
public class SuperKeywordExample {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat();
}
}
이를 실행하면 다음과 같은 출력이 나옵니다:
This animal eats food
The dog eats dog food
super
키워드를 사용하여 Animal
클래스의 eat()
메서드를 호출한 후에 자신만의 동작을 추가했습니다.
부모 클래스 생성자 호출
super
키워드는 부모 클래스의 생성자를 호출하는 데도 사용할 수 있습니다. 이는 상속받은 필드를 초기화하는 데 특히 유용합니다.
class Animal {
String name;
Animal(String name) {
this.name = name;
}
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name); // Animal의 생성자 호출
this.breed = breed;
}
void display() {
System.out.println("My name is " + name + " and I'm a " + breed);
}
}
public class ConstructorInheritanceExample {
public static void main(String[] args) {
Dog myDog = new Dog("Buddy", "Golden Retriever");
myDog.display();
}
}
이것은 다음과 같은 출력을 낼 것입니다:
My name is Buddy and I'm a Golden Retriever
IS-A 관계
상속은 클래스 간의 "IS-A" 관계를 설정합니다. 우리의 예제에서는 "A Dog IS-A Animal"라고 말할 수 있습니다. 이 관계는 상속을 이해하는 데 필수적입니다.
'instanceof' 키워드
자바는 instanceof
키워드를 제공하여 특정 클래스나 인터페이스의 인스턴스인지 확인할 수 있습니다. "에이, 이 가족의 일부니?"라고 묻는 것과 같습니다.
public class InstanceofExample {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Dog myDog = new Dog();
System.out.println(myAnimal instanceof Animal); // true
System.out.println(myDog instanceof Animal); // true
System.out.println(myAnimal instanceof Dog); // false
}
}
HAS-A 관계
상속은 "IS-A" 관계를 나타내는 대신, 복합은 "HAS-A" 관계를 나타냅니다. 예를 들어, Car HAS-A Engine.
class Engine {
void start() {
System.out.println("Engine started");
}
}
class Car {
private Engine engine;
Car() {
this.engine = new Engine();
}
void startCar() {
engine.start();
System.out.println("Car is ready to go!");
}
}
public class CompositionExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.startCar();
}
}
자바 상속의 유형
자바는 여러 가지 유형의 상속을 지원합니다:
- 단일 상속: 클래스가 하나의 슈퍼클래스를 상속받습니다.
- 멀티레벨 상속: 클래스가 다른 클래스를 상속받고, 그 클래스는 또 다른 클래스를 상속받습니다.
- 계층적 상속: 여러 클래스가 단일 슈퍼클래스를 상속받습니다.
자바는 클래스에서 여러 상속을 지원하지 않는데, 모호성을 피하기 위해서입니다. 그러나 인터페이스를 통해 여러 상속을 지원합니다.
다음은 상속 유형을 요약한 표입니다:
상속 유형 | 설명 | 자바에서 지원 여부 |
---|---|---|
단일 | 클래스가 하나의 슈퍼클래스를 상속받음 | 예 |
멀티레벨 | 클래스가 다른 클래스를 상속받고, 그 클래스는 또 다른 클래스를 상속받음 | 예 |
계층적 | 여러 클래스가 단일 슈퍼클래스를 상속받음 | 예 |
여러 | 클래스가 두 개 이상의 클래스를 상속받음 | 아니요 (하지만 인터페이스를 통해 가능) |
그리고 이렇게 끝납니다, 여러분! 우리는 자바 상속의 기본 개념을 다루었습니다. 기억해요, 연습이 만든다는 말이 있으니, 이 개념들을 실험해 보세요. 코딩 잘 하세요, 상속이 여러분의 편을 도와드리길 바랍니다!
Credits: Image by storyset