pass_by

Mia Lee·2021년 12월 17일
0

JAVA

목록 보기
74/98
package ex_pass_by;

public class Ex1 {

	public static void main(String[] args) {

		/*
		 * Pass by value(값에 의한 전달) & Pass by Reference(참조에 의한 전달)
		 * 
		 * - 메서드 등의 파라미터에 데이터를 전달할 때 기본 데이터타입과 참조 데이터타입은
		 *   전달되는 값의 종류가 다름
		 *   => 기본 데이터타입 : 실제 저장된 데이터가 복사되어 전달됨
		 *      참조 데이터타입 : 실제 저장된 데이터가 있는 주소값이 복사되어 전달됨
		 * - 어떤 데이터타입을 전달하느냐에 따라 데이터를 전달받은 곳에서 해당 데이터를
		 *   사용했을 때 다른 곳에서 영향을 받을 수도 있음
		 *   => 기본 데이터타입 전달 시 값 복사가 일어나므로 복사된 값을 전달받은 
		 *      서로 다른 객체끼리 값의 영향 X
		 *   => 참조 데이터타입 전달 시 주소값 복사가 일어나므로 복사된 주소값을 전달받은 
		 *      서로 다른 객체끼리 동일한 객체의 주소를 참조하므로 변경된 값의 영향이 발생!
		 * 
		 */
		
		Money m = new Money();
		m.money = 1000;
		
		// 1. 메서드에 기본 데이터타입을 전달하는 경우
		System.out.println("m.money 값 변경 전 : " + m.money);
		changeValue(m.money);
		// => 변경할 값 전달(m.money에 저장된 정수 1000을 복사하여 전달)
		System.out.println("m.money 값 변경 후 : " + m.money);
		// => 기본데이터타입을 메서드 파라미터로 전달 시 실제 값의 복사가 일어나므로
		//    복사된 값을 전달받은 메서드에서 값을 변경하더라도 원본데이터에는 
		//    아무런 영향이 발생하지 않는다!
		
		System.out.println("===================================");
		
		// 2. 메서드에 참조 데이터타입(객체)를 전달하는 경우
		System.out.println("m.money 값 변경 전 : " + m.money);
		changeReference(m);
		// => 변경할 값 전달(m에 저장된 주소값을 복사하여 전달)
		System.out.println("m.money 값 변경 후 : " + m.money);
		// => 참조데이터타입을 메서드 파라미터로 전달 시 실제 값이 아닌 주소값의 복사가 일어남
		//    따라서, 복사된 주소를 통해 객체의 값을 변경하는 경우
		//    원본데이터가 참조하는 객체와 동일한 객체의 값이 변경되므로 영향이 발생한다!
		
		System.out.println("===================================");
		
		System.out.println("m.money 값 변경 전 : " + m.money);
		m.money = changeValue2(m.money);
		System.out.println("m.money 값 변경 후 : " + m.money);
		
	} // main() 끝
	
	public static int changeValue2(int money) {
		
		// 기본데이터타입의 데이터를 전달받을 경우 값의 복사가 일어나므로
		// 원본데이터와는 다른 위치에 복사된 값이 저장됨
		
		System.out.println("changeValue() 의 money 값 변경 전 : " + money);
		// 전달받은 값 변경
		money -= 500;
		System.out.println("changeValue() 의 money 값 변경 후 : " + money);
		
		return money;
	}
	
	// 참조 데이터타입을 전달 할 메서드
	public static void changeReference(Money mm) {
		
		// 참조데이터타입의 데이터를 전달받을 경우 주속밧의 복사가 일어나므로
		// 원본데이터가 참조하는 위치의 객체와 동일한 객체를 참조하게 됨
		
		System.out.println("changeReference() 의 money 값 변경 전 : " + mm.money);
		// 전달받은 주소에 접근하여 값 변경
		mm.money -= 500;
		System.out.println("changeReference() 의 money 값 변경 후 : " + mm.money);
	}
	
	// 기본 데이터타입을 전달 할 메서드
	public static void changeValue(int money) {
		
		// 기본데이터타입의 데이터를 전달받을 경우 값의 복사가 일어나므로
		// 원본데이터와는 다른 위치에 복사된 값이 저장됨
		
		System.out.println("changeValue() 의 money 값 변경 전 : " + money);
		// 전달받은 값 변경
		money -= 500;
		System.out.println("changeValue() 의 money 값 변경 후 : " + money);
	}
	
	

}

class Money {
	
	int money;
	
}













0개의 댓글