상속

조현태·2023년 3월 23일
0

✨ 상속이란? (Inheritance) ✨

참고자료
객체지향프로그램의 특징

  • 상자 하나하나는 모두 클래스(class)입니다.
    이러한 계층을 표현하기 위해 만들어진 것이 바로 상속입니다.

  • 하위 객체는 상위 객체 (부모)의 특징을 물려받습니다.

이 메소드 OR 변수를 '구현'하는가 그대로 '사용'하는가에 따라서 상속의 형태가 갈리게 됩니다.

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

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


✨ extends (상속) ✨

extend란?

  • 상속의 대표적인 형태
  • 부모의 메소드를 그대로 사용할 수 있으며 오버라이딩 할 필요 없이 부모에 구현되있는 것을 직접 사용 가능합니다.
// 부모 클래스
class Vehicle {
  protected int speed = 10;
  
  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 Main {
  public static main (String[] args){
    Car A = new Car();
    System.out.println(A.getSpeed());
    A.printspd();
  }
}

위의 코드에서 Car클래스는 Vehicle을 상속 받았습니다.
따라서 부모 클래스의 getSpeed() 메소드로 speed를 반환받을 수 있고
Car클래스의 printspd 메소드에서 speed변수를 직접 바로 사용할 수도 있습니다.
extends를 했으니 메소드 뿐만 아니라 변수까지 사용이 가능해 지는 것입니다.

여기서 특징은 Java는 "다중상속"을 지원하지 않는다는 입니다.

다중상속이란 부모 클래스가 두개 이상 존재할 수 있다는 것인데, 자바에서는 이를 지원하지 않습니다.
코드로 설명하자면, public class Son extends Father, Mother{...}같은 코드는 지원하되지 않는다는 것입니다..

이를 해결하기 위해 존재하는 것이 implements(인터페이스)입니다.

접근제어자

코드에서 protected를 사용했는데 여기서 접근제어자에 대해 가볍게 설정하자면
public : ALL
protected : 상속 OR 동일 패키지
default : 상속 && 동일패키지
private : 클래스, { }내부


✨ implements (상속) ✨

implements란?

  • interface를 상속하기 위해 사용됩니다.
    - 다중 상속이 가능합니다.
  • 부모의 메소드를 반드시 오버라이딩해야합니다.
// 부모 클래스 (인터페이스)
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 Main{
  public static void main(String args[]){
    InterfaceExam exam = new InterfaceExam();
    exam.fun1();
  }
}

implements를 사용하면 public class Son implements Father, Mother{...}같은 코드가 가능해집니다.

implements의 가장 큰 특징은 이렇게 부모의 메소드를 반드시 오버라이딩해야 한다는 것입니다.
fun1, fun2와 같은 함수를 interface에 정의만 하고 자식 클래스에서 오버라이딩하는 것입니다.

내용을 좀 더 추가하자면

  • implementinterface 상속에 사용하지만 interfaceinterface를 상속 받을 땐 extends를 사용해야합니다.
  • implements한 클래스는 implements의 내용을 다 사용해야 합니다.
  • implements는 설계 목적으로 구현 가능하다.


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

0개의 댓글