[C#] 내일배움캠프 사전캠프 - C# 사전 문법 기초 (is, as, Convert, Parse, TryParse, 접근제한자)
[Stage3. 각자 속도에 맞춰 나아가기]
Stage3에서는 C# 기초를 다져볼 수 있다. 걷기반과 달리기 반으로 나눠서 단계별 학습이 권장된다.
나는 C#을 배우는 것은 처음이기 때문에 걷기반부터 시작해서 달리기반까지 학습할 계획이다. 다만 현재 나에게 가장 친숙한 언어는 C++이기 때문에 C++과 비교하며 받아들여지는 경향이 있다.
우선 C# 사전 문법 기초 문서를 공부한 다음에 걷기반의 연습문제를 풀면 될 것 같다.
C# 사전 문법 기초
내일배움캠프에서 주는 C# 문법 기초 문서를 토대로 쭉 읽어보았다. 생각했던 것보다는 C++의 문법과 비슷해서 다행이라고 생각했다. 이번 주제에서는 C++과 달라서 새롭게 느껴지는 것들만 위주로 정리해보려고 한다. (쓰면서 추가하다보니 C++과의 차이나는 점이 많은 것 같기도 하다.)
캐스팅
기초 자료형은 C++과 동일하다. 캐스팅도 암시적, 명시적 캐스팅은 동일하게 적용되지만, 다른 점이 눈에 띄어 문서 외 내용을 보충하여 정리했다.
C#의 is, as 키워드는 객체 간의 안전한 캐스팅을 위해 사용된다.
is
타입 확인에 사용되며, 객체가 특정 타입인지의 여부를 bool 값으로 반환한다.
예시 코드를 작성해보니 가독성도 좋고, 키워드 자체에서 의미 전달도 잘되는 키워드 네이밍인 것 같다.
string str = "Hello";
if (str is string)
{
Console.WriteLine("str은 문자열입니다."); // 출력
}
as
as 키워드의 예시 코드를 작성하던 중 새로운 것을 알게 되었다.
string을 int로 변환하는 코드를 작성하니 컴파일 에러가 떴다. as 키워드는 참조 타입(heap 영역에 생기는 데이터들)에서만 사용할 수 있다. (C# 에서는 int num = new num(); 으로 선언해도 num이 값타입으로서 stack영역에 생긴다.)
그리고 C#에서는 직접 포인터를 사용하는 것을 unsafe라는 블록 안에서 쓸 수는 있지만 권장하지 않는다. C# 도 가비지 컬렉터로 메모리를 관리해주기 때문에 언리얼에서와 마찬가지로 직접 포인터를 생성하는 것을 권장하지 않는다.
...
아래가 ChatGPT가 제시한 as 키워드 사용의 옳은 예시이다.
object obj = "Hello, World!";
string str = obj as string;
if (str != null)
{
Console.WriteLine($"obj는 문자열이며, 값은 {str}입니다."); // 출력
}
else
{
Console.WriteLine("obj는 문자열로 변환할 수 없습니다.");
}
as 키워드 예시에 object 라는 타입의 객체가 있다. 예시로 쓰인 사용자 정의 클래스를 의미하는 줄 알았는데, object 클래스를 만들지 않아도 컴파일 오류가 나지 않았다. f12로 object 클래스의 정의로 들어가보니 System namespace에 묶여있었다. 알아보니 C#의 모든 데이터 타입의 최상위 클래스이다. 모든 데이터 타입은 object에서 상속받는 것이다.!!
그 외 형변환
C++에서도 std의 to_string() 함수를 사용할 수 있듯이 C#에도 다양한 변환 함수가 있다.
- 다른 자료형 -> 문자
int x = 10;
string xStr = x.ToString(); // "10"
float y = 10.5f;
string yStr = y.ToString(); // "10.5"
bool myBool = true;
string boolStr = myBool.ToString(); // "true"
- 문자 -> 다른 자료형
대표적인 3가지 방법
* Convert 클래스 이용
* Parse() 함수 이용
* TryParse() 함수 이용
1. Convert
string iStr = "10";
int x;
x = Convert.ToInt32(iStr); // x : 10
string bStr = "true";
bool b;
b = Convert.ToBoolean(bStr); // b : true
2. Parse
string iStr = "10";
int x;
x = int.Parse(iStr); // x : 10
string bStr = "true";
bool b;
b = bool.Parse(bStr); // b : true
3. TryParse
Convert와 Parse 함수를 이용하면 변환할 수 없는 값을 변환했을 때 문제가 생긴다.
이런 상황을 대처하기 위한 TryParse 가 있다. 여기서도 out 이라는 새로운 개념을 보게 되었다.
string iStr = "10";
int x;
int.TryParse(iStr, out x); // x : 10
string bStr = "true";
bool b;
bool.TryParse(bStr, out b); // b : true
out은 C#에서 메서드가 호출자에게 여러 값을 반환할 때 사용하는 키워드라고 한다. TryParese 에서 변환된 값을 반환하기 위해 사용된다.
TryParse 은 캐스팅의 성공 여부를 반환한다.
string bStr = "testtest"; // bool 로 변환 할 수 없으니 실패
bool b;
bool isSuccess;
isSuccess = bool.TryParse(bStr, out b); // isSuccess : false
제어문
제어문은 C++과 거의 유사하다. 다른 점은 C++의 범위 기반 for 문이 C#에서는 foreach 문인 정도!?
초기값
C#은 초기값을 설정하지 않으면 각 타입의 기본값으로 초기화된다.
접근제한자
C# 에는 internal 이라는 접근제한자가 추가로 있다. 같은 프로젝트에서만 접근 가능하다고 한다. (같은 어셈블리)
그 외 public, private, protected는 동일하다.
✏️ 개인적인 후기
오늘도 개인적인 경험과 관련해서 느낀 점이 있어 적어보았습니다.
게임 개발을 공부한 이후로 C++을 위주로 사용하고, 언리얼 엔진을 배워본 입장에서 C# 이 엔진같다는 생각이 들었습니다. C++과 유사하지만 엔진처럼 기능을 추가해둔 것 같기 때문에 그렇게 느껴집니다. 특히 메모리 관리를 알아서 해주고, 최상단 클래스가 존재한다는 점에서 언리얼과 유사하게 느껴진 것 같습니다. C# 의 첫인상이 좋아서 다행입니다. 원래도 Unity 트랙이 기대됐지만, C# 에 대해 조금 알게 되고 나니 앞으로가 더 기대되는 것 같기도!?