본문 바로가기

Contact English

【java】 4강. 상속(inheritance)

 

4강. 상속(inheritance)

 

추천글 : 【JavaJava 목차 


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 Parentp 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