JAVA_21_호출 스택(call back), 매개변수

charl hi·2021년 8월 11일
0

JAVA

목록 보기
21/53

스택(stack)

: 밑이 막힌 상자. 위에 차곡차곡 쌓인다.

  • 꺼낼 땐 위에서 쌓인 순서대로

호출 스택(call stack)

: 메소드 수행에 필요한 메모리가 제공된 공간

  • 메소드가 호출되면 호출스택에 미모리 할당, 종료되면 해제
  • 아래에 있는 메소드가 그 다음의 위에 쌓인 메소드를 호출한 것
  • 맨 위의 메소드 하나만 실행 중, 나머지는 대기 중
  • 예) main 실행
    -> main이 println()호출
    -> println 실행 / main 대기
    -> println() 종료 -> main 실행
    -> main 종료 -> 프로그램 종료



매개변수

1. 기본형 매개변수

: READ only = 변수의 값을 읽기만 할 수 있다.

  • 예제 - 플래시 PrimitiveParam.exe

class Data1 {
	int x;
}

public class Ex6_6 {

	public static void main(String[] args) {
		// 기본형 매개변수(Primitive Parameter)
		
		Data1 d = new Data1();
		d.x = 10;
		System.out.println("main() x = "+d.x);  // 10
		
		change(d.x);
        	//static 메소드이므로 따로 객체생성 필요없다.
		System.out.println("AfterChange(d.x)");
		System.out.println("main() x = "+d.x);  // 10
		
	}
	
	static void change(int x) {
		x = 1000;	//지역변수x를 바꾼 거임
		System.out.println("change() x = "+x);  // 1000
	}

}

main() x = 10
change() x = 1000
AfterChange(d.x)
main() x = 10

2. 참조형 매개변수

: read & write = 변수의 값을 읽고 변경할 수 있다.

  • 예제 - 플래시 ReferenceParam.exe

class Data2 {
	int x;
}

public class Ex6_7 {

	public static void main(String[] args) {
		// 참조형 매개변수(Reference Parameter)
		
		Data2 d = new Data2();
		d.x = 10;
		System.out.println("main() x = "+d.x);  // 10
		
		change(d);	//주소 0x100이 들어감
		System.out.println("AfterChange(d)");
		System.out.println("main() x = "+d.x);  // 1000
	}
	
	static void change(Data2 d) {	//0x100 -> 같은 걸 가리키게 된다!
		d.x = 1000;		//change의 지역변수d가 가리키는 x변경
		System.out.println("change() x = "+d.x);  // 1000
	}

}

main() x = 10
change() x = 1000
AfterChange(d)
main() x = 1000


✨✨✨ 두 예제를 복습 계속 하자. 차이가 분명히 있다.

과정 중 내가 체득해야 할 것

  • 💕 Data d = new Data();
    : 생성된 인스턴스의 주소가 참조변수 d에 저장된다.

  • 💕 d.x = 10;
    : 참조변수 d가 가리키고 있는(참조하고 있는) 인스턴스의 멤버변수 x에 10을 저장한다.

  • change(d.x);
    : change메소드에 매개변수로 참조변수 d가 가리키고 있는(참조하고 있는) 인스턴스의 멤버변수 x(d.x) 의 값을 넘겨준다.
    : d.x의 값인 10이 change메소드의 매개변수 (int) x에 복사된다.

->

  • 🎆change(d);
    : change메소드에 매개변수로 참조변수 d 를 넘겨준다.
    = 리모컨을 통째로 넘겨준 거
    : main메소드에서 참조변수 d의 값인 Data인스턴스 주소가 change메소드의 매개변수 (Data) d에 복사된다.
    = 주소를 넘겨줬으니 읽고 변경할 수 있다.

->

  • 🎆change메소드 안에서 d.x = 1000;
    : change메소드의 지역변수인 참조변수 d가 가리키고 있는 인스턴스의 멤버변수 x에 1000을 저장한다.
    : 인스턴스 내 x의 값이 1000으로 완전히 바뀐거임!!

참조형 반환타입 & 참조형 매개변수

내일 다시
코드를 보면서 그림그려보자

자바정석


class Data3 {
	int x;
}

public class Ex6_8 {

	public static void main(String[] args) {
		// 참조형 매개변수와 참조형 반환타입
		
		Data3 d = new Data3();
		// 1. 인스턴스 생성. main 메소드의 지역변수 d 생성.
		// 2. 참조변수 d에 인스턴스의 주소(0x100) 저장
		
		d.x = 10;   
        	// 3. 참조변수 d가 가리키는 인스턴스의 멤버변수 x에 10 저장.
		
		Data3 d2 = copy(d);  
		// 4. main 메소드의 지역변수 d2 생성.
        	// *****copy()메소드 호출!!!!실행!!! 
		// 5. 참조변수 d의 값인 인스턴스의 주소(0x100)를 copy 메소드의 매개변수로 넣기.
		// 11. 지역변수이자 참조변수 d2에 tmp(0x200) 저장-> d2의 값은 인스턴스의 주소(0x200)
		// 12. copy 메소드 종료, copy의 지역변수인 tmp, d 사라짐
		
		System.out.println("d.x = "+d.x);  // 13. d.x == 10 출력
		System.out.println("d2.x = "+d2.x);  // 14. d2.x== 200 출력

	}
	
	static Data3 copy(Data3 d) {
		// 6. copy 메소드의 지역변수 d에 넘겨받은 인스턴스의 주소(0x100) 받음
		Data3 tmp = new Data3();   // 7. 새 객체 tmp 생성. copy 메소드의 지역변수 tmp.
		// 8. copy 메소드의 지역변수이자 참조변수 tmp는 인스턴스의 주소값(0x200:새 객체이므로)을 저장
		tmp.x = 20 * d.x;  
		// 9. 참조변수 tmp가 가리키는 인스턴스의 멤버변수 x에 d.x의 값인 10에 20을 곱해서 복사
		// -> tmp.x == 200
		return tmp; 
		// 10. 반환타입은 Data3타입 or 참조형으로 같은 타입인 tmp의 값인 주소(0x200) 반환
	}

}

d.x = 10
d2.x = 200

위의 예제에서 유념할 점

  • 👀 같은 클래스 내에서는 ✨참조변수가 필요가 없다.
  • 👀 static메소드는 ✨객체 생성 없이 호출 가능하다.
public class Ex6_8 {
	
	public static void main(String[] args) {
	
		Data3 d = new Data3();
		d.x = 10; 
        
       		***Ex6_8 e = new Ex6_8();  //객체생성
        	Data3 d2 = **e.**copy(d);  //참조변수
		...



Ref

0개의 댓글

관련 채용 정보