[Java] 오버로딩(Overloading)

Date:     Updated:

카테고리:

태그:

java.png

오버로딩의 사용 이유

  • 매개변수 종류 별로 메소드 내용을 다르게 작성해야하는 경우들이 있다
  • 이 때 동일한 기승의 메소드를 매개변수에 따라 다르게 이름을 정의하면 복잡하고 관리가 어렵다
  • 규모가 작은 프로그램의 경우는 정도가 덜하지만, 규모가 거대한 경우 메소드 또한 관리가 어려워 진다
  • 따라서 동일한 이름으로 다양한 종류의 매개변수에 따라 처리해야하는 여러 메소드를 동일한 이름으로 관리하기 위해 사용하는 기술을 오버로딩이라고 한다.

오버로딩의 조건

  • 동일한 이름을 가진 매소드의 파라미더 선언부에 매개변수 타입, 갯수, 순서를 다르게 작성하여 현 클래스 내에서 동일한 이름의 메소드를 여러개 작성할 수 있도록 한다
  • 메소드 시그니처가 다르면 다른 메소드로 인식하기 때문이다
  • 즉, 시그니처 중 메소드의 이름은 동일해야하기 때문에 파라미터 선언부가 다르게 작성되어야 오버로딩이 성립된다

메소드 시그니처란?

  • public void method(int num){}이라는 메소드의 메소드명과 파라미터 선언부 부분을 시그니처라고 부른다
  • method(int num) 이 부분이 시그니처이다
  • 매소드 시그니처가 달라야하기 때문에 접근제한이나 변환형은 오버로딩 성립요건에 해당하지 않는다

  • OverloadingTest
package section05.overloading;

public class OverloadingTest {

    public void test(){}
    // public void test(){} //에러남

    //private void test(){} //에러남 // 접근제한자는 매소드 시그니처에 해당하지 않는다.

    /*public in test(){  //에러남 // 반환형은 매소드 시그니처에 해당하지 않는다.
        return 0;
    */

        public void test(int num){}      //파라미터 선언부는 매소드 시그니처에 해당합니다.

        public void test (int num, int num2){} // 매개변수 갯수에 따른 오버로딩 확인

        public void test(int num,String name){}     // 매개변수 타입에 따른 오버로디로딩 확인

        public void test(String name, int num){}    // 매개변수 순서에 따른 오버로딩 확인

    }

메소드의 파라미터에 대해 이해하고 사용할 수 있다

  • 매개변수(parameter)로 사용 가능한 자료형
    1. 기본자료형
    2. 기본자료형 배열
    3. 클래스자료형
    4. 클래스자료형 배열
    5. 가변인자

-Application.java

package section05.parameter;

import javax.lang.model.SourceVersion;

public class Application {
    public static void main(String[] args) {
        
        /*인스턴스 생성*/
        ParameterTest pt = new ParameterTest();

        /* 1. 기본자료형을 매개변수로 전달받는 메소드 호출 확인*/
        int num = 10;
        pt.testPrimaryType(num);

        /* 2. 기본자료형을 매개변수로 전달받은 메소드 호출 확인*/

        int[] iarr = new int[]{1, 2, 3, 4, 5};

        System.out.println("인자로 전달하는 값= " + iarr );
        pt.testPrimaryTypeArray(iarr);

        System.out.print("변경된 원본 배열의 값 출력 : ");
        for (int i = 0; i < iarr.length; i++) {
            System.out.print(iarr[i] + " ");
        }
        System.out.println();

        /* 3. 클래스 자료형 */
        RectAngle r1 = new RectAngle((12.5), 22.5);
        System.out.println("인자로 전달하는 값 :" + r1);
        pt.testClassType(r1);

        System.out.println("================ 변경 후 사각형의 넓이와 둘레 ================");
        r1.calcArea();
        r1.calcRound();

        /* 4. 클래스 자료형 배열은 뒤에 다룬다. */

        /* 5. 가변인자 */
//        pt.testVariableLengthArray();
        pt.testVariableLengthArray("홍길동");  // 가변인자는 전달하지 않아도 됨
        pt.testVariableLengthArray("유관순","볼링");   // 1개도 전달가능
        pt.testVariableLengthArray("이순신","볼링","농구","축구");   // 여러개도 가능
        pt.testVariableLengthArray("신사임당", new String[]{"테니스", "족구", "농구", "만두빚기"});    // 배열도 가능



    }
}
  • ParameterTest.java
package section05.parameter;

public class ParameterTest {

    public void testPrimaryType(int num) {
        System.out.println("내개변수로 전달 받은 값 = " + num);

    }

    public void testPrimaryTypeArray(int[] iarr) {

        System.out.println("매개변수로 전달 받은 값 = " + iarr);

        System.out.print("배열의 값 출력 : ");
        for (int i = 0; i < iarr.length; i++) {
            System.out.print(iarr[i] + " ");

        }
        System.out.println();

        iarr[0] = 99;

        System.out.println("변경된 배열의 값 출력 = " + iarr);

        System.out.print("배열의 값 출력 : ");
        for (int i = 0; i < iarr.length; i++) {
            System.out.print(iarr[i] + " ");
        }
        System.out.println();
    }

    public void testClassType(RectAngle rectAngle) {

        System.out.println("매개변수로 전달받은 값 = " + rectAngle);

        System.out.println("================ 사각형의 넓이와 둘레 ================");
        rectAngle.calcArea();
        rectAngle.calcRound();

        rectAngle.setWidth(100);
        rectAngle.setHeight(100);

        System.out.println("================ 변경 된 사각형의 넓이와 둘레 ================");
        rectAngle.calcArea();
        rectAngle.calcRound();

    }

    public void testVariableLengthArray(String name, String... hobby) {
        /* (...)은 가변인자를 나타내는 문법. 메서드에 여러 개의 매개변수를 전달할 수 있도록 한다.
        가변인자를 사용하면 메서드를 호출할 때 필요한 수만큼의 인자를 전달할 수 있으며, 메서드 내부에서 해당 이자들을 배열로 처리할 수 있다. */
        System.out.println("이름 : " + name);
        System.out.println("취미의 갯수 : " + hobby.length);
        System.out.print("취미 : ");
        for (int i = 0; i < hobby.length; i++) {
            System.out.print(hobby[i] + " ");
        }
        System.out.println();

    }

}
  • RectAngle.java
package section05.parameter;

public class RectAngle {

    private double width;
    private double height;

    public RectAngle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getWidth() {
        return width;
    }

    public double getHeight() {
        return height;
    }

    public void calcArea() {

        double area = width * height;

        System.out.println("이 사각형의 넓이는? = " + area + "입니다.");

    }

    public void calcRound() {

        double round = (width + height) * 2;

        System.out.println("이 사각형의 둘레는?  = " + round + "입니다.");

    }

}

요약. 파라미터: 함수나 메소드에 전달되는 값으로, 해당 함수 또는 메소드에서 사용되는 변수를 초기화하거나 조작하는 데 사용된다

오늘도 좋은일만 가득하길..

Java 카테고리 내 다른 글 보러가기

댓글 남기기