2019년 2월 22일 금요일

[서울대 컴퓨터의 개념 및 실습 PA 3] Main 함수와 Function 관련 메모리


Programming Assignment #3


*본 보고서는 이미 제출된 보고서로 표절 시 발각될 확률이 높습니다. 또한 오류가 있을 가능성 또한 있으니 주의하고 참고하시길 바랍니다.


<제목 차례>

I. Problem
II. Answer
1. 주석 1
2. 주석 2
3. 주석 3
4. 주석 4
5. 주석 5
6. 주석 6
7. 주석 7
8. 주석 8
9. 주석 9
10. 주석 10
III. Discussion
<표 차례>
표 1 주석 1의 Main 함수 관련 메모리
표 2 주석 1의 Function 관련 메모리
표 3 주석 2의 Main 함수 관련 메모리
표 4 주석 2의 Function 관련 메모리
표 5 주석 3의 Main 함수 관련 메모리
표 6 주석 3의 Function 관련 메모리
표 7 주석 4의 Main 함수 관련 메모리
표 8 주석 4의 Function 관련 메모리
표 9 주석 5의 Main 함수 관련 메모리
표 10 주석 5의 Function 관련 메모리
표 11 주석 6의 Main 함수 관련 메모리
표 12 주석 6의 Function 관련 메모리
표 13 주석 7의 Main 함수 관련 메모리
표 14 주석 7의 Function 관련 메모리
표 15 주석 8의 Main 함수 관련 메모리
표 16 주석 8의 Function 관련 메모리
표 17 주석 9의 Main 함수 관련 메모리
표 18 주석 9의 Function 관련 메모리
표 19 주석 10의 Main 함수 관련 메모리
표 20 주석 10의 Function 관련 메모리
<그림 차례>
그림 1 전체 Code
I. Problem
다음 Code를 실행시켰을 때, 메모리의 저장 상태가 주석 번호 별로 어떻게 변화하는지 기술하여라. 참고로 주석 번호의 순서가 주어진 과제물과 다르게 붙어있다.
static void Main(string[] args)
{
int x, y, z;
x = 3; y = 4; z = 0;
//1
  z = x + y;
   //2
x = 4; y = 3; z = 0;
addCallByValue(x, y, z);
  //3
x = 5; y = 1; z = 0;
z = addCallByReturn(x, y);
//5
x = 8; y = 6; z = 0;
addCallByRef(x, y, ref z);
//7
x = 1; y = 2; z = 0;
addCallByOut(x, y, out z);
//9
}
static void addCallByValue(int a, int b, int c)
{
  c = a + b;
  //4
}
static int addCallByReturn(int a, int b)
{
  int c = a + b;
  //6
  return c;
}
static void addCallByRef(int a, int b, ref int c)
{
  c = a + b;
  //8
}
static void addCallByOut(int a, int b, out int c)
{
  c = a + b;
  //10
}

그림 1 전체 Code
메모리가 어떻게 저장되는지 Main 함수 부분의 메모리와 외부 함수 부분의 메모리를 나누어 표를 그려 설명해보도록 한다.
II. Answer
1. 주석 1
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z
int
0x0003
표 1 주석 1의 Main 함수 관련 메모리
Variable
Type
Address
Data


0xAA01



0xAA02



0xAA03

표 2 주석 1의 Function 관련 메모리
변수가 선언되고 입력이 이루어진다. Main 함수밖에 선언되지 않았으므로 Function 메모리에는 아무것도 저장되지 않은 상태이다.
2. 주석 2
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z
int
0x0003
표 3 주석 2의 Main 함수 관련 메모리
Variable
Type
Address
Data


0xAA01



0xAA02



0xAA03

표 4 주석 2의 Function 관련 메모리
z의 메모리에 x와 y를 더한 값이 저장된다. 아직도 Main 함수밖에 선언되지 않았으므로 Function 메모리에는 아무것도 없다.
3. 주석 3
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z
int
0x0003
표 5 주석 3의 Main 함수 관련 메모리


Variable
Type
Address
Data
a
int
0xAA01
b
int
0xAA02
c
int
0xAA03
표 6 주석 3의 Function 관련 메모리
Main 함수에서 변수 x, y, z에 새로운 값을 입력하였고, 그 입력된 값이 선언된 Function의 변수 a, b, c에 입력되었다.
4. 주석 4
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z
int
0x0003
표 7 주석 4의 Main 함수 관련 메모리
Variable
Type
Address
Data
a
int
0xAA01
b
int
0xAA02
c
int
0xAA03
표 8 주석 4의 Function 관련 메모리
Function 내부의 변수 c에는 a와 b를 더한 값이 저장되었다. 하지만 c의 변경은 Main 함수의 z 값에 아무런 영향도 끼치지 못하였다.
5. 주석 5
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z
int
0x0003
표 9 주석 5의 Main 함수 관련 메모리
Variable
Type
Address
Data
a
int
0xAA01
b
int
0xAA02
c
int
0xAA03
표 10 주석 5의 Function 관련 메모리
Main 함수에서 변수 x, y, z에 새로운 값을 입력하였고, 그 입력된 값이 선언된 Function의 변수 a, b, c에 입력되었다.



6. 주석 6
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z
int
0x0003
표 11 주석 6의 Main 함수 관련 메모리
Variable
Type
Address
Data
a
int
0xAA01
b
int
0xAA02
c
int
0xAA03
표 12 주석 6의 Function 관련 메모리
Function에서 c에 a와 b를 더한 값을 저장하였고, 저장된 c 값을 Main 함수에 리턴하였다. 리턴한 값을 Main 함수에서 z의 값으로 집어넣었고, z에는 결과적으로 x와 y를 더한 값이 저장되게 된다.
7. 주석 7
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z = c
int
0x0003
표 13 주석 7의 Main 함수 관련 메모리
Variable
Type
Address
Data
a
int
0xAA01
b
int
0xAA02


0xAA03

표 14 주석 7의 Function 관련 메모리
Main 함수에서 x, y, z에 새로운 값을 집어넣었고, 그 입력된 값이 변수 a, b에는 x와 y의 값이 저장되었다. 반면 c는 z의 메모리 주소 값을 넘겨 받고, c와 z가 같은 것처럼 행동하게 된다. 하지만, z의 값이 미리 할당되어 있지 않은 상태에서 참조하면 오류를 일으킨다.
8. 주석 8
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z = c
int
0x0003
표 15 주석 8의 Main 함수 관련 메모리



Variable
Type
Address
Data
a
int
0xAA01
b
int
0xAA02


0xAA03

표 16 주석 8의 Function 관련 메모리
Function에서 c에 a와 b를 더한 값을 저장하는 동시에, 같은 메모리 주소에 상주하는 z에도 그 값이 입력된다.
9. 주석 9
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z
int
0x0003
표 17 주석 9의 Main 관련 메모리
Variable
Type
Address
Data
a
int
0xAA01
b
int
0xAA02
c
int
0xAA03
표 18 주석 9의 Function 관련 메모리
Main 함수에서 변수 x, y, z에 새로운 값을 입력하였고, 그 입력된 값이 선언된 Function의 변수 a, b, c에 입력되었다.
10. 주석 10
Variable
Type
Address
Data
x
int
0x0001
y
int
0x0002
z=c
int
0x0003
표 19 주석 10의 Main 관련 메모리
Variable
Type
Address
Data
a
int
0xAA01
b
int
0xAA02




표 20 주석 10의 Function 관련 메모리
Function 함수에서 c에 a와 b를 더한 값을 집어넣었다. 참조 매개 변수이므로 ref와 비슷하게 움직이나, z의 값이 미리 할당되어 있지 않아도 괜찮다는 특징이 있다. 다만, c의 값이 변경되지 않으면 오류를 일으킨다.


III. Discussion
외부 함수에서 계산한 결과를 Main 함수에서 이용하는 방법을 다방면으로 살펴보았다. 메모리 한계가 얼마나 되느냐에 따라서 이런 방법을 바꾸어 가며 이용할 수 있을 거라고 생각이 되었다. 그 방법에 대해서는 앞으로의 활동에서 배워보고 싶다.