본문 바로가기

JAVA

JAVA #20 호출 스텍(call stack) , 기본형 매개변수

1. 호출 스텍(call stack)

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

 

메서드 수행에 필요한 메모리가 제공되는 공간

메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제

순서가 올 때 까지 대기중! (아래 있는 메서드가 위의 메서드를 호출한 것)

class Ex6_5 {
	public static void main(String[] args) {
    System.out.printlm("Hello");
    }
   }

위 코드 실행 순서 (호출 스택)

 

2. 기본형 매개변수

기본형 매개변수 - 변수의 값을 읽기만 할 수 있다. (read only)

참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다. (read & write)

 

 

기본형 매개변수 예제

class Date { int x }
class Ex6_6 {
	public static void main(String[] args) {
    	Data d = new Date();
        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);
        }
   }

결과 :

main() : x = 10

change() : x = 1000

After change(d.x)

main() : x = 10 -> 10인 이유 change() 메소드는 이미 호출되어 스택에서 사라진 후 이기때문에 1000이 아님

      

 

참조형 매개변수 예제

class Data2 {int x; }

class Ex6_7 {
	public static void main(String[] args) {
    	Date2 d = new Data2();
        d.x = 10;
        System.out.println("main() : x = " + d.x);
        
        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);
         }
      }

결과 :

main() : x = 10

change() : x = 1000

After change(d)

main() : x = 1000

 

참조형 매개변수 이기 때문에 같은 주소 값을 가르키고 거기의 x의 값이 1000으로 변경되어서 1000이 나옴

참조형 반환타입

class Data3 { int x }

class Ex6_8 {
	public static void main(String[] args)
    	Data3 d = new Data3();
        d.x = 10;
        
        Data3 d2 = copy(d);
        System.out.println("d.x = " d.x);
        System.out.println("d2.x = " + d2.x);
     }
     
     	static Data3 copy(Data3 d) {
        	Data3 tmp = new Data3(); // 새로운 객체 tmp 를 생성
            tmp.x = d.x; // d.x의 값을 tmp.x에 복사
            return tmp; // 복사한 객체의 주소를 반환
           }
       }

결과

d.x = 10

d2.x = 10

main 에 있는 d와 copy에 있는 d 는 이름만 같을 뿐 다른 d 임!!