[Java] 객체지향개념 - 메서드의 매개변수

miyeon·2023년 3월 19일
0

Java

목록 보기
3/10
post-thumbnail

매개변수


기본형 매개변수

  • 변수의 값을 읽기만 가능함 (을 받음)
  • 변수의 데이터타입이 기본형 8가지
    char byte short int long float double boolean

참조형매개변수

  • 변수의 값을 읽고, 수정이 가능함 (주소를 받음)
  • 데이터타입이 기본형 8개가 아니면 참조형
  • 반환타입 - 객체의 주소를 반환함






기본형 매개변수 예제


Ex6_6 전체 코드 💻


class Data { int x; }	//x:멤버변수

class Ex6_6 {
	public static void main(String[] args) {
		Data d = new Data();	//객체생성(main에 d라는 참조변수 생성, d는 Data인스턴스를 참조)
		d.x = 10;	//참조변수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);
	}
}


한줄씩 풀이✍️

class Ex6_6 {
	public static void main(String[] args) {

클래스 Ex6_6이 메모리에 로드되고 클래스의 메인메모리가 호출되면서 프로그램이 시작된다.

Data d = new Data();

Data클래스가 메모리에 로드되고, 참조변수d가 메인메서드에 지역변수로 생성된다.
Data의 인스턴스가 생성되고 생성된 인스턴스의 주소가 d에 저장된다.

d.x = 10;

d가 참조하고 있는 인스턴스의 멤버변수x에 10을 저장한다.

change(d.x);

change메서드를 호출하면서 매개변수로 d가 참조하고 있는 x의 값(10)을 넘겨준다. d.x의 값이 change의 매개변수 x에 복사된다.

static void change(int x) {  // 기본형 매개변수
		x = 1000;
		System.out.println("change() : x = " + x);
}

change의 지역변수 x에 1000을 저장한다.(x의 값이 10에서 1000으로 변경된다.)
인스턴스의 멤버변수x의 값은 변경되지 않음

👉 기본형 매개변수는 읽기만 가능(수정 불가)






참조형 매개변수 예제

Ex6_7 전체 코드 💻

class Data2 { int x; }

class Ex6_7 {
	public static void main(String[] args) {
		Data2 d = new Data2();		//참조변수d가 main메서드에 지역변수로 생성
		d.x = 10;		//참조변수d가 참조하고있는 인스턴스의 멤버변수x에 10을 저장
		System.out.println("main() : x = " + d.x);

		change(d);	//change메서드를 호출하면서 매개변수로 참조변수d값(인스턴스의 주소)을 넘겨준다.
		System.out.println("After change(d)");
		System.out.println("main() : x = " + d.x);
	}

	static void change(Data2 d) { // 참조형 매개변수
		d.x = 1000;
		System.out.println("change() : x = " + d.x);
	}
}

한줄씩 풀이✍️

class Ex6_7 {
	public static void main(String[] args) {

Ex6_7클래스가 메모리에 로드되고, 클래스의 메인메서드가 호출되면서 프로그램이 시작된다.

Data2 d = new Data2();	

Data2클래스가 메모리에 로드되고, 참조변수d가 메인메서드에 지역변수로 생성된다.
Data2의 인스턴스가 생성되고, 생성된 인스턴스의 주소가 참조변수d에 저장된다.

d.x = 10;	

참조변수d가 참조하고 있는 인스턴스의 멤버변수x에 10을 저장한다.

change(d);

change메서드를 호출하면서 매개변수로 참조변수d 값(인스턴스의 주소)을 넘겨준다.

	static void change(Data2 d) { // 참조형 매개변수
		d.x = 1000;
		System.out.println("change() : x = " + d.x);
	}

change메서드에 Data2인스턴스를 참조하는 참조변수d가 생성된다.
그 d가 참조하는 인스턴스의 멤버변수x에 1000을 저장한다. 이때 메인메서드의 d.x값도 1000으로 변경된다.

👉 참조형 매개변수는 읽기와 수정이 가능!





Ex6_8 전체 코드💻

class Data3 { int x; }

class Ex6_8 {
	public static void main(String[] args) {
		Data3 d = new Data3();
		d.x = 10;

		Data3 d2 = copy(d); 	//static 매서드는 객체 생성없이 호출 가능(호출시 참조변수 없음)
		System.out.println("d.x ="+d.x);
		System.out.println("d2.x="+d2.x);
	}

	static Data3 copy(Data3 d) {	//main의 d주소를 copy의 참조변수d에 대입
		Data3 tmp = new Data3();    // 새로운 객체 tmp를 생성한다.

		tmp.x = d.x;  // d.x(copy메서드의 d)의 값을 tmp.x에 복사한다.

		return tmp;   // 복사한 객체의 주소를 반환한다.
	}
}

한줄씩 풀이✍️

class Ex6_8 {
	public static void main(String[] args) {

Ex6_8클래스가 메모리에 로드되고 클래스의 메인메서드가 호출되면서 프로그램이 시작된다.

Data3 d = new Data3();

Data3클래스가 메모리에 로드되고, 참조변수 d가 메인메서드에 지역변수로 생성된다.
Data3의 인스턴스가 생성되고, 생성된 인스턴스의 주소(예:0x100)가 참조변수 d에 저장된다.

d.x = 10;

참조변수d가 참조하고 있는 인스턴스의 멤버변수 x에 10을 저장한다.

Data3 d2 = copy(d);

메인메서드에 참조변수d2가 지역변수로 생성되고 copy메서드가 호출되면서 매개변수로 참조변수d의 값을 넘겨준다.

static Data3 copy(Data3 d) {	
		Data3 tmp = new Data3();    
		tmp.x = d.x; 
		return tmp;   
}

copy메서드에 Data3인스턴스를 참조하는 참조변수d가 생성된다.
copy메서드에 참조변수tmp가 지역변수로 생성된다.
새로운 Data3의 인스턴스가 생성되고, 생성된 인스턴스의 주소(예:0x200)가 tmp에 저장된다.
tmp가 참조하고 있는 새로운 인스턴스의 멤버변수x에 d가 참조하고 있는 x값(10)을 대입한다.
tmp가 참조하고 있는 주소(예:0x200)를 반환하고 copy메서드가 종료된다.

메인메서드의 d2에는 tmp의 주소(예:0x200)가 저장된다.


참고 📑

남궁성의 정석 코딩 - 자바의 정석 기초편(2020 최신)

profile
내가 보려고 기록하는 블로그

0개의 댓글