Java/Java 기본

인자 전달

검정비니 2018. 6. 23. 15:36
728x90
반응형

인자 전달



기본적으로, 자바의 메소드 호출 시 인자 전달 방식은 '값에 의한 호출 (call by value)'이다. 그러므로 호출하는 인자의 값이 복사되어 메소드의 인자에 전달된다.



1. 기본 타입이 인자로 전달되는 경우 (call by value)


byte, char, short, int, long, float, double, boolean 등의 자바 기본 타입이 인자로 전달되는 경우에는 호출자(caller)가 건네는 인자의 값을 복사하여 메소드의 인자에 전달한다. 다음 예제 코드는 기본 타입의 값이 전달되는 사례이다. Person의 setAge()가 호출되면 인자 n이 생기며 이곳에 main()의 지역 변수 a의 값 33이 복사되어 넘어온다. setAge()에서 n의 값을 34로 증가시킨다. 그러나, 이 n이라는 변수는 지역변수 a와는 무관하므로 a의 값은 여전히 33이다.


i.e.

public class CallByValue {

public static void main(String[] args) {

Person aPerson = new Person("a");

int a = 33;


aPerson.setAge(a);


System.out.println(a); //n은 a의 값을 복사해서 만든 새로운 변수이기에 a와 무관. 따라서 여기서는 33을 출력한다

}

}


public class Person {

public String name;

public int age;


public Person(String s) {

name = s;

}


public void setAge(int n) { //n은 CallByValue 클래스의 지역 변수 a와는 무관한 변수이다.

age = n;

n++; //n의 값은 증가하지만, n과 무관한 a의 값은 변하지 않는다.

}

}




2. 객체 레퍼런스가 인자로 전달되는 경우 (call by reference)


메소드 인자로 객체에 대한 레퍼런스가 전달되는 경우, 객체가 통째로 전달되는 것이 아니라 객체의 레퍼런스 값이 전달된다. 이전에 언급하였듯이, 자바에서 생성된 객체는 레퍼런스 변수에 의해서 연결이 되어 진다. 레퍼런스(reference)란 영어 단어는 "참조"라는 뜻을 가졌다는 것을 안다면 레퍼런스 값을 전달한다는 것의 의미를 쉽게 눈치 챘을 수도 있을 것이다. 레퍼런스 값을 복사해서 전달했다는 의미는 같은 객체를 가리키는 새로운 레퍼런스 변수를 만들어서 그 변수를 인자로 전달하였다는 것을 의미한다. C에서의 call by pointer와 비슷한 개념이라고 생각하면 될 것이다.


다음 예제 코드를 통해서 객체 레퍼런스가 인자로 전달된다는 개념을 제대로 이해 해보도록 하자.


i.e.


public class MyInt {

int val;


MyInt(int i) {

val = i;

}

}


public class CallByValue {

public static void main(String[] args) {

Person aPerson = new Person("a");

MyInt a = new MyInt(33);


aPerson.setAge(a);


System.out.println(a.val); //setAge 메소드에서 값을 증가시켰으므로, 34를 출력

}

}


public class Person {

public String name;

public int age;


public Person(String s) {

name = s;

}


public void setAge(MyInt n) { //n은 CallByValue 클래스의 메인 메소드의 레퍼런스 변수 a와 같은 객체를 참조

age = n.val;

n.val++; //n은 CallByValue 클래스의 메인 메소드의 레퍼런스 변수 a와 같은 객체를 참조하기에, 여기서 a의 멤버 값도 증가

}

}



다시 한번 강조하지만, call by reference 방식은 객체에 대한 레퍼런스만 복사되지 객체가 통째로 복사되지 않는다.





3. 배열이 인자로 전달되는 경우


배열이 메소드의 인자로 전달되는 경우도 객체 레퍼런스가 인자로 전달되는 경우와 동일하다. 배열이 통째로 전달되는 것이 아니며, 배열에 대한 레퍼런스만 전달된다. 다음은 배열이 인자로 전달되는 경우를 나타내는 예시 코드이다.



i.e.

public class ArrayParameter {

public static void main(String[] args) {

int a[] = {1,2,3,4,5};


increase(a);


for (int i = 0; i < a.length; i++) {

System.out.println(a[i]); //increase 메소드에서 배열의 모든 값을 증가시켰으므로 2, 3, 4, 5, 6이 차례로 출력되어질 것이다.

}


static void increase(int[] array) { //array는 a와 같은 배열을 참조하는 레퍼런스 변수이다.

for (int i = 0; i < array.length; i++) {

array[i] ++;

}

}

}

반응형

'Java > Java 기본' 카테고리의 다른 글

다형성  (0) 2018.06.23
메소드 오버로딩  (0) 2018.06.23
메소드 형식  (0) 2018.06.22
객체 배열  (0) 2018.06.22
클래스 선언과 활용  (0) 2018.06.22