본문 바로가기
카테고리 없음

[Java] 클래스간의 업캐스팅 & 다운 캐스팅, 메소드 오버라이딩, 추상 클래스

by niahh 2025. 2. 28.

24th Jan 2025 - day 13. 

이것저것

자료구조에서 트리는 거꾸로 생각한다. 뿌리 노드로 부터 브랜치들을 따라 노드를 순회하면서 내가 원하는 데이터를 찾아나간다.

상속구조는 항상 Is-a 구조이다.

자바의 클래스 구조는 Object 클래스를 최상위 클래스로 두며 이를 제외한 모든 클래스들이 Object 클래스를 상속받는 계층적 상속을 한다.

Upcasting & Downcasting between classes

기본 자료형간의 형변환은 데이터의 값을 바꾼다. 하지만 클래스 간의 형변환 값을 바꾸는 기능은 없고 사용자의 접근권한을 제한한 사용자 정의 타입인 클래스 타입 간의 타입 변경은, 상속관계에서만 형 변환이 가능하다.

상위 클래스 Parent 는 멤버로 int a 와 int b 를 가진다. 하위 클래스 Child 는 멤버로 int c 를 가진다.

Parent upcasted = (Parent) child

이렇게 child 인스턴스를 (Parent) 로 형변환한 것이 upcasted 인스턴스이다. upcasted 인스턴스는 Parent 타입으로 생성되었다. 그러므로 upcasted.c 는 이제 불가능하다. upcasted.a, upcasted.b 는 가능하다.

  • 참고로, ArrayList API 는 List Interface 를 실체화한 클래스이다. 자바 docs 참고.

Method Overriding

메소드 오버라이딩에선 부모 메서드의 시그니처를 무조건 똑같이 쓴다. 오버라이딩이 아닌 오버로딩은 파라미터가 바뀐다. 블럭 안의 동작만 재정의 해서 쓰는 것을 메서드 오버라이딩이라고 한다.

 

접근 제한을 더 강하게 오버라이딩할 수 없다. pulic 에서 private 으로 변경불가하고 시그니처를 그대로 써야 한다. 또한, 새로운 예외 또한 throws 할 수 없다. Method overriding 에서는 메소드의 기능 구현을 어떻게 하느냐가 달라진다.

 

@Override 어노테이션 마크는 컴파일 단계에서 부모의 메소드를 정확히 오버라이딩 되었는지 체크하고 문제가 있으면 컴파일 에러를 출력한다. 어노테이션은 필수는 아니지만, 코드 readability를 향상시키기 때문에 권장된다. 

 

연습 문제에서.. 

  • abstract 클래스로 new 연산자 이용한 인스턴스 생성 불가하다.
  • abstract 인 상위 클래스를 extends 하고 있다면 abstract class 에서 정의된 메소드들을 모두 다 implement 해야 한다.
  • // implemented method from abstract class Count @Override public void calcRate() { // empty for now }
  • 클래스에 붙어있는 static method는 @Override 메소드 오버라이딩 할 수 없다.
  • 메소드 내에서만 사용되는 로컬 변수는 자동으로 초기화 되지 않기 때문에 항상 초기화 해줘야 한다. 하지 않으면 컴파일 에러 발생. 예측 불가능한 동작을 방지한다. 
  public void printPrice() {
        int sum = 0; // 지역변수는 자동 초기화가 되지 않기 때문에 꼭 초기화 해줘야 한다. 

        for(Book book: booklist) {
            sum += book.getPrice();
        }
    }
    ```
- 생성자의 파라미터 순서를 바꿔서 생성자 오버로딩 가능하다.