[Java] 자바의 상속과 오버라이딩

SmileJun·2025년 8월 13일

Java

목록 보기
6/8

상속은 객체 지향 프로그래밍의 핵심 요소 중 하나로, 기존 클래스의 필드와 메소드를 새로운 클래스에서 재사용하게 해준다. 기존 클래스의 속성과 기능을 그대로 물려받는 것이다

장점

  • 클래스의 간결화 ( 멤버의 중복 작성 불필요)
  • 클래스 관리 용이 (클래스들의 계층적 분류)
  • 소프트웨어의 생산성 향상 (클래스 재사용과 확장 용이, 새로운 클래스의 작성 속도 빠름)

클래스 상속과 객체

상속을 사용하려면 extends 키워드 사용. extends 대상은 하나만 선택 가능

  1. 부모 클래스(슈퍼 클래스) : 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스
  2. 자식 클래스(서브 클래스) : 부모 클래스로부터 필드와 메서드를 상속받는 클래스
ex) public class ElectricCar extends Car

자바 상속의 특징

자바는 다중 상속을 지원하지 않는다. 따라서 부모를 하나만 선택할 수 있다.
상속의 최상위 조장 클래스는 java.lang.Object이다.

상속에서의 생성자 호출 및 실행

서브 클래스의 생성자가 먼저 호출되고 슈퍼 클래스가 호출되지만, 슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자가 실행된다.

상속에서의 생성자 선택

  • 슈퍼 클래스와 서브 클래스 각각 여러 생성자 작성 가능하다
  • 서브 클래스 생성자에서 슈퍼 클래스 생성자를 직접 고르거나 기본 생성자가 자동 선택된다
  • 서브 클래스에서 슈퍼 클래스의 생성자를 선택할때는 super(...)를 사용한다.
  • 상속 관계에서 자식 클래스의 생성자 첫줄에 반드시 super(...)를 호출해야한다
  • super는 부모 클래스에 대한 참조를 나타낸다.

상속과 메모리 구조

자식 클래스로 객체를 만들면 부모 클래스까지 포함해서 인스턴스를 생성한다. 따라서 참조값은 하나지만 실제로 그 안에는 두 가지 클래스 정보가 공존한다. 따라서 자식 클래스와 부모 클래스에 모두 존재하는 메서드를 호출할 때는 호출하는 변수의 타입(클래스)을 기준으로 선택한다. 하지만 호출하려는 메서드가 자식 타입에 없으면 부모 타입으로 올라가서 찾는다. 만약 부모에서도 해당 기능을 찾지 못하면 더 상위 부모에서 필요한 기능을 찾아본다. 최상위 부모까지 올라갔지만 찾지 못하는 경우에는 컴파일 오류가 발생한다.


메서드 오버라이딩

부모에게서 상속 받은 기능을 자식이 재정의 하는 것. (자식의 새로운 기능이 부모의 기존 기능을 넘어 새로운 기능으로 덮어짐)

  • @Override : 상위 클래스의 메소드를 오버라이드 하는 것, 오버라이딩한 메서드 위에 이 애노테이션을 붙여야함
  • 컴파일러는 이 애노테이션을 보고 메서드가 정확히 오버라이드 되었는지 확인한다. 오버라이딩 조건을 만족시키지 않으면 자동으로 컴파일 에러를 발생시킨다.
  • 상속을 통해 '하나의 인터페이스에 서로 다른 내용 구현'이라는 객체 지향의 다형성을 실현시킨다.

오버라이딩의 조건

  1. 메서드 이름과 메서드 매개변수가 같아야 한다.
  2. 오버라이딩 메서드의 접근 제어자는 상위 클래스의 메서드보다 더 제한적이면 안된다.
  3. static, final, private 키워드가 붙은 메서드는 오버라이딩 될 수 없다.

추상 메서드 및 클래스

선언되어 있으나 구현되어 있지 않은 메소드, abstract로 선언

  • 추상 메서드는 서브 클래스에서 오버라이딩하여 구현해야된다.

  • 추상 클래스는 객체를 생성할 수 없다.

  • 추상 클래스의 상속은 크게 추상 클래스의 단순 상속과 구현 상속으로 구분된다.

  • 추상 클래스는 슈퍼클래스에서는 개념을 정의하고 각 서브 클래스에서 구체적 행위를 구현할 수 있는 용도로 사용된다. 즉 설계와 구현이 분리되는 것이다.


메서드 오버로딩

메서드 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것


업캐스팅

서브 클래스 객체를 슈퍼 클래스 타입으로 타입 변환하는 것

  • 업캐스팅된 레퍼런스는 객체 내의 슈퍼 클래스 멤버만 접근 가능하다.
  • 슈퍼클래스는 여러 서브 클래스에 상속되기 때문에 업캐스팅된 레퍼런스로 객체의 타입 판단이 어렵다. 따라서 레퍼런스가 가리키는 객체의 타입 식별을 위해 instanceof 연산자가 사용된다.

다운캐스팅

슈퍼 클래스 객체를 서브 클래스 타입으로 변환하는 것

  • 개발자의 명시적인 타입 변환이 필요하다.
profile
하루하루는 성실하게, 인생 전체는 되는대로

0개의 댓글