overloading vs overriding
overloading
오버로딩 사전적 의미로는 "과적하다, 너무 많이 부하를 주다"라는 뜻이다. 이걸 자바에 대입해 보자면 하나의 메소드 이름을 사용하면서 여로 기능을 제공한다는 의미로 해석할 수 있고, 하나의 메소드 이름으로 많은 부하를 준다고도 볼 수 있다.
오버로딩은 메소드들은 모두 이름이 동일하지만 각 메소드 매개변수의 종류와 개수, 순서가 다르다.
여기서 매개변수의 개수가 같더라도 타입의 순서가 다르다면 다른 메소드로 인식한다. ( 중요! 매개 변수의 이름이 아니라 매개 변수의 타입)
타입이 다르다면 다른 메소드로 인식하지만 타입이 같다면 같은 메소드로 인식한다.
+ return type, 접근 제어자는 영향을 주지 않는다.
public class Main
{
public void print(int date){
}
public void pirnt(String name){
}
// error: method print(int) is already defined in class Main
public void print(int age){
}
}
overloading은 같은 역할을 하는 메소드는 같은 이름을 가져야 한다는 모토로 사용되었다. 이점을 기억하면 쉽게 overloading의 개념을 이해할 수 있을 것이다. (생성자도 overloading처럼 매개 변수가 다르면 다르게 인식한다.)
상속
extend라는 자바의 예약어를 사용하며 사용자가 원하는 클래스를 상속받는다. 상속은 하나의 클래스를 만들어 놓고 추가적인 부분을 넣을 때 새로운 클래스를 만들고 기본 기능이 있는 클래스를 상속받아 기본 기능은 따로 구현하지 않고 사용자가 원하는 추가적인 기능만을 구현하면 된다는 장점과 하나의 메소드에 문제가 발생할 경우 그 메소드를 하나하나 수정하는 것이 아니라 부모 클래스에서 문제가 되는 메소드만 수정하면 매우 빠르게 문제를 해결할 수 있다. 상속을 사용하는 이유를 쉽게 말하자면 배우지 않아도 되는 것들(공통으로 구형해야 하는 기능)이 바로 자바에서는 부모 클래스에 있는 변수와 메소드라고 생각하고 해당 부분을 상속만 받고 사용이 가능하게 만드는 것이다.
class Parent{
String name;
public Parent(){ // 자식 클래스의 모든 생성자가 실행 될 때 부모 클래스의 기본 생성자를 찾는다.
System.out.println("Parent basic Constructor");
}
public Parent(String name){
this.name=name;
System.out.println("Parent Constructor");
}
public void setName(String name){
this.name = name;
}
public void printName(){
System.out.println("Name: "+ name);
}
}
class Child extends Parent{
public Child(){
}
public Child(String name){
this.name = name;
System.out.println("Child Constructor");
}
public void setName(String name){
this.name = name;
System.out.println("Child setName");
}
}
public class Main {
public static void main(String[] args){
Child child=new Child("JIWON");
child.printName();
child.setName("YUKANG");
child.printName();
}
}
결과
Parent basic Constructor
Child Constructor
Name: JIWON
Child setName
Name: YUKANG
상속의 특징
- 부모 클래스에서 기본 생성자를 만들어 놓는 것 이외에는 상속을 위해서 아무런 작업을 할 필요가 없다.
부모 클래스에서 기본 생성자가 반드시 필요한 이유는?
자식 클래스의 모든 생성자가 실행될 때 부모 클래스의 기본 생성자를 찾는데 부모의 기본 생성자가 존재하지 않아 기본 생성자를 찾을 수 없기 때문에 오류가 발생한다.
해결방법
부모 클래스에 매개 변수가 없는 기본 생성자를 만든다.
자식 클래스에서 부모 클래스의 생성자를 명시적으로 지정하는 super()를 사용한다. (부모 클래스의 생성자를 명시적으로 호출) - 자식 클래스는 클래스 선언 시 extends 다음에 부모 클래스 이름을 적어줘야 한다.
- 자식 클래스의 생성자가 호출되면, 자동으로 부모 클래스의 매개 변수 없는 생성자가 실행된다.
- 자식 클래스에서 부모 클래스에 있는 public, protected로 선언된 모든 인스턴스, 클래스 변수, 메소드를 사용할 수 있다.
상속관계를 보다 유연하게 활용하기 위해서 overriding을 사용한다.
overriding이란?
오버라이딩은 단어의 사전적 의미는 다른 무엇보다 더 중요한, 최우선시되는 이라는 뜻이다. 자바에서는 자식 클래스에서 부모 클래스에 있는 메소드와 동일하게 선언하는 것을 overriding이라고 한다. (접근 제어자, 리턴 타입, 메소드 이름, 매개 변수 타입 및 개수가 모두 동일해야 한다.)
overriding의 특징
- 메소드 Overring은 부모 클래스의 메소드와 동일한 시그니처를 갖는 자식 클래스의 메소드가 존재할 때 성립된다.
부모 클래스에서 오버라이딩한 메소드를 자식 클래스에서 수정한다면 오류가 발생한다. ( ~ cannot override method in ~) - Overriding 된 메소드는 부모 클래스와 동일한 리턴 타입을 가져야 한다.
- Overriding 된 메소드의 접근 제어자는 부모 클래스에 있는 메소드와 달라도 되지만 접근 권한이 확장되는 경우에만 허용된다.
(접근 권한이 축소될 경우 부모 public -> 자식 private 일 경우 컴파일 에러가 발생한다. weaker access privileges)
부모 자식 생성자의 타입을 알 수 있는 instanceof
자식 타입의 객체를 부모 타입으로 형 변환을 할 때에는 명시적으로 타입을 지정해 주어야 한다.
instanceof 예약어를 사용하면 객체 타입을 확인할 수 있다.
instanceof 예약어로 타입을 확인할 때에는 자식 타입 instanceof 부모 타입도 true로 반환하기 때문에 가장 하위에 있는 자식 타입부터 확인해야 제대로 된 타입 점검이 가능하다.
public class CheckParent{
public static void main(String[] args){
// Child child=new Child("JIWON");
// child.printName();
// child.setName("YUKANG");
// child.printName();
Parent parent = new Parent();
Child child = new Child();
if(parent instanceof Parent){
System.out.println("Parent");
}
if(child instanceof Parent){
System.out.println("Child in Parent");
}
if(child instanceof Child){
System.out.println("Child");
}
}
}
결과
Parent basic Constructor
Parent basic Constructor
Parent
Child in Parent
Child
overriding 정리
- 자식 클래스에서 메소드를 부모 클래스에 선언된 메소드들이 자신의 클래스에서 선언된 것처럼 사용할 수 있다.
- 부모 클래스에 선언된 메소드와 동일한 시그니처를 사용함으로써 메소드를 overriding 할 수 있다.
- 자식 클래스에서 부모 클래스에 선언되어 있지 않은 이름의 새로운 메소드를 선언할 수 있다.
overloading과 overriding의 차이점
overloading은 확장의 개념(매개 변수들의 확장)으로 overriding은 덮어쓰기(부모 클래스의 메소드를 복제하여 자식 클래스에서 새로운 메소드 형식으로 사용)로 한 줄 정리가 될 것이다.
'책 공부 > 자바의 신' 카테고리의 다른 글
interface 와 abstract class (0) | 2024.03.12 |
---|---|
Java에서 this란 무엇인가? (0) | 2022.09.01 |
java final 알아보기 (1) | 2022.08.29 |
자바의 신 기본 정리 (0) | 2022.08.14 |