[Java] 오버로딩(Overloading), 오버라이딩(Overriding)

dustle·2022년 11월 28일
3

오버로딩과 오버라이딩은 이름이 비슷해서 헷갈리는 개념 중 하나인 것 같습니다.

    @Override
    @Transactional
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return memberRepository.findByEmail(username)
                .map(this::createUserDetails)
                .orElseThrow(() -> new UsernameNotFoundException(username + " -> 데이터베이스에서 찾을 수 없습니다."));
    }

개발을 하면서 오버라이딩은 자주 보는 어노테이션이라 익숙해서 더 외우기 쉬운 것 같습니다.

오버로딩(Overloading)


메소드의 매개 변수들을 확장합니다.
메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미합니다.
리턴값만 다른 메소드와 접근 제어자만 다른 메소드는 만들 수 없습니다.
-> 매개변수가 다를 때 오버로딩이 가능합니다.

    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";
    } //이건 안됨

오버로딩의 장점

같은 역할을 하는 메소드를 오버로딩으로 정의하여 다형성을 줄 수 있습니다.

오버라이딩(Overriding)


부모 클래스에 선언되어 있는 메소드와 동일한 시그니처를 가진 메소드를 자식 클래스에서 재정의 하는 것을 의미합니다.

  • 부모 클래스와 동일한 리턴 타입을 가져야 합니다.
  • 접근 제어자는 부모 클래스에 있는 메소드와 달라도 괜찮지만 접근 권한(접근 제어자)이 확장되어야 합니다.(부모 클래스에서 접근 제어자가 public 인 메소드를 자식 클래스에서 private 으로 바꿔 오버라이딩 하게 된다면 attempting to assign weaker access privileges라는 에러 메세지가 뜨게 됩니다.)
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()가 추가되지만 메소드는 그렇지 않습니다.

오버라이딩의 장점

같은 이름으로 기능을 재정의 할 수 있기 때문에 프로그램의 리소스를 줄여줄 수 있습니다.

결론

오버로딩은 한 클래스 안에서 메소드 이름을 재활용 하는 것이고
오버라이딩은 상속된 자식 클래스에서 메소드 확장하는 것이다.

6개의 댓글

comment-user-thumbnail
2022년 11월 28일

우와 정말 좋은 정보 감사합니다!
질문이 하나 있는데, 오버라이딩에서 접근 제어자의 접근 권한이 확장되어야 한다는게 혹시 어떤 의미 인지 알려주실수 있을까요?? 😭🙏

1개의 답글
comment-user-thumbnail
알 수 없음
2022년 11월 30일
수정삭제

삭제된 댓글입니다.

1개의 답글
comment-user-thumbnail
2022년 11월 30일

좋은글입니다.

1개의 답글