관리 메뉴

나구리의 개발공부기록

자바의 정석 기초편 ch6 - 23 ~ 25[기본형매개변수, 참조형매개변수, 참조형 반환타입] 본문

유튜브 공부/JAVA의 정석 기초편(유튜브)

자바의 정석 기초편 ch6 - 23 ~ 25[기본형매개변수, 참조형매개변수, 참조형 반환타입]

소소한나구리 2023. 11. 16. 20:29

1) 기본형 매개변수

  • 변수의 값을 읽기만 할 수 있음 - read only
  • 플래시 동영상 - PrimitiveParam.exe 참조
class Data { int x; }

class ex6_6 {
	public static void main(String[] args) {
		Data d = new Data();	// 객체 생성
		d.x = 10;				// 참조변수 d가 가리키는 값을 10으로 변경
		System.out.println("main() : x = " + d.x);	// main()x의 값은 10		

		change(d.x);			// (d.x)의 값(현재 10)을 입력한 change메서드호출 
		System.out.println("After change(d.x)");
		System.out.println("main() : x = " + d.x);	// 여전히 main() x의 값은 10
	}

	static void change(int x) { // 기본형 매개변수
		x = 1000;				// change메서드의 지역변수 x에 1000을 저장
		System.out.println("change() : x = " + x);	// change()x의 값은 1000
	}	// 메서드 종료 후 호출한 값으로 이동 (스택에서 사라짐,change 메서드의 지역변수 x도 함께 사라짐)
}

출력값

main() : x = 10
change() : x = 1000
After change(d.x)
main() : x = 10

 

(1) 프로그램 동작 설명

  1. Data 클래스의 인스턴스 변수 x 생성
  2. main 메서드가 실행되어 호출 스택에 쌓이고 Data() 객체를 생성하여 참조를 변수 d에 저장(d를 가리킴)
  3. d.x로 변수를 사용하여 d가 가리키는 x 변수에 10을 입력
  4. static 메서드인 change()에 d.x를 인자로 입력하고 호출하여 메서드를 실행하면 호출 스택에 쌓이게 되고 인자로 전달받은 d.x의 값이 change 메서드의 매개변수 x에 복사가 됨
  5. change 메서드 내부의 코드가 수행되어 지역변수인 x의 값을 1000으로 변경
  6. change 메서드가 종료되고 호출스택에서 삭제하여 main 메서드로 복귀
  7. main 메서드의 나머지 코드를 수행하여 참조변수 d가 가리키는 변수 x의값 10을 출력하고 main메서드가 종료되어 호출스택에서 제거됨


2) 참조형 매개변수

  • 매개변수의 타입은 기본형이 아니면 참조형임
  • 참조형 매개변수는 변수의 값을 읽고 변경 할 수 있음 - read and write
  • 객체를 다룰 수 있는 주소(참조) 자체를 매개변수로 복사하기 때문에 가능함
  • 플래시 동영상 - ReferenceParam.exe 참조
class Data2 { int x; }	// 멤버가 1개	

class ex6_7 {
	public static void main(String[] args) {
		Data2 d = new Data2();	// 객체생성
		d.x = 10;	// 참조변수 d가 가리키는 x에 10을 저장
		System.out.println("main() : x = " + d.x);

		change(d);	// 참조변수 d 값을 입력한 change 메서드 호출
		System.out.println("After change(d)");
		System.out.println("main() : x = " + d.x);	// main() x의 값이 1000으로 변경 됨
	}

		// 객체의 주소 자체를 매개변수에 복사해서 값을 변경할 수 있음 => 읽고 쓰는것이 가능해짐!!
		static void change(Data2 d) {	// 참조형 매개변수 = 기본형이 아니면 참조형
        
		d.x = 1000;	// 참조변수 d가 가리키는 x에 1000을 저장 -> d의값이 변경 됨.
		System.out.println("change() : x = " + d.x); // change() x의 값은 1000	
	}
}

출력값

main() : x = 10
change() : x = 1000
After change(d)
main() : x = 1000

 

(1) 프로그램 동작 설명

  1. Data2 클래스의 인스턴스 변수 x 생성
  2. main 메서드가 실행되어 호출 스택에 쌓이고 Data2() 객체를 생성하여 참조를 변수 d에 저장(d를 가리킴)
  3. d.x로 변수를 사용하여 d가 가리키는 x 변수에 10을 입력
  4. static 메서드인 change()에 참조변수 자체를 인자로 입력하고 메서드를 호출하여 실행하면 호출스택에 쌓이게 되고, change의 매개변수인 Data2타입의 d변수에 인자로 받은 참조값(주소값)을 저장함, 즉 change의 파라미터가 Data2객체를 가리킴
  5. change 메서드 내부의 코드가 수행되어 d.x로 참조변수 d가 가리키는 변수 x의 값을 1000으로 변경
  6. change 메서드가 종료되고 호출스택에서 삭제하여 main 메서드로 복귀
  7. main 메서드의 나머지 코드를 수행하여 참조변수 d가 가리키는 변수 x의값 1000을 출력하고 main메서드가 종료되어 호출스택에서 제거됨 - change 메서드 호출 결과로 Data()객체의 변수의 값이 변경되었음


3) 참조형 반환타입

  • 반환타입이 참조형일 경우 객체의 주소를 반환함
  • 객체의 주소(참조값)는 정수타입(int)임
class Data3 { int x; }

class ex6_8 {
	public static void main(String[] args) {
		Data3 d = new Data3();
		d.x = 10  ;  // 참조변수 d가 가리키는 x에 10을 저장

		Data3 d2 = copy(d);
		// 참조변수 d를 복사한 copy메서드 호출하여 실행 값(주소)를 참조변수 d2에 반환
		System.out.println("d.x ="+d.x);
		System.out.println("d2.x="+d2.x);
	}

	static Data3 copy(Data3 d) {
		Data3 tmp = new Data3();    // 새로운 객체 tmp를 생성

		tmp.x = d.x;  // d.x의 값을 tmp.x에 복사

		return tmp;   // 복사한 객체의 주소를 반환
		// 반환 타입이 참조형일 경우 객체의 주소가 반환 됨
	}
}

출력결과
d.x =10
d2.x=10

 

(1) 프로그램 동작 설명

  1. Data3 클래스의 인스턴스 변수 x 생성
  2. main 메서드가 실행되어 호출 스택에 쌓이고 Data3() 객체를 생성하여 참조를 변수 d에 저장(d를 가리킴)
  3. d.x로 변수를 사용하여 d가 가리키는 x 변수에 10을 입력
  4. static 메서드인 copy()에 참조변수 자체를 인자로 입력하여 메서드를 호출하여 실행하면 호출스택에 쌓이게 되고, copy의 매개변수인 Data3타입의 d변수에 인자로 받은 참조값(주소값)을 저장함
  5. copy 메서드 내부의 코드가 수행되어 Data3객체를 새로 생성하여 tmp 변수에 참조값을 저장하고 d.x의 값을 tmp.x의 값으로 복사
  6. 반환값으로 새로생성 된 tmp 변수의 참조값을 반환하여 d2라는 변수에 반환 된 참조값을 저장
  7. copy 메서드가 종료되고 호출스택에서 삭제하여 main 메서드로 복귀
  8. main 메서드의 나머지 코드를 수행하여 참조변수 d가 가리키는 변수 x의값 10과 d2가 가리키는 변수 x의값 10(메서드로 복사 된 값)을 출력하고 main메서드가 종료되어 호출스택에서 제거됨

 

4) 위 예제들의 static 메서드 호출시 할 때 참조변수가 없는 이유

  • 메서드가 같은 클래스에 있으면 참조변수 생략가능
  • static메서드는 객체 생성없이 호출 가능하여 클래스 이름으로 호출할 수 있음
  • 만약 다른 클래스에 copy() 메서드가 정의되어 있었다면 해당 클래스의 객체를 생성 후 반환 된 참조변수로 호출해야함.
    • Copy e = new Copy();
    • e.copy() 

 

** 출처 : 남궁성의 정석코딩_자바의정석