본문 바로가기

Java

자바 상속 기본

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

상속


상속과 다형성은 객체지향의 '꽃'이라고 해도 과언이 아닙니다.

오늘은 자바의 상속에 대해서 알아보겠습니다.

 

상속이란, 상위 클래스의 필드, 메서드를 하위 클래스가 물려받는 것을 의미합니다.

그래서 상속을 통해 '올바른 상속관계'에 있는 클래스들을 정의한다면

하위 클래스에서 동일한 필드나 메서드를 재정의할 필요가 없기 때문에 코드가 간결해지고 유지보수가 쉽습니다.

 

여기서 말하는 올바른 관계에는 IS-A 관계가 대표적입니다.

IS-A는 말 그대로 '일종의 ~인 관계이다' 라고 정의합니다.

간단한 예로 학생과 사람이 있다면

학생은 일종의 사람입니다.

 

사람이 갖는 기본적인 특성인 머리, 팔다리, 이름 등을 그대로 갖고

말하기, 걷기 등의 기본적인 행동도 갖습니다.

 

거기에 더하여 공부하기, 시험보기 등의 행위를 추가할 수 있습니다.

위와 같은 관계에서 사용하는 것이 상속입니다.


 

자바에서 상속


  1. 자바에서는 상속시 다중 상속을 지원하지 않습니다. (인터페이스는 다중 구현 가능)
  2. 자바의 모든 클래스는 Object 클래스를 상속받습니다.
    직접 만든 클래스가 아무 클래스도 상속받지 않고 있다고 해도, 컴파일러에 의해서 자동으로 Object 클래스를 상속받게 됩니다.

 

기본 사용법


class Student extends Person {
    int grade;

    void study() {}
    
    public static void main(String[] args) {
        Student student = new Student();
        student.age = 10;
        student.speak();
    }
}

class Person {
    int age;
    String name;
    
    void speak() {}
    void run() {}
}

상속은 extends라는 키워드를 사용해서 표현합니다.

위 예시에서 Student 클래스는 Person 클래스를 상속받았습니다.

그러므로 Student 클래스는 age, name 필드들과 speak(), run() 메서드를 그대로 상속받습니다.

위에서 student에서 상위 클래스의 필드인 age나 메서드인 speak()에 접근하고 있음을 볼 수 있습니다.


 

메모리 구조


상속시 메모리 구조에 대해서 알아보겠습니다.

예시는 위에서 든 예시와 같습니다.

 

위와 같은 메모리 구조가 만들어집니다.

그래서 하위 클래스에서 상위 클래스의 멤버나 메서드에 접근이 가능합니다.


 

상속에서 접근 지정자


 

예를 보겠습니다.

class SuperClass {
    private int a;
    int b;
    protected int c;
    public int d;
}

class SubClass extends SuperClass{

    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.a = 10; //컴파일 에러
        subClass.b = 10; //같은 패키지라면 OK, 다른 패키지라면 컴파일 에러
        subClass.c = 10;
        subClass.d = 10;
    }
}

접근 지정자에 따라서 바뀜을 볼 수 있습니다.

 

여기서 눈여겨봐야 할 것은 private와 protected입니다.

부모에서 private필드는 자식 클래스에서 다이렉트로 접근할 수 없습니다.

(부모 클래스의 메서드나 다른 방법으로 접근해야 함)

접근할 수 없다고 해서, 상속받지 않는 것이 아닙니다. 상속은 받으나 접근할 수 없을 뿐입니다.

 

protected는 다른 패키지라도 자식 클래스에서 접근 할 수 있습니다.


 

'Java' 카테고리의 다른 글

(상속) 생성자 호출  (0) 2021.05.07
(상속) 부모 클래스 접근  (0) 2021.05.07
Java static / non-static  (0) 2021.05.06
Java의 패키지와 접근 지정자  (0) 2021.05.06
생성자  (0) 2021.04.13