6장. 상속

3 minute read

목표

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

학습할 것

자바 상속의 특징

  1. extents 키워드를 사용한다.
    public class Dog extents Animal {}
    
  2. 다중 상속이 불가능하다.
    public class Dog extents Animal, SomeClass{}
    
  3. 우리 눈에는 모이지 않지만 모든 class는 Object라는 class를 상속받음 그러기 때문에 기본적으로 Object가 제공하는 메소드를 사용할 수 있다.

super 키워드

super

해당 키워드는 상속을 받았을 때 부모의 변수, 메소드를 사용하기 위해서 사용하는 키워드이다.

super.print()

위와 같이 사용할 수 있다.

근데 궁금한 것은 과연 부모의 private 메소드도 접근할 수 있을까?

테스트해본 결과로는 private 으로 된 메소드를 가져오지 못하는 것으로 확인했다.

super()

부모의 상속을 받게 되는 경우 부모 클래스의 객체를 만들어준다는 개념으로 부모의 생성자를 실행해줘야된다. 실제로 log를 찍어보게 되면 super()으로 인해서 부모 생성자가 실행된다.

중요한 특징으로 반드시 super()은 자식 생성자의 맨처음에 실행되어야 한다.

메소드 오버라이딩

오버라이딩 (Overriding)

상속 받은 메소드를 다시 재정의할 때 사용한다.

부모에 getMoney()라는 메소드가 있다고 했을 때 부모와 자식 클래스 모두 해당 값을 다르게 반환해야되는 경우가 존재한다. 왜냐하면 각 객체마다 가져야되는 상태가 다르기 때문이다.

public class Parents {

    public Parents() {
        System.out.println("부모 생성자 실행");
    }

    private void print() {
        System.out.println("부모 private method");
    }

    public Long getMoney() {
        return 10L;
    }
}

public class Child extends Parents {

    public Child() {
        super();
        System.out.println("자식 생성자 실행");
    }

    @Override
    public Long getMoney() {
        return 1L;
    }

    public void callParentPrivateMethod() {
        // 안됩니다. 에러 메시지가 나옵니다.
        // java: print() has private access in week6.Parents
         // super.print();
    }
}

@Override 키워드는 사용하지 않아도 되지만 하는 것이 Best practice이기 때문에 하는것이 좋다. 그리고 intellij를 사용하는 경우 오버라이딩하면 자동으로 만들어준다. 만약 오버라이딩이 아닌데 해당 어노테이션이 있으면 컴파일 에러가 발생한다.

오버로딩 (Overloading)

같은 이름의 메소드를 여러개 만들 수 있게 해준다.

public void print(int number) {
    System.out.println(number);
}

public void print(String string) {
    System.out.println(string);
}

같은 메소드 이름이지만 매개변수에 따라서 다르게 동작할 수 있다.

하지만 밑에와 같은 경우는 제대로 동작하지 않는다.

public void print(int number) {
    System.out.println(number);
}

public int print(int number) {
    System.out.println(number);
    return number;
}

---
Compile error message

'print(int)' is already defined in 'week6.Child'

반환타입이 다른 경우는 오버로딩이 안되면 반드시 파라미터의 수, 파라미터의 타입에 따라서 달라진다.

추상 클래스

추상 메소드를 가지고 있는 class를 추상 클래스라고 한다. Abstract라는 키워드를 꼭 붙여주어야 한다. (컴파일에서 잡아준다.)

단순히 abstract 키워드가 있다고 해서 꼭 abstract 메소드가 존재하는 것은 아니지만 abstract 메소드가 없으면 큰 의미가 없다고 생각하기에 그렇게 적었다.

추상 클래스는 인스턴스 만들지 못한다. 바로 만들고 싶은 경우 선언과 동시에 구현을 해야된다.

abstract public class AbstractParents {

    public AbstractParents() {
        System.out.println("부모 생성자 실행");
    }

    private void print() {
        System.out.println("부모 private method");
    }

    abstract public Long getMoney();
}

public static void main(String[] args) {
    AbstractParents abstractParents = new AbstractParents() {
        @Override
        public Long getMoney() {
            return 5L;
        }
    };
}

일단 abstract 메소드는 구현이 되어 있지 않은 메소드이다. 상속받았을 경우 해당 메소드를 구현하지 않은 해당 클래스도 abstract 클래스가 되고 인스턴스를 만들지 못한다.

가장 큰 장점은 구현에 대한 강제성이 있다. 그리고 그것을 통한 상속받은 여러 클래스를 동시에 컨트롤할 수 있는 장점이 있다.

final 키워드

선언과 동시에 그 이후에 재선언을 하지 못하도록 하는 키워드이다.

final class

final 키워드가 붙은 class는 상속을 할 수 없다.

final method

메소드의 오버라이딩을 하지 못하게 한다. final 메소드는 자식에서 재정의가 불가능하다.

final variable

한번 선언 이후에 값을 다시 assign 하지 못한다.

final Long number = 5L;
number = 10L; // <- 에러 발생

하지만 주의해야되는 것은 객체인 경우 내부 값을 변경할 수 있다.

final List<Long> list = new ArrayList<>;
list.add(1);
list.add(2);
list.add(3);

---
final List<Long> list = new ArrayList<>;
list.add(1);
list.add(2);
list.add(3);

list = new ArrayList<>; // <- 에러 발생

위에 처럼 사용해도 아무 문제 없다. 단순히 재정의하는 것을 막는 역할을 한다.

Object 클래스

모든 클래스의 상위 개념으로 존재하는 클래스이다.

Object 클래스 내부에 존재하는 모든 메소드가 모든 클래스 내부에서 사용 가능하다.

Object method 설명 출처: http://www.tcpschool.com/java/java_api_object

다이나믹 메소드 디스패치 (Dynamic Method Dispatch)

과제 코드

github

라이브 방송

방송 중 내용

  • double dispatch
    • 예제를 일단 잘 봐야됨.
    • if문을 처리하기 위해서 참 적절히 사용 가능
    • dispatch를 진행하는데 있어서 어떤 SNS인지 확인하고
    • 그 이후에 SNS안에서 어떤 메소드를 호출할 것인지에 대해서 또 확인.
    • 그러기 때문에 2번의 dispatch가 진행된다.
  • visitor 패턴
    • dom parser
    • sax parser?
  • Object 객체를 사용하는 이유
    • 모든 것을 오브젝트를 이용해서 사용하기 위해서.
    • 모든 클래스 인스턴스를 지정할 수 있는 다룰 수 있는 것이 필요했기 때문에 최상위에 Object라는 친구를 만듬

7주차 과제

  • static import까지
  • classpath 관련

베스트 글 모음

https://blog.naver.com/swoh1227/222181505425

https://blog.naver.com/swoh1227/222181505425

https://www.notion.so/e5c33507880b4d098f83a2c4f8f02c04

https://roeldowney.tistory.com/486

Leave a comment