Developer/JAVA

JAVA , 매개변수의 전달 방식 : CallByValue와 CallByReference

단님 2024. 8. 3. 02:05
728x90
CallByValue : 값을 전달

 

값 (리터럴)을 전달. 기본자료형과 string 에 해당한다.

 

	public void juiceCafe1(String s) { 
		System.out.println("매개변수 테스트"); 
		s = "망고수박"; 
		System.out.printf("무슨 주스를 원하시나요 ? %s %n", s);
		System.out.println();
	}
		String kind = "바나나";
		ex03.juiceCafe1(kind); 
		System.out.println(kind);

값은 전달해준 kind 에는 영향을 주지 않는다. kind 의 리터럴만 전달했기 때문(CallByValue)

 

CallByReference
주소값을 전달

 

매개변수로 car 와 int를 받는 메서드

	public int carTast(Car car, int speed) {
		System.out.println("carTest 메서드**************");
		System.out.println("car->"+ car);
		car.brand ="BMW";
		car.grade='D';
		System.out.println("car (brand / grade 변경 후 )->"+ car);
		System.out.println("carTest 메서드**************");
		return car.speed + price ;
	}

 

Car 타입의 인스턴스가 필요하다.

		Car myCar = new Car(); 
		ex03.carTast(myCar, 10);

 

 

-메인 메서드의 사용

		Car myCar = new Car(); 
		myCar.brand ="기아";
		myCar.grade='K';
		System.out.println("main에서 수정한 mycar 1"+myCar);
		System.out.println("ex03.carTast(myCar, 10 호출");
		System.out.println(ex03.carTast(myCar, 10)); // 메서드 호출
		System.out.println("ex03.carTast(myCar, 10); 호출후  mycar 2"+myCar);

 

 

 

CallByReference
진행에 대한 정리

 

1. 힙의 영역에 메모리 준비

Car myCar = new Car();

 

2. 힙의 영역에 있는 myCar 의 값을 변경

		myCar.brand ="기아";
		myCar.grade='K';

 

3. 주소부를 인자를 통해 전달.

System.out.println(ex03.carTast(myCar, 10));

 

4. 메서드 내에서 인자로 전달받은 주소부의 값들을 변경.

	public int carTast(Car car, int speed) {
		System.out.println("carTest 메서드**************");
		System.out.println("car->"+ car);
		car.brand ="BMW";
		car.grade='D';

 

즉 메서드를 통해 정렬메서드를 만들어도,

배열을 참조받아서 배열의 원본이 정렬이 변경될 수 있겠다.

즉 , 메서드를 통해 리턴하지 않아도 메서드를 사용함으로도 내부 주소의 값이 변경 될 수 있음을 의미

 

또 다른 방법으로는 ,

인스턴스 생성과 함께 인자로 활용도 가능하다.

System.out.println(ex03.carTast(new Car(), 10));

 

메서드에서 모든 처리가 이루어지고 ,

인자로서 사용만 한다면 굳이 이름값이 필요하지 않을 것이다.

Car 를 일회성 매개변수로만 사용하는 경우 적당하다.