개발/자바

(자바)값에 의한 호출 vs 참조에 의한 호출

kakk789 2022. 4. 5. 22:01

Call By Value (값에 의한 호출)

  • 메소드 호출 시에 기본 자료형이 전달되는 것을 말하며, 메소드 안에서 전달된 값이 변경되더라도 호출하는 쪽에서는 변경된 내용이 적용되지 않음
class Exam01{

	//정수형 변수 하나를 매개변수로 전달받아 1 증가 시키는 메소드
	
	public static void plusOne(int n) {
		n=n+1;
		System.out.println(n);
		System.out.println("메소드 안에서 값을 변경하였습니다.");
	}
}


public class CallByValueTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int age;
		age=28;
		
		Exam01.plusOne(age);
		System.out.println(age);
	}
}
age 값에 + 1을 했음에도 불구하고 실제 age는 변화 없이 28 그대로임

Call By Value

Call By Reference (참조에 의한 호출)

  • 메소드 호출 시에 참조 자료형(객체, 배열)이 전달되는 것을 말하며 메소드 안에서 전달된 값이 변경될 때에 호출하는 쪽에서 변경된 내용이 적용된다
  • 매개 변수로 객체나 배열을 받게 되면 해당 매개변수는 원본의 주소 값을 가리킨다. 그래서 객체나 배열을 받은 후 값을 변경하면 원본의 값도 같이 바뀐다.
  • 참조변수 : 메모리가 있는 영역을 가리키는 변수

배열을 참조 변조로 사용

결과 값을 보면 'plusOne' 함수 밖으로 나와서도 data[i]++가 적용 된 것을 확인 가능
class Exam02{
	
	// 정수형 배열을 매개변수로 전달받아 모든 요소를 출력하는 메소드를 정의
	public static void printArray(int []data) {
		for(int i=0; i<data.length; i++) {
			System.out.println(data[i] + "\t");
		}
	}
	// 정수형 배열을 매개변수로 전달받아 모든 요소를 1씩 증가시키는 메소드 
	public static void plusOne(int []data) {
		for(int i=0; i<data.length; i++) {
			data[i]++;
		}
		
		System.out.println("메소드 안에서 배열의 요소 출력");
		printArray(data);
	}
}

public class CallByReferenceTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int []arr = {10,20,30,40,50};
		System.out.println(" 메소드하기 전의 배열" );
		Exam02.printArray(arr);
		
		Exam02.plusOne(arr);
		
		System.out.println(" 메소드 호출한 후 배열 " );
		Exam02.printArray(arr);
	}
}

Call By Reference

객체를 참조 변수로 사용

결과 값을 보면 'plusOne' 함수 밖으로 나와서도 age++가 적용 된 것을 확인 가능
class Person{
	String name;
	int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}

class Exam03{
	// person 객체를 매개변수로 전달받아 나이를 1증가 시키는 메소드를 정의
	
	public static void plusOne(Person p) {
		p.age++;
		System.out.println("메소드 안에서 출력");
		System.out.println(p.name + ", " + p.age);
		System.out.println();
	}
}

public class CallByReferenceTest02 {

	public static void main(String[] args) {
		
		Person kim = new Person("김민혁", 28);
		
		System.out.println("메소드 호출한 후 ");
		System.out.println(kim.name+","+kim.age);
		System.out.println();
		
		Exam03.plusOne(kim);
	}
}

반응형