TIL(Today I Learned)

C# 문법 기초, 새로 알게 된 사실과 느낀 점 - TIL#6

Najdorf 2023. 12. 29. 21:49
728x90

오늘부터는 본격적으로 C#을 다루는 것에

집중해서 수업을 받게 된다.

 

그런만큼 C#에 대해 처음 알게 되는 사실도 있었고

기존에 다른 프로그래밍 언어를 다룰 때 배웠던 개념들도

C#에서는 어떻게 표현하는 지 알 수 있었다.

 

<목차>

  • 1. Hello, World!
  • 2. 마법의 키워드 var
  • 3. 궁금했던 문법, 3항 연산자( ? : )
  • 4. 궁금증: Switch case 문과 If else문의 차이?
  • 5. 기타(foreach, 중첩반복문)

 

 

1. Hello, World!

 

항상 어떤 프로그래밍 언어를 배울 때

제일 처음에 시작하는 것은 당연히 Hello, world!를 콘솔 창에 띄우는 것부터다.

 

Hello, world! 를 콘솔 창에 띄우는 것을 보고

우리는 그 언어에 대해 첫인상을 받게 되고

대충 이럴 것이다 라는 추측을 하게 된다.

 

내가 처음 코딩에 입문하면서 배웠던 C언어의 Hello, world!는

#include <stdio.h>

int main(void) 
{
    printf("Hello, World!\n");
    return 0;
}

 

이와 같은 형태였다.

아마 Hello, world!를 떠올리게 된다면 가장 근본적이면서도 가장 유명한 형태인

C언어의 Hello, world!를 다들 떠올리게 될 것이다.

 

처음엔 단순히 'Hello, world!'라는 문장 하나를 화면에 띄우는 데

저렇게나 많이 써야한다고? 라는 생각이 들었지만

 

시간이 지나고 문법을 배운 뒤엔

모든 문장에는 다 기능이 있었다는 사실을 알게 됐다.

 

 

그러다, 어느 날은 Python의 Hello, world를 접하게 되었는데...

print("Hello, World!")

 

한 줄로 모든 표현이 끝나는 게 아니겠는가?

 

당장 어떤 걸 C언어의 #include 처럼 전처리를 할 필요도 없고,

변수또한 인터프리터가 타입을 추정한다고 하며,

세미콜론(;) 또한 각 문장의 끝에 추가할 필요도 없다는 사실을 알게 되었다.

 

굉장히 신선한 충격이었다.

 

그래서 Python을 배우기 시작했던 경험이 있는 가 하면...

 

section .data
hello_world     db      "Hello, world!", 0x0a
 
        section .text
        global _start
 
_start:
        mov rax, 4
        mov rbx, 1
        mov rcx, hello_world
        mov rdx, 14
        syscall
        mov rax, 1
        mov rbx, 0
        syscall

이렇게 복잡하고 읽기도 힘든 경우의 언어도 있다.

 

(이건 Assembly어라는 기계어와 1대 1 대응이 되는

저급(기계어와 가까운) 언어의 Hello, World! 예제이다.)

 

내가 굳이 C, Python, Assembly의 Hello, World! 예제를 들고 와서까지

주구장창 설명했던 건

 

그 만큼 프로그래밍 언어란 건

첫인상이 굉장히 중요하게 작용한다고 느꼈기 때문이다.

 

 

이는 내가 C#을 처음 접했을 때도 적용됐다.

 

using System;

namespace hello_world_ex
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, world!");
        }
    }
}

 

Assembly 까지는 아닌데...

분명한 건 기존에 자주 다루던 Python보다는 확실히 어려워 보였고

처음보는 키워드들도 많아서

 

저 Hello, World! 예제 하나만 보고

배우는 걸 시도하기조차 하지 않은 적이 굉장히 많다.

 

나는 지금 그걸 굉장히 후회하고 있다.

 

왜냐하면,

C# 10.0부터는...

Console.WriteLine("Hello, world!");

 

이렇게 한 줄만 적는 것도 지원을 하기 때문이다....!!

 

이 렇 게!!! 간단한 걸!!!!

계속 편안함에 취해서

배우기를 포기하고 있었다니...

 

 

이제와서 본격적으로 C# 문법을 배우는 입장에서,

C# 문법은 첫인상과는 달리 상당히 쉽고 직관적인 편에 속했다.

 

한 가지 확실히 Python과 차이를 느끼는 건,

실행 속도가 굉장히 빠르다는 것이다.

 

아직 코드를 몇 백 줄 적을 수준은 아니지만

VS와 VSCode의 환경 차이인지? 뭔지는 모르겠지만

분명 느껴지는 속도의 체감은 있기는 하다.

 

내가 전문가는 아니라 잘은 모르겠지만,

여타 C계열 언어들 (C, C++)이 그렇듯이

C# 또한 직접 변수 타입을 명시해서

변수 타입을 인터프리터가 추론하는 Python의 과정이 없어서 그런 것일지도 모르겠다.

 

 

2. 마법의 키워드 var

 

참고로 C#에도 비슷한 기능이 있다.

바로 'var'이라는 마법의 키워드 인데,

 

int, float, string 어떤 자료형에 관계없이

그냥 변수를 선언함과 동시에 초기화만 해주면,

초기화 된 값의 자료형을 추정해서 할당해준다.

var num = 10;         // int 자료형으로 결정됨
var name = "kero";   // string 자료형으로 결정됨
var pi = 3.141592;    // double 자료형으로 결정됨

 

매우 편리한 기능이지만,

자료형을 명시해놓는 것이 메모리 관리나 코드 가독성이나

C#의 장점을 끌어올리기엔 10000배 이상 유리할 것이라고 생각한다.

 

다만, var이 쓰이는 경우는

보통 남의 코드를 들여와서 적용하는데

 

도통 이 변수의 타입이 어떤 형인지 모르겠는 경우,

그럴 때 변수 타입을 고민하는 시간을 줄여줄 수 있다는데 의의를 둘 수 있다.

 

그러니 var 키워드를 사용할 땐,

꼭 필요할 때만 사용하도록 하자...

 

 

3. 궁금했던 문법, 3항 연산자( ? : )

 

Unity로 예제를 만들고

문제가 생길 때마다 구글링하며 다른 코드를 참고할 때,

C# 문법에 있어 가장 궁금했던 것이 있었다.

 

바로, 3항 연산자인데...

'C# ?: 연산자', 'C# 특수 연산자' 따위로 구글링을 해봐도

돌아오는 건 null 값을 활용한 무슨 이상한 ??> 연산자 밖에 나오지 않았다.

 

의외로 문법과 개념 자체는 간단하고

오늘 궁금증이 해결돼서 상당히 행복하다.

 

형태는 다음과 같다.

(조건식) ? 참일 경우 값 : 거짓일 경우 값;

 

진짜 딱 if문이나 함수에 파라미터로 넣기 좋은

한 줄 짜리 가성비 if문이라고 생각했다.

 

 

4. 궁금증: Switch case 문과 If else문의 차이?

 

문득, C# 조건식을 공부하면서 들었던 의문이 있다.

 

어떤 한 변수에 대해서, 단순히 값만 비교해서 나누는 거라면,

굳이 번거롭게 조건마다 break;를 써가며 switch 문을 쓰지 않고

if else만 써도 될텐데, 어떤 차이가 있어서 만들었을까?

 

그래서 궁금증을 해결하기 위해 구글링을 하며 알게 된 사실이 있다.

 

switch case문과 if else문은 기본적으로

속도메모리 성능 관리에 있어서 차이가 있다.

 

크게 쓰지 않는 이상은 별 차이가 없지만,

switch 문은 기본적으로 구문을 점프를 해서 구동한다는 특징이 있고

무엇보다도 '가독성'이 뛰어나다는 점이 있다.

 

그 외에도 switch문의 분기를 단순 숫자값 비교로 쓴다면

메모리 관리의 효율을 위해 내림차순으로 정렬한다는 둥

 

아직은 최적화에 신경 쓸 레벨이 난 아니기에

내가 참고 했던 블로그의 글을 읽어보는 것이 나중에도 도움이 될 것 같다.

https://blog.naver.com/tutorials_korea/221589317912

 

C# switch문 - if vs switch

C# switch문 이번에는 switch문을 알아보겠습니다. if문과 함께 많이 사용되는 구문중에 하나인데 if문과 ...

blog.naver.com

 

 

5. 기타(foreach, 중첩반복문)

 

기타 흥미롭게 여겼던 C#의 문법들이다.

 

첫 번째로, foreach문의 경우엔

다음과 같은 형태로 사용이 되는데,

foreach (자료형 변수 in 배열 또는 컬렉션)
{
    // 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
}

 

이게, Python의 기본적인 for 문의 사용 형태랑 매우 비슷해서 넣어봤다.

for i in range(5):
	print("{i+1}번째 줄입니다.")

 

Python에서 range()라는 함수는 파라미터의 값만큼의 인덱스를 가지는 리스트를 생성하는 함수인데,

그 인덱스에 든 모든 요소에 대해 반복적으로 실행하는 것이 for문이니

 

C#의 foreach와 매우 비슷하다(사실 거의 같다)라고 생각하게 되었다.

 

 

그리고 중첩반복문의 경우는,

// 2차원 중첩반복문의 예제
for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 3; j++)
    {
        Console.WriteLine("i: {0}, j: {1}", i, j);
    }
}

 

다른 코드에서도 많이 쓰이지만,

약간 물리학에서 차원을 나타낼 때 단위벡터의 기호로 

i, j, k 를 주로 사용하는데,

 

이게 매우 친근해서 그냥 넣어봤다.

별 다른 의미는 없다.

 

그리고!! Visual Studio에서 들여쓰기 단축키

Ctrl + K, F다 !!

 

 

 

 

주말에는 다가오는 2024년을 편안히 맞이하기 위해서

공부도 쉬면서 해야겠다...

728x90