[JAVA] 8.인자전달 (Call-by-value)

안녕하세요 IT뽀로로입니다. 

 

오늘은 인자전달에 대해서 알아보도록 할게요.

 

인자 전달이라 함은 함수를 호출했을 때 그 함수에 인자를 전달하는 걸 의미하겠죠?

 

JAVA에서 메소드 호출 시 인자 전달 방식은 '값에 의한 호출 (Call-by-value)'입니다.

 

호출하는 인자의 값이 복사되어 메서드의 인자에 전달되죠.

 

#기본 타입 인자 전달일 경우

 

여기서 기본 타입 이라 함은 int, char, double.. 등을 말합니다.

 

기본 타입의 인자 전달일 경우에는 변수가 가지고 있는 상수를 보냅니다.

 

EX)

int sum(int a){
	return a
}

main(){
	int a = 3;
    sum(a);
    Syetem.out.println(a);
}

예를 들어 이런 코드가 있다고 가정합시다. 

 

a는 3이라는 상수를 가지고 있죠? 그리고 sum()을 호출하면서 a를 인자로 전달합니다. 

 

이때 전달되는 값은 3이 되겠죠?  출력 결과가 3이 나오겠죠?

 

그럼 만약 다음과 같은 코드는 어떨까요?

 

int sum(int a){
	a = 4;
	return a
}

main(){
	int a = 3, b = 0;
    sum(a);
    Syetem.out.println(a);
}

 

위 코드의 출력 결과는 어떻게 나올까요? 당연히 결과는 3이 나옵니다.

 

sum함수에 의해 a값을 4로 변경했지만 사실상 변경되지 않았죠.. 왜냐? call-by-value에 의해서죠

 

함수를 호출했을 때 전달되는 인자는 값을 복사한 것이지 주소를 보낸 게 아니기 때문이죠

 

즉 지역변수라 생각하시면 될 거 같네요.

 

그렇지만 또 인자가 객체일 때나 배열일 때는 조금 다릅니다.

 

#객체 레퍼런스가 인자로 전달되는 경우

 

객체 레퍼런스가 인자로 전달된다는 것은 객체 레퍼런스가 가지고 있는 주소를 넘긴다 이거죠

 

EX)

class MyInt{

	int val;
    MyInt(int i){
    	val = i;
    }
}

public class Person{

	public String name;
    public int age;
    public Person(String s){
    	name = s;
    }
    
    public void setAge(MyInt i){
    	age = i.val
        i.val++
    }
}

public class CallByValueObject{

	public static void main(String[] args){
    
    	Person aPerson = new Person("홍길동");
            MyInt a = new MyInt(33);
            
            aPerson.setAge(a);
            
            System.out.println(a.val);
    }
}

위 코드를 보시면 먼저 aPerson이라는 객체를 생성과 동시에 "홍길동"으로 초기화했습니다.

 

그리고 a 객체도 생성과 동시에 33이라는 값으로 초기화했고요

 

그리고  aPerson 객체의 메서드인 setAge에 a 객체를 인자로 전달하죠?

 

이때 전달되는 값은 a객체는 MyInt 타입의 레퍼런스이기 때문에 실제 MyInt 인스턴스의 주소를 보내겠죠?

 

처음 a객체를 생성했을 당시에 a객체의 val값은 33이었습니다. 

 

그런데 setAge(a)를 통해서 val이 34로 변합니다. 

 

그럼 setAge함수가 종료하고도 값이 34일까요? 

 

네 34가 맞습니다. 그 이유는 바로 주소를 보내 참조했기 때문에 변경이 가능한 거죠

 

C언어에서 포인터라고 보시면 될 거 같네요.

 

또 배열도 마찬가지로 수행될 수 있고요.

 

마지막으로 위에 내용이 이해가 가지 않을 분을 위해 간단하게 그림으로 표현해봤습니다.

 

위의 그림을 보면서 이해해보세요.

 

 

References. 명품 Java Programming

'IT Study > JAVA' 카테고리의 다른 글

[JAVA] 10.this  (0) 2019.09.02
[JAVA] 9.메소드 오버로딩(Method Overloading)  (0) 2019.09.02
[JAVA] 7.클래스와 객체  (0) 2019.08.31
[JAVA] 6.객체지향 언어의 특성  (0) 2019.08.31
[JAVA] 연습문제  (0) 2019.08.30