C# 기초 정리 1 - C# 기본

woollim·2024년 9월 22일
0

C#

목록 보기
1/11

1. 키워드

  • 키워드는 특별한 의미가 부여된 예약어로 식별자로 사용할 수 없음

  • 키워드 종류

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. 식별자

  • 식별자는 C#에서 이름을 붙일 때 사용하는 단어
  • 변수와 메서드 이름 등으로 사용

○ 식별자 규칙

  • 키워드를 사용하면 안 됨
  • 특수 문자는 _만 허용
  • 숫자로 시작하면 안 됨
  • 공백은 입력하면 안 됨

○ 보편적인 방식

  • 파스칼(PascalCase) : 시작 단어의 첫글자를 대문자로, 이후 단어의 첫글자도 대문자로 표기. 쌍봉낙타를 닮음. 클래스, 메서드, 프로퍼티 등에 주로 사용
  • 카멜(camelCase) : 시작 단어의 첫글자는 소문자로, 이후 단어의 첫글자는 대문자로 표기. 단봉낙타를 닮음. 변수, 매개변수, 로컬 변수 등에 주로 사용.
  • 스네이크(snake_case) : 단어 사이를 _로 연결


3. 자료형

○ 변수를 세분화 해서 사용하는 이유

  • 메모리의 효율적인 사용
  • 정확한 데이터 표현
  • 타입 안정성

○ 리터럴 (literal)

  1. 리터럴의 개념과 역할
    : 프로그램에서 직접 사용되는 상수 값, 소스코드에 직접 기록되어 있는 값. 컴파일러에 의해 상수 값으로 처리되며 변수나 상수에 할당되거나 연산에 사용됨

  2. 리터럴의 종류와 예시

  • 정수형
    • 10 (int)
    • 0x10 (16진수 int)
    • 0b10 (2진수 int)
    • 10L (long)
    • 10UL (unsigned long)
  • 부동소수점형
    • 3.15 (double)
    • 3.14f (float)
    • 3.14m (decimal)
  • 문자형
    • 'A' (char)
    • '\n' (개행 문자)
    • '\u0022' (유니코드 문자)
  • 문자열
    • "Hello, World!" (string)
    • "문자열 내 "따옴표" 사용하기"
    • @"문자열 내 개행 문자
      사용하기"



4. 문자열

○ 문자열 나누기

문자열변수명.Split() : 문자열을 ()내의 문자를 기준으로 나눔

string[] numbers = s.Split(' ');
// s 문자열을 공백으로 구분하여 배열로 만듦
// numbers[0] 첫 번째 값, numbers[1] 두 번째 값...

○ 문자열 검색

  • 문자열.IndexOf(검색할것) : 문자열에서 ()내의 문자열 검색하여 첫번째 인덱스를 찾아 반환
 string str = "Hello, World!";
 int index = str.IndexOf("World");
 // 이 코드는 str 문자열에서 "World" 문자열의 첫 번째 인덱스를 찾아 index 변수에 저장 함

○ 문자열 대소 비교

  • 문자열.Compare(문자열1, 문자열2) : 문자열1과 문자열2를 비교함
    - 문자열1 > 문자열2 -> 0보다 작은 수 반환
    - 문자열1 = 문자열2 -> 0 반환
    - 문자열1 < 문자열2 -> 0보다 큰 수 반환
 int compare = string.Compare(str1, str2);
 // 앞에거가 크면 음수, 같으면 0, 작으면 양수
 // 사전순으로 비교

○ 문자열 포맷팅

  • 문자열 형식화
  • string.Format("문자열 내용 {0} {1}", 변수1, 변수2) : {숫자} 순서에 맞는 변수 삽입
string name = "John";
int age = 30;
string messege = 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.";


5. 입출력

○ 입력 종류

  • Console.Read() : 한 문자를 입력받고 문자의 int(유니코드)로 반환
  • Console.ReadLine() : 한 문자열을 입력받고 string으로 반환 (엔터키 입력이 트리거)
  • 둘다 입력 버퍼 이용

○ 출력 종류

  • Console.Write(value) : 변수의 값을 출력
  • Console.WriteLine(value) : 변수 값을 출력하고 줄 바꿈

○ 변환

1) 문자 -> 정수

  • 문자 - '0'
 char c = '10';
 int n = c - '0'; // n = 10

2) 문자열 -> 정수

  • int.Parse(문자열)
 string s = "1000";
 int n = int.Parse(s); // n = 1000

3) 숫자 -> 문자열

  • 숫자변수.ToString()
int n = 1000;
string s = n.ToString();

4) Parse

  • 자료형.Parse(변수)
  • 문자열을 특정 자료형으로 변환
 string s = "123";
 int n = int.Parse(s); // n = 123

5) Convert

  • Conver.To자료형.(변수)
  • Convert.ToString() : 문자열
  • Convert.ToInt() : 정수
  • Convert.ToDouble() : 실수
  • Convert.ToChar() : 문자
int a = 10;
Console.WriteLine(Convert.ToString(a)); // 문자열 10으로 변환

6) 이진수 변환

  • Convert.ToString(10진수변수, 2)
int n = 8;
Console.WriteLine(Convert.ToString(n, 2)); // 1000

6) 데이터 형식 알아내는 법

  • 변수이름.GetType()
int n = 0;
Console.WriteLine(n.GetType()); // System.Int32


5. var 키워드

• 변수 선언할 때 사용
• 변수의 자료형이 컴파일러에 의해 자동으로 결정됨.
• 즉, 초기화하는 값의 자료형에 따라 변수의 자료형이 결정 됨.

int a = 10;
var b = a;
Console.WriteLine(b.GetType()); // System.Int32


6. 배열

○ 1차원 배열

자료형[] 배열변수명 = new 자료형[크기];

 int[] numbers = new int[3];  // 3개의 숫자를 저장할 배열
 
 char[] ch;
 ch = new char[10]; // 두 줄로 나누어서 초기화 해도 ok
 
 int[] item = {100, 200, 300, 400, 500}; // 배열 크기 : 5 

○ 2차원 배열

자료형[,] 배열변수명 = new 자료형[크기,크기];

int[,] map = new int[5, 5]
{
    {1, 1, 1, 1, 1},
    {1, 0, 0, 0, 1},
    {1, 0, 1, 0, 1},
    {1, 0, 0, 0, 1},
    {1, 1, 1, 1, 1}
};

○ foreach문을 활용한 배열 접근

foreach(자료형 내부변수이름 in 배열이름) { }

foreach (int i in list)
{
    Console.WriteLine(i);
} // 배열 내부의 원소를 하나하나 접근 하여 출력문을 수행함

○ 배열과 리스트의 차이점

: 처음 초기화된 크기로 고정되는 배열과 달리 리스트의 크기는 동적으로 조정 가능. 단, 메모리 사용량 증가, 데이터 접근 시간 증가, 코드 복잡도 증가 등의 단점들이 있으므로 사용목적을 고려 하여 적절한 선택이 필요함



7. C++와 C#의 문자열 차이

○ 문자열 불변성

  • C++ : std::string은 가변(mutable) 타입으로, 기존 문자열을 수정할 수 있음
std::string str = "Hello";
str += " World"; // 기존 문자열을 수정
  • C# : string은 불변 타입. 문자열을 수정하려고 하면 새로운 문자열 객체가 생성됨
string original = "Hello";
string modified = original + " World"; // 새로운 문자열이 생성됨

○ 문자열 조작

  • C++ : std::string은 문자열 조작 메서드를 제공하지만, C 스타일 문자열을 사용할 경우 문자열 조작에 대한 함수(예: strcpy, strlen, strcat 등)를 사용해야 함
std::string str = "Hello, World!";
str.replace(str.find("World"), 5, "C++");
  • C# : 문자열에 대한 다양한 메서드가 제공되어, 검색, 분할, 대체 등 다양한 조작을 쉽게 수행할 수 있음
string result = str.Replace("World", "C#");

○ 형태와 성능

  • C++ : std::string은 더 많은 제어를 제공하고, 필요에 따라 C 스타일 문자열을 사용하여 성능을 최적화할 수 있음. 그러나 포인터와 메모리 관리를 잘 다루어야 함
  • C# : string은 사용이 간편하지만, 불변성으로 인해 자주 수정하면 성능에 영향을 줄 수 있음. 이 경우 StringBuilder 클래스를 사용 할 수 있음

○ 요약

C#은 문자열 처리에서 더 많은 추상화와 편리함을 제공하는 반면, C++은 더 많은 유연성과 성능 최적화를 가능하게 함


8. C++와 C#의 배열 차이

○ 배열 선언 및 초기화

  • C++ : 배열의 크기를 선언 시 지정하며, 초기화도 가능. 배열은 초기화하지 않으면 쓰레기 값이 들어갈 수 있음
int array[5]; // 크기가 5인 배열 (초기화되지 않음)
int initializedArray[5] = { 1, 2, 3, 4, 5 }; // 초기값을 갖는 배열
  • C# : 배열의 크기는 선언 시에 지정하며, 크기를 변경할 수 없음. 배열은 0으로 초기화 됨
int[] array = new int[5]; // 크기가 5인 배열
int[] initializedArray = { 1, 2, 3, 4, 5 }; // 초기값을 갖는 배열

○ 배열의 크기 변경

  • C++ : 배열은 고정 크기이지만, 동적 배열을 사용하면 new 키워드를 사용하여 런타임에 크기를 지정할 수 있음
int* dynamicArray = new int[size]; // 동적 배열
delete[] dynamicArray; // 메모리 해제
  • C# : 배열의 크기는 고정되어 있으며, 다른 크기의 배열을 만들려면 새로운 배열을 생성해야 함

○ 배열의 메모리 관리

  • C++ : 배열의 메모리는 직접 관리해야 하며, 동적으로 할당된 배열은 사용 후 반드시 해제해야 함 (delete[] 사용)
  • C# : 배열은 가비지 컬렉터에 의해 관리되므로, 메모리 해제를 신경 쓸 필요가 없음

○ 다차원 배열

  • C++ : 다차원 배열을 선언할 수 있지만, 배열의 크기는 컴파일 타임에 고정
int multiArray[2][3]; // 2x3 배열
  • C# : 다차원 배열을 쉽게 만들 수 있으며, 다양한 형태의 배열을 지원 함
int[,] multiArray = new int[2, 3]; // 2x3 배열

○ 배열의 타입

  • C++ : 배열은 특정 타입의 요소를 포함하지만, 형변환이나 포인터 연산으로 더 유연하게 사용할 수 있음
  • C# : 배열은 특정 타입의 요소만 포함할 수 있으며, 일반적으로 타입 안전성이 높음

○ 요약

C#은 메모리 관리와 배열 처리에서 더 많은 안전성을 제공하는 반면, C++는 더 많은 제어와 성능 최적화를 가능하게 함.

0개의 댓글