본문 바로가기
프로그래밍/자바(Java)

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

by imfireguy 2020. 12. 20.
반응형



목차

 - 오버로딩(Overloading) 이란?

 - 오버라이딩(Overriding) 이란?

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


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


오버로딩(Overloading), 오버라이딩(Overriding) 외우면 까먹고 헷갈리는 이것들을 정리해 보도록 하겠습니다.


*다형성이란?


객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록함으로써 다형성을 프로그램적으로 구현하였습니다. 인터페이스와 상속은 둘 다 다형성이라는 객체지향 프로그래밍의 특징을 구현하는 방식입니다.


오버로딩(Overloading) 이란?


오버로딩(Overloading)은 메소드 오버로딩과 생성자 오버로딩이 있습니다. 

하지만 둘다 같은 개념입니다. 같은 이름의 함수를 여러 개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답하게 합니다.


먼저 테스트를 위해서 OverloadingTest.java를 만들어 줍니다.

그리고 TestOverLoading() 이라는 매소드를 만들어 줍니다.

단, 여기서 동일한 이름의 매소드이지만 매개변수를 다르게 해서 세개를 만들어 줍니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class OverloadingTest {
    public void TestOverLoading() {
        System.out.println("매개변수 존재하지 않음.");
    }
    
    public void TestOverLoading(String a, String b) {
        System.out.println("매개변수 a는 " + a + " 그리고 매개변수 b는 " + b);
    }
    
    public void TestOverLoading(String a, int b, String c) {
        System.out.println("매개변수 a는 " + a + " 그리고 매개변수 b는 " + b + "더해서 매개변수 C는 " + c);
    }
    
}
cs


만든 클래스 파일은 두고 이제 새로운 파일을 생성해서 해당 클래스에 매소드를 불러와 보겠습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class OverLoading {
 
    public static void main(String[] args) {
        
            OverloadingTest ot = new OverloadingTest();
            
            ot.TestOverLoading();
            
            ot.TestOverLoading("첫번째""두번째");
            
            ot.TestOverLoading("세번째"10"네번째");
 
    }
 
}
cs



실행결과



1
2
3
4
매개변수 존재하지 않음.
매개변수 a는 첫번째 그리고 매개변수 b는 두번째
매개변수 a는 세번째 그리고 매개변수 b는 10더해서 매개변수 C는 네번째
 
cs


이처럼 오버로딩은 예제에서 TestOverLoading() 이라는 매소드를 여러개 정의하고 매개변수만 변경하여 선언했을 때, 호출되는 매개변수에 매칭되어 각각의 매소드를 실행 시키게 됩니다.



오버라이딩(Overriding) 이란?


상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메소드도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다. 하지만, 하위 클래스에서 메소드를 재정의해서 사용할 수 있습니다.


상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술을 오버라이딩(Overriding) 이라고 합니다.



1
2
3
4
5
6
7
8
9
10
11
12
public class Student {
    
    public String name;
    public int age;
    
    public void print() {
        
        System.out.println("학생의 이름은 " + this.name + " 입니다. \n그리고 나이는" + this.age + "입니다." );
        
    }
    
}
cs



1
2
3
4
5
6
7
8
9
public class ClassPresident extends Student{
    String classPresident;
    
    public void print() {
        System.out.println("학생의 이름은 " + this.name + " 입니다. \n그리고 나이는 " + this.age + " 입니다." );
        System.out.println("학생의 이름은 " + this.name + " 입니다. \n그리고 학생은 " + this.classPresident + " 입니다." );
    }    
}
 
cs


위와 마찬가지로 만들어진 클래스를 불러오고 값을 셋팅해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class OverridingTest {
 
    public static void main(String[] args) {
        // 클래스 객체생성
        ClassPresident cp = new ClassPresident();
        
        // 변수설정
        cp.name = "코비";
        cp.age = 19;
        cp.classPresident = "반장";
        
        cp.print();
        
    }
}
 
cs



실행결과 



1
2
3
4
5
학생의 이름은 코비 입니다. 
그리고 나이는19입니다.
학생의 이름은 코비 입니다. 
그리고 학생은 반장 입니다.
 
cs


Student에 print() 함수를 선언하고, ClassPresident에서 Student를 상속하여 print() 메소드를 재정의 하였습니다.


OverridingTest main 매소드에서 ClassPresident 클래스를 생성 후, print() 메소드를 호출하면 오버라이딩된 classPresident 객체의 print() 메소드가 호출되고, 실행결과가 보여지게 됩니다.


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


 구분

오버로딩 

오버라이딩 

매소드 이름

동일 

동일 

매개변수, 타입

다름 

동일 

리턴타입 

상관없음 

동일 





반응형

댓글