4강. 상속(inheritance)
추천글 : 【Java】 Java 목차
1. 상속
2. 상속 관련 예제
3. final
4. interface
a. GitHub
1. 상속
⑴ 개요
① 정의 : 특정 class의 내용을 전부 갖추면서 목적에 따라 추가적으로 내용을 덧붙이는 것
② java의 모든 class은 Object class를 상속함
○ toString() // object의 String 표현을 반환함
○ getClass() // object의 클래스를 나타내는 Class object를 반환함
○ equals() // value-based object equality를 정의함
○ finalize(), clone(), hashCode(), wait(), notify(), notifyAll()
⑵ 목적
① class 간의 hierarchy를 구성하여 프로그래밍을 보다 단순화시키기 위함
② 불필요한 코드 반복을 제거함
⑶ 문법
① 다른 패키지에 있는 다른 public class도 상속할 수 있음
② instanceof : 어떤 instance가 특정 class의 instance인지를 확인하는 명령어
○ instanceof는 actual type을 따라감
○ 즉, Parent p = new Child();인 경우 p instanceof Parent와 p instanceof Child 모두 true
③ getClass().getName() : actual type을 return
④ 상속할 때 함수 일부를 못 쓰게 하는 것은 가능함
○ parent Class에 private으로 method 및 attribute를 정의하면 가능함
○ 상속의 취지를 고려하면 바람직하지 않음
⑤ java는 multiple inheritance를 지원하지 않음
○ A extens B, C 등이 불가능하다는 의미
○ diamond problem
○ (참고) C++에서는 multiple inheritance가 가능하지만 diamond problem에서 에러가 날 수 있음
⑥ super
○ super();를 통해 parent class의 생성자를 호출할 수 있음
○ 생성자에서 super();를 쓰지 않아도 implicit하게 호출됨
class Point extends Geometry {
Point(){ }
}
class Point extends Geometry {
Point() { super(); }
}
○ super.super();와 같은 용법은 불가능함
○ child class에서 super();가 constructor에서 다른 명령어 뒤에 나오면 다음 컴파일 에러가 뜸
Call to 'super()' must be first statement in constructor body
2. 상속 관련 예제
⑴ 예제 1.
Figure. 1. 상속 예제 1
public class Main{
public static void main(String[] args){
B b = new B();
b.c(); // B
}
}
class A{
public void a(){
b();
}
public void b(){
System.out.println("A");
}
}
class B extends A{
public void b(){
System.out.println("B");
}
public void c(){
super.a();
}
}
① super.a();는 문자 그대로 b();를 나타냄
⑵ 예제 2.
Figure. 2. 상속 예제 2
public class Main{
public static void main(String[] args){
B b = new B();
b.c(); // A
}
}
class A {
public void a() {
b();
}
private void b() {
System.out.println("A");
}
}
class B extends A {
private void b() { // no matter if "public void b()"
System.out.println("B");
}
public void c() {
super.a();
}
}
⑶ 예제 3.
Figure. 3. 상속 예제 3
public class Main{
public static void main(String[] args){
B b = new B();
b.c(); // A or error
}
}
class A {
public void a() {
b();
}
public void b() {
System.out.println("A");
}
}
class B extends A {
private void b() {
System.out.println("B");
}
public void c() {
super.a();
}
}
3. final
⑴ final class
① subclass를 만들 수 없음
② 에러 메시지 : java: cannot inherit from final ###
⑵ final method
① parent method가 될 수 없음 : final method를 가지고 있는 클래스가 final class일 필요는 없음
② 에러 메시지 : java: method() in Child cannot override method() in Parent overriden method is final
⑶ final variable
① 한 번 선언되면 값이 바뀔 수 없음. C에서의 const와 유사함
② 에러 메시지 : java: cannot assign a value to final variable origin
4. interface
⑴ 목적
① class를 구현하는 데 있어 청사진을 제공하기 위함 : class에게 있어 일종의 계약의 성격
② class가 extends 할 수 있는 알려진 interface를 제공하기 위함
⑵ 문법
① attribute는 모두 public, static, final
○ 굳이 명시하지 않아도 implicit하게 설정됨
○ 다른 access modifier를 쓰는 경우 compile error가 일어남
② method는 대부분 abstract method
○ method가 default method인 경우 : 확정적으로 특정 method를 정의할 수 있음
○ 이 경우 굳이 class에서 정의하지 않아도 자동으로 override됨
○ (출제 예상) (참고) java 8로 업데이트 되면서 abstract가 아니어도 됨
③ class가 해당 interface를 사용하기 위해 class B implements A { ··· }와 같이 입력
○ public interface는 public class가 implements하는 경우를 지칭
④ multiple interface 지원 : 한 class가 여러 interface를 implements하는 게 가능함
⑤ 다른 interface를 extends하는 interface도 가능함
○ interface에 implements를 쓸 수 없음
○ @Override를 쓸 수 있음
⑥ 인터페이스 하위 클래스 선언 시 종종 인터페이스로 explicit하게 선언함
○ 이유 : 인터페이스 하위 구현 클래스 간의 교체를 용이하게 하기 위함
○ I i = new A(); i = new B(); // no error
⑶ 예시
① List<E> interface
○ ArrayList<E>, LinkedList<E>, Stack<E>, Vector<E> 등은 List<E>를 implement함
② Comparable<T> interface
○ 문법 : classA implements Comparable<A>
○ compareTo() 메소드를 override함으로써 String 등에서도 compareTo() 메소드를 사용할 수 있음
○ Array.sort() 메소드, TreeSet 등 크기 비교가 중요한 상황에서 중요함
③ Queue interface
○ LinkedList 등
⑷ (구별개념) abstract class
① 특징
○ abstract method : child class가 어떤 method를 override하기를 바라는 경우
○ abstract method를 가지고 있는 class는 반드시 abstract class여야 함
○ abstract class는 instance를 생성할 수 없음
Cannot instantiate the type ...
② abstract class를 사용하는 이유
○ child class들이 same logic과 common interface를 공유하기 위해
○ public static final을 제외한 modifier를 사용하기 위해
○ (참고) abstract class를 이용하면 interface의 대부분의 기능을 구현할 수 있음
③ interface를 사용하는 이유
○ multiple inheritance를 지원하기 위해
○ 이를 위해 interface 간 hierarchy가 없음
④ 응용 1. 어떤 class에 abstract method가 있는 경우
○ 그 class는 반드시 abstract class여야 함
○ 그 method는 body 부분이 없어야 함
○ 그 class의 instance는 생성될 수 없어야 함
○ subclass에서 instance를 만들고 싶으면 subclass가 그 method를 non-abstract로 정의해야 함
⑤ (출제 예상) 응용 2. ArrayList<E>가 AbstractList<E>를 extends하고 List<E>를 implements하는 이유
○ Abstract<E>를 extends하지 않아도 기능은 동일함
○ 이유 1. 클릭해서 구현하는 interface를 쉽게 검색할 수 있게 해 줌
○ 이유 2. interface는 청사진 기능을 하므로 프로그래머에게 어떤 method가 들어가는지를 알려주기 위함
○ Why does ArrayList have "implements List"?
⑸ (구별개념) library : package, interface, class의 집합
입력: 2020.09.23 17:29
'▶ 자연과학 > ▷ Java' 카테고리의 다른 글
【Java】 Java 목차 (0) | 2020.09.23 |
---|---|
【Java】 5강. 다형성(polymorphism) (0) | 2020.09.23 |
【Java】 3강. 캡슐화 (0) | 2020.09.23 |
【Java】 2강. 클래스 (0) | 2020.09.23 |
【Java】 1강. 자바 시작하기 (0) | 2020.09.23 |
최근댓글