티스토리 뷰

2. 매개변수

1. 매개변수 개념

매개변수의 의미

메서드를 호출해서 객체 간 메시지가 전달될 때 필요한 부가 정보를 매개변수 형태로 전달한다.

메서드 매개변수로 전달되는 데이터가 기본형이냐 참조형이냐에 따라 동작 방식이 달라지게 된다.

매개변수 타입에 따른 특징

 

값 복사

// 기본형 매개변수의 값 복사

int score = 80; // score 변수에 80 저장
int copyScore = score; // score 변수에 저장된 값을 copyScore 변수에 할당함

// - 메모리 상에는 두 변수가 같은 값을 가지게 된다.
// - 특정 변수의 값을 수정해도 다른 변수에는 영향을 미치지 않음

주소 복사

// 참조형 변수
int[] list = { 100, 85, 90 }; // list 변수에 일차원 배열 객체의 주소 값이 저장됨
int[] copyList = list; // copyList 변수에 list 변수에 저장된 주소 값을 할당함

// - list 변수에 저장된 배열 객체의 주소 값이 복사된다.
// - 하나의 일차원 배열 객체를 두개의 참조 변수가 참조하면서 데이터를 공유하게 된다.
// - 특정 변수로 배열의 값을 수정하면, 동일한 객체를 참조하는 다른 변수도 수정된 값을 인식한다.

 

기본 데이터 타입 : 값에 의한 호출 (Call by value)

매개 변수의 타입이 기본 데이터 타입인 경우

public class CallByValueTest {
    public static void main(String[] args) {
        int score = 10;
        System.out.println("변경 전 score : " + score);

        changeScore(score);

        System.out.println("변경 후 score : " + score);
    }

    private static int changeScore(int score) {
        // 매개 변수의 값을 수정한다.
        score = 100;
        System.out.println("변경된 score : " + score);
        return score;
    }
}
// 변경 전 score : 10
// 변경된 score : 100
// 변경 후 score : 10

 

참조 데이터 타입 : 주소에 의한 호출 (Call by reference)

참조형 매개변수참조하는 객체의 주소 값이 복사되어 전달된다.

메서드를 호출 할 때 넘겨준 인자 ----- 호출된 메서드의 매개 변수

  • 같은 객체의 주소를 가지며, 하나의 객체를 두 개의 참조 변수가 공유한다.
public class CallByReferenceTest {
    public static void main(String[] args) {
        // 1. 정수형 배열 scoreList에 일차원 배열 객체를 생성하여 할당한다.
        int[] scoreList = {40, 78, 98};

        System.out.println("변경 전 score : " + scoreList[0]); // 40

        // 2. changeScore() 메서드를 호출하면서 scoreList 변수를 인자로 넘김
        changeScore(scoreList);

        System.out.println("변경 후 score : " + scoreList[0]); // 100
    }

    private static int[] changeScore(int[] scoreList) {
        // 3. scoreList 변수가 참조하는 객체의 0번 인덱스 값 수정
        scoreList[0] = 100; 

        System.out.println("변경된 score " + scoreList[0]);     // 100
        return scoreList; // 배열 변경된 객체를 리턴함        
    }
}
// 변경 전 score : 40
// 변경된 score 100
// 변경 후 score : 100

따라서, 매개변수로 객체를 넘길 시

  • 객체가 다른 객체의 메서드를 호출 할 때 단순히 메서드 수행에 필요한 값만 넘기고자 할 때는
    • => 매개변수를 기본형으로 선언한다.
  • 메서드 수행 이후에도 수행 결과를 지속적으로 유지하고자 하는 경우
    • => 매개변수를 참조형으로 선언한다.

 

class Pair{
    int x;
    int y;

    Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class SwapTest {
    public static void swap(int x, int y) {
        // int 매개변수
        int tmp;

        tmp = x;
        x = y;
        y = tmp;
    }

    public static void swap(Pair p) {
        // Pair 객체를 매개변수로 입력받아서 객체 변수의 값을 서로 바꾼다.
        int tmp;
        tmp = p.x;
        p.x = p.y;
        p.y = tmp;    
    }

    public static void main(String args[]) {
        // x, y 값과 Pair 객체를 초기화한다.
        int x = 10, y = 20;
        Pair p = new Pair(10, 20); 

        System.out.println("before: x, y (" + x + ", " + y + ")");
        System.out.println("\tPair(" + p.x + ", " + p.y + ")");

        swap(x,y);
        swap(p);

        System.out.println("after: x, y (" + x + ", " + y + ")");
        System.out.println("\tPair(" + p.x + ", " + p.y + ")");
    }
}
//    before: x, y (10, 20)
//    Pair(10, 20)
//    after: x, y (10, 20)
//    Pair(20, 10)

 

2. 가변적 매개변수

가변적 매개변수

  • 매개변수의 숫자를 컴파일이나 실행 시에 미리 지정하지 않고 가변적으로 사용하는 방식
  • 가변적 매개변수는 여러 개의 매개변수와 사용 가능. 그러나 매개변수 리스트 마지막 위치에서 한 번만 사용 가능
public class VariableArgumentTest {
    public static double scoreSum(double... score) {
        double sum = 0;

        for (int i = 0; i < score.length; i++) {
            sum = sum + score[i];
        }
        return sum;
    }

    public static void main(String[] args) {
        System.out.println("국어 점수 총 합 : " + scoreSum(80, 60, 90));
        System.out.println("자바 점수 총 합 : " + scoreSum(54.2, 78.5));
    }
}
//    국어 점수 총 합 : 230.0
//    자바 점수 총 합 : 132.7

 

출처 - swexpertacademy.com/

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
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
글 보관함