오버로딩과 오버라이딩의 차이점
상위클래스의 메서드를 하위클래스에서 재정의 한 다형성을 오버라이딩이라고 하며,
ride 는 타다라는 의미로 위로 올라타다 로 전에 있던 정의를 덮어쓰게 되어 메소드 호출 시 하위클래스에서 재정의된 메소드를 호출하게됩니다.
메소드의 동작만을 재정의하는 것이므로,메서드의 선언부인 매개변수의 자료형,갯수,순서가 같아야합니다.
, 그리고 반환타입도 같아야합니다.📍하지만 jdk의 버전업으로 메소드의 반환타입은 부모 클래스의 반환 타입으로 형변환할 수 있는 타입이라면 변경할 수 있습니다.
부모 클래스의 메소드보다 접근 제어자가 같거나 커야합니다.
만약에 상위메소드의 접근 권한자가 protected라면, 하위메소드의 접근 권한자는 protected, public으로 해야합니다.
3.예외(Exception)는 부모 클래스의 메소드 보다 많이 선언할 수 없다.
부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다는 것이다.
다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.
다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.
생략가능합니다. 하지만 사용하는 이유는?
부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다는 것이다.
하지만 자식 클래스에서 부모 클래스를 재정의(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()이 실행 됩니다.
같은클래스 내에서 같은 이름을 가진 메소드 를 여러개 정의한 것입니다. load 는 싣다 라는 의미로 여러개의 물건을 화물칸에 싣은 것처럼 하나의 이름으로 여러개로 정의 됩니다.
매개변수의 개수와 타입이 달라야 하며 리턴값은 상관없습니다.
1) 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.
대표적인 예로 우리가 흔히 콘솔창에 텍스트를 출력할 때 사용하는 println()메소드 있습니다.
우리는 println의 인자 값으로 int, double, boolean, String 등의 아주 다양한 타입의 매개변수들을 집어넣어도 우리는 그 함수들이 어떻게 실행되지는 모르지만 콘솔창에 아주 잘 출력해주는 것을 볼 수 있다.
이렇게 '출력하다.'라는 같은 기능을 가진 메소드들를 println이라는 하나의 이름으로 정의가 가능한 것이다.
2) 메소드의 이름을 절약할 수 있다.
이 위에서 예로 들었던 println을 생각합니다. 이 메소드를 매개변수의 종류에 따라서 다르게 지정한다고 생각해보자. printlnInt, printlnDouble, printlnBoolean 등 수많은 메소드들의 이름을 정해줘야 함으로 프로그래머의 입장에서는 메소드의 네이밍에 고민을 가중이 되고, 그리고 이런 이름들은 다른 곳에 사용할 가능성도 생기게 됩니다.