본문 바로가기
JAVA

[JAVA] 메서드 오버라이딩, 오버로딩과 오버라이딩

by 정공자씨 2024. 4. 21.

 

 

 

메서드 오버라이딩(method overriding)

개념

  • 상속 관계에 있어서
  • 부모 클래스에 정의되어 있는 메서드를 자식 클래스에서 상속 받아서, 메서드의 선언부는 같고, 구현부의 내용만 다르게 재정의하여 사용하는 것
  • 즉, 상속 받은 부모 클래스의 메서드를 재정의하여 사용하는 것

 

 

특징

  • 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메서드를 상속 받아서 사용할 수 있음
  • 상속받은 메서드는 그대로 사용해도 되고,
  • 필요한 동작을 위해서 재정의하여 사용할 수도 있음
    • 기존의 메서드를 재정의해서 사용하는 것이 메서드 오버라이딩

 

 

오버라이딩의 조건

  1. 오버라이딩은 메서드의 동작만을 재정의 하므로, 메서드의 선언부는 부모 클래스의 메서드와 완전히 같아야 하고
  2. 기존 메서드의 구현부만 재정의하여 사용
  3. 부모 클래스의 메서드보다 접근 제어자를 더 좁은 범위로 변경할 수 없음
  4. 부모 클래스의 메서드보다 더 큰 범위의 예외를 선언할 수 없음

 

 

예제

class Parent {

    void talking() { 
    	System.out.println("부모 클래스의 talking() 메소드"); 
    }
}
class Child extends Parent {
 
    @Override
    void talking() { 
    	System.out.println("자식 클래스의 talking() 메소드"); 
    }
}
public class Inheritance {
    public static void main(String[] args) {

        Parent parent = new Parent();
        parent.talking();

        Child child = new Child();
        child.talking();

        Parent parentchild = new Child();
        parentchild.talking();  // 자식 클래스에서 오버라이딩한 메서드가 출력
    }
}

 

[ 실행 결과 ]

 

 

 

 

 

자바의 다형성

  • 부모 타입의 참조변수로 자식의 인스턴스를 참조할 수 있음
Parent pa = new Child();
pa.taking;  // 오버라이딩한 메서드가 나옴
[ 다형성 ]

1. 개념
- 하나의 객체가 여러 타입의 객체를 가질 수 있음
- 즉, 클래스의 상속 관계에서 부모 클래스 타입의 참조 변수로 자식 클래스의 인스턴스(객체)를 참조할 수 있음

2. 참조변수의 다형성
- 클래스들 사이에서 반드시 상속 관계가 전제할 것
- 다형성을 위하여 부모 클래스 타입의 참조변수로 자식 클래스 타입의 인스턴스(객체)를 참조할 수 있도록 함
- 반대의 경우, 자식 클래스 타입의 참조 변수로는 부모 클래스 타입의 인스턴스를 참조할 수 없음
- 그 이유는, 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버(부모 클래스 인스턴스)보다 많기 때문이고
- 자식 클래스는 부모의 멤버를 상속 받기 때문에, 사용할 수 있는 멤버의 개수가 부모 클래스보다 같거나 더 많음

class Parent { }

class Child extends Parent { }

public class Main {     
    public static void main(String [] args) {      
    
    	Parent pa = new Parent(); // 허용 
        Child ch = new Child(); // 허용 
        
        // 다형성 이용 
        Parent pa2 = new Child(); // 허용 
        
        // 자식 타입의 참조변수로, 부모 클래스 타입의 인스턴스 참조 X 
        Child ch2 = new Parant(); // 오류 발생, (X)     
    } 
}​


 

 

 

 

 

 

오버로딩과 오버라이딩

1. 오버로딩
- 메서드의 이름은 같고, 매개변수의 타입, 매개변수의 개수을 다르게 설정하여
- 아예 새로운 메서드를 정의하는 것
- [ 주의할 점 ] 리턴 타입만 다른 메서드는 같은 메서드로 취급함

2. 오버라이딩
- 상속 관계일 것
- 상속 받은 기존의 메서드를 재정의하여 사용
- @Override

 

 

예제

  • 오버로딩과 오버라이딩 메서드
class Parent {

    void talking() { 
    	System.out.println("부모 클래스의 talking() 메소드"); 
    }
}
class Child extends Parent {
 
    // 오버라이딩 한 talking() 메서드
    @Override
    void talking() { 
    	System.out.println("자식 클래스의 talking() 메서드"); 
    }
    
    // 오버로딩한 talking() 메서드 
    void talking(String str) { // 메서드 이름은 같지만, 매개변수의 개수가 다름
    	System.out.println(str); 
    }   
}
public class Inheritance {
    public static void main(String[] args) {

        Child child = new Child();
        
        child.talking();
        child.talking("오버로딩된 talking() 메서드!");
    }
}

 

[ 실행 결과 ]

 

 

 

 

 

 

 

 

 

출처

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com