1. Overloading이란?
클래스 내에 동일한 이름을 가진 메서드가 여러개 존재하더라도 매개변수의 갯수, 매개변수의 타입이 다르면 메서드 이름을 변경하지 않고 사용할 수 있다.
public class Member() {
private String name;
private String job;
private int age;
public void printInfo(String name) {
System.out.println("이름 : " + name);
}
public void printInfo(String name, String job) {
System.out.println("이름 : " + name);
System.out.println("직업 : " + job);
}
public void printInfo(String name, String job, int age) {
System.out.println("이름 : " + name);
System.out.println("직업 : " + job);
System.out.println("나이 : " + age);
}
}
Overloading 사용하는 이유
1. 가독성이 증가한다.
2. 비슷한 기능을 가진 메서드를 여러개 생성하지 않아도 된다.
3. 메서드의 이름만 보고 같은 기능을 사용하고 있음을 추측 가능하다.
자바 기본 입출력 함수인 print함수를 만약 오버로딩이 없었다면 printInt, printString, printFloat이렇게 나눠서 써야한다고 생각하면 너무 끔찍하다...
2. Overriding 이란?
상속 관계에 있는 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 내용을 변경해서 사용하는 것.
Overloading과 다르게 Overriding에서는 메서드의 이름과 매개변수를 바꿀 수 없다. 선언부는 부모 클래스의 메서드와 동일하게 해야한다.
Overriding 할 때의 주의점
1. 자식 클래스가 오버라이딩 하려는 메서드는 부모 클래스의 메서드와 완전히 동일해야 한다. 메서드 이름, 매개 변수, 반환 타입 전부
2. 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
부모 클래스 : public > 자식 클래스 : public
부모 클래스 : protected > 자식 클래스 : public / protected 선택 가능
접근 제어자의 범위 - public > protected > default > private 순으로 접근 범위가 좁아진다.
class Car {
public void startEngine() {
System.out.println("엔진 굴러감");
}
}
class ElectricCar extends Car {
@Override
public void startEngine() {
System.out.println("전기로 굴러감");
}
}
class GasolineCar extends Car {
@Override
public void startEngine() {
System.out.println("기름으로 굴러감");
}
}
public class Main {
public static void main(String[] args) {
Car genericCar = new Car();
genericCar.startEngine();
ElectricCar myElectricCar = new ElectricCar();
myElectricCar.startEngine();
GasolineCar myGasolineCar = new GasolineCar();
myGasolineCar.startEngine();
}
}
@Override 어노테이션 사용 이유는?
사실 override를 할 때에는 메서드 선언부만 잘 써주면 문제없이 코드가 실행된다. 하지만 @Override어노테이션을 사용함으로써
1. 혹시 모를 개발자의 실수를 방지해줌.
- 만약 @Override 어노테이션이 붙어있는 상태에서 메서드 선언부가 틀릴경우 오류 메세지를 출력한다.
2. 가독성 증가
- 메서드만 봤을 때에는 이 함수가 상속 받아서 오버라이딩 한 메서드인지 그냥 메서드인지 구분하기 힘들다. 이건 코드로 보자
class Parent {
public void myMethod() {
// 부모 클래스의 로직
}
}
//어노테이션 없음
class Child extends Parent {
public void myMethod() {
// 자식 클래스에서의 로직
}
}
//어노테이션 있음
class Child extends Parent {
@Override
public void myMethod() {
// 자식 클래스에서의 로직
}
}
메서드가 한개만 있을 때에는 에? 없어도 되겠는데 싶겠지만 클래스가 나뉘고 메서드가 엄청나게 많을 때에는 가독성이 떨어진다.
Overriding 사용하는 이유
1. 다형성
- 동일한 메서드명을 사용하면서 내부에서는 각자 클래스에 맞는 역할을 구현할 수 있기 때문에 다형성을 높일 수 있다. 또한 이 다형성을 이용하여 변경 유연한 코드를 설계할 수 있다.
2. 코드 재사용성 및 기능 확장
- 특정 공통된 클래스를 선언 후 상속받아 오버라이딩 함으로써 코드 재사용성을 높일 수 있다.
궁금한 부분이 생기면 찾아보고 토대로 제가 이해한 내용을 글로 정리하는 개인 공부 블로그입니다.
내용 중 틀린 부분은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
'Backend > Java' 카테고리의 다른 글
[Backend/Java] BufferedReader를 사용할 때 IOException을 해주는 이유 (0) | 2023.08.17 |
---|---|
[Backend/Java] 입출력 (Tokenizer / BufferedReader / split) (0) | 2023.08.15 |