Jay's Developer Note

[JAVA] Class - 5(상속) 본문

JAVA

[JAVA] Class - 5(상속)

Jay(J) 2022. 4. 2. 20:45
728x90

상속(Inheritance)

상속(inheritance)은 아주 매력적이다.

우리가 흔히 알고 있는 부모-자식 간에 상속과 동일하게 생각할 수 있다.

부모는 자식에게 유전자를 물려줄 수 있고 재산도 물려줄 수 있고 자식은 물려받은 것들을 사용할 수 있다.

부모가 없이는 자식이 존재할 수 없으며 자식은 부모가 필히 한 개이어야 한다.

부모클래스는 상위클래스, 수퍼클래스라고도 불리고 자식클래스는 하위클래스, 서브클래스라고도 불린다.

부모, 자식의 동일한 이름

부모와 자식은 1:N 관계가 되어야 한다.

부모:자식 = 1:N

 

사용방법

extends 를 사용하여 부모클래스를 상속받는다.

[접근 제어자] class ClassName extends SuperClassName

부모클래스를 특정하지 않으면 Object 클래스를 상속받는다.

[접근 제어자] class ClassName [extends Object]

이전 게시글들에서 사용했던 소스를 활용해보겠다. https://fall-in-it.tistory.com/38

class Car {
  public static String brand = "Hyundai";
  int maxSpeed;
  private String assembler;
}

class Avante extends Car { }
class Sonata extends Car { }
class Grandeur extends Car { }

Car 클래스를 Avante, Sonata, Grandeur 클래스가 상속받았다.

각 클래스는 brand 라는 멤버 변수만 접근할 수 있다. 이전 게시글들에서 봤던 접근 제어자를 다시 상기하여 복습해보자.

접근 제어자
class Car {
  public static String brand = "Hyundai";
  int maxSpeed;
  private String assembler;
}

class Avante extends Car {
  public String getBrand() {
    // public 이기 때문에 접근 가능
    return brand;
  }
  public String getAssembler() {
    // private 이기 때문에 접근 불가
    return assembler;
  }
}

 

super & super( )

상속을 받게 되면 super 라는 키워드와 super( ) 메소드를 사용할 수 있다.

super 키워드는 상위클래스를 참조할 수 있는 키워드다.

super( ) 메소드는 상위클래스의 생성자를 호출할 때 사용한다. 상위클래스의 생성자를 호출하는 것이기 때문에 하위클래스의 생성자에서만 호출되어야 한다.

 

super 키워드 사용방법
// public, protected 만 호출 가능
super.상위클래스의 멤버 변수
super.상위클래스의 메소드( )
class Car {
  public static String brand = "Hyundai";
  protected int maxSpeed;
  private String assembler;
}

class Avante extends Car {
  public int getMaxSpeed() {
    // protected 이기 때문에 접근 가능
    return super.maxSpeed;
  }
}
super( ) 메소드 사용방법
super( )
super(매개 변수1, ...)
class Car {
  public Car() {
    System.out.println("생성");
  }
}

class Avante extends Car {
  public Avante() {
    super();
  }
  public String getBrand() {
    // Error
    // 생성자에서만 호출해야 함
    super();
  }
}

 

오버라이딩

오버라이딩(Overriding)은 상위클래스에 있는 메소드와 똑같은 메소드를 하위클래스에서 재정의해서 사용하는 것이다.

메소드의 반환타입, 이름, 매개 변수까지 전부 동일해야만 한다.

private, static, final 로 선언된 경우에는 오버라이딩할 수 없다.

class Car {
  public void print() {
    System.out.println("Super Print");
  }
  public final void println() {
    System.out.println("Cannot Override\n");
  }
}

class Avante extends Car {
  public void print() {
    System.out.println("Sub Print");
  }
  // 반환 타입이 다르면 오버라이딩 성립 X
  public String print() { }
  // final 은 오버라이딩 성립 X
  public void println() { }
}
728x90