본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

오버로딩(Overloading, 중복 정의)은 같은 이름의 함수·메서드나 연산자를 매개변수의 개수나 자료형을 달리해 여러 개 정의해 두고, 호출할 때 넘긴 인자에 맞는 것이 골라지게 하는 기능이다.

어느 정의를 부를지는 컴파일할 때 인자의 개수와 자료형으로 정해진다. 그래서 오버로딩은 컴파일 시간에 결정되는 정적 다형성의 한 형태다. 같은 일을 하는 함수에 printInt, printDouble 처럼 이름을 따로 붙이지 않아도 되어 코드를 읽기 쉬워진다.

메서드 오버로딩

편집 원본 편집

같은 클래스 안에 이름이 같고 매개변수의 개수나 자료형이 다른 메서드를 여러 개 둔다.

class Calc {
    int add(int a, int b)            { return a + b; }
    int add(int a, int b, int c)     { return a + b + c; }
    double add(double a, double b)   { return a + b; }
}
  • 반환형만 다른 것은 오버로딩이 아니다. 호출하는 쪽에서 구별할 수 없어 컴파일 오류가 난다
  • 생성자도 오버로딩할 수 있다
  • 자바의 규칙과 예는 자바 오버로딩

연산자 오버로딩

편집 원본 편집

+, -, ==, [] 같은 연산자를 사용자 정의 자료형에 대해 새로 정의한다. 복소수·행렬·문자열 객체를 기본 자료형처럼 a + b 로 쓸 수 있게 된다.

struct Point {
    int x, y;
    Point operator+(const Point &o) const { return {x + o.x, y + o.y}; }
};
Point c = a + b;   // a.operator+(b) 를 부른다
  • C++ 은 operator 키워드로, 파이썬은 __add__, __eq__ 같은 특수 메서드로 정의한다
  • 자바는 사용자 정의 연산자 오버로딩을 지원하지 않는다. 문자열의 + 만 언어가 정해 둔 예외다
  • 연산자의 원래 의미와 다르게 정의하면 코드를 오해하게 되므로 자연스러운 경우에만 쓴다

연산자 오버로딩은 같은 기호를 자료형마다 다른 뜻으로 쓰게 하는 언어 기능이다. 모듈 사이의 결합도를 낮추고 독립성을 높이려고 시스템을 기능 단위로 나누는 설계 원칙은 모듈화다.

오버라이딩과의 차이

편집 원본 편집
구분 오버로딩 오버라이딩
뜻 같은 이름, 다른 매개변수로 새로 여러 개 정의 상속받은 메서드를 하위 클래스가 같은 모양으로 다시 정의
위치 같은 클래스 안(상속 관계에서도 가능) 상위·하위 클래스 사이
매개변수 개수나 자료형이 달라야 한다 같아야 한다
결정 시점 컴파일 시간(정적 바인딩) 실행 시간(동적 바인딩)