도라에몽주머니

[Java] extends, implements의 차이 본문

Programming/Java

[Java] extends, implements의 차이

에몽쓰 2022. 10. 11. 00:33

개요

기사시험 준비하면서 다시 자바를 복습하던 중, 오랜만에 implements 문제를 봤는데 오랜만에 봐서 개념이 가물가물했다.

이번 기회에 인터페이스, 상속 등에 관해 자세히 정리해두려고 한다.

 

상속(inheritance) 이란?

기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.

쉽게 이야기하면 현실에서 부모에게 재산 등을 자식이 상속받듯이, 부모 클래스로부터 정의된 메소드를 자식 클래스가 상속받아 부모의 클래스를 재정의하는 것이다.

  • 부모 클래스 : 자식 클래스에게 상속해주는 클래스
  • 자식 클래스 : 부모 클래스의 모든 특성을 물려받아 새롭게 작성된 클래스

출처: http://www.tcpschool.com/java/java_inheritance_concept

 

상속의 형태

상속에는 여러가지 형태가 있는데 여기에서는 헷갈리기 쉬운 extends와 implemets만 정리해보려 한다.

  • extends : 부모에서 선언정의를 모두하며, 자식은 부모의 변수나 메소드를 오버라이딩할 필요 없이 그대로 사용할 수 있다. (다중상속 지원 X)
  • implements : 부모 객체는 선언만 하며, 정의는 반드시 자식이 오버라이딩해서 사용해야 한다. (다중상속과 같은 기능을 함)
더보기

✔️ 오버라이딩

상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니처를 갖는 메소드로 다시 정의하는 것이다.

 

참고 : http://www.tcpschool.com/java/java_inheritance_overriding

 

extends

  • 상속의 가장 대표적인 형태
  • 모든 선언/정의를 부모가 하며, 자식은 오버라이딩 할 필요 없이 부모의 메소드/변수를 그대로 사용할 수 있다. (필요에 따라 오버라이딩 해도 상관 X)
  • Java에서는 다중상속을 지원하지 않는다. (= 부모클래스가 두 개 이상 존재할 수 없다.)
public class Son extends Father, Mother{...} // 에러 발생(다중상속 지원 X)

 

- 예제 코드

class Vehicle {
  protected int speed = 3;
  
  public int getSpeed(){
    return speed;
  }
  public void setSpeed(int speed){
    this.speed = speed;
  }
}

class Car extends Vehicle{
  public void printspd(){
    System.out.println(speed);
  }
}

public class ExtendsSample {
  public static main (String[] args){
    Car A = new Car();
    System.out.println(A.getSpeed());
    A.printspd();
  }
}

Car 클래스는 Vehicle을 상속받아 getSpeed() 메소드를 사용해 바로 speed를 출력했다.

extends를 통해 Car 클래스로 부모의 메소드인 getSpeed() 뿐 아니라 변수인 speed까지 직접 사용한 것을 확인할 수 있다.

 

implements

  • 부모에서는 선언만 하며 반드시 자식은 부모의 메소드를 오버라이딩 해야한다.
  • 다중상속과 같은 기능을 지원한다.
public class Son implements Father, Mother{...} // 에러 발생 X

 

- 예제 코드

interface TestInterface{
  public static int num = 8;
  public void fun1();
  public void fun2();
}

class InterfaceExam implements TestInterface{
  @Override
  public void fun1(){
    System.out.println(num);
  }
  
  @Override
  public void fun2() {
    
  }
}

public class InterfaceSample{
  public static void main(String args[]){
    InterfaceExam exam = new InterfaceExam();
    exam.fun1();
  }
}

 

 

Reference

https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4

https://wooono.tistory.com/261