0. Formal Parameter & Actual Parameter

Formal parameter: 메소드의 선언부에 나타는 인자

ex) public void funA(String a);


Acutal parameter: 실제 값을 가진 인자

ex) funA("abc");



1. Call-by-Value (값에 의한 호출)

약속된 메모리 공간에 actual parameter의 값을 보내며, formal parameter를 초기화한다.

원본에 영향을 주지 않고 원본의 값만 이용하여 새로운 메모리 공간에서 사용하고 싶은 경우에 call-by-value 방식이 좋다. 



2. Call-by-Reference (참조에 의한 호출)

약속된 메모리 공간에 actual parameter의 주소 값을 보내, 원본의 값이 변경된다.

함수는 return 문을 이용해 하나의 결과값을 반환한다. 

두 개 이상의 결과를 반환해야 할 때는 call-by-reference 방식을 사용해 직접 원본의 값을 변경함으로서 해결할 수 있다.



3. 예시

1
2
3
4
5
6
7
8
9
10
11
12
Program X:
    integer m;
    procedure Y (n : integer)
        begin
            n = n+1;
            write(m, n);
        end;
    begin {start main}
        m = 1;
        Y(m);
        write(m);
    end;
cs

call-by-value 일 때의 결과: m: 1 n:2 m:1

call-by-reference 일 때의 결과: m: 1 n:2 m:2



4. C언어의 호출방식

C언어를 call-by-value 방식으로 한다면, "fun(int a)" 코드처럼 a의 값을 보낸다.

call-by-reference 방식으로 한다면, "fun(int* a)" 와 같은 포인터를 사용해 a의 주소값을 전달한다.

(주소값 또한 call-by-value 방식처럼 값을 복사하여 전달한다고 하여 call-by-reference 가 아닌 call-by-value 방식이라 한다고도 한다.)



5. JAVA의 호출방식

기본 데이터형은 call-by-value 방식으로 처리되고, 클래스의 객체는 call-by Reference 방식으로 처리된다.

(객체의 주소값 역시 call-by-value 방식처럼 값을 복사하여 전달되기 때문에 call-by-reference 가 아닌 call-by-value 방식이라 한다고도 한다)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CallByValue {
 
        public static void swap(int x, int y) {
               int temp = x;
               x = y;
               y = temp;
        }
 
        public static void main(String[] args) {
               int a = 10;
               int b = 20;
               System.out.println("swap() 호출 전: a="+a+", b="+b);
               swap(a,b);
               System.out.println("swap() 호출 후: a="+a+", b="+b);
        }
}
 
// 결과
// swap() 호출 전: a=10, b=20
// swap() 호출 후: a=10, b=20
 
//[출처] ▣ JAVA - Call by Value, Call by Reference|작성자 kaka
cs


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
class Number {
        public int a;
        public int b;
}
 
public class CallByReference {
 
        public static void swap(Number z) {
               int temp = z.a;
               z.a = z.b;
               z.b = temp;
        }
 
        public static void main(String[] args) {
               Number n = new Number();
               n.a = 10;
               n.b = 20;
               System.out.println("swap() 호출 전: a="+n.a+", b="+n.b);
               swap(n);
               System.out.println("swap() 호출 후: a="+n.a+", b="+n.b);
        }
}
 
// 결과
// swap() 호출 전: a=10, b=20
// swap() 호출 후: a=20, b=10
 
//[출처] ▣ JAVA - Call by Value, Call by Reference|작성자 kaka
cs

number 클래스의 객체를 생성하고 저장된 값은 주소값이다.

main() 에서 Number 클래스의 객체인 n을 만들어 인수로 전달하기 때문에 swap() 내에서 Number 클래스 내의 x, y의 값을 바꾼 결과가 main() 에 영향을 미치게 된다.




참고 출처: http://blog.naver.com/PostView.nhn?blogId=clown7942&logNo=110121061770


+ Recent posts