IT
자바 상속(Inheritance)
1. 상속의 기본 개념
상속은 기존에 정의된 클래스를 바탕으로 새로운 클래스를 정의할 수 있도록 해줍니다. 자식 클래스는 부모 클래스의 모든 멤버 변수와 메서드를 물려받지만, 생성자와 private 멤버는 상속되지 않습니다.
class Animal {
void eat() {
System.out.println("먹는다");
}
}
class Dog extends Animal {
void bark() {
System.out.println("짖는다");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // Animal 클래스에서 상속됨
dog.bark(); // Dog 클래스의 메서드
}
}
2. 상속의 문법
자바에서 클래스 상속은 extends 키워드를 사용합니다.
class 자식클래스 extends 부모클래스 {
// 자식 클래스의 멤버들
}
-
단일 상속만 지원 (하나의 부모 클래스만 상속 가능)
-
인터페이스를 통해 다중 상속의 효과를 일부 구현할 수 있음
3. 접근 제어자와 상속 관계
부모 클래스의 멤버가 자식 클래스에서 어떻게 접근 가능한지는 접근 제어자에 따라 달라집니다.
접근 제어자
동일 클래스
같은 패키지
자식 클래스
전체
private
O
X
X
X
default
O
O
O (같은 패키지)
X
protected
O
O
O
X
public
O
O
O
O
4. 메서드 오버라이딩 (Overriding)
상속을 받은 자식 클래스에서 부모 클래스의 메서드를 재정의할 수 있습니다. 이를 오버라이딩이라고 합니다.
class Animal {
void sound() {
System.out.println("동물이 소리를 낸다");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹");
}
}
-
@Override 어노테이션을 사용하면 컴파일 타임에 재정의 여부를 체크할 수 있어 안정성이 높아짐
-
오버라이딩한 메서드는 부모 클래스가 아닌 자식 클래스의 메서드가 호출됨
5. super 키워드
supper는 부모 클래스의 생성자나 멤버에 접근할 때 사용합니다.
5-1. 부모 생성자 호출
자식 클래스 생성자에서 부모 클래스 생성자를 명시적으로 호출할 수 있습니다.
class Animal {
Animal(String name) {
System.out.println("동물 이름: " + name);
}
}
class Dog extends Animal {
Dog() {
super("바둑이"); // 부모 생성자 호출
}
}
5-2. 부모 메서드 호출
class Animal {
void eat() {
System.out.println("동물이 먹는다");
}
}
class Dog extends Animal {
void eat() {
super.eat(); // 부모 클래스의 eat() 호출
System.out.println("개가 사료를 먹는다");
}
}
6. 생성자와 상속
-
생성자는 상속되지 않지만, 자식 클래스 생성자 내에서 부모 클래스의 생성자를 반드시 호출해야 함
-
명시하지 않으면 컴파일러가 super()를 자동으로 추가
-
부모 클래스에 기본 생성자가 없고 매개변수가 있는 생성자만 존재할 경우, 자식 클래스에서 super(인자)를 반드시 명시적으로 호출해야 함
7. final 키워드와 상속 제한
-
final class: 상속이 불가능한 클래스
-
final method: 자식 클래스에서 오버라이딩 불가능한 메서드
final class Vehicle { }
// class Car extends Vehicle { } // 컴파일 오류
class Shape {
final void draw() {
System.out.println("그리기");
}
}
8. 상속의 장점과 단점
장점
-
코드 재사용 가능
-
유지보수가 쉬움
-
프로그램의 구조가 계층적으로 정리됨
단점
-
잘못된 상속 구조는 코드 복잡성 증가
-
상위 클래스에 의존하게 되어 유연성이 낮아질 수 있음
-
오용 시 코드 품질 저하 가능
9. 예제: 상속과 오버라이딩 활용
class Person {
String name;
void introduce() {
System.out.println("안녕하세요. 제 이름은 " + name + "입니다.");
}
}
class Student extends Person {
String school;
@Override
void introduce() {
System.out.println("안녕하세요. 학생입니다. 이름은 " + name + ", 학교는 " + school + "입니다.");
}
}
댓글
아직 댓글이 없습니다.
로그인 후 댓글을 남길 수 있습니다.