상속

    상속(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