Posts [Java] Call by value와 Call by reference
Post
Cancel

[Java] Call by value와 Call by reference

Call by value와 Call by reference

  • Call by value와 Call by reference는 메소드 호출 시 인자 값을 어떤식으로 받아오는지에 대한 차이이다.
    • Call by value: 값에 의한 호출
    • Call by reference: 참조에 의한 호출
  • Java는 Call by value형식이다.

Call by value

  • 메소드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보냄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
	
	private static void swap(int x, int y) {
		int tmp = x;
		x = y;
		y =tmp;
	}
	
	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);				
	}
	
}
  • 실행 결과
    스크린샷 2021-03-23 오전 7 21 32

설명

스크린샷 2021-03-23 오전 7 55 48

  • 인자로 넘겨 준 a와 b의 값은 메모리 상에 복사되어 x와 y가 참조하게 된다.
  • swap함수에서는 복사된 x와 y의 값을 서로 바꾸기에 원본 a와 b는 동일한 값을 유지하게 된다.

Call by reference

  • 메소드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 주소(Address)를 복사하여 보냄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Main {
	
	public static class Foo {
		int a;
		
		public Foo(int a) {
			this.a = a;
		}
	}

	private static void swap(Foo x, Foo y) {
		int tmp = x.a;
		x.a = y.a;
		y.a =tmp;
	}
	
	public static void main(String[] args) {
		Foo foo1 = new Foo(10);
		Foo foo2 = new Foo(20);
		System.out.println("[swap() 호출 전] foo1.a: " + foo1.a + ", foo2.a: " + foo2.a);
		swap(foo1, foo2);
		System.out.println("[swap() 호출 후] foo1.a: " + foo1.a + ", foo2.a: " + foo2.a);				
	}
}
  • 실행 결과
    스크린샷 2021-03-23 오전 7 47 54

설명

스크린샷 2021-03-23 오전 7 58 11

  • 변수 foo1과 foo2는 실제 인스턴스가 위치하는 주소 값을 가리키고 있다.
  • 함수를 호출하면 foo1과 foo2 인스턴스의 주소 값이 새로 복사되어 x와 y의 변수로 참조하게 된다.
  • swap함수에서 멤버 변수 a의 값을 바꾸면 실제 인스턴스의 a값이 바뀌게 된다.

Call by value와 Call by reference 정리

  • 자바는 기본형 타입은 단순하게 복사해서 주지만 참조형 타입은 값의 래퍼러스(주소)가 저장되기에 그 값의 래퍼런스가 복사 된다.
  • 객체를 메소드로 넘길 때는 Call By Reference임을 기억해야 한다.

출처

This post is licensed under CC BY 4.0 by the author.

[Java] Array&List변환

[Java] Collection