상속

상속(Inheritance) 이란?

기존 클래스를 확장하여 새로운 클래스를 만드는 개념

코드 재사용성 증가 및 객체 간 계층 구조 형성

 

상속의 기본 구조

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

// 자식 클래스 (Sub Class)
class Dog extends Animal {
    void makeSound() { // 메서드 오버라이딩 (Overriding)
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.name = "바둑이";
        myDog.makeSound();  // 출력: 멍멍!
    }
}

 

➡︎ Dog 클래스는 Animal 클래스를 상속

➡︎ makeSound() 메서드를 오버라이딩(Overriding) 하여 고유 기능 구현


상속의 장단점

장점

  • 코드 재사용성 증가: 기본 기능을 부모 클래스에 정의
  • 유지보수 용이: 공통 로직을 부모 클래스에서 관리

단점

  • 상속 구조가 깊어질수록 의존성 증가 ➔ 유지보수 어려움
  • 부모 클래스가 변경되면 자식 클래스에 영향을 미칠 위험

➡︎ 상속보다 "조합(Composition)" 을 사용하는 것이 더 유리한 경우도 많음!


다형성

다형성(Polymorphism) 이란?

하나의 인터페이스로 여러 구현을 처리할 수 있는 개념

오버라이딩(Overriding)오버로딩(Overloading) 이 대표적인 방식

 

다형성 예제

class Animal {
    void makeSound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

class Cat extends Animal {
    void makeSound() { // 오버라이딩
        System.out.println("야옹~");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Cat(); // 부모 타입으로 자식 객체 참조
        myAnimal.makeSound(); // 출력: 야옹~
    }
}

 

➡︎ Animal myAnimal = new Cat(); ➔ 부모 타입을 사용하여 다양한 객체를 다룰 수 있음


오버로딩과 오버라이딩 차이

  • 오버로딩(Overloading): 같은 클래스에서 메서드 이름이 같고 매개변수가 다름 ex) void add(int a), void add(double a)
  • 오버라이딩(Overriding): 부모 클래스의 메서드를 재정의 ex) @Override void makeSound()

인터페이스 vs 추상 클래스

인터페이스(Interface) 란?

메서드의 동작만 정의하고, 구현은 하지 않음

다중 구현 가능 (implements)

 

인터페이스 예제

interface Animal {
    void makeSound(); // 구현 X (추상 메서드)
}

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

 

➡︎ 다양한 객체가 동일한 동작을 할 때 사용!


추상 클래스(Abstract Class) 란?

일부 구현이 포함된 클래스: 추상 메서드 + 일반 메서드 포함 가능

단일 상속만 가능 (extends)

 

추상 클래스 예제

abstract class Animal {
    abstract void makeSound(); // 추상 메서드 (구현 X)

    void sleep() { // 일반 메서드 (구현 O)
        System.out.println("동물이 잠을 잡니다.");
    }
}

 

➡︎ 공통 기능을 제공하면서 일부만 구현이 필요할 때 사용!


주요 포인트

  • 상속과 다형성의 차이를 명확히 알아야 함!
    • 상속: 부모 클래스를 기반으로 새로운 클래스를 확장하는 방식, 코드 재사용성 증가, 깊은 상속 구조는 유지보수 어려움
    • 다형성: 부모 타입으로 여러 자식 객체를 다룰 수 있는 개념, 메서드 오버라이딩을 활용하여 객체마다 다른 동작 수행 가능
  • 인터페이스와 추상 클래스의 차이
    • 인터페이스: 행동만 정의하고 구현은 하지 않음, 다중 구현 가능
    • 추상 클래스: 일부 구현이 포함될 수 있음, 단일 상속만 가능

+ Recent posts