게으른 개발자의 끄적거림

Java extends implement 차이

끄적잉 2025. 2. 11. 12:07

Java에서 extends와 implements 키워드는 객체지향 프로그래밍(OOP) 개념에서 중요한 역할을 하며, 각각 클래스 상속과 인터페이스 구현에 사용됩니다. 두 개념을 명확히 이해하면 Java의 객체지향적인 설계를 보다 효율적으로 할 수 있습니다.
이제 extends와 implements의 차이를 자세하게 설명하겠습니다.


1. extends와 implements의 개념

 

1.1 extends 키워드

extends는 클래스가 다른 클래스를 상속받을 때 사용됩니다. Java는 단일 상속(single inheritance)만을 지원하므로, 한 클래스는 오직 하나의 부모 클래스만 상속할 수 있습니다.

 

 

특징

  • 부모 클래스(상위 클래스, Superclass)의 필드와 메서드를 자식 클래스(하위 클래스, Subclass)에서 사용할 수 있습니다.
  • 부모 클래스의 기능을 재사용하면서도 새로운 기능을 추가할 수 있습니다.
  • 부모 클래스의 메서드를 오버라이딩(Overriding)하여 동작을 변경할 수 있습니다.
  • 생성자는 상속되지 않지만, 부모 클래스의 생성자를 호출할 수 있습니다. (super 사용)

예제

class Animal {
    String name;

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

// Dog 클래스는 Animal 클래스를 상속받음
class Dog extends Animal {
    void makeSound() { // 메서드 오버라이딩
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "바둑이";
        System.out.println(dog.name);
        dog.makeSound();  // 멍멍!
    }
}

위 코드에서 Dog 클래스는 Animal 클래스를 extends 키워드로 상속받았으며, 부모 클래스의 makeSound() 메서드를 오버라이딩하여 새로운 동작을 정의했습니다.


 

1.2 implements 키워드

implements는 클래스가 하나 이상의 인터페이스를 구현할 때 사용됩니다. 인터페이스는 메서드의 시그니처(선언)만 정의하고, 실제 구현은 인터페이스를 구현하는 클래스에서 담당합니다.

 

특징

  • 다중 구현(multiple implementation)이 가능하여 여러 개의 인터페이스를 한 클래스에서 구현할 수 있습니다.
  • 인터페이스의 모든 메서드는 반드시 구현해야 합니다.
  • 인터페이스는 상속이 아닌 "구현" 개념이므로, implements를 사용한 클래스는 인터페이스와는 다른 관계를 가집니다.

예제

interface Animal {
    void makeSound();  // 인터페이스 메서드는 본문이 없음 (추상 메서드)
}

// Dog 클래스는 Animal 인터페이스를 구현
class Dog implements Animal {
    public void makeSound() { // 반드시 구현해야 함
        System.out.println("멍멍!");
    }
}

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

위 코드에서 Dog 클래스는 Animal 인터페이스를 implements 키워드로 구현했으며, 인터페이스의 메서드를 반드시 재정의해야 했습니다.


 

2. extends와 implements의 차이점

구분 extends (상속) implements (구현)

적용 대상 클래스 -> 클래스 클래스 -> 인터페이스
개념 부모 클래스의 속성과 동작을 물려받음 인터페이스의 메서드를 구현해야 함
다중 사용 단일 상속만 가능 (하나의 부모 클래스만 상속) 다중 구현 가능 (여러 개의 인터페이스 구현 가능)
메서드 구현 부모 클래스의 메서드를 그대로 사용하거나 오버라이딩 인터페이스의 모든 메서드를 반드시 구현해야 함
접근 제어 부모 클래스의 protected 또는 public 멤버 접근 가능 인터페이스는 기본적으로 public 메서드만 가짐
키워드 사용 extends implements

 

 

3. extends와 implements 함께 사용하기

Java에서는 클래스가 extends로 다른 클래스를 상속받으면서 동시에 implements를 사용하여 여러 개의 인터페이스를 구현할 수 있습니다.

예제

interface Animal {
    void eat();
}

interface Pet {
    void play();
}

// Dog 클래스는 Animal 클래스를 상속하고, Pet 인터페이스를 구현
class Dog extends Animal implements Pet {
    public void eat() {
        System.out.println("강아지가 음식을 먹습니다.");
    }

    public void play() {
        System.out.println("강아지가 놀고 있습니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();   // 강아지가 음식을 먹습니다.
        dog.play();  // 강아지가 놀고 있습니다.
    }
}

이처럼 extends와 implements를 동시에 사용할 수 있으며, 클래스 상속을 활용하면서도 여러 개의 인터페이스를 구현할 수 있습니다.


 

4. extends와 implements의 활용 예시

4.1 extends를 활용한 상속 관계 예시

상속을 사용하면 기존 코드를 재사용하면서도 새로운 기능을 추가할 수 있습니다.

class Vehicle {
    void move() {
        System.out.println("이동 중...");
    }
}

class Car extends Vehicle {
    void move() {
        System.out.println("자동차가 달립니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.move();  // 자동차가 달립니다.
    }
}

 

 

4.2 implements를 활용한 다중 인터페이스 구현 예시

인터페이스를 활용하면 코드의 결합도를 낮추고 유연성을 높일 수 있습니다.

interface Engine {
    void start();
}

interface Wheels {
    void roll();
}

class Car implements Engine, Wheels {
    public void start() {
        System.out.println("엔진이 시작됩니다.");
    }

    public void roll() {
        System.out.println("바퀴가 굴러갑니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.start();  // 엔진이 시작됩니다.
        car.roll();   // 바퀴가 굴러갑니다.
    }
}

이처럼 implements를 사용하면 여러 개의 인터페이스를 구현하여 보다 유연한 설계를 할 수 있습니다.


 

 

5. extends와 implements 선택 기준

  • 상속(extends): 부모 클래스의 기능을 그대로 사용하거나 일부 변경하고 싶다면 상속을 사용합니다.
  • 구현(implements): 특정 동작을 보장해야 하는 경우(예: 인터페이스의 메서드를 반드시 구현해야 하는 경우) implements를 사용합니다.
  • 둘 다 사용 가능: 클래스 상속을 활용하면서도 다중 인터페이스 구현이 필요하면 둘 다 사용할 수 있습니다.

6. 결론

Java에서 extends와 implements는 객체지향 프로그래밍의 핵심 개념으로, 각각 상속과 인터페이스 구현에 사용됩니다.

  • extends는 클래스의 상속을 의미하며, 코드 재사용성을 높이고 부모 클래스의 기능을 확장할 수 있습니다.
  • implements는 인터페이스의 구현을 의미하며, 다중 구현이 가능하고 유연한 설계를 도와줍니다.
  • 필요에 따라 extends와 implements를 동시에 사용할 수도 있습니다.