자바에서 메소드로 인수가 전달되는 방법은 기본적으로 “값에 의한 호출” 임 인수의 값이 복사되어 매개 변수로 전달!
인수(argument)는 함수나 메서드를 호출할 때 실제로 전달되는 값
함수나 메서드를 호출할 때 인수를 전달하면,
해당 인수가 매개변수에 대입되어 함수의 동작을 수행
1. 기초형 값이 전달되는 경우
인수의 값이 복사되어 매개 변수로 전달 (= 값에 의한 호출) 원본 변수 'x' 에는 영향 없다.
2. 객체가 전달되는 경우 ★
객체를 메소드로 전달하게 되면 객체의 참조값만 복사되어서 전달된다. 참조 변수는 참조값 (주소)를 가지고 있으니, 참조값이 매개변수로 복사되면 메소드의 매개변수도 동일한 객체를 참조하게 된다. 즉, 매개변수를 통해서 객체의 내용을 변경하게 되면 인수(argument)가 가리키는 객체도 변경 됨!! 메소드가 객체를 반환할 때도 객체가 통째로 반환되는 것이 아니라 객체의 참조값만 반환됨
객체가 전달되는 경우 예시 (값 변경 x)
obj1의 whosLargest 메소드를 호출하여 obj1과 obj2 중 반지름이 더 큰 피자 객체를 largest 변수에 저장
package ex05; //클래스 class Pizza { //필드 int radius; String name; //생성자 Pizza(int r, String name) { this.radius = r; this.name = name; } //메소드 // 객체를 매개변수로 받음 //객체를 리턴!! Pizza whosLargest(Pizza p1, Pizza p2) { if (p1.radius > p2.radius) { return p1; } else { return p2; } } } public class PizzaTest { public static void main(String[] args) { //객체 Pizza obj1 = new Pizza(14, "슈프림"); Pizza obj2 = new Pizza(18, "불고기"); //메소드 호출 & 변수에 담기 //메소드의 매개변수가 참조 변수임! (객체를 매개변수로 전달!) Pizza largest = obj1.whosLargest(obj1, obj2); System.out.println(largest.radius + "인치 피자가 더 큼 " + largest.name + " 피자가 좋음"); } }
whosLargest()
메소드 내에서 p1
이나 p2
를 새로운 객체로 대체하는 등의 동작을 수행하지 않는다면, 전달된 객체 자체가 변경되는 것이지 객체의 참조 값이 변경되는 것은 아님해당 코드는 값 변경은 일어나지 않는다.
Pizza 객체를 매개변수로 전달 받았고, return하는 값도 Pizza (참조자료형) 타입이니
자료형 타입에 Pizza를 사용한다. 객체를 매개변수로 받아서!
값 변경 o
package test; class Pizza { //필드 int radius; String name; //생성자 Pizza(int r, String name) { this.radius = r; this.name = name; } //메소드 // 객체를 매개변수로 받음 //객체를 리턴!! Pizza whosLargest(Pizza p1, Pizza p2) { if (p1.radius > p2.radius) { p1.radius = 19; return p1; } else { p2.radius = 24; return p2; } } } public class PizzaTest { public static void main(String[] args) { //객체 Pizza obj1 = new Pizza(14, "슈프림"); Pizza obj2 = new Pizza(18, "불고기"); //메소드 호출 & 변수에 담기 //메소드의 매개변수가 참조 변수임! (객체를 매개변수로 전달!) Pizza largest = obj1.whosLargest(obj1, obj2); System.out.println(largest.radius + "인치 피자가 더 큼 " + largest.name + " 피자가 좋음"); } }
+)
3. 배열이 전달되는 경우
- 배열의 원소들을 출력하는 메소드나 배열 원소들의 평균을 구하는 메소드는 모두 배열을 매개변수로 받아야 한다.
- 이때, 배열 원소가 메소드로 전달된다면 똑같이 값이 복사되어서 전달된다.
- 그러나!! 배열 전체가 전달된다면 다르다.
- 배열도 객체이기 때문에 (자바에서 배열은
new
키워드를 사용하여 생성하니까) 배열 전체를 전달하는 것은 배열 참조 변수를 복사하는 것!!
- (배열을 가리키는 참조값이 복사되고 메소드에서 매개 변수를 통하여 배열을 변경하면 원본 배열이 변경된다!!)
예시
package ex05; public class ArrayArgumentTest { public static double minArray(double[] list) { //double배열을 자료형으로 받으니까 double min = list[0]; for (int i = 0; i < list.length; i++) { if (list[i] < min) min = list[i]; } return (min); } public static void main(String[] args) { double[] a = { 1.1, 2.2, 3.3, 4.4, 0.1, 0.2 }; double[] b = { -2.0, 3.0, -9.0, 2.9, 1.5 }; double min; min = minArray(a); System.out.println("첫 번째 배열의 최소값=" + min); min = minArray(b); System.out.println("두 번째 배열의 최소값" + min); } }
public static double minArray(double[] list)는 배열(double 타입의 배열)을 인자로 받아 해당 배열에서 최소값을 찾아 반환하는 메소드 (double[] list): 메소드의 매개변수로, double 타입의 배열인 list를 받습니다. 이 배열에서 최소값을 찾아 반환합니다. 따라서 public static double minArray(double[] list)는 double 타입의 배열을 입력으로 받아 해당 배열에서 최소값을 찾는 메소드를 선언한 것
Share article