티스토리 뷰

1. 오버로딩이란?

💡 동일한 클래스 내에는 동일한 이름의 생성자 혹은 메소드를 작성하지 못한다. 하지만 매개변수의 타입, 갯수, 순서를 다르게 작성하면 서로 다른 생성자나 메소드로 인식하기 때문에 동일한 이름의 생성자나 메소드를 여러 개 작성할 수 있게 해준다.

package com.ohgiraffers.section05.overloading;

public class OverloadingTest {

    /* 수업목표. 오버로딩(Overloading)에 대해 이해할 수 있다. */

    /* 필기.
    *   메소드의 시그니처?
    *    public void method(int num){}이라면, 메소드의 메소드명과 파라미터 선언부 부분을
    *    메소드의 시그니처(signature)라고 한다.(즉, method(int num))
    *
    * 필기.
    *  동일한 메소드 이름으로 다양한 종류의 매개변수에 따라 처리해야 하는 경우 적용하는 기술을
    *  오버로딩이라고 한다.
    *
    * 필기.
    *  오버로딩의 조건?
    *   매개변수의 타입, 갯수, 순서를 다르게 작성하여 하나의 클래스 내에 동일한 이름의 메소드를
    *   여러 개 작성할 수 있다.
    *   메소드의 헤드부(중괄호 앞)에 있어 시그니처를 제외한 부분이 다르게 작성되는 것은 인정되지 않는다.
    * */

    /* 필기. ex. println
    *   하나의 메소드, 여러 개의 매개변수.
    *   메소드의 시그니처가 달라서 가능하다.
    *   같은 클래스 안에서!
    * */
    public void test() {}

//    private String test() {}        // 메소드 오버로딩에서는 시그니처를 제외한 나머지는 무관

    /* 설명. 매개변수의 갯수가 달라짐 */
    public void test(int num) {}

    public void test(int num1, int num2) {}

//    public void test(int num2, int num1) {}     // 매개 변수명이 다른 것은 무관

    /* 설명. 매개변수의 타입이 달라짐 */
    public void test(int num1, String str) {}

    /* 설명. 매개변수의 순서가 달라짐(타입만 고려) */ // 문제 내기 딱 좋네!!!!!!!
    public void test(String str, int num) {}

}

2. 매개변수로 사용 가능한 자료형

💡 5가지 형태의 매개변수
: 기본자료형, 기본자료형 배열, 클래스 자료형, 클래스 자료형 배열, 가변인자
package com.ohgiraffers.section05.parameter;

import java.util.Arrays;

public class Application {
    public static void main(String[] args) {
        System.out.println("프로그램 실행 시 던져진 값: " + Arrays.toString(args));

        /* 수업목표. 메소드의 파라미터(매개변수)에 대해 이해하고 사용할 수 있다. */

        /* 필기.
        *   파라미터로 사용 가능한 자료형
        *   1. 기본자료형
        *   2. 기본자료형 배열
        *   3. 클래스자료형(참조자료형)
        *   4. 클래스자료형 배열(객체 배열이지만 다음 챕터에서 다룰 예정)
        *   5. 가변인자
        * */

        ParameterTest pt = new ParameterTest();

        /* 목차. 1. 기본자료형을 매개변수로 전달 받는 메소드 호출 */
        /* 필기. call by value, call by reference 차이 정리! (면접) */
        /* 설명. 리터럴 값(참조 주소값 X)을 전달해서 메소드를 호출 시에는 서로 다른 지역 변수는 서로 영향 X */
        int num = 20;       // 리터럴을 메소드에 넘겨도 여기에 영향을 받지 않는다
        System.out.println("call by value 전: " + num);
        pt.testPrimitiveTypeParameter(num);                 // 리터럴 값에 의한 호출(call by value)
        System.out.println("call by value 후: " + num);

        /* 목차. 2. 기본자료형 배열을 매개변수로 전달 받는 메소드 호출 */
        int[] iArr = new int[]{1, 2, 3, 4, 5};
        System.out.println("call by reference 전: " + Arrays.toString(iArr));
        pt.testPrivitiveTypeArrayParameter(iArr);           // 참조 값에 의한 호출 , 주소값을 넘긴다.
        System.out.println("call by reference 후: " + Arrays.toString(iArr));

        /* 목차. 3. 클래스 자료형을 매개변수로 전달 받는 메소드 호출 */
        Rectangle r1 = new Rectangle(22, 12);
//        r1.calArea();
//        r1.calRound();
        pt.testClassTypeParameter(r1);

        /* 목차. 4. 아직 클래스 배열(객체 배열)은 배우지 않았으므로 건너 뜀 */
        /* 목차. 5. 가변인자를 매개변수로 전달 받는 베소드 호출(자바는 왠만하면 권장 X) */
        pt.testVariableLengthArrayParameter();
        pt.testVariableLengthArrayParameter("홍길동");
        pt.testVariableLengthArrayParameter("유관순", "볼링");
        pt.testVariableLengthArrayParameter(new String[]{"강감찬", "낚시", "독서"});
    }
}

// 실행 결과
프로그램 실행 시 던져진 값: []

call by value 전: 20
매개변수로 전달받은 값: 10
call by value 후: 20

call by reference 전: [1, 2, 3, 4, 5]
매개변수로 전달받은 값: [100, 2, 3, 4, 5]
call by reference 후: [100, 2, 3, 4, 5]

사각형의 넓이는 264
사각형의 둘레는 68

str = []
str = [홍길동]
str = [유관순, 볼링]
str = [강감찬, 낚시, 독서]

2-2. call by value VS. call by reference

  1. call by value
    • 리터럴 값에 의한 호출
    • 함수에 인자를 전달할 때, 인자의 실제 값이 복사되어 전달
    • 함수 내부에서 인자의 값을 변경하더라도 원래의 인자 값에는 영향을 미치지 않는다.
  2. call by reference
    • 참조 값에 의한 호출 / 주소를 넘긴다.
    • 함수에 인자를 전달할 때, 인자의 참조(주소)가 전달
    • 함수 내부에서 인자의 값을 변경하면 원래의 인자 값도 변경된다.
package com.ohgiraffers.section05.parameter;

import java.util.Arrays;

public class ParameterTest {
    public void testPrimitiveTypeParameter(int num) {
        num = 10;
        System.out.println("매개변수로 전달받은 값: " + num);
    }

    public void testPrivitiveTypeArrayParameter(int[] iArr) {
        iArr[0] = 100;
        System.out.println("매개변수로 전달받은 값: " + Arrays.toString(iArr));
    }

    public void testClassTypeParameter(Rectangle rectangle) {
        rectangle.calArea();
        rectangle.calRound();
    }

    public void testVariableLengthArrayParameter(String... str) {
        System.out.println("str = " + Arrays.toString(str));    // 문자열 배열로 되어서 그냥 str 출력 시 주소값 나온다.

    }
}
package com.ohgiraffers.section05.parameter;

public class Rectangle {
    private int height;
    private int width;

    public Rectangle() {
    }

    public Rectangle(int height, int width) {
        this.height = height;
        this.width = width;
    }

    public void calArea() {
        System.out.println("사각형의 넓이는 " + (this.width * this.height));
    }

    public void calRound() {
        System.out.println("사각형의 둘레는 " + (this.width + this.height) * 2);
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함