[Java] 상속 - extends, implements

mando·2023년 9월 23일

상속이란


이러한 계층을 표현하기 위해 만들어진 것이 상속
하위 객체는 상위 객체의 특징을 물려받는다.

상위 객체의 메소드 또는 변수를 ‘구현’하는가 그대로 ‘사용’하는가에 따라서 상속의 형태가 갈리게 된다.

1. extends
부모의 선언 / 정의를 모두하며 자식은 메소드 / 변수를 그대로 사용할 수 있음

2. implements(interface 구현)
부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩(재정의)해서 사용해야함

3. abstract
extends와 interface 혼합. Extends하되 몇 개는 추상 메소드로 구현되어 있음

추상 메소드란?
자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드
자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함한 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하기 위함이다.

abstract 반환타입 메소드이름();

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();
  }
}

하나 짚고 가자면
자바는 “다중 상속”을 지원하지 않는다.

다중 상속이란 부모 클래스가 두 개 이상 존재할 수 있다는 것인데, 자바에서는 이를 지원하지 않는다.

자바에서는 다중 상속을 지원하지 않지만, 이를 해결하기 위해 implements(인터페이스)가 등장했다.

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();
  }
}

implements의 가장 큰 특징은 부모의 메소드를 반드시 오버라이딩(재정의)해야 한다.

Implements는 다중상속을 대신해준다.

public class Son implements Father, Mother {...}

Tip 오버라이딩과 오버로딩

오버라이딩이란 부모-자식 상속 관계에 있는 클래스에서 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것

오버로딩은 같은 클래스 내에서 이름이 같지만, 매개변수의 개수나 타입이 다른 메소드를 선언하는 것

profile
"This is the way"

0개의 댓글