본문 바로가기
✨ Java/상속(Inheritance)

자바(JAVA) - OverLoding 오버로딩과 Overriding 오버라이딩 (상속)

by 환풍 2023. 2. 13.
728x90

 

부모 클래스의 모든 메소드가 자식 클래스에게 맞게 설계되어 있다면 가장 이상적인 상속이지만,

어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수 있다.

이러한 메소드는 자식 클래스에서 재정의해서 사용해야한다. 이것을 오버라이딩(Overriding)이라고 한다.

 

즉, 오버라이딩(Overriding)이란 ?

상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이다.

오버라이딩(Overriding)은 상속 관계뿐만 아니라 인터페이스와 추상 클래스와 같은 다른 상속 관련 개념에서도 사용될 수 있다.

오버라이딩은 상속 관계에 국한되지 않고, 인터페이스(interface)와 추상 클래스(abstract class)와 같은 다른 개념에서도 사용될 수 있다.

인터페이스는 클래스가 구현해야 하는 메서드들의 집합을 정의하며,

추상 클래스는 일부 메서드를 구현하고 나머지 메서드는 하위 클래스에서 오버라이딩하여 구현하도록 하는 클래스이다.

 

오버라이딩의 조건

  • 메서드 이름이 같아야 한다.
  • 매개 변수의 개수, 타입, 순서가 같아야 한다.
  • 리턴 타입이 같아야 한다.
  • 접근 제한자는 부모 보다 범위가 넓거나 같아야 한다.
  • 조상보다 더 큰 예외를 던질 수 없다.
  • static, final, private 키워드가 붙은 메서드는 오바리이딩 될 수 없다.
  • 생성자는 오버라이딩 할 수 없다.

 

Animal.class

Dog.class

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Animal {
 
    public void sound(){
        System.out.println("동물이 웁니다.");
    }
}
 
class Dog extends Animal{
    public void sound(){ 
        super.sound();
        System.out.println("멍멍");
    }
}
cs

Overriding.class

1
2
3
4
5
6
7
8
9
10
public class Overriding {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        //오버라이딩으로 구현된 메소드는
        // 자식 클래스에서 재정의된 메소드만 호출 가능!
        // 상속관계에서만 사용 가능.
 
        d1.sound();
    }
}
cs

 

실행결과

원래 sound( ) 메소드는 중복이나서 오류가 나는게 맞지만,

부모클래스에서 선언되있는걸 자식클래스에서 재선언 가능하다. 이것이 메소드 Overriding이라고 한다.

만약 sound( int a )를 한다면, 이것은 메소드 Overroding이다.

요약하자면, 메소드 Overriding은 메소드의 매개변수까지 같아야한다.

 

부모클래스의 메소드를 호출할 때에는 super. 을 사용한다.

super( ); 라는 생성자 호출기능이 생략되어 있다.

 

메서드 오버라이딩

부모에게서 상속받은 기능을 자식이 재정의 하는 것을 메서드 오버라이딩이라고 부른다.

메서드 이름은 같지만 새로운 기능을 사용하고 싶을때 부모의 기능을 자식이 재정의해서 사용한다.


오버로딩(OverLoading)이란?

같은 이름의 생성자 또는 메소드를 여러 개 선언하는 것을 말한다. 즉, 이름은 같고 타입이 달라야한다.

단, 애매모호한 것은 에러가 난다.

오버로딩(OverLoading)은 상속관계랑 관계가 없다.

 

OverLoading1.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class OverLoading1 {
    public static void main(String[] args) {
        System.out.println(10);
 
        aaa("java");
        aaa(10);
    }
 
    public static void aaa(String str){
        System.out.println(str);
    }
 
    public static void aaa(int a){
        System.out.println(a);
    }
    
}
 
cs

메소드의 명이 동일하지만, 매개변수의 자료형이 다르거나 개수가 다르면 중복을 허용한다.

이것을 메소드 OverLoading이라고 부른다. over - 많이 초과해서 or Loading - 읽는다.

상속이랑은 관계가 없다.

실행결과

 

반응형

댓글