오늘의 인기 글
최근 글
최근 댓글
Today
Total
03-29 12:36
관리 메뉴

우노

[Java] extends, implements의 차이 본문

Language/Java

[Java] extends, implements의 차이

운호(Noah) 2021. 3. 12. 13:41

상속(Inheritance)이란?

  • 상속에 대해서 다루기 전에 우선, OOP(Object-Oriented Programming, 객체지향프로그래밍)가 무엇인지에 대해 알고 있어야한다.

    • OOP는 다음과 같은 특징을 가지고 있다.
      • 상속과 인터페이스 (계층성)
      • 다형성, 사용편의성 (모듈화)
      • 캡슐화, 정보은닉
      • 자료 추상화 (모델링)
      • 동적 바인딩
  • 아래 그림을 통해, 상속에 대해 이해해보자.

  • 상자 하나하나는 모두 객체(Object)이고, 자바 용어로는 Class이다.

  • 이러한 계층을 표현하기 위해 만들어진 것이 바로 상속이다.

  • 상속 시, 하위 객체(자식)는 상위 객체(부모)의 특징(메소드, 변수 등)을 물려받게 된다.

  • 이 때, 상위 객체(부모)의 특징(메소드, 변수 등)을 '새롭게 구현'하는가, '그대로 사용'하는가에 따라서 상속의 형태가 갈리게 된다.

    • extends
      • 부모에서 선언/정의를 모두하며, 자식은 오버라이딩 할 필요 없이 부모의 메소드/변수를 그대로 사용할 수 있다.
      • "부모의 특징을 연장해서 사용한다."라고 기억하면 될 듯!
    • implements (interface 구현)
      • 부모 객체는 선언만 하며, 정의는 반드시 자식이 오버라이딩해서 사용한다.
      • "부모의 특징을 도구로 사용해 새로운 특징을 만들어 사용한다."라고 기억하면 될 듯!
    • abstract
      • extends와 interface의 혼합이다.
      • extends를 사용하지만, 몇 개는 추상 메소드로 구현되어 있다.

extends

  • 사실 extends가 상속의 대표적인 형태이다.

  • 모든 선언/정의를 부모가 하며, 자식은 오버라이딩 할 필요 없이 부모의 메소드/변수를 그대로 사용할 수 있다.

  • 물론, 필요에 따라 오버라이딩 해도 상관 없다.

  • 예제 코드

      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 클래스의 변수와 메소드를 상속 받았다.

  • 따라서, Car 클래스는 Vehicle 클래스의 speed, getSpeed(), setSpeed()를 사용할 수 있다.

  • 하지만, Java는 "다중상속"을 지원하지 않는다.

  • 즉, 부모 클래스가 두 개 이상 존재할 수 없다는 것이다.

    • ex) public class Son extends Father, Mother {...}
  • 하지만, Java는 implements를 사용해 여러 interface를 상속 받을 수 있다.

implements

  • 부모는 선언만 하며, 반드시 자식이 정의를 오버라이딩해서 사용한다.

  • 예제 코드

      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();
        }
      }
  • 사실, "이러한 구현은 부모의 메소드를 어차피 재정의해야하니 '상속'의 의미가 없지 않나?"라고 할 수 있지만,

  • Java와 c#의 인터페이스 상속은, 계약 및 분류의 의미가 강하다고 한다.

정리

  • extends는 클래스 한 개만 상속 받을 수 있으며, 자식 클래스는 부모 클래스의 기능을 사용할 수 있다.
  • implements는 여러 개의 interfaces를 상속 받을 수 있으며, 자식 클래스는 부모의 기능을 다시 정의해서 사용해야한다.

참고

Comments