-
Java | Call by Value & Call by ReferenceJAVA/JAVA 2020. 1. 31. 17:42
메소드 호출 방식 Call by Value & Call by Reference
메소드를 호출할 때 매개변수에 전달되는 인자의 자료형에 따라 메소드 호출 방식이 구분됨
Call by Value와 Call by Reference 두 개의 메소드 호출 방식(인자 전달 방식)이 존재
Call by Value
값에 의한 전달 방법, 매개변수의 자료형으로 기본 자료형 8가지 사용
기존의 값을 복사해서 전달하기 때문에 원본에는 변함이 없음
사용례
package j200131; // int형 변수 r, g, b를 전달받아서 값을 변경하고 출력하는 메소드 public class CallByValue { static void changeColor(int r, int g, int b) { r += 10; g += 50; b += 10; System.out.println("changeColor_red: " + r + ", green: " + g + ", blue: " + b); } public static void main(String[] args) { // rgb(0~255) 각각의 변수 r, g, b 초기화 int r = -1, g = -1, b = -1; System.out.println("before_red: " + r + ", green: " + g + ", blue: " + b); // before_red: -1, green: -1, blue: -1 /* r, g, b 를 인자로 받아서 changeColor() 메소드를 호출한 뒤 메소드의 지역 변수 r, g, b 각각의 값 출력 ※ 인자가 전달될 때는 원래의 값을 복사해서 전달함 */ changeColor(r, g, b); // changeColor_red: 9, green: 49, blue: 9 // changeColor()의 r, g, b에 main()의 r, g, b의 값 즉, value가 복사돼서 // 전달되었기 때문에 main()의 r, g, b에는 변함이 없음 System.out.println("after_red: " + r + ", green: " + g + ", blue: " + b); // after_red: -1, green: -1, blue: -1 } }
※ main()의 r, g, b가 저장된 메모리 주소와
changeColor()의 r, g, b가 저장된 메모리 주소가 다르기 때문에
main() r, g, b의 주소가 아니라 값만 복사되어 changeColor() r, g, b로 전달됨
따라서 main() r, g, b의 값은 변화하지 않음
Call by Reference
주소에 의한 전달 방법, 매개변수의 자료형은 참조형(=클래스형, 객체형)
주소값 즉, 원본을 전달하기 때문에 원본의 값이 수정됨
사용례
package j200131; class RGBColor { // 멤버 변수 int r, g, b; // 0, 0, 0 // 생성자 RGBColor(int r, int g, int b) { this.r = r; this.g = g; this.b = b; } } public class CallByRef { // 색상을 변경하고 변경된 값을 출력하는 정적 메소드 static void changeColor(RGBColor rgbc) { System.out.println("rgbc 주소: " + rgbc); rgbc.r += 10; rgbc.g += 50; rgbc.b += 10; System.out.println( "changeColor_red: " + rgbc.r + ", green: " + rgbc.g + ", blue: " + rgbc.b); } public static void main(String[] args) { // RGBColor 클래스 객체 생성, 초기화 RGBColor rgb = new RGBColor(-1, -1, -1); // rgb 객체의 주소 출력 System.out.println("rgb 주소: " + rgb); // rgb 주소: j200131.RGBColor@15db9742 // 변경 전 rgb 객체의 멤버변수 r, g, b 출력 System.out.println("before_red: " + rgb.r + ", green: " + rgb.g + ", blue: " + rgb.b); // before_red: -1, green: -1, blue: -1 // changeColor() 메소드에 rgb 객체(주소)를 인자로 전달하면서 호출 changeColor(rgb); // rgbc 주소: j200131.RGBColor@15db9742 // changeColor_red: 9, green: 49, blue: 9 // 변경 후 rgb 객체의 멤버변수 r, g, b 출력 System.out.println("after_red: " + rgb.r + ", green: " + rgb.g + ", blue: " + rgb.b); // after_red: 9, green: 49, blue: 9 } }
※ changeColor()의 인자로 main()의 rgb 객체가 저장된 메모리 주소가 전달되었기 때문에
changeColor()의 매개변수 rgbc의 주소가 main()의 rgb 객체의 주소와 같아짐
따라서 같은 주소에 저장된 r, g, b를 수정한 것이기 때문에 r, g, b의 값이 변경됨
메소드의 매개변수에 전달되는 인자의 자료형에 따라 메소드가 호출되는 방식에 대해 알아보았습니다.
매개변수와 인자라는 단어가 다소 헷갈릴 수 있는데
매개변수(parameter)는 메소드의 선언부에 작성된 변수를 말하며인자(argument)는 메소드를 호출할 때 전달되는 실제 값이라고 할 수 있습니다.
원본을 수정하고 싶은 경우에는 Call by Reference 방식으로,
그렇지 않은 경우에는 Call by Value 방식으로 메소드를 호출하면 되겠습니다.
'JAVA > JAVA' 카테고리의 다른 글
Java | String Method(2) & Character Method (0) 2020.02.03 Java | Interface (0) 2020.02.03 Java | Abstract 추상 클래스 & 추상 메소드 (0) 2020.01.31 Java | Final (0) 2020.01.31 Java | Integer.to~String() (0) 2020.01.31