JAVA/객체지향프로그래밍1

[JAVA]기본형 매개변수와 참조형 매개변수

prize1209 2021. 6. 20. 23:13

기본형 매개변수와 참조형 매개변수

 

기본형 매개변수 변수의 값을 읽기만 할 수 있다.(read only)

 

참조형 매개변수 변수의 값을 읽고 변경할 수 있다.(read & write)

 

 

 

예9) //기본형 매개변수

 

public class PrimitiveParamEx {
	public static void main(String[] args) {
		Data d = new Data();
		d.x = 10; // 참조변수 d를 통해 x에 10 저장
		System.out.println("main() : x=" + d.x);

		change(d.x); // x의 값을 change에 복사
		System.out.println("After change(d.x)");
		System.out.println("main():x=" + d.x);
	}

	// 메인 메소드 후의 change메소드
	static void change(int x) {
		x = 1000; // 지역변수x에 값 저장
		System.out.println("change() :x=" + x);
	}

}

class Data {
	int x;
}

1. change 메서드가 호출되면서 'd.x'가  change 메서드의매개변수 x에 복사됨

2. change 메서드에서 x의 값을 1000으로 변경

3. change 메서드가 종료되면서 매개변수 x는 스택에서 제거됨

 

'd.x'의 값이 변경된 게 아니라 change 메서드의 매개변수  x 가 변경된 것이다. 

즉 원본이 아닌 복사본이 변경된 것이라 원본에는 아무런 영향을 미치지 못한다. 

change메서드가 자기 할일 다하면 사라지고 대기중이던 main메서드가 실행된다. 

 

 

예10) //참조형 매개변수

public class ReferenceParamEx {
	public static void main(String[] args) {
		// 객체 생성
		Data2 d = new Data2();
		d.x = 10; // 참조변수d를 통해 x에 10 값 저장
		System.out.println("main():x=" + d.x);

		change(d);
		System.out.println("After change(d)");
		System.out.println("main(): x=" + d.x);

	}

	static void change(Data2 d) {
		d.x = 1000;
		System.out.println("change():x=" + d.x);
	}
}

class Data2 {
	int x;
}

change 메서드를 호출한 후에 d.x의 값이 변경되었다. 

change 메서드의 매개변수가 참조형이라서 값이 아니라 '값이 저장된 주소'를 change메서드에 넘겨주었기 때문에

값을 읽어오는 것 뿐만 아니라 변경하는 것도 가능하다. 

 

1. change메서드가 호출되면서 참조변수 d의 값(주소)이 매개변수 d에 복사됨

이제 매개변수 d에 저장된 주소값으로 x에 접근이 가능

2.change메서드에서 매개변수 d로 x의 값을 1000으로 변경

3. change메서드가 종료되면서 매개변수 d는 스택에서 제거됨 

 

change메서드의 매개변수르 참조형으로 선언했기 때문에, x의 값이 아닌 주소가 매개변수 d에 복사되었다. 

이제 main 메서드의 참조변수d로 x의 값을 읽는 것과 변경하는 것이 모두 가능하다. 

 

 

예11)

public class ReferenceParanEx2 {
	public static void main(String[] args) {
		int[] x = { 10 }; // 길이가 1인 배열
		System.out.println("main() : x=" + x[0]);

		change(x);
		System.out.println("After change(x)");
		System.out.println("main() :x=" + x[0]);
	}

	static void change(int[] x) { // 참조형 매개변수
		x[0] = 1000;
		System.out.println("change(): x=" + x[0]);
	}
}

 

Data클래스의 인스턴스 대신 길이가 1인 배열 x를 사용했다.

배열도 객체와 같이 참조변수를 통해 데이터가 저장된 공간에 접근한다. 

Data 클래스 타입의 참조변수 d와 같이 변수 x도 int배열 타입의 참조변수이기 때문에 같은 결과를 얻는다. 

 

 

 

예12)

 

public class ReferenceParamEx3 {
	public static void main(String[] args) {
		int[] arr = new int[] { 3, 2, 1, 6, 5, 4 };

		printArr(arr); // 배열의 모든 요소를 출력
		sortArr(arr); // 배열을 정렬
		printArr(arr); // 정렬 후 결과를 출력
		System.out.println("sum=" + sumArr(arr)); // 배열의 총합을 출력

	}

	static void printArr(int[] arr) { // 배열의 모든 요소를 출력
		System.out.print("[");

		for (int i : arr) // 향상된 for문
			System.out.print(i + ",");
		System.out.println("]");

	}

	static int sumArr(int[] arr) {// 배열의 모든 요소의 합을 반환
		int sum = 0;

		for (int i = 0; i < arr.length; i++)
			sum += arr[i];
		return sum;
	}

	static void sortArr(int[] arr) {
		for (int i = 0; i < arr.length; i++)
			for (int j = 0; j < arr.length - 1 - i; j++)
				if (arr[j] > arr[j + 1]) {
					int tmp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = tmp;
				}
	}
}

 

 

예13) ??

public class ReturnTest {
	public static void main(String[] args) {
		ReturnTest r = new ReturnTest();
		
		int result = r.add(3,5);
		System.out.println(result);
		
		int[] result2 = {0}; //배열을 생성하고 result2[0]의 값을 0으로 초기화
		r.add(3,5,result2); //배열을 add메서드의 매개변수로 번달
		System.out.println(result2[0]);
		
	}
	int add(int a, int b) {
		return a+b;
	}
	void add(int a, int b, int[] result) {
		result[0] = a+b;
	}
}

 

 

반환값이 있는 메서드를 반환값이 없는 메서드로 바꾼다. 

참조형 매개변수를 이용하면 반환값이 없어도 메서드의 실행 결과를 얻어올 수 있다.