2025-08-25 상속

Ckd gus·2026년 2월 2일

상속과 다형성 정리 – extends, override, super, getter/setter

오늘은 상속(Inheritance)다형성(Polymorphism)을 중심으로 객체지향 개념을 정리했다.
개념 자체가 많아서 처음엔 헷갈렸지만, 예제 코드를 다시 정리하면서 흐름이 조금씩 보이기 시작했다.


상속(Inheritance)

상속이란 부모 클래스의 필드와 메서드를 자식 클래스가 물려받는 것을 말한다.

  • 침대는 가구이다
  • 소방차는 자동차이다
  • 강아지는 동물이다

이처럼 “~은 ~이다”라고 말할 수 있는 관계를
is-a 관계 또는 kind-of 관계라고 한다.


상속을 사용하는 이유

1️⃣ 재사용성

공통 로직을 부모 클래스에 두고 자식 클래스가 상속받아 사용하면
중복 코드를 줄이고 가독성을 높일 수 있다.

2️⃣ 확장성

자식 클래스에서 기능을 추가하거나 변경(오버라이딩)하여
유연하게 확장할 수 있다.

3️⃣ 다형성

부모 타입으로 자식 객체를 다룰 수 있다.

⚠️ 자바는 다중 상속을 지원하지 않으며, 반드시 하나의 부모 클래스만 가질 수 있다.


extends 키워드

상속을 받기 위해서는 클래스 이름 뒤에 extends 키워드를 사용한다.

class Animal { // 부모 클래스
    public void makeSound() {
        System.out.println("동물이 소리를 냅니다");
    }
}

class Dog extends Animal { // 자식 클래스
}

public class OverrideExam {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 동물이 소리를 냅니다
    }
}

부모 클래스의 메서드를 그대로 상속받아 사용할 수 있다.


메서드 오버라이딩(Method Overriding)

메서드 오버라이딩이란
부모 클래스의 메서드를 자식 클래스에서 재정의하는 것이다.

조건

  • 메서드 이름 동일
  • 매개변수 동일
  • 반환 타입 동일
  • @Override 어노테이션 사용 권장
class Animal {
    public void makeSound() {
        System.out.println("동물이 소리를 냅니다");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

public class OverrideExam {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 멍멍!
    }
}

super 키워드

super

부모 클래스의 필드나 메서드에 접근할 때 사용한다.

class Library {
    int code = 1234;
}

class Book extends Library {
    int code = 5678;

    void print() {
        System.out.println(code);        // 자식 필드
        System.out.println(super.code);  // 부모 필드
    }
}

super()

부모 클래스의 생성자를 호출한다.

  • 자식 생성자에서 사용
  • 반드시 첫 줄에 작성
  • 생략 시 컴파일러가 자동으로 super() 호출
class Parent {
    Parent(String msg) {
        System.out.println("Parent 생성자: " + msg);
    }
}

class Child extends Parent {
    Child() {
        super("Hello from Child!");
        System.out.println("Child 생성자 실행");
    }
}

public class Main {
    public static void main(String[] args) {
        new Child();
    }
}

👉 자식 객체를 생성할 때 부모 생성자가 항상 먼저 실행된다.


Getter / Setter

부모 클래스의 필드가 private일 경우
외부 클래스에서 직접 접근할 수 없기 때문에 getter/setter를 사용한다.

  • getter : 값을 가져오는 메서드
  • setter : 값을 설정하는 메서드
class Car {
    private String name;
    private int speed;

    // Getter
    public String getName() {
        return name;
    }

    public int getSpeed() {
        return speed;
    }

    // Setter
    public void setName(String name) {
        this.name = name;
    }

    public void setSpeed(int speed) {
        if (speed >= 0) {
            this.speed = speed;
        }
    }
}

public class GetterSetter {
    public static void main(String[] args) {
        Car car = new Car();

        car.setName("BMW");
        car.setSpeed(120);

        System.out.println(car.getName());
        System.out.println(car.getSpeed());
    }
}

instanceof 연산자

instanceof객체의 실제 타입을 확인하는 연산자이다.
주로 다운캐스팅의 안전성 확보를 위해 사용한다.

Animal animal = new Dog();

System.out.println(animal instanceof Animal); // true
System.out.println(animal instanceof Dog);    // true
System.out.println(animal instanceof Cat);    // false

업캐스팅 & 다운캐스팅

업캐스팅 (자동)

Animal a = new Dog();

다운캐스팅 (명시적)

if (a instanceof Dog) {
    Dog d = (Dog) a;
    d.wagTail();
}

다형성(Polymorphism)

다형성이란 부모 타입으로 여러 형태의 자식 객체를 다룰 수 있는 것이다.

특징

  • 부모 타입 참조 변수로 자식 객체 참조 가능
  • 오버라이딩된 메서드가 실행됨 (동적 바인딩)
  • 하나의 배열이나 컬렉션에 여러 자식 객체 저장 가능

객체 생성 기준 정리

  • 일반적인 객체 생성

    Dog dog = new Dog();
  • 다형성 활용 (업캐스팅)

    Animal a = new Dog();
  • 자식 고유 기능 사용 (다운캐스팅)

    Dog d = (Dog) a;

느낀 점

오늘은 병원 진료 때문에 오전 수업을 듣지 못해
진도를 따라가기 조금 벅찼다.

그래도 회고가 끝난 후 약 3시간 정도 블로그 정리를 하면서
개념을 다시 복습하니 기본적인 흐름은 어느 정도 잡힌 것 같다.

요즘 점점 객체지향 개념이 재미있어지고 있어서
그 점은 다행이라고 느낀 하루였다.

profile
백엔드 공부중입니다.

0개의 댓글