Call By Value 와 Call By Reference는 메소드 호출과 관련된 개념으로
매개변수에 값을 전달(복사)할 때는 Call By Value를,
매개변수에 메모리의 주소값을 전달(복수)하는 경우에는 Call By Reference를 사용한다.
1) Call By Value
매개변수의 타입이 기본자료형인 경우에 사용한다.
간단한 예제를 통해서 알아보자.
▲ callByValue메소드를 이용해서 처음입력값과 두번째입력값의 데이터 값을 swap하려고 한다.
main메소드에서 first를 1, second을 10으로 변수선언 및 초기화까지하고 출력을 먼저해본다. 그리고 callByValue메소드를 호출해본 후 다시 first와 second의 값을 출력해봤다. 결과는 아래와 같다.
▲ callByValue를 호출하기 전에는 first와 second의 값이 각각 1과 10이었고, 호출 하였을 때는 각각 10과 1로 서로 데이터값이 반대로 바뀌었었다. 하지만 메소드가 종료된 후 다시 first와 second을 출력해보면 결과값이 메소드 호출 전과 동일 한 것을 볼 수 있다.
callByValue메소드와 main메소드는 서로 다른 메소드이므로 변수의 이름이 같더라도 각각의 first와 second라는 메모리는 따로 생성되어 있는 것이다. 서울의 홍길동과 부산의 홍길동은 이름은 같지만 다른 사람인 것과 같은 맥락이다.
따라서 각 변수의 값은 해당 메소드에서 초기화된 것으로 사용되기 때문에 결과값이 위와 같이 나오는 것이다.
2) Call By Reference
매개변수의 타입이 참조형(배열, String, Class, interface등)인 경우 사용한다.
값이 아니라 주소값이 매개변수에 전달되므로 같은 메모리를 참조한다.
또한 매개변수에 여러개의 값을 동시에 전달할 수도 있고 여러개의 값을 반환할 수도 있다.
(반환타입이 void여도 반환되는 효과가 일어남)
▲ callByReference메소드는 arr이라는 매개변수를 가지고 있고 역시 swap기능을 가지고 있는 메소드이다.
main메소드 안을 보면 ref라는 메모리 크기가 2인 배열을 생성하였고 해당 배열 ref[0]은 1, ref[1]은 10을 저장하였다.
아래 출력 결과를 보자.
▲ Call By Value와 값이 다른 것을 볼 수 있다. 메소드를 실행한 후 다시 배열 ref의 데이터 값을 출력해보니 메소드처럼 값이 swap되어 있는 것을 볼 수 있다. How? 바로 값이 아닌 주소를 통해 서로 같은 메모리를 참조했기 때문이다.
main메소드에서 callByReference를 실행할 때 인자로 배열ref를 입력하고 있다. 배열 ref는 데이터값을 가지고 있는 것이 아니고 주소값을 가지고 있기때문에 그 주소값을 callByReference메소드의 매개변수인 arr에 저장하게 되는 것이다.
그리고 메소드가 실행될 때 매개변수 arr를 사용하려고 보니 배열 ref의 메모리 주소가 들어있기 때문에 결과적으로는 주소를 따라가 배열 ref의 메모리의 데이터 값을 사용하기 때문이다.
즉, heap영역에 있는 같은 메모리를 주소를 통해 공유하고 있었던 것이다.
이것이 바로 Call By Value와 Call By Reference의 차이이다.
Call By Reference의 좀 더 심화된 예제를 보자.
▲ 2차원 배열 scores에 3명의 국영수점수와 총점과 평균을 위한 메모리를 만들었다. 3열에 총점을, 4열에 평균을 설정하는 메소드를 만들고 출력하는 메소드까지 만들어보자.
▲ double형 2차원 배열 scores의 주소값을 인자로 하는 총점과 평균을 위한 메소드 이름
▲ 배열 scores의 주소값을 매개변수에 받아 이중 for문으로 총점과 평균을 만들어 배열scores의 메모리에 넣는메소드
▲ 배열 scores의 주소값을 받아 메모리에 있는 데이터값을 출력하는 메소드의 이름
▲ 출력시 좀 더 전달력이 좋도록 과목명과 총점, 평균의 title을 String형 1차원 배열을 만들었다. 이후 배열 scores의 데이터 값과 함께 좀 더 가독성있는 출력코드를 만들었다.
출력 결과물을 보자.
▲ 기존에 주어진 각 과목의 점수와 우리가 메소드를 통해 만든 총점, 평균의 값들이 예쁘게 잘 출력되었다.
이처럼 Call By Reference를 통해 데이터 값보다는 주소값을 참조하는 방향으로 메소드를 사용한다면 많은 데이터값을 반환 또는 출력할 수 있다.
'Java' 카테고리의 다른 글
[Java]Class - part.1 (0) | 2022.03.04 |
---|---|
[Java]method없이 가위바위보게임 만들기 (0) | 2022.03.04 |
[Java]method - type4 (0) | 2022.03.03 |
[Java]method - type3 (0) | 2022.03.03 |
[Java]method - type2 (0) | 2022.03.02 |