hoon's bLog

Java method Overriding, Overloading 자바 메서드 오버라이딩과 오버로딩 본문

IT/Java

Java method Overriding, Overloading 자바 메서드 오버라이딩과 오버로딩

개발한기발자 2021. 1. 6. 13:54
반응형

안녕하세요 :)

이번 시간에는 메서드 오버라이딩과 오버로딩에 대해서 알아보도록 하겠습니다.

이름도 비슷하고, 자주 듣는 내용이지만 정리가 잘 안될 때가 많습니다.

이번 시간에 한번 제대로 정리해보자구요!

자바에는 다형성을 지원하는 방법으로 메서드 오버로딩오버라이딩이 있습니다.

오버로딩(Overloading) : 같은 이름의 메서드 여러 개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용

서로 개념은 다르지만 이름이 비슷해서 헷갈리는 경우도 있고, 신입 개발자의 경우 면접 단골 질문이기도 하니

하나하나 예제를 살펴보겠습니다.

오버로딩(Overloading)

오버로딩은 메서드 오버로딩과 생성자 오버로딩이 있습니다. 하지만 둘 다 같은 개념이에요.

같은 이름의 함수(메서드)를 여러 개 정의하고, 매개변수의 유형과 개수를 다르게 하여 ,

다양한 유형의 호출에 응답할 수 있게 됩니다.

public class OverloadingTest{
    //이름이 cat인 메서드
    void cat(){
        System.out.println("매개변수 없음");
    }
    
    //매개변수 int형이 2개인 cat 메서드
    void cat(int a, int b){
        System.out.println("매개변수 :"+a+", "+b);
    }
    
    //매개변수 String형이 한 개인 cat 메서드
    void cat(String c){
        System.out.println("매개변수 : "+ c);
    }
}
 
public class OverTest {
    public static void main(String[] args) {
        //OverloadingTest 객체 생성
        OverloadingTest ot = new OverloadingTest();
        //매개변수가 없는 cat() 호출
        ot.cat();
        //매개변수가 int형 두개인 cat() 호출
        ot.cat(20, 80);
        //매개변수가 String 한개인 cat() 호출
        ot.cat("오버로딩 예제입니다.");       
    }
}

//실행결과
매개변수 없음
매개변수 : 20, 80
매개변수 : 오버로딩 예제입니다.

 

오버라이딩(Overriding)

상위 클래스가 가지고 있는 멤버 변수가 하위 클래스로 상속되는 것처럼,

상위 클래스가 가지고 있는 메서드도 하위 클래스로 상속되어 하위 클래스에 사용할 수 있습니다.

또한, 하위 클래스에서 메서드를 재정의해서도 사용할 수 있습니다.

쉽게 말해 메서드의 이름이 서로 같고, 매개변수가 같고, 반환형이 같을 경우,

상속받은 메서드를 덮어쓴다고 생각하시면 됩니다.

'부모클래스의 메서드는 신경 쓰지 않고,

자식 클래스의 메서드 기능을 사용하겠다'와 같습니다.

예제

class People{ //부모클래스
    public String name;
    public int age;
    
    //info 메서드
    public void info(){
        System.out.println("사람의 이름은 "+name+", 나이는 "+age+"살입니다.");
    }
    
}
 
class Job extends People{ //People클래스(부모클래스)를 상속받음
    String job;
    public void info() {//부모(People)클래스에 있는 info()메서드를 재정의
        super.info();
        System.out.println("사람의 직업은 "+job+"입니다.");
    }
}
 
public class OverTest {
    public static void main(String[] args) {
        //Job 객체 생성
        Job job = new Job();
        
        //변수 설정
        job.name = "test";
        job.age = 30;
        job.job = "프로그래머";
        
        //호출
        job.info();
    }
}

Job Class(자식클래스)에서 People Class(부모클래스)를 상속받아,

부모클래스에 있는 info()를 재정의하여 사용하였고,

메인 메서드에서 Job 객체를 생성하고 호출하였기 때문에 Job클래스의 내용이 실행되었습니다.

부모클래스의 info() 와는 다르죠? 부모클래스를 호출하였다면,

실행결과는 사람의 이름은 test, 나이는 30살입니다. 가 되었겠죠.

자식클래스만 호출했을 때 부모클래스의 내용도 그대로 가져오고 싶을 때는 어떻게 해야 할까요?

사람의 이름과 나이, 직업을 모두 알고 싶을 때는 똑같이 재정의 해도 되고, super예약어를 사용해도 됩니다.

class Job extends Woman{
 
    String job;
    
    public void info() {
        
        System.out.println("여자의 직업은 "+job+"입니다.");
        System.out.println("여자의 이름은 "+name+", 나이는 "+age+"살입니다."); //추가
        
    }
}


class Job extends Woman{
 
    String job;
    
    public void info() {
        super.info(); //추가
        System.out.println("여자의 직업은 "+job+"입니다.");
        
    }
}

1) 부모클래스에 있던 변수들을 자식클래스에서 상속받았기 때문에 자식클래스에서 선언을 해주지 않더라도

사용할 수 있습니다.

2) super 예약어를 사용하는 이유는 자식클래스에서 재정의된 info() 메서드에 의해 부모클래스에 있는

info() 메서드가 가려지기(덮어썼기) 때문입니다.

오버로딩(Overloading)과 오버라이딩(Overriding) 성립 조건

구분 오버로딩 오버라이딩
메서드 이름 동일 동일
매개변수, 타입 다름 동일
리턴 타입 상관없음 동일

오늘은 이렇게 메서드 오버로딩과 오버라이딩에 대해서 알아보았습니다.

다음 포스팅에서는 추상클래스와 인터페이스에 대해서 알아보도록 하겠습니다!

 

출처 : 자바의 정석 3rd Edition 내용 정리

728x90
반응형