강께르의 개발일지
[문제 풀기] 변수에 관하여 본문
1. C/C++ 배열과 C# 배열 비교
배열은 동일한 데이터형이 연속적으로 메모리에 저장되어 있는 자료구조를 의미한다.
C++에서는 이를 취급할 때, 포인터를 이용하여 다룬다. 배열의 이름은 포인터로 배열의 첫 번째 주소를 의미하고 임의의 인덱스를 접근할 때는 선언한 데이터형의 바이트 크기만큼 인덱스 값을 곱해 첫 번째 주소값에 더해줘 접근하는 등 포인터와 밀접한 관련이 있다.
C#에서의 배열은 포인터를 주로 다루지 않기에 배열은 하나의 클래스로 구현되어있다. 클래스로서 여러 메소드들을 지니고 있고 사용할 수 있다.
2. 피보나치 재귀함수 구현 + 그림판 콜스택 설명
static int Fibo(int x)
{
if (x == 1)
return 1;
else if (x == 2)
return 1;
else if (x == 0)
return 0;
return Fibo(x - 1) + Fibo(x - 2);
}
static void Main(string[] args)
{
string str = Console.ReadLine();
Console.Write(Fibo(Int32.Parse(str)));
}
}
3. C++에서 포인터 매개변수 왜 콜바이 밸류냐?
C++에서 매개변수로 포인터를 넘길 때, 포인터가 갖고있는 주소값을 넘긴다. 이 때, 매개변수는 할당받은 주소값을 가지고 데이터에 접근하여 읽고 쓰는 것이다.
즉, 스택 영역에 메모리를 할당받아 주소값을 저장하여 사용한다는 것이다. 만약 메소드 내에서 스택 영역의 메모리에 다른 주소값을 넣는다고 하더라도 메소드를 호출한 함수의 포인터에 아무런 영향을 주지 않는다.
4. 콜 바이 밸류, 콜 바이 레퍼런스 차이점을 설명하세요.
콜 바이 벨류는 매개변수를 전달받으면 매개변수로 받은 데이터를 메모리에 저장하기 위해 메모리의 스택 영역에 메모리를 할당받아 데이터를 저장한다. 메소드 내에서 생명주기를 가지고 있는 동안 할당받은 메모리의 값을 읽고 쓰고 메소드 끝나면 그 스택 영역의 메모리를 해제하기에 그 데이터 또한 소멸된다.
콜 바이 레퍼런스는 매개변수로 전달받으면 스택 영역에 데이터를 저장하기 위한 처리를 거치지 않으며 매개변수의 이름으로 전달받은 데이터를 참조받을 수 있도록 공유하는 것이다. 그렇기에 메소드 내에서 읽고 쓰는 것은 메소드 내의 주소값 따위로 접근하는 것이 아니라 접근하고자 하는 데이터의 또 다른 이름인 매개변수로 접근하는 것이기에 변화에 영향을 준다.