[CS] 오버로딩과 오버라이딩의 차이점

hyewon jeong·2023년 4월 5일
0

CS

목록 보기
18/22

오버로딩과 오버라이딩의 차이점

1. ⚡️Override

상위클래스의 메서드를 하위클래스에서 재정의 한 다형성을 오버라이딩이라고 하며,
ride 는 타다라는 의미로 위로 올라타다 로 전에 있던 정의를 덮어쓰게 되어 메소드 호출 시 하위클래스에서 재정의된 메소드를 호출하게됩니다.

1-1. ❄️ 오버라이딩의 조건(java)

  1. 메소드의 동작만을 재정의하는 것이므로,메서드의 선언부인 매개변수의 자료형,갯수,순서가 같아야합니다.
    , 그리고 반환타입도 같아야합니다.📍하지만 jdk의 버전업으로 메소드의 반환타입은 부모 클래스의 반환 타입으로 형변환할 수 있는 타입이라면 변경할 수 있습니다.

  2. 부모 클래스의 메소드보다 접근 제어자가 같거나 커야합니다.
    만약에 상위메소드의 접근 권한자가 protected라면, 하위메소드의 접근 권한자는 protected, public으로 해야합니다.
    3.예외(Exception)는 부모 클래스의 메소드 보다 많이 선언할 수 없다.
    부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다는 것이다.

1-1-1. 다형성(polymorphism)이란?

다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.

자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.
다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.

1-2. @Override 어노테이션

생략가능합니다. 하지만 사용하는 이유는?

  1. 어노테이션음 검증기능을 가지고 있어 오류를 알려줍니다.
    예를 들어
  • 잘못 기술했을 경우 오류와
  • 혹시라도 상위메서드가 후에 수정이되었을 경우 오류를 알려주기 때문에 검토할수 있게 유도해줍니다.

부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다는 것이다.

1-3. ❄️ super 키워드란?

하지만 자식 클래스에서 부모 클래스를 재정의(override)를 하면 부모 클래스의 메소드는 사용할 수가 없습니다. 이것이 재정의(override)의 단점 입니다. 그래서 나온 키워드가 super키워드로 자식클래스에 super키워드를 이용하여 부모클래스의 메소드를 사용할 수 있게 됩니다.

public class OverrideMain {

  public static void main(String[] args) {
   Children child = new Children();
   child.method1();
  }

  public static class Parent {
    public Parent(){
      System.out.println("부모클래스입니다.");
    }
    public void method1(){
      System.out.println("부모메스드 입니다.");
    }
  }

  public static class Children extends Parent{
    public Children(){
      System.out.println("자식클래스입니다.");
    }

    
    public void method1(){
      super.method1();
      System.out.println("자식메서드입니다.");
    }
  }
}


클래스가 호출 되는 순서
상속 받은 자식 클래스가 존재 한다면 부모 클래스가 먼저 호출 되고 다음으로 자식 클래스가 호출 됩니다.

위의 결과와 같이

  • 부모 클래스가 제일 먼저 실행 됩니다.

  • 다음으로 자식 클래스가 실행 됩니다.

  • 자식 클래스의 메소드1()이 실행 되어야 하지만 super 키워드로 인해 부모 클래스의 메소드1()이 실행 됩니다.

  • 마지막으로 자식 클래스의 오버라이드된 메소드1()이 실행 됩니다.

2. Overload

같은클래스 내에서 같은 이름을 가진 메소드 를 여러개 정의한 것입니다. load 는 싣다 라는 의미로 여러개의 물건을 화물칸에 싣은 것처럼 하나의 이름으로 여러개로 정의 됩니다.

2-1. ❄️ 오버로딩의 조건(java)

매개변수의 개수와 타입이 달라야 하며 리턴값은 상관없습니다.

2-2.오버로딩을 사용하는 이유는

1) 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.

대표적인 예로 우리가 흔히 콘솔창에 텍스트를 출력할 때 사용하는 println()메소드 있습니다.

우리는 println의 인자 값으로 int, double, boolean, String 등의 아주 다양한 타입의 매개변수들을 집어넣어도 우리는 그 함수들이 어떻게 실행되지는 모르지만 콘솔창에 아주 잘 출력해주는 것을 볼 수 있다.
이렇게 '출력하다.'라는 같은 기능을 가진 메소드들를 println이라는 하나의 이름으로 정의가 가능한 것이다.

2) 메소드의 이름을 절약할 수 있다.
이 위에서 예로 들었던 println을 생각합니다. 이 메소드를 매개변수의 종류에 따라서 다르게 지정한다고 생각해보자. printlnInt, printlnDouble, printlnBoolean 등 수많은 메소드들의 이름을 정해줘야 함으로 프로그래머의 입장에서는 메소드의 네이밍에 고민을 가중이 되고, 그리고 이런 이름들은 다른 곳에 사용할 가능성도 생기게 됩니다.

2-3. 가장 대표적인 오버로딩 예

참고
https://hyoje420.tistory.com/14

profile
개발자꿈나무

0개의 댓글