검색 팁: MSDN C# <찾으려는 키워드>
중괄호: "블록범위"
개인적으로 GIT (private) 에 올리며 스터디 코드를 관리하려고 했다.
따라서 프로젝트를 별도로 생성하지 않고 GIT 에 repository 를 먼저 생성하였다.
기존에 VS 2022 가 설치되어 있어 그대로 사용하였다. 설치된 모듈을 확인해보니 .NET 이 추가되어있지 않아 추가 설치를 진행하였다.
아래와 같이 코드를 만들어 실행하려고 했다. 그런데, F5 를 눌러도 실행이 되지 않았다.
결과적으로는 IDE 에서 어떤 빌더로 컴파일 및 실행을 해야 할지 선택되지 않아 발생한 문제이다.
IDE 에서 이를 설정하기 위해 여러 방면으로 검색하였지만 제대로 나오지 않았다.
따라서 Console 을 띄워 CLI 를 통한 실행을 진행하게 되었다.
실행 가능한 CLI 는
$ dotnet run <실행파일명>.cs
# run 001_helloworld.cs
Hello world
=====================
# run 002_variable.cs
42
66
Hello world
=====================
# run 003_helloworld.cs
Hello world
Nope Still here!
=====================
너무 불편하여 결국 교육 가이드대로 새 프로젝트를 만들었다 (시무룩)
CLI 사용이 딱히 불편하지는 않지만, 앞으로 교육을 진행하며 이 부분 때문에 문제가 발생하여
따라가기 어려운 상황이 나오면 안될 것 같다는 판단이다.
주석은 // 나 /* */ 를 통해 넣을 수 있다.
주석은 실제 코드에는 아무런 영향을 주지 않는다.
만든 함수나 Logic 에 대해서는 되도록 주석을 남기는 것이 보통이다.
다만, 배보다 배꼽이 커지면 본인이 만든 함수의 기능에 대해 생각해봐야 한다.
자주 사용하는 것은 \n 과 \t
기능들은 보통 namespace 로 묶여 있다. 일종의 카테고리로 봐도 무방하다.
해당 기능을 사용해야 할 경우 using 을 이용하여 불러올 수 있다.
기본 예제에는 using System;이 그 예로 볼 수 있다.
출력 자리 표기.
Python 에서 문자열 처리에서 많이 해본 방식이다.
using System;
namespace _20251209
{
internal class Program
{
static void Main(string[] args)
{// 블록 시작
Console.WriteLine("Press any key to continue...");
Console.Write("Byounghee Chae");
Console.WriteLine(" is SmartBear.");
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Welcome to C# Programming!");
/*
* 이것은 Multiline 주석입니다.
* 알겠습니꽈?
*/
Console.WriteLine("1\n2");
Console.WriteLine("나는 \"개발자\"다");
Console.WriteLine("\tTab 1개");
Console.WriteLine("\t\tTab 2개");
Console.WriteLine("\t\t\tTab 3개");
Console.WriteLine("First pos {0}는 무도의 {0}, second pos {1}", "무야호", "끼야호");
}// 블록 끝
}
}
Press any key to continue...
Byounghee Chae is SmartBear.
Welcome to C# Programming!
1
2
나는 "개발자"다
Tab 1개
Tab 2개
Tab 3개
First pos 무야호는 무도의 무야호, second pos 끼야호
값이 변경되지 않아야 하는 값. 선언시 초기화를 같이 진행.
ex) 원주율 등
using System;
namespace _20251209
{
internal class Program
{
static void Main(string[] args)
{// 블록 시작
int a = 46;
int b;
b = 10;
float n = 3.14f;
string str = "Hello, World!";
Console.WriteLine("Integer a value: " + a);
Console.WriteLine("Integer b value: " + b);
Console.WriteLine("Float n value: " + n);
Console.WriteLine("String str value: " + str);
Console.WriteLine("Size of int: " + sizeof(int) + " bytes");
Console.WriteLine("Size of float: " + sizeof(float) + " bytes");
Console.WriteLine("Size of double: " + sizeof(double) + " bytes");
Console.WriteLine("Size of char: " + sizeof(char) + " bytes");
Console.WriteLine("Size of bool: " + sizeof(bool) + " bytes");
// 변수명은 유의미한 단어로 하는게 좋다.
// 변수명으로 예약어를 사용할 수 없다. ex) for, while, as, ...
Console.WriteLine("integer a value: " + a);
a = 20;
Console.WriteLine("integer a value: " + a);
const int c = 7;
// c = 10; 상수는 변경이 되지 않음. 실행시 오류 발생.
Console.WriteLine("constant c value: " + c);
}// 블록 끝
}
}
Integer a value: 46
Integer b value: 10
Float n value: 3.14
Char v value: A
String str value: Hello, World!
Size of int: 4 bytes
Size of float: 4 bytes
Size of double: 8 bytes
Size of char: 2 bytes
Size of bool: 1 bytes
integer a value: 46
integer a value: 20
constant c value: 7
20 10 3.14 Hello, World!
20 10 3.14 Hello, World!
string + string 보다 $"string{string}" 이 더 연산이 빠르다?
참조 타입의 자료형은 실제 값을 별도의 장소에 저장하고 해당 값을 갖고 있는 메모리를 "참조"하는 형태로 존재한다.
string name = "Chae";
string text = "My name is " + name + " !!";
와 같은 String 의 연산에서는 참조 + 참조가 되버리기 때문에 값에 대한 복제가 발생되어 추가 연산이 들어가게 된다.
즉, "My name is" 와 " !!" 의 값이 별도로 string 으로 저장되고 다시 이것들을 저장하려고 하..는 듯 하다
(정확하게는 좀 더 확인 필요. 아직 정식 문서를 확인을 못 함)
반면,
string name = "Chae";
string text = $"My name is {name} !!";
와 같은 String 연산은 My name is {name} !! 라는 덩어리 하나 자체만 연산되므로 불필요한 연산이 줄어드는 것 같다.
아래는 간단히 테스트 한 코드
using System;
namespace _20251209
{
internal class Program
{
static void Main(string[] args)
{// 블록 시작
string name = "Chaeb";
DateTime opString1BeforeT = DateTime.Now;
string operation1 = "Now " + name + " !!!!";
DateTime opStrint1AfterT = DateTime.Now;
Console.WriteLine($"\"Now \" + name + \" !!!!\" : {(opStrint1AfterT - opString1BeforeT).TotalMilliseconds}");
DateTime opString2BeforeT = DateTime.Now;
string operation2 = $"Now {name} !!!!";
DateTime opStrint2AfterT = DateTime.Now;
Console.WriteLine($"$\"Now {{name}} !!!!\" : {(opStrint2AfterT - opString2BeforeT).TotalMilliseconds}");
}// 블록 끝
}
}
"Now " + name + " !!!!" : 1.0006
$"Now {name} !!!!" : 0
#regionRegion 은 에디터내 Collapsed 를 제공하기 위한 Tag. 빌드에는 영향이 없다. #region 이름 으로 시작해 #endregion으로 묶는다.
기본적인 덧/뺄/곱/나눗셈을 지원한다. 산수에서 배웠듯 곱/나눗셈부터 진행.
연산 순서를 변경하려면 괄호를 추가하면 된다.
++, -- 등 특정값을 1씩 증가시키는 연산
변수의 앞에 하느냐, 뒤에 하느냐에 따라 연산 순서가 달라지니 주의하자.
ex) count++, ++count, count--, --count
// 극단적인 예시
int count = 0;
count = count++;
count = count++;
count = count++; // 결과는 0
count = ++count;
count = ++count;
count = ++count; // 결과는 3
값을 서로 비교하는 연산자. 주로 조건문에서 많이 사용된다.
and/or 등 bit 단위를 논리적으로 연산한다.
& 나 | 를 2개씩 사용. ex) &&, ||
앞에서 부터 연산된다. && 조건일 경우 앞에서 부터 연상 중 false 조건이 날 경우 연산이 종료된다.
using System;
namespace _20251209
{
internal class Program
{
static void Main(string[] args)
{// 블록 시작
#region 사칙 연산
Console.WriteLine("5 + 2 = \t{0}", 5 + 2);
Console.WriteLine("5 - 2 = \t{0}", 5 - 2);
Console.WriteLine("5 * 2 = \t{0}", 5 * 2);
Console.WriteLine("5 / 2 = \t{0}", 5 / 2);
#endregion
#region 기타 연산
Console.WriteLine("5 % 2 = \t{0}", 5 % 2);
Console.WriteLine("5 << 2 = \t{0}", 5 << 2);
Console.WriteLine("8 >> 2 = \t{0}", 8 >> 2);
#endregion
#region 논리 연산
Console.WriteLine("true & true = \t{0}", true & true);
Console.WriteLine("true & false = \t{0}", true & false);
Console.WriteLine("true | true = \t{0}", true | true);
Console.WriteLine("true | false = \t{0}", true | false);
Console.WriteLine("true ^ true = \t{0}", true ^ true);
Console.WriteLine("true ^ false = \t{0}", true ^ false);
Console.WriteLine("!true == \t{0}", !true);
#endregion
#region 비교 연산
Console.WriteLine("true == true : \t{0}", true == true);
Console.WriteLine("true == false : \t{0}", true == false);
Console.WriteLine("5 > 2 : \t{0}", 5 > 2);
Console.WriteLine("5 < 2 : \t{0}", 5 < 2);
Console.WriteLine("5 >= 2 : \t{0}", 5 >= 2);
Console.WriteLine("5 <= 2 : \t{0}", 5 <= 2);
Console.WriteLine("5 != 2 : \t{0}", 5 != 2);
Console.WriteLine("5 == 2 : \t{0}", 5 == 2);
#endregion
#region 증감 연산
int count = 0;
count++;
// ++, --
Console.WriteLine("count : \t{0}", count);
count++;
Console.WriteLine("count : \t{0}", count);
count++;
Console.WriteLine("count : \t{0}", count);
float a = 5.0f;
float b = 2.0f;
Console.WriteLine($"{a} / {b} = \t{a / b}");
a += b;
// +=, -=, *=, /=, %=
Console.WriteLine("a += b : \t{0}", a);
#endregion
#region 형변환
int i = 5;
int j = 6;
int k = 8;
// float res0 = (i + j + k) / (float)3;
// float res0 = (i + j + k) / 3f;
float res0 = (float)(i + j + k) / 3;
Console.WriteLine("res0 : \t{0}", res0);
#endregion
#region 조건부 논리 연산
bool isKeyDown = true;
bool isGrounded = false;
bool isAlive = true;
bool isAnotherState = false;
bool canJump = isKeyDown && isGrounded && isAlive && !isAnotherState;
Console.WriteLine("You {0} jump !!", canJump ? "can" : "cannot");
#endregion
}// 블록 끝
}
}
5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2
5 % 2 = 1
5 << 2 = 20
8 >> 2 = 2
true & true = True
true & false = False
true | true = True
true | false = True
true ^ true = False
true ^ false = True
!true == False
true == true : True
true == false : False
5 > 2 : True
5 < 2 : False
5 >= 2 : True
5 <= 2 : False
5 != 2 : True
5 == 2 : False
count : 1
count : 2
count : 3
5 / 2 = 2.5
a += b : 7
res0 : 6.333333
You cannot jump !!
화면에 출력하는 함수.
Console.Write(): 줄바꿈 없이 화면에 출력Console.WriteLine(): 줄바꿈 포함 화면에 출력using System;
namespace _20251209
{
internal class Program
{
static void Main(string[] args)
{// 블록 시작
Console.Write("Enter something: ");
string inputString = Console.ReadLine();
Console.WriteLine($"You entered: {inputString}");
Console.WriteLine();
Console.Write("Enter something: ");
bool isCorrect;
int num;
isCorrect = int.TryParse(Console.ReadLine(), out num);
// int num = int.Parse(Console.ReadLine());
Console.WriteLine($"You entered: {num}");
Console.WriteLine($"Parsing successful: {isCorrect}");
}// 블록 끝
}
}
Enter something: how do you do?
You entered: how do you do?
Enter something: how do you do?
You entered: 0
Parsing successful: False