본문 바로가기

Java/OOP

[Java | OOP] 6-23~24. 기본형 매개 변수 / 참조형 매개 변수

📌 학습 목차

23. 기본형 매개 변수 / 참조형 매개 변수

24-1. 기본형 매개 변수 예제

24-2. 참조형 매개 변수 예제

23. 기본형 매개 변수 / 참조형 매개 변수

자료형(data type): 값(data)의 종류(type)에 따라 저장될 공간의 크기와 저장 형식을 정의한 것 / 크게 기본형과 참조형으로 구분됨

기본형(primitive type): 계산을 위한 실제 값(data)을 저장하는 8개의 자료형

참조형(reference type): 객체 주소(memory address)를 저장하는 기본형 외 나머지 타입

•자바에서는 메서드 호출 시 인수로 지정한 값을 메서드의 매개 변수로 복사해 넘겨줌

   이때 메서드의 매개 변수 타입을 기본형으로 선언할 경우, 기본형 값이 복사되어 단순히 값을 읽기만 할 수 있음

   반면 참조형으로 선언할 경우, 값이 저장된 객체 주소가 복사되어 값을 읽어오는 것뿐만 아니라 변경할 수도 있음 

•기본형은 저장할 값의 종류에 따라 구분되므로 자료형(data type)이라는 용어를 사용함

   반면 참조형은 객체의 종류에 따라 구분되므로 타입(type)이라는 용어를 사용하며, 이때 타입은 자료형을 포함하는 넓은 의미의 용어임

24-1. 기본형 매개 변수 예제

📌 // 매개 변수가 기본형인 메서드 간의 호출 관계

package chap_06;

class Data1 {
    int x;
}

public class _24_Example1 {
    public static void main(String[] args) {
        Data1 d = new Data1();
        d.x = 10;
        System.out.println(d.x); // 10
        change(d.x); // 123
        System.out.println(d.x); // 10
    }

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

 

 

1) public class Example {} / public static void main(String[] args) {}

•Example 클래스가 메모리에 로드된 후, 클래스의 main 메서드가 호출되면서 프로그램이 시작됨

   이때 main 메서드를 위한 메모리 공간이 호출 스택에 할당되어 main 메서드가 실행됨

2) Data1 d = new Data1();

Data1 클래스가 메모리에 로드된 후, Data1 타입의 참조 변수 d가 main 메서드의 지역 변수로 생성됨

new 연산자에 의해 Data1 클래스의 인스턴스가 생성된 후, Data1 인스턴스의 멤버 변수 x는 자료형의 기본값인 0으로 자동 초기화됨

대입 연산자에 의해 Data1 인스턴스 주소 0x100이 참조 변수 d에 저장되어 참조 변수 d로 Data1 인스턴스 멤버에 접근할 수 있게 됨

3) d.x = 10; 

대입 연산자에 의해 10이 d.x(main 메서드에서 참조 변수 d가 참조하고 있는 Data1 인스턴스의 멤버 변수 x)에 저장됨

4) System.out.println(d.x);

main 메서드에서 println 메서드를 호출한 상태로,

   main 메서드는 호출 스택에 대기 상태로 남고 println 메서드를 위한 메모리 공간이 호출 스택에 할당되어 d.x값인 10이 출력됨

실행이 종료된 println 메서드는 호출 스택에서 제거된 후, 자신을 호출한 main 메서드로 되돌아감

   이때 대기 상태였던 main 메서드는 println 메서드를 호출한 이후부터 실행을 재개함

 

 

5) change(d.x);

main 메서드에서 change 메서드를 호출한 상태로,

   main 메서드는 호출 스택에 대기 상태로 남고 change 메서드를 위한 메모리 공간이 호출 스택에 할당됨

change 메서드의 매개 변수로 값을 넘겨주는 기본형을 선언함에 따라, d.x에 저장된 값인 10이 change 메서드의 매개 변수 x로 복사됨

   이때 change 메서드는 Data1 인스턴스와 참조 변수로 연결되어 있지 않아 원본인 d.x값을 읽거나 변경할 수 없음

6) x = 123;

•대입 연산자에 의해 123이 change 메서드의 지역 변수 x에 저장됨

7) System.out.println(x);

change 메서드에서 println 메서드를 호출한 상태로, 

   change 메서드는 호출 스택에 대기 상태로 남고 println 메서드를 위한 메모리 공간이 호출 스택에 할당되어 x값인 123이 출력됨

•실행이 종료된 println 메서드는 호출 스택에서 제거된 후, 자신을 호출한 change 메서드로 되돌아감

   이때 대기 상태였던 change 메서드는 println 메서드를 호출한 이후부터 실행을 재개함

 

 

8) System.out.println(d.x);

•실행이 종료된 change 메서드는 호출 스택에서 제거된 후, 자신을 호출한 main 메서드로 되돌아감

   이때 대기 상태였던 main 메서드는 change 메서드를 호출한 이후부터 실행을 재개함

main 메서드에서 println 메서드를 호출한 상태로, 

   main 메서드는 호출 스택에 대기 상태로 남고 println 메서드를 위한 메모리 공간이 호출 스택에 할당되어 d.x값인 10이 출력됨

•실행이 종료된 println 메서드는 호출 스택에서 제거된 후, 자신을 호출한 main 메서드로 되돌아감

main 메서드에 더 이상 실행할 코드가 없으므로 main 메서드가 종료되고, 동시에 호출 스택 전체가 비워지면서 프로그램이 종료됨

24-2. 참조형 매개 변수 예제

📌 // 매개 변수가 참조형인 메서드 간의 호출 관계

package chap_06;

class Data2 {
    int x;
}

public class _24_Example2 {
    public static void main(String[] args) {
        Data2 d = new Data2();
        d.x = 10;
        System.out.println(d.x); // 10
        change(d); // 123
        System.out.println(d.x); // 123
    }

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

 

 

1) public class Example {} / public static void main(String[] args) {}

•Example 클래스가 메모리에 로드된 후, 클래스의 main 메서드가 호출되면서 프로그램이 시작됨

   이때 main 메서드를 위한 메모리 공간이 호출 스택에 할당되어 main 메서드가 실행됨

2) Data2 d = new Data2();

Data2 클래스가 메모리에 로드된 후, Data2 타입의 참조 변수 d가 main 메서드의 지역 변수로 생성됨

•new 연산자에 의해 Data2 클래스의 인스턴스가 생성된 후, Data2 인스턴스의 멤버 변수 x는 자료형의 기본값인 0으로 자동 초기화됨

대입 연산자에 의해 Data2 인스턴스 주소 0x100이 참조 변수 d에 저장되어 참조 변수 d로 Data2 인스턴스 멤버에 접근할 수 있게 됨

3) d.x = 10; 

대입 연산자에 의해 10이 d.x(main 메서드에서 참조 변수 d가 참조하고 있는 Data2 인스턴스의 멤버 변수 x)에 저장됨

4) System.out.println(d.x);

main 메서드에서 println 메서드를 호출한 상태로,

   main 메서드는 호출 스택에 대기 상태로 남고 println 메서드를 위한 메모리 공간이 호출 스택에 할당되어 d.x값인 10이 출력됨

실행이 종료된 println 메서드는 호출 스택에서 제거된 후, 자신을 호출한 main 메서드로 되돌아감

   이때 대기 상태였던 main 메서드는 println 메서드를 호출한 이후부터 실행을 재개함

 

 

5) change(d);

main 메서드에서 change 메서드를 호출한 상태로,

   main 메서드는 호출 스택에 대기 상태로 남고 change 메서드를 위한 메모리 공간이 호출 스택에 할당됨

change 메서드의 매개 변수로 객체의 주소를 넘겨주는 참조형을 선언함에 따라,

   참조 변수 d에 저장된 Data2 인스턴스 주소 0x100이 change 메서드의 매개 변수 d로 복사됨

change 메서드의 참조 변수 d가 main 메서드의 참조 변수 d와 같은 Data2 인스턴스를 참조하게 됨에 따라,

   change 메서드의 참조 변수 d 또한 Data2 인스턴스 멤버에 접근해 값을 읽거나 변경할 수 있게 됨

6) d.x = 123;

•대입 연산자에 의해 123이 d.x(change 메서드에서 참조 변수 d가 참조하고 있는 Data2 인스턴스의 멤버 변수 x)에 저장됨

7) System.out.println(d.x);

change 메서드에서 println 메서드를 호출한 상태로, 

   change 메서드는 호출 스택에 대기 상태로 남고 println 메서드를 위한 메모리 공간이 호출 스택에 할당되어

   d.x(change 메서드에서 참조 변수 d가 참조하고 있는 Data2 인스턴스의 멤버 변수 x)값인 123이 출력됨

•실행이 종료된 println 메서드는 호출 스택에서 제거된 후, 자신을 호출한 change 메서드로 되돌아감

   이때 대기 상태였던 change 메서드는 println 메서드를 호출한 이후부터 실행을 재개함

 

 

8) System.out.println(d.x);

•실행이 종료된 change 메서드는 호출 스택에서 제거된 후, 자신을 호출한 main 메서드로 되돌아감

   이때 대기 상태였던 main 메서드는 change 메서드를 호출한 이후부터 실행을 재개함

main 메서드에서 println 메서드를 호출한 상태로, 

   main 메서드는 호출 스택에 대기 상태로 남고 println 메서드를 위한 메모리 공간이 호출 스택에 할당되어 d.x값인 123이 출력됨

   이때 5)~6)의 과정으로 인해 change 메서드 작업이 종료된 후에도 d.x값이 123으로 변경되어 출력되는 점을 확인할 수 있음

실행이 종료된 println 메서드는 호출 스택에서 제거된 후, 자신을 호출한 main 메서드로 되돌아감

main 메서드에 더 이상 실행할 코드가 없으므로 main 메서드가 종료되고, 동시에 호출 스택 전체가 비워지면서 프로그램이 종료됨

 


Reference

[남궁성의 정석코딩] Java의 정석 기초편 강의

[도우출판] Java의 정석 기초편 / 기본편