오버로딩과 오버라이딩은 이름이 비슷해서 헷갈리는 개념 중 하나인 것 같습니다.
@Override
@Transactional
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return memberRepository.findByEmail(username)
.map(this::createUserDetails)
.orElseThrow(() -> new UsernameNotFoundException(username + " -> 데이터베이스에서 찾을 수 없습니다."));
}
개발을 하면서 오버라이딩은 자주 보는 어노테이션이라 익숙해서 더 외우기 쉬운 것 같습니다.
메소드의 매개 변수들을 확장합니다.
메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미합니다.
리턴값만 다른 메소드와 접근 제어자만 다른 메소드는 만들 수 없습니다.
-> 매개변수가 다를 때 오버로딩이 가능합니다.
public void hongsi(int age) {
age = 300;
}
public void hongsi(String name) {
name = "dustle";
} // 가능함
public void hongsi(int age) {
age = 300;
}
public String hongsi(String name) {
return "dustle";
} //가능함
public void hongsi(int age) {
age = 300;
}
public String hongsi(int age) {
return "dustle";
} //이건 안됨
같은 역할을 하는 메소드를 오버로딩으로 정의하여 다형성을 줄 수 있습니다.
부모 클래스에 선언되어 있는 메소드와 동일한 시그니처를 가진 메소드를 자식 클래스에서 재정의 하는 것을 의미합니다.
class Test {
public static void main(String[] args) {
Dustle dustle = new Dustle();
dustle.printName();
}
}
class Hongsi {
public Hongsi() {
System.out.println("홍시 생성자");
}
public void printName() {
System.out.println("Hongsi");
}
}
class Dustle extends Hongsi {
public Dustle() {
System.out.println("먼지 생성자");
}
@Override
public void printName() {
System.out.println("Dustle");
}
}
/**
결과:
홍시 생성자
먼지 생성자
Dustle
**/
생성자의 경우 자동으로 부모 클래스를 호출하는 super()가 추가되지만 메소드는 그렇지 않습니다.
같은 이름으로 기능을 재정의 할 수 있기 때문에 프로그램의 리소스를 줄여줄 수 있습니다.
결론
오버로딩은 한 클래스 안에서 메소드 이름을 재활용 하는 것이고
오버라이딩은 상속된 자식 클래스에서 메소드 확장하는 것이다.
우와 정말 좋은 정보 감사합니다!
질문이 하나 있는데, 오버라이딩에서 접근 제어자의 접근 권한이 확장되어야 한다는게 혹시 어떤 의미 인지 알려주실수 있을까요?? 😭🙏