본문 바로가기
컴퓨터 지식창고

오버로딩(Overloading)과 오버라이딩(overriding) 차이

by 재미보장 2021. 12. 14.

이번 포스팅에서는 오버로딩(Overloading)과 오버라이딩(overriding) 차이에 대하여 코드를 통해서 살펴보겠다.

오버로딩(Overloading)이란

오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다.'라는 뜻이다. C언어에서는 함수명이 고유하게 존재해야 한다. 즉 하나의 함수가 하나의 기능만을 구현해야 한다는 것이다. 하지만 자바에서는 하나의 메소드 이름으로 여러 기능을 구현하기 때문에 '과적하다.'라는 뜻의 이름을 붙여준 것으로 보인다.

 

오버로딩의 정의는 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.

오버로딩의 조건

메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다. 주의할 점은 '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다. 아래의 코드를 통해서 예를 들어보자.

 

<코드>

class OverloadingTest {

public static void main(String[] args) {
OverloadingMethods om = new OverloadingMethods();

om.print();
System.out.println(om.print(3));
om.print("Hello!");
System.out.println(om.print(4, 5));
}
}

class OverloadingMethods {
public void print() {
System.out.println("오버로딩1");
}

String print(Integer a) {
System.out.println("오버로딩2");
return a.toString();
}

void print(String a) {
System.out.println("오버로딩3");
System.out.println(a);
}

String print(Integer a, Integer b) {
System.out.println("오버로딩4");
return a.toString() + b.toString();
}

}

 

<결과>

오버로딩1
오버로딩2
3
오버로딩3
Hello!
오버로딩4
45

 

위 코드는 아무런 문제없이 잘 실행되고 있다. print라는 같은 이름을 가진 네개의 메소드가 매개변수의 개수와 타입를 다르게 지정하여 지정하는 것이 가능하다는 것을 보여주고 있다. 단, 여기서 한번 더 강조할 점은 '리턴 값'만 다르게 지정하는 것은 오버로딩할 수 없다는 것이다.

 

또한 접근 제어자도 자유롭게 지정해 줄 수 있다. 각 메소드의 접근 제어자를 public, default, protected, private으로 다르게 지정해줘도 상관없다는 것이다. 접근 제어자만 다르게한다고 오버로딩이 가능하지 않다는 것도 알아두자. 결국 오버로딩은 매개변수의 차이로만 구현할 수 있다는 것이다. 매개변수가 다르다면 리턴 값은 다르게 지정할 수 있다.

오버라이딩(overriding)이란 

오버라이딩이란 조상 클래스로부터 상속받은 메서드의 내용을 변경(재 정의)하여 사용하는 것이다. 상속받은 메서드를 그대로 사용할 수도 있지만, 필요에 따라 메서드를 재정의 하여 사용해야 하는 경우가 있다. 이와 같이 조상 클래스로부터 상속받은 메서드를 재정의 하여 사용하는 경우를 오버라이딩이라고한다.

오버라이딩(overriding) 조건

오버라이딩의 조건은 위와 같습니다.

  1. 매개변수가 같아야 한다.
  2. 리턴타입이 같아야 한다.

코드를 통해 예시를 살펴 보겠습니다.

<코드>
public class Parent {

    public void overridingTest() {
        System.out.println("부모 메서드의 내용");
    }
}
 
class Child extends Parent{
 
    @Override
    public void overridingTest() {
        System.out.println("상속받은 부모메서드의 내용을 수정하여 자식메서드의 내용으로 재사용");
    }
}

 

위의 코드는 Child클래스가 조상클래스인 Parent클래스의 overridingTest()메서드를 상속받아 재사용 하는 코드입니다. 오버라이딩이란 메서드의 선언부는 조상의 메서드와 일치하며, 메서드의 내용만 재정의하여 사용하는 것 입니다.

오버로딩(Overloading)과 오버라이딩(overriding) 차이

오버로딩과 오버라이딩에 대해서 알아보았다. 이름이 비슷하기 때문에 기억하기 힘들다고 생각한다면, 오버로딩의 loading 사전적인 의미에 집중해보자, 로딩은 짐을 싣다할 때 어떤 것에 운반해서 올리는 이미지다. FPS게임을 하면 "리로드!"라고 외치며 총알을 장전하는 모습을 충분히 상상이 가능할 것이다.

 

이때 총알을 운반에 총에 실어담는 Loading의 개념이 적용된 샘이다. 영어공부나 하자고 이런 이야기를 꺼낸 것은 아니고, 여기서 오버로딩 또한 같은 의미의 용어이다. 위의 사진처럼 여러개의 메소드를 실어 담아놓아서 여러 개의 방향으로 쏠 수 있는 하나의 거대한 메소드를 만드는 것이다. 다만 여기서 주의해야할 것은 화살 하나 하나가 다른 재질(매게 변수)를 지녀야 한다는 점이다.

 

여기서 라이딩 또한 쉽게 유추해볼 수 있다. 라이딩은 말그대로 타는 것. 자전거를 타든 자동차를 타든 그걸 타는 사람에 의해서 그 탈것(메소드)의 방향과 결과가 달라진다. 위의 사진으로 본다면 화살 위에 또다른 화살을 태워서(Riding)날려보내는 느낌이다.

 

이 둘을 비교해서 굳이 차이를 나눈다면 오버로딩은 매게변수나 타입이 달라야하지만 오버라이딩은 동일해야하고 오버로딩은 리턴 타입이 무엇이든지 상관없지만 오버라이딩은 동일해야한다는 차이점이 있다.

 

연관정보 : 명령어 처리방식 RISC와 CISC의 비교

 

명령어 처리방식 RISC와 CISC의 기본개념과 비교

컴퓨터의 명령어 처리 방식에는 RISC와 CISC RISC(Reduced Instruction Set Computer)는 컴퓨터 내부적으로 사용하는 명령어 세트를 단순화 시켜서 처리하는 형태의 구조이다. 단순한 명령을 조합해서 하나의

gguljaem.tistory.com

연관정보 : 리눅스의 개념과 장점 

 

리눅스의 개념과 장점에 대하여 알아보자

리눅스는 유닉스를 모태로 한다. 유닉스에서 나왔다고 봐도 되지만, 리눅스는 사실 오픈소스 개념으로 출시되고, 리눅스 제단이 있지만, 누구가 소스를 수정하여 재컴파일할 수 있다. 이번 포스

gguljaem.tistory.com

 

댓글