코드일기장

[Java] 호출 스택, 매개변수 (객체지향 1-6) 본문

Java/OOP

[Java] 호출 스택, 매개변수 (객체지향 1-6)

won_hyeok2 2022. 1. 4. 20:41

 

 

 

스택(stack)이란, 밑이 막힌 상자. 위에 차곡차곡 쌓인다.

 

 

 

스택은 어떠한 데이터가 차곡차곡 쌓이고 나갈 때도 위에서부터 나간다.

절대 중간에 넣을 수는 없고 맨 아래에서부터 뺄 수도 없다.

 

 


🎯 호출 스택

메서드가 호출되면 수행에 필요한 메모리를 스택에 할당.

메서드가 수행을 마치면 사용했던 메모리를 반환. (수행을 마친 메서드는 스택에서 삭제)

호출 스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.

 

public class Hello {
	
	public static void main(String[] args) {
		str();

	}
	static void str() {
		System.out.println("Hello World");
	}
}

기본적인 Hello World String으로 출력하는 프로그램이다. 이 프로그램의 호출스택이 어떻게 변하는지 그림으로 설명해보겠다.

아래는 method의 삭제 순서 

각 스택별로 아래 있는 메서드가 위의 메서드를 호출한 것


 

🎯 매개변수

 

기본형 매개변수 - 변수의 값을 읽기만 가능하다. (매개변수가 int String 등인 것)

참조형 매개변수 - 변수의 값을 읽고, 변경도 가능 (매개변수가 참조변수인 것)

 

 

 

🔑 기본형 매개변수 예시 코드

class Data{
	int d;
}

public class Hello {
	
	public static void main(String[] args) {
		Data dc= new Data();
		dc.d=5;
		System.out.println(dc.d);
		change(dc.d);
		System.out.println("메서드 실행 후 main");
		System.out.print(dc.d);
	}
	
	static void change(int x) {
		x=1500;
		System.out.println(x);
	}
}

 

코드실행결과

이 코드의 결과를 보면 change메서드에서 입력받은 dc.d=5라는 값을 1500으로 바꾸고 메서드에서 한번 출력한 후 다시 main메서드로 간다. main메서드에서는 1500 값이 바뀌지 않고 여전히 5로 저장되어 있다.

 

여기서, 기본형 매개변수는 값을 읽기만 가능하고 메서드내에서 변경이 가능하지만 처음 입력받았던 데이터의 기본 값은 변경할 수 없다. 

 

 

 

🔑 참조형 매개변수 예시 코드

class Data{
	int d;
}

public class Hello {
	
	public static void main(String[] args) {
		Data dc= new Data();
		dc.d=5;
		System.out.println(dc.d);
		change(dc);
		System.out.println("메서드 실행 후 main");
		System.out.print(dc.d);
	}
	
	static void change(Data dr) {
		dr.d=4000;
		System.out.println(dr.d);
	}
}

 

프로그램 실행 결과

 

이 코드는 change() 메서드는 Data dr로 참조 변수가 매개변수이다.  이 프로그램은 전 프로그램과 달리 dc.d의 값이 change메서드 실행 이후 변경된 것을 확인할 수 있다.

 

change메서드는 dc참조변수를 복사받는다. 복사받으면서 같이 객체 주소를 가리키게 될 수 있게 된다. 그러므로 dr과 dc 두 개의 참조 변수는 같은 class Data 주소를 가리키게 된다. change메서드에서 Data 객체의 멤버 변수 d값을 바꾸었으므로 같은 주소를 가리킨 dc참조 변수도 바뀐 값으로 프로그램이 동작되는 것이다.

class Data{
	int d;
}

public class Hello {
	
	public static void main(String[] args) {
		Data d=new Data();
		System.out.println(d);
		change(d);
	}
	static void change(Data d2) {
		System.out.println(d2);
	}
	
}

객체주소

이 처럼 d와 d로 복사(대입) 받은 d2 두 참조 변수는 같은 객체 주소를 가리키므로 한쪽에서 값을 변경하면 그 객체의 값이 변경되는 것이다.

 

 

이처럼, 참조 변수를 사용한 참조형 매개변수는 기본형 매개변수와 달리 읽고 쓰는 게 가능해진다.


🎯 참조형 반환타입

method 반환 타입이 참조형인 경우는 객체의 주소, 객체를 반환한다고 보면 된다.

class Data2{
	int variable;
}

public class Hello {
	
	public static void main(String[] args) {
		Data2 d=new Data2();
		d.variable=50;
		System.out.println("d.variable=  "+d.variable);
		Data2 d2=D(d);
		System.out.println("d2.variable=  "+d2.variable);
	}
	static Data2 D(Data2 d) {
		Data2 tmp=new Data2();
		tmp.variable=d.variable;
		return tmp;
	}
}

 

 

 

 

🎈 다음 글 보기(객체지향 1-7)



 

 

 

 

 

🚀 이전 글 보기(객체지향 1-5)


 


 

 

 

Comments