본문 바로가기
java

0928_참조형 변수 (클래스 타입), 기본형 변수

by 신방동불주먹 2022. 9. 28.
public class DataTest {//0928-2  //class이기 때문에 멤버변수, 함수 정의 가능
	//메소드의 매개변수가 기본형인지, 참조형인지에 따라 값을 보내는지 주소값을 보내는지 다름
	public static void main(String[] args) { 
		
	//	Data d = new Data(); //객체 생성 
	
	//==========기본형 변수	(기본형은 객체의 값자체를 넘긴 것)
//		d.x = 10;
//		System.out.println(d.x);
//		
//		change(d.x); //d는 change함수로 넘어간 매개변수와 무관한 main 메소드의 지역변수
//		System.out.println(d.x); //따라서 호출한 쪽의 원본 데이터는 바뀌지 않는다. 지역변수이기 때문에 =값의 복사
	
	//===========참조형 변수
//		d.x=10; //d는 주소값 .x는 그 주소값의 변수로 접근
//		System.out.println(d.x);
//		
//		change(d); //메소드내에서 정의된 지역변수(ox100같은 Data class의 주소값)
//		System.out.println(d.x);
	
		//d.x = 5000;
		
		//=========================================================//리턴타입을 참조형으로 갖는 메소드
		Data d = new Data(); //ex.5x100이라는 주소값이 있다
		d.x =10;
		
		Data d2 = copy(d);//Data타입을 가진 변수를 보내야 하니까 d
		
		//참조하는 위치가 다르다
		System.out.println(d.x);
		System.out.println(d2.x);
	}
	
	
	//==========기본형 메소드
//	static void change(int x) {// 값 복사 //동적 바인딩 : 필요시 메소드 자동 할당(할당과 소멸을 반복)
//		 x = 1000;
//		 System.out.println("change() : " + x);
//	}
	//==========참조형 메소드
//	static void change(Data d) {// 매개변수 Data d는 주소값을 받는다 //여기 지역변수도 지역변수로 밖에서 사용할수 없다
//		d.x=1000;
//		System.out.println("change() : "+ d.x);
//		//참조형은 주소값으로 해당 주소에 있는 객체자체의 값을 바꾸기 때문에 원래 x값 자체가 바뀜 
//	}
	
	
		//=========================================================//리턴타입을 참조형으로 갖는 메소드(참조형을 리턴할 땐 반드시 return 있어야함)
		static Data copy(Data d) { //d는 주소값
			
			Data tmp = new Data(); //각각 main-d, copy-tmp 가지는 지역변수
			tmp.x = d.x;
			
			return tmp; //tmp가 가지고 있던 5x200주소값이 return
		}
	
	
}
public class Data {//0928-2 
	int x;

}

-----------------정리

public class DataTesttest {

	public static void main(String[] args) {
//		//===============================================기본형 변수(기본형은 객체의 값자체를 넘긴 것)
//		call-by-value
//		Data d = new Data();
//		d.x = 10;
//		System.out.println(d.x);
//		
//		change(d.x); //d는 change함수로 넘어간 매개변수와 무관한 main 메소드의 지역변수
//		System.out.println(d.x); //따라서 호출한 쪽의 원본 데이터는 바뀌지 않는다. 지역변수이기 때문에 =값의 복사
//	
//	}
//
//
//	static void change(int x) { // 값 복사 -> change가 실행되면 x라는 매개변수가 생성되고 d.x의 값10으로 초기화.d.x는 관련이 없어짐. 
//	 x = 1000;
//	 System.out.println("change() : " + x);
		
		
		
		
//		//===============================================참조형 변수(기본형은 객체의 값자체를 넘긴 것)
		//(메소드의 매개변수가 클래스 타입인 경우 : 주소를 복사)
		//		call-by-reference
		Data d = new Data();
		
		d.x = 10; //d는 주소값 .x는 그 주소값의 변수로 접근
		System.out.println(d.x);
		
		change(d); //메소드내에서 정의된 지역변수(ox100같은 Data class의 주소값)
		System.out.println(d.x);
	
		d.x = 5000;
		
		
}
	static void change(Data d) {// 매개변수 Data d는 주소값을 받는다 //여기 지역변수도 지역변수로 밖에서 사용할수 없다
		d.x=1000;
		System.out.println("change() : "+ d.x);
		//참조형은 주소값으로 해당 주소에 있는 객체자체의 값을 바꾸기 때문에 원래 x값 자체가 바뀜 
	}
}

 

'java' 카테고리의 다른 글

0928_참조형 변수 (배열 타입)  (0) 2022.09.28
0928_리턴타입을 참조형으로 갖는 메소드  (0) 2022.09.28
0928_메소드  (0) 2022.09.28
0927_클래스, 변수  (0) 2022.09.27
0927_이중배열(빙고게임)  (0) 2022.09.27