이번 겨울 방학에 유니티를 활용한 프로젝트를 하나 해보고자 해서 일단 C#문법을 간단히 한번 훑었다.
사실 유니티를 사용하여 뭔가 해보자라고 마음 먹기 전까지 C#배울 일은 없겠거니 했지만 그게 지금이 되었다.
학년이 올라가면서 C++과 자바를 사용할 수 있게 되었고, 따라서 C#을 배우면서 언어간의 차이를 느끼면서
훑는 느낌으로 배웠고 따라서 이번 글에서는 C++와 자바를 알고 있다는 가정하에 내가 느낀 C#만의 차이점이나
문법적인 차이들을 정리해보려고 한다.
1) Char의 크기
먼저 C#에서는 char형의 크기가 2바이트다. 이는 유니코드 방식을 사용하기 때문이다. 사실 중요한 것은 아니나 C#으로 알고리즘 문제를 풀거나 할때 메모리크기를 고려해야 할땐 신경써야 할지도 모르겠다.
Console.WriteLine(sizeof(char));
비주얼 스튜디오에서 확인해보면 2바이트가 찍힌다.
2) ref, out 키워드
먼저 ref는 C++의 &과 같은 그 역할이 맞다. reference값을 parameter로 넘기고자 할 때 사용한다. out도 비슷한 역할을 하나 조금 다르다. out은 함수의 parameter들 중에 결과 값을 받아오는 인자 라는 것을 명시해주는 역할을 하며 ref와 동일하게 call by reference이다. ref와 out를 사용할 때 몇가지 주의할 점은 아래와 같다.
먼저 out으로 지정된 parameter는 함수내에서 값이 결정되어야 한다. 그렇지 않으면 오류가 난다.
이건 문법적인 부분이라 이유가 따로 있는것은 아니다.
그리고 함수를 호출하고자 하는 경우 위와 같이 ref와 out 키워드를 명시적으로 해줘야 한다.
C++같은 경우 &을 함수 호출 시에 붙이지 않고 함수 선언 부에만 &를 붙여서 이것은 reference 값임을 명시해 주는데 이런 점이 좀 다르다고 느꼈다.
3) 깊은 복사와 얕은 복사
자바를 배우면서 정말 헷갈렸던 부분이다. 클래스, 객체의 복사 부분인데 이는 C#과 자바가 동일했다. 그 점은 다행이었다고 생각한다. 또한 마찬가지로 C#은 자바와 같이 GC(garbage collector)가 존재해서 C++처럼 사용자가 delete 키워드를 통해 메모리를 해제 해주지 않아도 된다.
또한 깊은 복사와 얕은 복사 부분이 자바와 동일하다고 했는데, ' = ' 연산자를 사용하여 객체를 복사하면 기본적으로 reference를 공유하는 개념과 같아서 얕은 복사가 된다. 따라서 값이 완전히 같은 객체를 만드는 깊은 복사를 하고 싶은 경우에는 별도의 메소드를 만들어 깊은 복사를 구현하는 것이 올바르다.
4) 상속과 base 키워드
객체의 상속부분은 C++와 비슷한 문법을 띈다.
public class Parents
{
public String name;
public Parents(String name)
{
this.name = name;
Console.WriteLine("Parents constructor call");
}
}
public class Child : Parents
{
public Child(String name) : base(name)
{
Console.WriteLine("Child Constructor call");
}
public void Introduce()
{
Console.WriteLine("My name is...{0}", name);
}
}
위의 예제 코드를 보면 알 수 있듯이 부모를 상속받는 자식 클래스의 선언은 C++와 거의 유사하다. 주목해야 할 것은 base라는 키워드 인데, 이는 자바의 super 키워드와 동일한 역할을 한다.
위의 코드에서 자식 클래스의 생성자에서 base(name)이라고 선언된 부분이 보이는데, 이는 자식 클래스를 생성할 때, String name을 받고, 그 name을 부모 클래스의 생성자로 넘겨서 부모의 생성자를 먼저 호출하겠다는 뜻이 된다. 자바에서도 부모를 상속받은 자식 클래스 생성시, 부모 클래스의 생성자가 먼저 호출 되는데, C#에서는 이를 좀 더 명시적으로 부모의 어떤 생성자를 호출 할 것인지를 자식의 생성자 코드에서 나타내 준다고 느꼈다.
static void Main(string[] args)
{
Child A = new Child("Bob");
A.Introduce();
}
앞서 설명한 내용이 맞는지 보기 위해 클래스를 생성하는 코드를 작성 후 빌드해보면,
부모 -> 자식 생성자 호출 후 Bob씨가 자기소개를 하는것을 볼 수 있다.
5) delegate 키워드
delegate 키워드는 한마디로 C/C++의 함수 포인터와 같다. 정말 말 그대로 이며 C#에서는 자바처럼
포인터를 직접적으로 사용하지 않기 때문에 따로 delegate라는 키워드를 사용한다.
정리
이번 글에서는 C#을 배우면서 내가 느꼈던 다른 언어와 달랐던 점을 위주로 작성하였다. 글 하나에 언어의 모든 것을 담는다는 건 당연히 말이 안되고 C#에 대해서 배우면서 새로 알게 되는 내용은 계속 정리해 나가겠다.