Java에서 Call by value와 Call by reference를 구분하는 방법은 매서드의 매개변수의 자료형에 달려있다.
Java에서는 개발자가 포인터를 사용할 수 없도록 되어있다. 그래서 바꾸길 원하는 값의 주솟값을 넘길 수 없다.
아래 코드를 보자
class Number{
public void increase(int count){
count++;
}
}
public class Main {
int count = 0;
public static void main(String[] args){
Main mainNumber = new Main();
Number newNumber = new Number();
newNumber.increase(mainNumber.count);
System.out.println(mainNumber.count);
}
}
mainNumber라는 객체에 있는 count값을 1만큼 증가시키고 싶을 때 C++에서는 increase 메소드의 인자로 int &count를 넘겨줌으로써 count값을 증가시킬 수 있다.
하지만 Java에서는 개발자가 포인터를 사용할 수 없는데 어떻게 해야할까?
바로 int count가 아닌 Main {변수명} 으로 매개변수의 자료형을 class로 지정해주면 된다.
Java는 메소드의 인자로 객체를 넘길 때 Call by value가 아니라 Call by reference 방식으로 즉, 객체의 주소값을 넘김으로서 포인터를 사용하게 된다.. 하지만 여기서 주의할 점이 있다.(Call by Reference 아님!)
실제로 객체가 존재하는 메모리 주소를 넘겨주는것이 아닌 객체가 존재하는 메모리 주소를 참조하는 임의의 변수를 heap 영역에 만들고, 만들어진 임의의 변수를 넘겨주게 된다.
heap영역에 있는 임의의 변수는 실제 객체의 값을 가리키고있고 임의의 변수가 변하면 실제 객체의 값도 변하게 되는 것이다. 따라서 메소드는 넘겨받은 임의의 변수를 가지고 실제 객체의 값을 조작할 수 있게된다.
결국 Java는 사실상 모든 메소드 호출을 Call by value 방식으로 한다는 것을 알 수 있다.
자바가 메모리를 많이 사용하는 이유를 깨닫게 되었다.
그리고 위와 같은 개념에서 Java의 객체지향 특성이 드러난다고 생각한다.
아래 코드는 Main객체를 자료형으로 받는 increase메소드를 통해서 mainNumber 객체의 count값을 실제로 1만큼 증가시켜주는 코드이다.
class Number{
public void increase(Main main){
main.count++;
}
}
public class Main {
int count = 0;
public static void main(String[] args){
Main mainNumber = new Main();
Number newNumber = new Number();
newNumber.increase(mainNumber);
System.out.println(mainNumber.count);
}
}
'Lang > Java' 카테고리의 다른 글
[Java] Lambda 특징과 활용 (1) | 2022.10.03 |
---|---|
함수형 프로그래밍과 Java #1 (6) | 2022.09.08 |
[디자인 패턴] 싱글톤 패턴 (Creational) (0) | 2022.01.10 |
[Java] Runnable과 Thread의 차이 (0) | 2021.12.11 |
[Java] 추상 클래스와 인터페이스 (abstract class & interface) (0) | 2021.10.13 |