* JAVA - 객체지향 프로그래밍(4)

jodbsgh·2022년 3월 15일
0

💡"JAVA"

목록 보기
13/67

기본형 매개변수와 참조형 매개변수

자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.

매개변수의 타입이 기본형(primitive type)일 때는 기본형 값이 복사되겠지만, 참조형(reference type)이면 인스턴스의 주소가 복사된다.

메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값만 얻지만, 참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경 하는 것도 가능하다.

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.(read & write)
class Data { int x; }

class PrimitiveParamEx{
	public static void main(String[] args)
    {
    	Data d = new Data();
        d.x = 10;
        System.out.println("main() : x =" + d.x);
        
        change(d.x);
        System.out.println("After change(d.x)");
        System.out.println("main() : x = " + d.x);
    }
    
    static void change(int x)	//기본형 매개변수
    {
    	x = 1000;
        System.out.println("change() : x = " + x);
    }
}

실행결과
main() : x = 10
change() x = 1000
After change(d.x)
main() : x = 10


1. change 메서드가 호출되면서 'd.x'가 change메서드의 매개변수 x에 복사됨
2. change 메서드에서 x의 값을 1000으로 변경
3. change 메서드가 종료되면서 매개변수 x는 스택에서 제거됨

  • 'd.x'의 값이 변경된게 아니라, change메서드의 매개변수 x의 값이 변경된 것이다.
  • 원본이 아닌 복사본이 변경된 것이라 원본에는 아무런 영향을 미치지 못한다.

이처럼 기본형 매개변수는 변수에 저장된 값만 읽을 수만 있을 뿐 변경할 수는 없다.

class Data { int x; }

class ReferenceParamEx{
	public static void main(String[] args)
    {
    	Data d = new Data();
        d.x = 10;
        System.out.println("main() : x =" + d.x);
        
        change(d);
        System.out.println("After change(d)");
        System.out.println("main() : x = " + d.x);
    }
    
    static void change(Data d)	//참조형 매개변수
    {
    	d.x = 1000;
        System.out.println("change() : x = " + d.x);
    }
}

실행결과
main() : x = 10
change() x = 1000
After change(d)
main() : x = 1000

 

이번엔 change메서드를 호출한 후, d.x의 값을 변경했다.
change메서드의 매개변수가 참조형이라서 값이 아니라 '값이 저장된 주소'를 change메서드에게 넘겨주었기 때문에 값을 읽어오는 것뿐만 아니라 변경하는 것도 가능하다.


1. change메서드가 호출되면서 참조변수 d의 값(주소)이 매개변수 d에 복사된다. 이제 매개변수 d에 저장된 주소값으로 x에 접근이 가능하다.
2. change메서드에서 매개변수 d로 x의 값을 1000으로 변경
3. change메서드가 종료되면서 매개변수 d는 스택에서 제거됨

  • 이번엔 x의 값이 아닌 주소가 매개변수 d에 복사되었다.
  • main메서드의 참조변수 d와 change메서드의 참조변수 d는 같은 객체를 가르키게 된다.
  • 매개변수 d로 x의 값을 읽는 것과 변경하는 것이 모두 가능해진다.

참조형 반환타입

모든 참조형 타입의 값을 '객체의 주소'이므로 그저 정수값이 반환되는 것일 뿐 특별할 것이 없다.

class Data {int x}

class ReferenceReturnEx{
	public static void main(String[] args)
    {
    	Data d = new Data();
        d.x = 10;
        
        Data d2 = copy(d);
        System.out.println("d.x =" + d.x);
        System.out.println("d2.x =" + d2.x);
    }
    
    static Data copy(Data d)
    {
    	Data tmp = new Data();
        tmp.x = d.x;
        
        return tmp;
    }
}

실행결과
d.x = 10
d2.x = 10
  • copy메서드는 새로운 객체를 생성한 다음에, 매개변수로 넘겨받은 객체에 저장된 값을 복사해서 반환.
  • 반환하는 값이 Data객체의 주소이므로 반환 타입이 'Data'인 것
static Data copy(Data d)
{
	Data tmp = new Data();	// 새로운 객체 tmp를 생성한다.
    tmp.x = d.x;			// d.x의 값을 tmp에 복사한다.

	return tmp;				// 복사한 객체의 주소를 반환
}
  • 메서드의 반환타입이 'Data'이므로, 호출결과를 저장하는 변수의 타입 역시 'Data'타입의 참조변수여야함.
	Data d2 = copy(d); 		// static Data copy(Data d)
  • copy 메서드 내에서 생성한 객체를 main메서드에서 사용할 수 있으려면, 이렇게 새로운 객체의 주소를 반환해줘야 함.
  • 그렇지 않으면, copy메서드가 종료되면서 새로운 객체의 참조가 사라지기 때문에 더 이상 이 객체를 사용할 방법이 없다.

    copy메서드를 호출하면서 참조변수 d의 값이 매개변수 d에 복사된다.

    새로운 객체를 생성한 다음, d.x에 저장된 값을 tmp.x에 복사한다.

    copy메서드가 종료되면서 반환한 tmp의 값은 참조변수 d2에 저장된다.

    copy메서드가 종료되어 tmp가 사라졌지만, d2로 새로운 객체를 다룰 수 있다.
"반환타입이 '참조형'이라는 것은 메서드가 '객체의 주소'를 반환한다는 것을 의미한다."
profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글