아이티-잉

공부하며 정리하는 IT블로그

Today   Total  
2023년! 복 많이 받으세요

오버로딩(Overloading)과 오버라이딩(Overriding) in JAVA

2016. 5. 26. 20:47

오버로딩(Overloading)

 

 

오버로딩(Overload)은 초과를 의미하는 over와 짐, 적재를 의미하는 load의 합성어다.

즉, 우리말로 직역하면 초과적재(?)정도 되겠다.

 

일상의 예를 들면, SUV차량에 서류가 가득차있을 땐 업무 목적으로 차량이 쓰일 것이고,

주말엔 가족을 태우고 여행을 가거나, 스포츠용품을 싣고 레저를 즐기러 가는등등

같은 SUV차량임에도 적재하는 화물(?)에 따라 다용도로 쓰일 수 있다.

 

보다 쉽게 코드 예를 살펴보자.

 

 


~ 광고 타임 ~


 

 

JAVA 코드

public class TestClass {

public static void main(String[] args){

System.out.println("#1. 오버로딩 테스트");
Students s1 = new Students();
Students s2 = new Students("아이티-잉");
Students s3 = new Students("아이티-잉", 20);

/*생성자 오버로딩*/
System.out.println("\n== 생성자 오버로딩 ==");
s1.printInfo();
s2.printInfo();
s3.printInfo();

/*함수(메소드) 오버로딩*/
System.out.println("\n== 메소드 오버로딩 ==");
s1.printInfo();
s1.printInfo(1);
s1.printInfo("Hi");
}
}

class Students{
private String name;
private int age;

public Students(){ /*기본 생성자*/
this.name = "쏘르빈";
this.age = 5;
}

public Students(String name){ /*생성자 오버로딩*/
this.name = name;
this.age = 10;
}

public Students(String name, int age){ /*생성자 오버로딩*/
this.name = name;
this.age = age;
}

public void printInfo(){ /*학생정보 출력*/
System.out.println("저의 이름은 [" + this.name + "]이고, 나이는 [" + this.age + "]세 입니다.");
}

public void printInfo(int i){ /*학생정보 오버로딩*/
System.out.println("학생 정보 안 알려줄껀데?");
}

public void printInfo(String s){ /*학생정보 오버로딩*/
System.out.println("나는 그 학생을 본지 오래됐어.");
}
}

 

결과

 

 

 

 

 

풀이

 

크게 생성자 오버로딩과 메소드 오버로딩을 예로 들어봤다.

 

먼저, 생성자 오버로딩에선 Students 클래스 내 생성자의 매개변수가 모두 다르다.

Students(), Students(String name), Students(String name, int age) 총 3개의 생성자가 존재한다.

그리고 호출시 그에 맞는 로직이 실행됨을 볼 수 있다.

 

메소드 오버로딩에서는 생성자 오버로딩과 마찬가지로 printInfo() 메소드 명은 모두 동일하지만,

매개변수(인자, 파라미터)가 모두 다르게 정의되어 있고 저마다의 로직이 호출되고 있다.

 

즉, 함수명이 같아야 하고 매개변수가 달라야 오버로딩이 성립된다.

끼워맞춰보면, 앞서 같은 SUV차량임에도 적재하는 물건이나 인원에 따라 목적이 변하는 것과 같은 이치다.

 

 

 

오버라이딩(Overriding)

 

 

 

오버라이딩(Overriding)은 초과의 의미를 같는 오버(over)와 탑승의 의미를 갖는 라이딩(riding)이 합쳐진 말이다.

직역해서 생각해보면 어딘가에 초과해서 탑승하는 셈이다.

 

기존의 것 위에 더 올려버리는 셈인데, 예를들어 말 한마리를 생각해보자.

말 위에 선수가 올라타면 경주용으로 쓰일 수 있지만, 주말엔 어린이를 올려태워서 관광상품으로 쓰일 수 있다.

 

음.. 예가 적절하지 않은듯 하여 바로 코드로 넘어가보자.

 

 

JAVA 코드

package preTest;

public class TestClass {

public static void main(String[] args){

System.out.println("#2. 오버라이딩 테스트");

Car c1 = new Car();
Car c2 = new SportsCar();
SportsCar s = new SportsCar();

c1.carInfo();
c2.carInfo();
s.carInfo();
}
}

class Car{

public void carInfo(){ /*메소드 오버라이딩*/
System.out.println("나는야 걍 카");
}
}

class SportsCar extends Car{

public void carInfo(){ /*메소드 오버라이딩*/
System.out.println("나는야 스포츠카");
}
}

 

결과

 

 

 

풀이

 

Car 객체 c1을 Car 인스턴스로 생성했고, c2는 Car 클래스를 상속받는 SportsCar 인스턴스로 생성했다.

같은 메소드를 호출했음에도 전자는 걍 카, 후자는 스포츠카라며 말하고 있다.

 

이와같이 자식클래스가 부모클래스의 메소드를 있는 그대로 재정의하는 것을 오버라이딩이라고 한다.

처음에 라이딩이 '쓰다'의 롸~이트(Write)에서 온줄 알았는데, 그렇게 이해해도 도움이 될 것이다.

'덮어 쓰기'와 같은 성격이 있기 때문이다. 그래서인지 오버라이딩을 함수재정의라고도 한다.

 

그리고 위에서 볼 수 있듯이 오버라이딩은 메소드 형태가 동일해야 한다.

 

 


~ 광고 타임 ~


 

 

 

마치며

 

자바로 분류한 이유는 코드를 자바로 예시했기 때문이다.

오버로딩과 오버라이딩은 C와 C++에서도 동일한 기능을 한다.

 

 

오버로딩은 '더 쌓는 다'는 이미지를 기억하여, 매개변수를 달리한다고 받아들이고,

오버라이딩은 '더 얹는다'는 이미지를 기억하여, 덮어쓴다고 생각하자.

 

 

끝.