본문으로 바로가기

자바에서는 메소드에 넘겨줄 매개변수를 지정된 값을 복사하여 넘겨준다.(이를 call by value 라고 한다.)

하지만 이렇게 단순히 값만이 복사되어 넘어 가는것이 아니다. 주소 값이 복사되어 넘어갈때도 있다.

 

이렇게 단순 값만을 복사하여 사용하는 매개변수를 기본형 매개변수라고 하며, 주소의 값이 복사되어 사용하는 매개변수를 참조형 매개변수라고 한다.

 

두가지 변수의 가장 차이점은 다음과 같다.

  • 기본형 매개변수는 원천데이터의 값이 변경되지 않지만, 참조형 매개변수의 원천데이터는 메소드에서 값을 변경하면 변경된다.

 

얼핏 이해가 안될수도 있으니 다음 예제를 통해 차이점을 확인해 보도록 하자.

 

 

1. 참조형 매개변수

 

참조형 매개변수 종류로는 배열과, 객체가 있다. 다음 예제를 통해 확인해 보도록 하자.

 

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
32
33
34
35
36
37
38
public class exMethod {
    // 인스턴스 변수 
    public String pVal = "test Instance Value";
 
    public void changeValue(exMethod test, String[] pArrVal) {
        test.pVal = "change Instance Value";
        
        for(int i=0; i < pArrVal.length; i++) {
            pArrVal[i] = "change test" + Integer.toString(i);
        }
    }
    
    public static void main(String[] args) {
        //배열 
        String[] pArrVal = new String[]{"test""test2"};
        
        exMethod test = new exMethod();
        
        System.out.println("클래스 내 멤버변수 pVal : " + test.pVal);
 
        System.out.print("배열 값 : ");
        for(String innerVal : pArrVal) {
            System.out.print(innerVal + ", ");
        }
        
        System.out.println("\n");
 
        //메소드 호출
        test.changeValue(test, pArrVal);
        
        System.out.println("메소드 호출 후클래스 내 멤버변수 pVal : " + test.pVal);
 
        System.out.print("메소드 호출 후 배열 값 : ");
        for(String innerVal : pArrVal) {
            System.out.print(innerVal + ", ");
        }
    }
}
 
 

 

 

결과)

클래스 내 멤버변수 pVal : test Instance Value
배열 값 : test, test2,

메소드 호출 후 클래스 내 멤버변수 pVal : change Instance Value
메소드 호출 후 배열 값 : change test0, change test1,

 

메소드를 호출 할때 Method(원천데이터, 원천데이터) 매개변수 값을 전달한다. 이때 매개변수가 객체(클래스), 배열 이면 주소 값이 복사되므로, 메소드에서 매개변수값을 변경한다면 결국 원천데이터를 변경하는 것과 같다. 이는 C언어에서 call by reference 같은 의미로 있다.

이점을 유의하여 원천데이터가 변경되지 않아야 한다면 메소드 내에서 지역변수를 사용하여 대입 사용하도록 하자어찌 보면 되게 간단한 내용이지만 모르고 사용하는 개발자가 생각 보다 많다.

 

 

2. 일반형 매개변수

 

위에서 설명한 참조형 매개변수와 반대 의미이다. 객체(클래스), 배열 이외의 값의 매개변수이면 메소드에서 값을 변경하더라도 원천데이터는 변경되지 않는다. 다음 소스를 통해 확인해 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class exMehotd2 {
 
    public static void changeValue(String testVal) {
        testVal = "change test data";
    }
    public static void main(String[] args) {
        String testVal = "test";
        
        System.out.println("일변 변수 형 호출 전 데이터 : " + testVal);
        //메소드 호출
        changeValue(testVal);
        
        System.out.println("일변 변수 형 호출 후 데이터 : " + testVal);
    }
}
 
 

 

 

결과)

일변 변수 형 호출 전 데이터 : test

일변 변수 형 호출 후 데이터 : test

 

메소드에서 전달받은 매개변수값을 변경해도 원천데이터는 변경되지 않았음을 확인 있다.