JAVA

자바 JAVA 클래스 상속(extends) 과 오버라이딩 VS 오버로딩 차이

수진97 2025. 11. 25. 01:39

안녕하세요!!

이번 포스팅은 자바의 상속 개념과 오버라이딩, 그리고 오버라이딩과 오버로딩의 차이까지 살펴보겠습니다.

 

1. 상속 개념

- OOP(Object-Oriented Programming)의 핵심 중 하나인 상속부모 클래스의 속성과 기능을 자식 클래스가 물려받는 것을 말함.

- 상속이 필요한 이유는 중복 코드를 줄이고, 확장성을 좋게 만들기 위함.

(확장하기 때문에 자식 클래스는 대체로 부모 클래스보다 속성이나 동작이 더 많음)

 

* 용어 정의

- 부모 클래스(= 슈퍼 클래스 = 기본 클래스)

- 자식 클래스(= 서브 클래스 = 파생 클래스 = 확장 클래스)

 

 

 

(1) 코드 재사용

자식 클래스는 부모 클래스에서 물려받은 멤버를 그대로 사용하거나 변경할 수 있고, 새로운 멤버도 추가할 수 있음.

 

 (2) 유지보수 용이

부모 클래스만 수정해도 자식이 모두 영향을 받기 때문에 유지보수가 쉬움.

 

 (3) 오버라이딩(Overriding)

부모 기능을 자식이 재정의해서 다른 동작 가능.

부모 클래스의 메서드를 자식 클래스에서 @Override 하여 사용

출처 : https://coding-factory.tistory.com/865



(4) 상속의 선언

extends 키워드 사용

class [자식 클래스 이름] extends [부모 클래스 이름] {   }

 

 

 (5) 부모와 자식 클래스 관계 : is - a 관계

- 상속 관계(is - a)란 "A는 B이다" 관계일 때 상속을 사용함.
즉, 자식 클래스는 부모 클래스의 한 종류 

 

ex. 원은 도형이다. 사과는 과일이다.

 

 

cf. 소유관계(has - a)"A는 B를 가지고 있다" 관계일 때 사용함.

즉, 클래스 안에 다른 객체를 멤버 변수로 포함하는 것.

 

class Engine{ }

class Car{

   Engine engine;   // Car 클래스가 Engine 객체를 포함

}

 

 

 (6) 주의

- 다중 상속 불가

class SubClass extends SuperClass1, SuperClass2 {  } (X)

 

 

- 자식이 부모의 필드 접근 시, super.필드 로 접근 < - > 자식 클래스 본인의 필드의 경우에는 this로 접근

하지만 자식이라도 부모의 멤버변수가 private으로 지정되어 있다면, 접근불가하므로 부모 클래스에서 정의한 setter 나 getter를 통해 접근 => super.부모메서드() 와 같이 사용 가능  (ex. super.getId())

 

 

- 자식 클래스에서 부모의 생성자 호출은 super()

 

-  main에서 자식클래스의 인스턴스를 생성하여 메서드 호출 시, 자식 클래스에서 재정의된 info() 메서드가 실행

main 또한 마찬가지로 외부 클래스이기 때문에 private으로 지정한 부모, 자식 클래스의 필드를

[객체 참조변수.필드] 와 같은 방식으로 접근 불가. getter 사용해야 함.

 

 

- 자식 클래스의 객체를 생성하여 부모 메서드 호출 가능 

=> 자식 타입이자 부모타입이기도 하기 때문

 

 

 

 

2. 오버라이딩 VS 오버로딩

 

1) 메서드 오버라이딩(Method Overriding)

- 물려받은 메서드를 자식 클래스에게 맞도록 수정하는 것

- 자식 클래스가 메서드를 오버라이딩하면 자식 객체는 부모 클래스의 오버라이딩된 메서드를 숨김

- 숨겨진 부모 클래스의 메서드를 호출하려면 super 키워드 사용

 

 

* 규칙

- 부모 클래스의 메서드와 동일한 시그니처 사용. 반환 타입도 동일해야 함.

- 부모 클래스의 메서드보다 접근 범위를 더 좁게 수정할 수 없음. 

 

부모 : public

자식 : private (X) / public(O)

 

 

 

- 추가적인 예외가 발생할 수 있음을 나타낼 수 없음.

=> 자식 클래스는 부모 메서드보다 더 많은(더 넓은) 예외를 throws 할 수 없다는 의미

=> 만약 부모 클래스에서 Exception을 아예 던지지 않았다면, 자식에서는 설정할 수 없음.

 

 

부모 : IOException

자식 : Exception 상위 익셉션 (X) / FileNotFoundException 등의 하위 익셉션 (O)

 

 

 

* 오버라이딩 불가 경우

1> private 메서드 : 부모 클래스 전용이므로 자식 클래스에 상속되지 않음

2> 정적(static) 메서드 : 클래스 소속이므로 자식 클래스에 상속되지 않음

static의 경우, 컴파일 시점에 어떤 클래스의 static 메서드를 부를지 이미 결정됨(정적 바인딩(static binding))

부모 클래스 로딩하는 순간 이미 결정됨.

 

<예시>

Parent p = new Child();
p.hello();

 

instance 메서드라면 → Child의 메서드 실행됨
static 메서드라면 → Parent의 메서드 실행됨 

 

 

3> final 메서드 : final 메서드는 더 이상 수정할 수 없으므로 자식 클래스가 오버라이딩 할 수 없음.

- final의 경우 한 번 초기화 시 변경이 불가능하기 때문에, final 변수도 마찬가지로  수정 불가

- final 클래스는 상속도 받을 수 없음.

 

 

 

2) 메서드 오버로딩

- 같은 이름의 메서드를 여러 개 정의하는 것을 의미

- 매개변수의 개수나 타입이 달라야 함.

- 반환 타입만 다른 것은 오버로딩이 아님.

출처 : https://developshrimp.com/entry/JAVA-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90