본문 바로가기

TIL (since 2023.08.07 ~ )

2023-08-14 TIL (C# - 01)

오늘부터는 C#의 기초문법 부터 가르쳐 주는 수업을 듣는 주차이므로,

C# 문법에 대해서 주로 다룰 예정이다.

C#을 처음 접하다 보니 이전에 배웠던 파이썬이나 R과는 많이 다른 문법구조 때문인지 아직까지 어려운 듯하다...

 

하지만 처음 배우는 만큼 잘 배워둬야 나중에 잘 쓸 수 있기 때문에 열심히 해야겠다...ㅠ

 

C# 소개

C# 언어의 특징

- 객체 지향 프로그래밍 언어

- 안전하고 형식이 분명함 (자료형을 컴파일러가 관리하여 안전하게 코드 작성 가능)

- 가비지 컬렉션 기능 (동적 할당된 메모리를 자동으로 회수해주는 기능)

 

.NET 프레임워크

-  다양한 프로그래밍 언어를 지원하는 플랫폼

 

프로그래밍 효율 높이기

 1. 클래스, 메서드, 변수 등의 이름을 입력할 떄 일부를 입력하고, Tab 키를 눌러 나머지를 자동 완성합니다.
- Console.Writeline을 작성할 때, Console. 까지 입력하고 Tab 키를 누르면 자동으로 WriterLine이 완성됩니다.
Console.WriteLine("C#");

- 메서드나 변수를 입력하는 도중에 Ctrl + Space를 눌러 IntelliSense를 호출하면, 해당 메서드나 변수에 대한 정보와 예제를 볼 수 있습니다.
Console.WriteLine("Study");

2. 코드 템플릿을 사용하여 코드를 더 빠르게 작성합니다.
-예 를들어, for문을 작성할 때, for 키워드를 입력하고, 두 번 Tab 키를 누르면 for문의 기본적인 코드 템플릿이 자동으로 생성됩니다.

 


프로그래밍 기본 요소

 

1) Hello World 로 기본 코드 구조 확인

//Hello World.cs
using System;

namespace HelloWorld
{
	class program
    {
    	static void Main(string[] args)
        {
        	Console.WriteLine("Hello World!");
         }
     }
}

● using System; : 기본적으로 제공하는 네임스페이스를 사용하기 위한 코드

 

● namespace : 코드를 구성하는 데 사용되며 클래스 및 기타 네임스페이스의 컨테이너

 

● class Program : 클래스를 정의하는 키워드

 

● static void Main() : 진입점(entry point)이며, Main 메서드는 프로그램이 시작 시 자동으로 호출되는 메서드

 

● {} : 코드 블록의 시작과 끝을 나타내는 중괄호

 

● 모든 C# 문은 세미콜론으로 끝남 : " ; " 

 

 

2) 출력

- Console.WriteLine 메소드는 인수로 전달된 값을 출력하고 줄 바꿈 문자열을 추가.

즉, 출력한 후에는 다음 줄로 커서가 이동.

Console.WriteLine(value);

value는 출력할 값으로

문자열, 숫자, 변수, 연산식 등 어떤 값이든 사용가능

 

<출력 예시>

Console.WriteLine("Hello World!");
Console.WriteLine("My Name is Minseok");

[출력]
Hello World!
My name is Minseok
Console.WriteLine(10);
Console.WriteLine(3.141592);
Console.WriteLine(3 + 3);

[출력]
10
3.141592
6

 

- Console.Write 메소드는 Console.WriteLine 메소드와 유사하지만, 줄 바꿈 문자열을 추가하지 않음.

즉, 출력한 후에는 다음 출력이 이어서 출력됨.

 

<Console.Write 예시>

Console.Write("Hello! ");
Console.Write("We are Learning ");
Console.WriteLine("at TeamSparta");

[출력]
Hello! We are Learning at TeamSparta

 

- 이스케이프 시퀀스(Escape Sequence)

문자열 내에 특수한 문자를 포함시키기 위해 사용되는 특별한 문자 조합 

Escape Sequence 설명
\' 작은따옴표(') 삽입
\" 큰따옴표(") 삽입
\\ 역슬래시(\) 삽입
\n 줄바꿈 삽입
\r 현재 줄 맨 앞으로 이동
\t 탭 삽입
\b 백스페이스 삽입

 

<Escape Sequence 예시>

Console.WriteLine("Hello\nWorld);
<출력결과>
Hello
World


Console.WriteLine("Name\tAge");
Console.WriteLine("Minseok\t26");
<출력결과>
Name 	Age
Minseok 26


Console.WriteLine("We learn \"C# Programming\"");
<출력결과>
We learn "C# Programming"


Console.WriteLine("He said, \'Hello\' to me.");
<출력결과>
He said, 'Hello' to me.


Console.WriteLine("C:\\MyDocuments\\Project\\");
<출력결과>
C:\MyDocuments\Project\

 

 

3) 주석

- 주석이란 코드의 설명이나 개발자간의 의사소통을 위해 사용함.

// : 한 줄 주석. 해당 줄 끝까지 주석 처리

/* */ : 여러 중 주석. 시작과 끝을 명시하여 주석 처리

 

※ 주석은 코드를 작성하는 과정에서 중요한 역할을 하며,

코드를 작성하기 전에 설계한 내용을 주석으로 작성하면 나중에 코드를 수정할 때 도움이 됨

 

<주석 예시>

// 변수 a를 선언합니다.
int a;

/*
여러 줄 주석을 사용하면
이렇게 긴 줄의 주석도
저장이 가능하답니다 ^^
*/

// 변수 a에 10을 할당합니다.
a = 10;

 

※ 주석 사용시 주의할 점

1. 주석은 코드를 대체하지 않는다.

- 주석은 코드를 설명, 보충하는 역할. 주석으로 코드의 복잡한 부분이나 로직을 대체하지 않아야 함.

 

2. 주석의 내용은 정확하고 명확해야 한다.

- 주석은 코드의 작동 방식이나 의도를 명확히 설명해야 함.

모호하다면 이해가 어려울 수 있으므로 틀린정보가 포함되지 않게 주의 해야 함.

 

3. 주석은 업데이트 되어야 한다.

- 코드가 변경되면 변경사항에 맞춰 주석도 변경되어야 함.

 

4. 주석은 필요한 경우에만 사용해야 한다.

- 코드가 명확하고 의도가 분명하면 사용할 필요 없음.

코드를 이해하는데 도움이 되는 경우에만 사용하는 것을 권장.

 

 


변수와 자료형

 

1) 기본 자료형

종류가 많지만 주로 쓰이는 자료형 위주로 설명하자면,

자료형 .NET 데이터 타입 크기(바이트) 범위
int System.Int32 4 -2,147,483,648 ~ 2,147,483,647
long System.Int64 8 -9,223,372,036,854,775,808 ~
9,223,372,036,854,775,807
float System.Single 4 ±1.5 × 10^-45 ~ ±3.4 × 10^38
double System.double 8 ±5.0 × 10^-324 ~ ±1.7 × 10^308
char System.Char 2 유니코드 문자
string System.String   유니코드 문자열
bool System.Boolean 1 true 또는 false

- 자료형의 크기, 표현 범위, 부호 여부 등에 따하 세분화된 자료형으로 구분.

- 각각의 자료형은 메모리의 크기와 표현 범위가 다름.

 

- 변수를 세분화 해야 하는 이유

1. 메모리의 효율적인 사용

2. 정확한 데이터 표현

3. 타입 안정성

 

- 리터럴 (literal)

1. 리터럴의 개념과 역할

- 프로그램에서 직접 사용되는 상수 값. 소스 코드에 직접 기록되어 있는 값

- C#에서 리터럴은 컴파일러에 의해 상수 값으로 처리되며, 변수나 상수에 할당되거나 연산에 사용

 

2.리터럴의 종류와 예시

- C#에서는 다양한 종류의 리터럴을 지원

- 각각의 리터럴은 다른 형식으로 표현되며, 다양한 값의 범위를 가짐.

- 정수형 리터럴 : 10(int) , 0x10(16진수 int) , 0b10(2진수 int) , 10L(long) , 10UL(unsigned long)

- 부동소수점형 리터럴 : 3.14(double) , 3.14f(float) , 3.14m(decimal)

- 문자형 리터럴 : 'A'(char) , '\n'(개행 문자) , '\u0022'(유니코드 문자)

- 문자열 리터럴 : "Hello, World!"(string) , "문자열 내 "따옴표" 사용하기" , @"문자열 내 개행 문자 사용하기"

int num = 10;
float f = 3.14f;
char c = 'A';
string str = "Hello, World!";

int num1 = 0x10;
int num2 = 0b1010;
long num3 = 100000000000000L;

 

2) 변수 선언과 초기화 방법

- 1. 변수란?

- 데이터(숫자, 문자 등)를 저장하고 사용하기 위한 할당받은 공간

- 필요에 따라 데이터를 저장하거나 수정 가능

 

- 2. 변수 선언

자료형 변수이름;

예를 들어, int 자료형의 변수 선언 방법은 다음과 같음.

int num;

그리고 한번에 변수 여러개를 선언하는 방법은 다음과 같음.

int num1, num2, num3;

 

- 3. 변수 초기화

- 변수를 선언한 후 변수를 초기화하여 값을 저장해야 함.

변수 이름 = 값;

int num; // 변수 선언
num = 10; // 변수 초기화

int num = 10; // 변수 선언과 초기화를 한 번에 수행

// 한 번에 여러개의 변수 초기화
int num1, num2, num3 = 10; // (X)
num1 = num2 = num3 = 10;

 

 

3) 변수명

 

- 1. 키워드 (Keywords)

- C#에는 이미 예약된 단어들이 있기 때문에 변수, 메소드, 클래스 등의 이름으로 사용할 수 없음.

- 이러한 단어들을 키워드(Keywords)라고 함.

abstract  as  base  bool  break  byte  case  catch  char  checked  class
const  continue decimal  default  delegate  do  double  else  enum  event
explicit  extern  false  finally fixed  float  for  foreach  goto  if
implicit  in  int  interface  internal  is  lock long  namespace  new
null  object  operator  out  override  params  private  protected  public
readonly  ref  return  sbyte  sealed  short  sizeof  stackalloc  static
string  struct  switch this  throw  true  try  typeof  uint  ulong
unchecked  unsafe  ushort  using  virtual  void volatile  while

- 2. 식별자 (Identifiers)

- 변수, 메서드, 클래스, 인터페이스 등에 사용되는 이름. 

- 식별자를 사용할 때는 다음과 같은 규칙을 따라야 함.

첫 문자는 알파벳, 언더스코어( _ )가 올 수 있다.
두 번째 문자부터는 알파벳, 언더스코어, 숫자가 올 수 있다.
대소문자를 구분한다.
키워드와 같은 이름으로 사용할 수 없다.

// 좋은 예시
int playerScore;
string PlayerName;
float itemPrice;

// 나쁜 예시 (중요! 의미 있는 변수명 짓기)
int x1;		// 변수명이 의미를 알기 어려움
string a;	// 변수명이 명확하지 않음

//오류 예시
int 1stNumber;	// 변수명은 숫자로 시작할 수 없음
string my-name;	// 변수명에 하이픈( - )을 사용할 수 없음
float total$;	// 변수명에 특수문자($)를 사용할 수 없음

- 3. 코드 컨벤션(Code convention)

- 개발자들 사이에서 약속된 코드 작성 규칙으로, 코드의 가독성을 높이고 유지 보수를 쉽게 하기 위해 사용.

- 프로그래밍 언어마다 다름.

  • 식별자 표기법
    • PascalCase : 클래스, 메서드, 프로퍼티 이름 등에 사용. 단어의 첫 글자는 대문자, 이후 단어의 첫 글자도 대문자ex) ClassName, MethodName, PropertyName
    • camelCase : 변수, 매개변수, 로컬 변수 이름 등에 사용. 단어의 첫 글자는 소문자, 이후 단어의 첫 글자는 대문자 ex) variableName, parameterName, localVariableName
    • 대문자 약어 : 예외적으로 전체 글자가 모두 대문자인 식별자도 존재. ex) ID, HTTP, FTP
  • 들여쓰기
    • 탭(Tab) 또는 스페이스(space) 4칸을 사용하여 코드 블록을 들여씀.
  • 중괄호 위치
    • 중괄호(" { } ")는 항상 새로운 줄에서 시작
  • 빈 줄 사용
    • 관련 없는 코드 사이에는 빈 줄을 사용하여 구분
    • 메서드, 클래스 등의 블록 사이에는 두 줄을 띄어 씀
  • 주석
    • 한 줄 주석을 사용

예를 들어, 다음과 같이 코드를 작성하는 것이 일반적인 코드 컨벤션이다.

class MyClass
{
    // 필드는 camelCase 표기법을 사용합니다.
    private int myField;

    // 프로퍼티는 PascalCase 표기법을 사용합니다.
    public int MyProperty { get; set; }

    // 메서드는 PascalCase 표기법을 사용합니다.
    public void MyMethod()
    {
        if (true)
        {
            // 중괄호는 새로운 줄에서 시작합니다.
        }

        // 코드 블록은 탭(tab) 또는 스페이스(space) 4칸으로 들여씁니다.

        // 관련 없는 코드 사이에는 빈 줄을 사용하여 구분합니다.
				// 블록 사이에는 두 줄을 띄어씁니다.
				
		    /*
		    여러 줄 주석을 사용할 때는
		     / * 를 새로운 줄에서 시작하고,
		     * / 를 새로운 줄에서 끝내도록 합니다.
		    */
		
		    // 한 줄 주석은 이렇게 사용합니다.
		    int a = 10; // 코드 끝에도 한 줄 주석을 사용할 수 있습니다.
		}
}

 

※ 참고 : Microsoft C# 코딩 규칙

https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/coding-style/coding-conventions

 

 

4) 명시적 및 암시적 형변환

- 1. 형변환 이란?

- 자료형이 다른 변수 간에 값을 할당하거나 연산 수행 가능.

 

- 2. 명시적 형변환(explicit casting)

int num1 = 10;
long num2 = (long)num1;		// int를 long으로 명시적 형변환

- 3. 암시적 형변환(implicit casting)

- 1) 작은 데이터 타입에서 더 큰 데이터 타입으로 대입하는 경우

- byte, short, char 등 작은 데이터 타입에서 int, long, float 등 더 큰 데이터 타입으로 대입할 때.

byte num1 = 10;
int num2 = num1;	// byte형에서 int형으로 암시적 형변환

- 2) 리터럴 값이 대입되는 경우

- C# 컴파일러는 리터럴 값의 데이터 타입을 판별하여 변수에 암시적으로 형변환

float result = 1;	// 1은 int형 리터럴 값이지만 float형으로 암시적 형변환

- 3) 정수형과 부동소수점형 간의 연산을 수행하는 경우

- 정수 + 부동소수점형 = 부동소수점형

int num1 = 10;
float num2 = 3.14f;
float result = num1 + num2;
// int형과 float형의 덧셈에서 float형으로 암시적 형변환

- 암시적 형변환은 직접 형변환 코드 작성을 하지 않아도 간결하게 작성 가능

- 하지만, 암시적 형변환이 발생할 때, 데이터 타입을 신중히 고려하여 작성해야 함

 

 

 

5) Console.ReadLine을 이용한 입력

- C# 에서 콘솔 입력을 받을 때는 Console.ReadLine 메소드를 사용.

- ReadLine 메소드는 사용자가 입력한 값을 문자열로 반환.

string input = Console.ReadLine();

input은 사용자가 입력한 값을 저장하는 변수. Console.ReadLine 메소드를 호출하면

사용자가 입력한 값이 문자열로 반환되어 input 변수에 저장.

 

Console.Write("Enter your name: ");
string name = Console.ReadLine();
Console.WriteLine("Hello, {0}!", name);

[출력]
Enter your name: Minseok
Hello, Minseok!

Console.ReadLine 메소드는 사용자가 입력한 값을 문자열로 반환하므로,

숫자나 논리값을 입력 받을 때에는 적절한 형변환을 해주어야 함.

 

- Split : 한줄에 여러 값 입력받기

- 사용자로부터 여러 개의 값을 한 줄에 입력받고 싶을 때 Console.ReadLine 메소드를 사용하여

입력받은 값을 문자열로 받은 후, string.Split 메소드를 사용하여 문자열을 나누어서 처리

 

예를 들어, 사용자로부터 공백으로 구분된 두 개의 정수를 입력받아 더하는 코드를 작성해보자.

Console.Write("Enter two numbers: ");
string input = Console.ReadLine();    // "10 20"과 같은 문자열을 입력받음

string[] numbers = input.Split(' ');  // 문자열을 공백으로 구분하여 배열로 만듦
int num1 = int.Parse(numbers[0]);     // 첫 번째 값을 정수로 변환하여 저장
int num2 = int.Parse(numbers[1]);     // 두 번째 값을 정수로 변환하여 저장

int sum = num1 + num2;                // 두 수를 더하여 결과를 계산

Console.WriteLine("The sum of {0} and {1} is {2}.", num1, num2, sum);

[출력]
Enter two numbers: 10 20
The sum of 10 and 20 is 30.

 

6) var 키워드 사용법

- 1. var 키워드

- var 키워드를 사용하여 변수를 선언하면 변수의 자료형이 컴파일러에 의해 자동으로 결정됨.

- 즉, 초기화하는 값의 자료형에 따라 변수의 자료형이 결정.

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

- var 키워드를 사용하여 변수를 선언할 때, 초기화하는 값의 자료형에 따라 변수의 자료형이 결정되므로

변수를 선언하는 시점에서 변수의 자료형을 정확히 알 수 없는 경우 유용함.

 


연산자와 문자열 처리

 

- 1) 산술, 관계, 논리 연산자 사용법

- 산술 연산자 : 숫자를 대상으로 사용

연산자 설명
+ 덧셈
- 뺄셈
* 곱셈
/ 나눗셈
% 나머지

 

- 관계 연산자 : 두 값을 비교하여 참(True) 또는 거짓(False) 값을 반환

연산자 설명
== 같음
!= 다름
>
< 작음
>= 크거나 같음
<= 작거나 같음

 

- 논리 연산자 : 참(Ture) 또는 거짓(False) 값을 대상으로 사용

연산자 설명
&& 논리곱(AND)
|| 논리합(OR)
! 논리부정(NOT)

 

 

2) 비트 연산자

- 데이터의 비트(bit) 단위로 연산을 수행하는 연산자

연산자 설명
& (AND) 두 비트 값이 모두 1일 때 1을 반환
| (OR) 두 비트 값 중 하나라도 1일 때 1을 반환
^ (XOR) 두 비트 값이 서로 다를 때 1을 반환
~ (NOT) 비트 값의 보수(complement)를 반환
<< (왼쪽 시프트) 비트를 왼쪽으로 이동
>> (오른쪽 시프트) 비트를 오른쪽으로 이동
int a = 0b1100; // 12 (2진수)
int b = 0b1010; // 10 (2진수)

int and = a & b; // 0b1000 (8)
int or = a | b; // 0b1110 (14)
int xor = a ^ b; // 0b0110 (6)

int c = 0b1011; // 11 (2진수)
int leftShift = c << 2; // 0b101100 (44)
int rightShift = c >> 1; // 0b0101 (5)

int d = 0b1100; // 12 (2진수)
int bit3 = (d >> 2) & 0b1; // 0 (3번째 비트)
d |= 0b1000; // 0b1100 | 0b1000 = 0b1100 (12)

 

3) 복합 대입 연산자와 증감 연산자 활용

- 1. 복합 대입 연산자

- C#에서는 변수에 값을 할당하는 대입 연산자( = ) 외에도, 다양한 복합 대입 연산자가 존재.

- 복합 대입 연산자는 변수에 연산을 수행한 결과를 저장하는 연산자

연산자 예시 설명
+= x += y; x = x + y;
-= x -= y; x = x - y;
*= x *= y; x = x * y;
/= x /= y; x = x / y;
%= x %= y; x = x % y;

 

- 2. 증감 연산자

- 변수의 값을 1 증가시키거나 감소시키는 연산자

연산자 설명
++ 1 증가
-- 1 감소

 

 

4) 연산자 우선순위

- 1. 연산자 우선순위란?

- 수식 내에서 연산자가 수행되는 순서

- 우선순위에 따라 결과가 달라질 수 있으므로 중요!

 

- 2. C#의 주요 연산자 우선순위

연산자들은 다양한 우선순위를 갖고 있으며, 높은 우선순위부터 수행

1. 괄호 ()
2. 단항 연산자 (++,--,+,-,! 등)
3. 산술 연산자 (*,/,%,+,-)
4. 시프트 연산자 (<<, >>)
5. 관계 연산자 (<, >, <=, >=, ==)
6. 논리 연산자 (&&, ||)
7. 할당 연산자(=, +=, -=, /=)

 

5) 문자열 처리 기능 및 메서드

 

- 1. 문자열 생성

string str1 = "Hello, World!"; // 리터럴 문자열 사용
string str2 = new string('H', 5); // 문자 'H'를 5개로 구성된 문자열 생성

- 2. 연결

string str1 = "Hello";
string str2 = "World";
string str3 = str1 + " " + str2;

- 3. 분할

string str = "Hello, World!";
string[] words = str.Split(',');

- 4. 검색

string str = "Hello, World!";
int index = str.IndexOf("World");

- 5. 대체

string str = "Hello, World!";
string newStr = str.Replace("World", "Universe");

- 6. 변환

- 문자열을 숫자로 변환

string str = "123";
int num = int.Parse(str);

 

- 숫자를 문자열로 변환

int num = 123;
string str = num.ToString();

 

- 7. 비교

- 문자열 값 비교

string str1 = "Hello";
string str2 = "World";
bool isEqual = str1 == str2;

 

-문자열 대소 비교

string str1 = "Apple";
string str2 = "Banana";
int compare = string.Compare(str1, str2);

 

 

- 8. 포멧팅

- 문자열 형식화

string name = "John";
int age = 30;
string message = string.Format("My name is {0} and I'm {1} years old.", name, age);

 

- 문자열 보간

string name = "John";
int age = 30;
string message = $"My name is {name} and I'm {age} years old.";

 

 

 

 

'TIL (since 2023.08.07 ~ )' 카테고리의 다른 글

2023-08-17 TIL (C# - 03)  (0) 2023.08.17
2023-08-16 TIL (C# - 02)  (2) 2023.08.16
2023-08-11 TIL  (0) 2023.08.11
2023-08-10 TIL  (0) 2023.08.10
2023-08-09 TIL  (0) 2023.08.09