📌16-1. 상속이 도움이 되는 상황의 소개

관리 대상이 둘인 경우, 두 개의 클래스를 만들어 관리를 해야 한다. 그런 경우에, 저장하는 데에도 2 개의 메소드, 참조하는 데에도 2 개의 메소드가 필요하고 관리 대상의 수가 늘어나는 경우에는 코드는 더욱 복잡해진다.

만약, 관리 대상들에 공통적인 부분이 있다면 이를 뽑아내어 부모 클래스로 만들고 고유한 부분은 자식 클래스로 만들어 상속을 이용하면 간결하게 나타낼 수 있다.

또한, 오버라이딩을 이용하면 자식 클래스의 메소드를 가져올 수 있기 때문에 코드의 관리가 용이해진다.


📌16-2. Object 클래스와 final 선언 그리고 @Override

✅Object 클래스

만약, 상속하는 클래스가 없다면 컴파일러에 의해 java.lang.Object 클래스를 상속하게 된다.

class MyClass extends Object {...}

다른 클래스를 상속한다면, Object 클래스를 직접 상속하지는 않지만 간접적으로 Object 클래스를 상속하게 된다.

Object 클래스는 모든 클래스의 부모 클래스이다.

이렇게 자동적으로 Object 클래스를 넣는 이유는 JVM의 인스턴스 관리를 위해서이다. JVM은 생성되는 모든 인스턴스를 관리해야 하는데 이 수가 많아진다면 관리가 힘들어진다. 따라서 Object 클래스를 상속하게 하고 JVM은 Object형 참조 변수만 있으면 모든 인스턴스에 접근할 수 있다.

모든 클래스가 println() 메소드를 사용할 수 있었던 이유는 println() 메소드가 Object형 인스턴스를 받을 수 있기 때문이다.

// System.out.println
public void println(Object x) {
    ...
    String s = x.toString();
    ...
}

또한, 앞에서 모든 인스턴스에 대해 toString() 메소드가 존재한다고 했었는데, 이는 toString() 메소드가 Object 클래스의 메소드이기 때문이다.

우리가 직접 toString() 메소드를 정의한 적도 있었다. 이는 메소드 오버라이딩이 발생하여 우리가 정의한 toString() 메소드가 실행되는 것이다.

toString() 메소드를 정의하는 데에는 정답은 없지만, 그 인스턴스의 정보를 잘 표현하도록 만드는 것이 좋다.

✅클래스와 메소드의 final 선언

public final class MyLastCLS {...}
// MyLastCLS 클래스는 다른 클래스가 상속할 수 없음

class Simple {
    public final void func(int n) {...}
    // func 메소드는 다른 클래스에서 오버라이딩 할 수 없음
}

✅@Override

@Override는 기능 제공이 아닌 안정성을 위한 문법이다.

@Override는 컴파일러에게 아래의 메소드는 오버라이딩이 목적이라고 알려준다.


🔗강의 및 자료 출처

네이버 카페 || 윤성우의 프로그래밍 스터디그룹

profile
Hello World!

0개의 댓글

Powered by GraphCDN, the GraphQL CDN