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
'Development knowledge' 카테고리의 다른 글
프로세스(Process)란 (0) | 2018.11.24 |
---|---|
컴퓨터 시스템의 구성요소 및 운영체제(OS)란 (0) | 2018.11.24 |
메모리 구조 (Code, Data, Stack, Heap) (0) | 2018.11.21 |
static과 const (0) | 2018.11.21 |
오픈 소스(Open Source)의 장단점 (0) | 2018.11.21 |