오늘부터는 본격적으로 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
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년을 편안히 맞이하기 위해서
공부도 쉬면서 해야겠다...
'TIL(Today I Learned)' 카테고리의 다른 글
C# 기초 문법 나머지, 텍스트 RPG 게임 만들기 - TIL#8 (1) (0) | 2024.01.03 |
---|---|
C# 문법 기초, 콘솔 숫자야구 게임 만들기 - TIL#7 (2) | 2024.01.02 |
카드 찾기 게임 종합 정리와 기타 알게 된 사실들 - TIL#5 (0) | 2023.12.28 |
카드 섞는 기능 구현하기 - TIL#4 (0) | 2023.12.27 |
Unity로 체스 만들기 외 - TIL#3 (0) | 2023.12.26 |