본문 바로가기

java study

#19 객체 지향 언어(OOP) 4

※ 시작하기 앞서  java study 카테고리 자료는 YOUTUBE에 남궁성 강사님의 자바의 정석 영상을 가지고
    공부한 내용을 정리한 것이며 상업적 목적은 전혀 없음을 알립니다.

 

 

호출 스택 (call stack)

 

스택(stack) : 밑이 막힌 상자. 위에 차곡차곡 쌓인다. 모든 프로그래밍 언어에서 공통적이다.

 

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

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

상자에서 무언가를 넣을 때 꺼낼 때를 생각하면 알기 쉽다.

 

기본형 매개변수

 

기본형 매개변수와 참조형 매개변수의 차이

 

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

 

 

Ex)

class Data { int x; }

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

Console

main() : x = 10
change() : x = 1000
After change(d.x)
main() : x = 10

기본형 매개 변수 실행 과정

예제가 실행되는 과정

 

1. 객체를 생성하여 참조 변수 d에 객체의 주소 값을 저장한다.

2. 참조 변수 d가 가리키는 객체의 x값에 10을 저장한다.

3.change 메서드를 호출한다. 

4.change 메서드에 d.x값이 대입이 된다.

5.change 메서드에 지역변수에 1000을 저장한다.

6.change 메서드를 사용하고 할 일을 다한 change메서드는 호출 스택에서 사라진다.

   지역 변수(lv)도 change 메서드와 같이 사라진다.

7. 마지막 문장을 실행하고 더 이상 실행할 문장이 없는 main 메서드는 프로그램을 종료한다.

   main 메서드도 스택에서 제거되고 스택은 완전히 비어진다.

 

 

참조형 매개변수

 

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

 

class Data2 { int x; }

class Ex6_7 {
	public static void main(String[] args) {
		Data2 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);
	}
}

Console

main() : x = 10
change() : x = 1000
After change(d)
main() : x = 1000

 

참조형 매개 변수 실행 과정

위 예제에서 참조형 매개변수는 기본형 매개변수와 달리 change 메서드에 참조 변수 d 가 가리키는 x의 주소 값을 

복사해서 change(Data2 d) 참조형 매개변수에 줄 수 있다. 

그로서 lv(지역변수)에 값을 변경하여 return 해줄 수 있다.

 

이렇듯 기본형 매개변수는 읽기만 가능하지만 참조형 매개변수는 읽고&쓰기가 가능하다.

 

 

참조형 반환타입

 

Ex)

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;   // 복사한 객체의 주소를 반환한다.
	}
}

Console

d.x =10
d2.x=10

 

예제 Ex6-8 진행 순서

1. d.x = 10; d가 가리키는 객체 x값에 10을 저장한다. ( 객체 주소 0x100)

2. Data3 d2 = copy(d); copy 메서드에 변수는 참조형 매개 변수이기에 객체의 주소 값을 넣어준다.

3. Data3 tmp = new Data3(); 새로운 객체 tmp를 생성한다. (객체 주소 0x200)

4. tmp.x = d.x;  d.x값을 tmp.x에 복사해 넣는다.

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

6. Data3 d2 = copy(d) 반환한 주소를 d2에 대입된다. 그로써 d2는 객체 tmp주소 0x200를 가진다.

 

※주의  -참조형 반환 타입이 객체 주소를 받는 변수 타입과 일치해야 한다.

 

 

 

 

 

▶참고자료  https://youtu.be/oJlCC1DutbA

'java study' 카테고리의 다른 글

#21 상속(Inheritance)  (0) 2022.06.11
#20 객체 지향 언어(OOP) 5  (0) 2022.06.11
#18 객체 지향 언어(OOP) 3  (0) 2022.06.07
#17 객체 지향 언어(OOP) 2  (0) 2022.06.07
#16 객체 지향 언어(OOP)  (0) 2022.06.06