## 상속이란 무엇인가? 

상속은 Parent 와 Child로 설명을 많이 하고는 하는데 정작 사용하는 방법에만 집중하여 본질을 놓치고는 한다(이건 내얘기임;;) 

상속을 사용하는 가장 큰 목적은 우리가 편하기 위함이다(잉? 뭔소리 뭔들 불편하고자 쓰겠냐...)

위에서 말한 편함은 정확히는 "코드의 중복"을 줄이기 위하여 사용한다. 

 

## 자바 상속의 특징 

자바 상속의 특징을 알기 위해서는 먼저, 상속을 어떻게 하는지 부터 시작해야겠다. 우선 Child 클래스인 Student 는 Person 클래스를 "extends" 해야 상속받을 수 있다. 자식 부분과 부모 부분은 각각의 생성자가 담당하여 책임지는데 이때,

1) extends 는 Person 하나 밖에 받을 수 없다. 

2) private 으로 정의된 멤버변수는 Child에서 상속받으나(개체에서 확인할 수 있으나) 메소드는 불가능하다. 

3) 모든 클래스의 Parent Class 는 Object 클래스이다. 

4) super 키워드에서도 알 수 있듯이 생성자는 상속받지 않는다.

 

public class Person {
    public String name;
    public int age;
    private String onlyForBase;

    Person(String name, int age){
        this.name = name;
        this.age = age;
        System.out.println("Person Constructor is called");
    }

    public String sayMyName(){
        return this.name;
    }

    public int getAged(){
        return this.age + 1;
    }

    private String onlyForMe(){
        return this.onlyForBase;
    }

}

public class Student extends Person{

    Student(String name, int age){
        super(name, age);
        System.out.println("Student Constructor is called");
    }
}

## super 키워드

위의 코드에서 보았다싶이, super 키워드는 Parent 를 의미한다. 

super()로 하면 부모인 Person 의 생성자를 호출하고, 부모의 멤버변수 및 메소드에 접근하기 위해서는 super.name, super.sayMyName()으로 접근하면 된다. 

 

## 메소드 오버라이딩

위의 코드에서 부모의 sayMyName()을 오버라이드(재정의)하여 사용할 수 있다. 

    @Override
    public String sayMyName() {
        return "I am not you";
    }

## 추상 클래스

추상 클래스는 추상적인 클래스, 즉 개체를 생성할 수 없는 클래스를 의미한다. 위에서 상속을 활용한 예시인 Person 과 Student 는 모두 각각 Person 과 Student 의 개체를 만들 수 있었다. 그러나 abstract 키워드를 통해 작성한 추상 클래스인 경우에는 개체를 생성할 수 없다. 

다만 해당 추상 클래스를 상속받은 클래스에서는 추상 클래스를 사용할 수 있고 추상 메소드가 있는 경우에는 오버라이드해야 한다.

 

## final 키워드 

final은 사전적의미로 마지막이란 의미이다. 즉, 변수에 final 키워드를 지정한다면 상수가 되는 것이고, 메소드에 쓰인다면 메소드의 오버라이드가 불가능한 것이고 클래스에 쓰인다면 상속이 불가능한 것이다! 

 

## Object 클래스

Object 클래스는 모든 클래스가 상속받는 대상이다. 

새롭게 클래스를 만들고 아무 메소드도 정의하지 않아도, 기본적으로 보이는 몇개의 메소드들이 바로 Object 클래스에서 상속받기 때문에 확인할 수 있는 메소드(equals.. 등) 이다. 

 

메소드의 종류 및 내용에 대해서는 docs.oracle.com/javase/8/docs/api/java/lang/Object.html 서 보면 될 것 이고 

특이한 점으로는 protected 메소드인 clone(), finalize() 메소드들은 분명히 상속을 받음에도 불구하고 사용이 불가능하였다. 

 

## 다이나믹 메소드 디스패치 

인터페이스 레퍼런스를 활용하는 방식과 유사하게 느껴지고 사용하는 목적은 다형성의 확보이다.

인터페이스 와 상속에서의 사용의 차이는 무엇일지가 궁금하다. 

 

Person d1 = new Teacher("", 40); // or could be new Student("", 41);

d1.sayMyName(); // Person 에 있는 sayMyName()이지만, Runtime 도중 구현체가 결정됨.

 

'가치코딩 [Java] > 기초문법' 카테고리의 다른 글

[Java 문법] 인터페이스  (0) 2021.03.05
[Java 문법] I/O  (0) 2021.03.04
[Java 문법] 어노테이션  (0) 2021.02.06
[Java 문법] enum  (0) 2021.02.04
[Java 문법] 패키지  (1) 2021.02.03

+ Recent posts