## 상속이란 무엇인가?
상속은 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 |