Study/java

[백기선님의 자바 라이브 스터디] 6주차 - 상속

에디개발자 2021. 2. 17. 00:05
반응형

www.youtube.com/watch?v=HLnMuEZpDwU 

나를 닮았다고 한다...

목표

자바의 상속에 대해서 학습하세요.

학습할 것 (필수)

  • 자바 상속의 특징
  • super 키워드
  • 메소드 오버라이딩
  • 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • final 키워드
  • Object 클래스

자바 상속의 특징

상속이란?
상위 클래스에서 선언 된 변수나 메서드를 하위 클래스에서 동일하게 사용할 수 있다.

자바 상속은 extends 를 사용합니다.

모든 클래스는 Object 객체를 상속받고 있습니다.

public class Study extends Basic {  // 상속

}
사용하는 이유?
코드의 재사용성을 높여주고 클래스 간 계층구조를 분류하고 관리하기 편해진다.

 

상속에는 여러가지 종류가 있습니다. 한개씩 살펴보겠습니다.

  • 단일 상속 : 1개의 클래스를 상속받는 것
    • A Class -> B Class
  • 다단계 상속 : N번에 걸쳐 상속받는 것
    • A Class -> B Class -> C Class 
  • 계층적 상속 : 하나의 클래스가 여러 자식 클래스를 상속하는 것
    • A Class -> B Class
    • A Class -> C Class
    • A Class -> D Class
  • 다중 상속 : 하나의 클래스가 여러 상위 클래스를 상속 받는 것 ( Java에서는 지원 X )
    • A Class -> B Class
    • C Class -> B Class

Super 키워드

자식 클래스에서 super를 사용하여 부모 클래스의 생성자에 접근할 수 있습니다.

// 부모
public class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }
}
// 자식
public class Dog extends Animal {
    public Dog() {
        super("navy");  // 부모 생성자 접근
    }
}

메소드 오버라이딩

자식클래스는 부모클래스의 메소드의 블록 내 로직을 재 정의할 수 있습니다. 이것을 오버라이딩이라고 합니다.

public class Animal {
    private String name;
    private Integer step;

    public Animal(String name) {
        this.name = name;
    }

    public void walking() {
        step++;
    }
}
public class Dog extends Animal {
    public Dog() {
        super("navy");
    }

    @Override		// 붙혀주는 것이 Best Practice!!
    public void walking() {
        System.out.println("걷는 시늉만 한다.");
    }
}

Annotation Override는 생략이 가능하나 명시해주자! 명시하지 않으면 이 메서드는 오버라이드 메소드인지 구별하기 힘들다!

 

다이내믹 메서드 디스패치 (Dynamic Method Dispatch)

먼저 메서드 디스패치가 무엇인가?

메서드를 호출할지 결정하고 어떻게 호출할지 결정하는 것을 말합니다. 메서드 디스패치는 정적(static), 동적(dynamic)으로 나누어 집니다.

Static Method Dispatch

위에서 작성한 예제를 정적 메서드 디스패치라고 합니다. Dog 클래스에서 부모 클래스인 Animal 클래스의 walking 메서드를 오버라이드로 재정의하였습니다. 그럼 컴파일러는 명확하게 오버라이드된 메서드의 로직을 실행하는 것을 알 수 있습니다. 이것을 정적 메서드 디스패치라고 합니다.

Dynamic Method Dispatch

동적 메서드 디스패치는 정적과는 다르게 컴파일러가 어떤 함수를 호출할 지 모르는 상태를 말합니다.

public interface Robot {
    void attack();
}
public class TaegunV implements Robot {
    @Override
    public void attack() {
        System.out.println("태권브이 주먹");
    }
}
public class GunDam implements Robot {
    @Override
    public void attack() {
        System.out.println("건담 주먹");
    }
}
public class Ground {
    private Robot robot;
    public Ground(Robot robot) {
        this.robot = robot;
    }

    public void run() {
        robot.attack();   // 어떤 클래스의 attack 메서드를 실행할까?
    }
}

추상 클래스

abstract class

추상 클래스는 말 그대로 추상적인 클래스입니다. 로직이 존재하는 메서드와 추상 메서드 둘 다 작성할 수 있습니다. 여기서 추상 메서드는 자식 클래스에게 강제로 메서드의 로직을 작성하게 만듭니다.

  • class 앞에 abstract를 선언하면 추상클래스
  • 하나 이상의 abstract 메서드를 선언하면 추상클래스
  • abstract 메서드는 구현이 불가
  • 추상클래스를 상속받은 클래스에서 강제로 구현
public abstract class Store {
    private String name;

    abstract int sell();	
    abstract int buy();

    public String getName() {
        return this.name;
    }
}
public class ToyStore extends Store {  // 추상 클래스 상속
    @Override
    int sell() {
        return 0;
    }

    @Override
    int buy() {
        return 0;
    }
}

위 코드를 보면 Store 클래스에서 abstract를 선언한 sell(), buy() 메서드가 존재합니다. 그리고 ToyStore에서 추상클래스인 Store를 상속받으면 강제로 2개의 메서드를 작성해야합니다.

final 키워드

클래스, 메서드, 변수 앞에 final을 작성하면 수정이 불가능합니다. 

final class 조상이 될 수 없는 클래스로 선언
method 메서드를 오버라이드하여 재정의 불가
변수 변수 값을 변경할 수 없는 상수

Class

public final class Parent {
}
public class Child extends Parent {
}

Method

public class Parent {
    public final void study() {
        System.out.println("parent study");
    }
}
public class Child extends Parent {
    @Override
    public void study() {
        super.study();
    }
}

변수

하지만 멤버변수를 상수로 선언할 경우 클래스 생성자에서 단 한번 초기화 할 수 있습니다.

public class Parent {
    private final String bookName;

    public Parent(String bookName) {	// 생성자에서 상수 초기화 가능
        this.bookName = bookName;
    }
}

Object Class

Object Class는 모든 메서드의 부모 클래스입니다. 아래 두 클래스는 동일한 클래스입니다.

public class Parent {

}

public class Parent extends Object {

}
Object클래스의 메서드 설 명
protected Object clone(   ) 객체 자신의 복사본을 반환
public boolean equals(Object obj) 객체 자신과 객체 obj가 같은 객체 여부 확인
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 호출
이 때 수행되어야하는 코드가 있을 때 오버라이딩한다.(거의 사용되지 않음)
public Class getClass() 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환
public int hashCode() 객체 자신의 해시코드를 반환
public String toString() 객체 자신의 정보를 문자열로 반환
public void notify() 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 사용
public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 사용
public void wait()
public void wait(long timeout)
public void wait(long timeout, int nanos)
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간동안 기다리게 한다.

 

반응형