NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Java 15-3. 메서드의 오버로딩 (Method's Overloading)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 감기 때문에 한참 고생했네요-_-; 몸이 안좋은 상태에서 무리하게 당구치고 놀다가 그만 다음날 뻣었습니다. 회사는 병가로 나가지도 못하고 4일 밤낮을 누워만 있었더니 허리가 아파 죽겠더라구요. 원래 약골이라 자주 아프기는 하지만 이번처럼 지독한 감기는 처음이었습니다. 여러분들도 감기 조심하세요^^;

     

    오늘은 OOP(Object Oriented Programming, 객체 지향 프로그래밍)의 핵심 개념 중 하나인 다형성을 구현하는 2가지 중 하나인 오버로딩(Overloading)에 대해서 알아보겠습니다.

     

    메소드는 다음의 규칙을 통해 같은 이름으로 여러번 정의될 수 있습니다. 물론, 메소드뿐만이 아니라 생성자도 오버로딩이 가능합니다.예전 C언어에는 시그니처가 다르더라도 동일한 이름으로 메소드를 생성할 수 없었습니다. 엄밀히 말하면 함수(Function)라고 해야겠죠.

     

    오버로딩은 정적 다형성으로 메서드를 구성하는 파라메터의 타입과 개수가 다르면 같은 이름으로 메서드를 정의할 수 있도록 하는 메커니즘을 제공합니다. 이런 규칙을 메서드의 시그니처라고 부르죠. 아래의 예가 모든 경우의 수를 표현하지는 않지만, 기본적인 내용을 잘 보여주고 있습니다. Java와 C#은 모두 반환 형식을 메서드의 시그니처에 포함시키지 않았습니다. 따라서 반환 형식을 지정하거나 void로 지정해도 같은 시그니처로 인식합니다. 또한, C#의 parmas 한정자와 같은 가변인자(...)의 경우 메소드 시그니처에 포함되어 있고, 파라메터의 순서가 달라도 오버로딩이 가능합니다.

    package ObjectOrientedProgramming;
     
    public class MethodOverloading {
        static int Plus(int a, int b) {
            System.out.println("Calling int Plus(int,int)...");
            return a + b;
        }
     
        static int Plus(int a, int b, int c) {
            System.out.println("Calling int Plus(int,int,int)...");
            return a + b + c;
        }
     
        static double Plus(double a, double b) {
            System.out.println("Calling double Plus(double,double)...");
            return a + b;
        }
     
        static double Plus(int a, double b) {
            System.out.println("Calling double Plus(int, double)...");
            return a + b;
        }
     
        public static void main(String[] args) {
            System.out.println(Plus(1, 2));
            System.out.println(Plus(1, 2, 3));
            System.out.println(Plus(1.0, 2.4));
            System.out.println(Plus(1, 2.4));
        }
    }
    

     

     

    아래는 위 코드를 실행한 결과입니다.

    j1yVgVG.png

     

     

    ※ 시그니처란?

    클래스, 구조체 및 인터페이스의 맴버를 오버로드할 수 있는 메커니즘입니다.

     

    여기 주제와는 상관 없는 내용이지만, 메소드의 시그니처에 대해서 약간이나마 알아보았기 때문에 함수형 프로그래밍에 대해서도 알아볼 수 있는 기회가 있었으면 합니다. 함수형 프로그래밍에서 메소드는 순수하게 작성하는것을 가장 중요한 가치중의 하나로 여깁니다. 순수 함수(또는 메소드)란, 입력과 출력이 투명하게 인자와 반환값으로 확인될 수 있어야 한다는 의미입니다. 

     

    이 말이 예제가 없이는 이해가 안갈수도 있습니다. 언젠가 설명할 수 있는 시간이 있을지도 모르겠지만, Java나 C#과 같은 언어도 함수형 프로그래밍을 할 수 있습니다. 하지만, 함수형 언어들이 있는데 굳이 OOP언어로 해야 하나 싶기도 합니다. 그렇지만, OOP의 장점과 함수형 프로그래밍의 장점(언어가 아닌 개념적인)을 적절히 사용한다면 좀 더 바람직한 방향으로 나아가지 않을까 생각해봅니다.

     

    함수형 언어(스칼라, 하스켈...)는 함수형 프로그래밍의 개념을 강제하는 언어입니다. Java가 OOP를 쉽게할 수 있도록 하는것처럼요. 스칼라의 경우에는 객체 지향 언어와 함수형 프로그래밍의 요소가 결합된 다중 언어라 할 수 있습니다. 하지만, 하스켈은 순수 함수형 프로그래밍언어입니다. 

    8alhsx2.jpg

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.