형변환이 가능한 Overloading

오버로딩 부분을 공부하다가 매개변수로 형변환이 가능한 메서드들을 오버로딩할 시 무엇이 다른가하는 궁금증이 발생해서 시도해봤다. 

 

오버로딩이란?

자바에서는 객체지향언어이기에 클래스 단위로 프로그램을 작성한다. 그렇기에 하나의 클래스 안에서 속성을 저장하기 위한 변수와 기능을 수행하기 위한 메서드가 함께 담기게된다. 그렇기에 클래스 안에서 중복되는 변수명, 메서드명을 가질경우 추후에 사용할 시점에 구별을 할 수 없기에 컴파일 단계에서 중복관련 에러가 발생한다. 여기까지가 개념적으로 맞는 부분이다. 그러나 오버로딩을 활용하면 동일한 메서드명을 사용하여 다양한 형태로 기능을 처리할 수 있게된다. 이때 각 메서드를 구별하는 요소는 전적으로 매개변수에 의해서만 결정되며 자세하게는 매개변수의 개수나 타입을 지정함에 따라 서로 구별될 수 있다.

 

이때, 궁금증이 생긴 부분이 예를들어 long 타입의 매개변수로 해놓으면 그보다 작은 범위인 정수형들은 값으로 모두 받을 수 있을 것이며, 그렇다면 int , long으로 타입을 다르게 할 경우 넘겨주는 쪽에서 단순 int 범위로 할 경우 이때 두 메서드 중 무엇으로 받아야하는지 모르는것이 아닌가? 하는 의문이 들어 실제로 어떻게 구별을 하며 요청을하는 클라이언트 측에서는 내가 원하는 메서드를 어떻게 결정할 수 있는지 확인해봤다. 

 

class OverLoding{

    static void method(long a, long b){
        System.out.println("long long");
    }

    static void method(long a, int b){
        System.out.println("long int");
    }

    static void method(int a, long b){
        System.out.println("int long");
    }
    static void method(byte a , byte b){
        System.out.println("byte byte");
    }

    static void method (short a, short b){
        System.out.println("short short");
    }

    static void method (char a, char b){
        System.out.println("char char");
    }
    static void method(int a, int b){
        System.out.println("int int");
    }

    public static void main(String[] args) {
        OverLoding.method(1 , 1); //  int int
        OverLoding.method((short) 2, 2); // int int
        OverLoding.method((short) 2,(short) 2); // short short
        OverLoding.method((byte) 1 , 1); // int int
        OverLoding.method((byte) 1 , (byte)1); // byte byte
        OverLoding.method((char)1,12); // int int
        OverLoding.method((char)1,(char)12);// char char
        OverLoding.method(1,1); // int int
        OverLoding.method(1,1L); // int long
        OverLoding.method(1L,1L); // long long
        OverLoding.method(1L,1); // long int
    }
}


class OverLoding2{

    static void method(long a, long b){
        System.out.println("long long");
    }

    static void method(int a, int b){
        System.out.println("int int");
    }

    static void method(byte a, byte b){
        System.out.println("byte byte");
    }

    public static void main(String[] args) {
        OverLoding2.method(1 , 1); // int int
        OverLoding2.method((short) 2, 2); // int int
        OverLoding2.method((short) 2,(short) 2); // int int
        OverLoding2.method((byte) 1 , 1); // int int
        OverLoding2.method((byte) 1 , (byte)1); // byte byte
        OverLoding2.method((char)1,12); // int int
        OverLoding2.method((char)1,(char)12); //  int int
        OverLoding2.method(1,1); //  int int
        OverLoding2.method(1,1L); //  long long
        OverLoding2.method(1L,1L);//  long long
        OverLoding2.method(1L,1);//  long long
    }
}

2가지의 케이스를 통해서 한번 확인해봤다. 이처럼 정의되어 있는 메서드에 매개변수에 타입과 일치시켜주면 정확하게 해당 메서드를 호출할 수 있으며, 그렇지 않은 경우는 기본타입을 따라 가는 것 같다. 다음으로 흥미로웠던 부분은 Overloading2 클래스에 long 타입 매개변수 관련 부분인데 이처럼 호출하는 쪽에서 어떻게 하는가에 따라서 오버로딩 된 메서드 중 무엇을 사용할 지 결정되는 것 같다. 그러나 한편으로는 오버로딩을 하는 것도 다양한 형태로 같은 기능을 처리하기 위한 것이지 실제로 처리할 기능은 매개변수보다는 메서드명에서 결정된다고 생각한다. 클라이언트 입장에서도 메서드명을 통해서 어떤 기능을 수행하겠다. 예측할 수 있는 것이지 매개변수로 결정하지는 않을 것이다.