개발/자바
(자바)값에 의한 호출 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 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);
}
}
객체를 참조 변수로 사용
결과 값을 보면 '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);
}
}
반응형