1. 내일배움캠프 1일차 TIL : C#기초1

woollim·2024년 9월 19일
0

내일배움캠프TIL

목록 보기
1/20
post-thumbnail

■ 오늘의 학습요약

○ 학습 목표

  • C# 기초강의 2주차 까지 수강완료 및 정리(완료)
  • C#소개 ~ 메소드와 구조체 까지

○ 학습 회고

  • 12시간 중 순수 집중 시간은 8시간으로 예상
  • 기존에 학습 중이던 C++과 미묘하게 다른 부분들이 많기 때문에 학습에 주의할 필요가 있음
  • 프로그래머스를 활용하여 C# 기출문제를 풀고 익히는데 도움이 될거 같으므로 앞으로 활용할 계획
  • 주말에 TIL에 추가 설명 등 세부적인 내용 추가, 양식 정리가 필요할 듯 함
  • 아직 카메라가 없으므로 내일 부터는 화면 공유라도 킬 예정
  • 내일부터는 강의 중 메모장 말고 벨로그 임시저장글에 메모하기

○ TIL 작성계획

  • 강의 중 메모한 것을 바탕으로 작성 예정
  • 본인이 중요하게👍 생각하거나 헛갈리는 부분😥을 집중 작성할 계획

○ TIL 작성후기

■ 1-1강. C#소개, 개발 환경 설정

○ C# 특징

  • 객체 지향 프로그래밍 언어이며, 안전하고 형식이 분명하다
  • 강력한 형식 시스템과 가비지 컬렉션 기능을 제공한다 👍
  • 다양한 플랫폼에서 사용 가능하며, NET 프레임워크에서 실행된다.
  • C, C++, Java 등 다른 언어들과 문법 및 구조적으로 유사하다.

○ 강력한 형식 시스템

  • 변수나 객체의 자료형이 미리 정의되어 있어 데이터 타입에 대한 안전성과 정확성을 보장하는 시스템이다.

○ 가비지 컬렉션 기능 👍

  • 동적 할당된 메모리를 자동으로 회수해주는 기능이다. C#에서는 개발자가 메모리를 직접 할당하고 해제하는 대신, .NET 프레임워크에서 가비지 수집기가 자동으로 메모리를 해제해준다.

• 자동완성 기능 IntelliSense 👍

  • Tab 키와 방향키를 이용하여 자동완성
  • 더블탭 할 경우 세부사항까지 자동완성 해주는 것도 있음 (for문, while문)

■ 1-2강. 프로그래밍 기본 요소

○ using System;

  • 시스템 네임스페이스를 이용하겠다는 선언

○ namespace

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

○ class Program

  • C# 클래스를 정의하는 키워드. 클래스 이름은 Program으로 지정합니다.

○ static void Main()

  • C#의 진입점(entry point)
  • Main 메서드는 프로그램이 시작할 때 자동으로 호출되는 메서드 입니다.
  • Main메서드는 프로그램 실행에 필수적

○ 출력문

  • Console.Write(string); // 줄 바꿈이 없음
  • Console.WriteLine(string); // 문장 끝에서 줄 바꿈
Console.WriteLine("My Name is Woollim"); // 출력 : My Name is Woollim
Console.Write("Hello! ");
Console.Write("We are Learning ");
Console.WriteLine("at TeamSparta\n"); // 출력 : Hello! We are Learning at TeamSparta\n

○ 입력문

  • Console.ReadLine(); // 한 줄 입력, 반환형은 string
  • Console.Read(); // 문자 하나 입력, 반환형은 int, 저장값은 아스키코드 😥 !!복습필요!!

○ Escape Squence

  • \' : 작은따옴표 삽입
  • \" : 큰따옴표 삽입
  • \ : 역슬래시 삽입
  • \n : 새줄 삽입
  • \r : 현재 줄 맨앞으로 이동
  • \t : 탭 삽입
  • \b :백 스페이스 삽입

■ 1-3강. 변수와 자료형1

○ 변수를 세분화 해서 사용하는 이유
1. 메모리의 효율적인 사용
: 세분화된 자료형을 사용하면, 해당 자료형이 필요한 크기만큼의 메모리를 할당하여 메모리의 효율적인 사용을 가능하게 함.
2. 정확한 데이터 표현
: 세분화된 자료형을 사용하면, 데이터의 특성에 따라 정확한 표현이 가능. 예를 들어, 부동소수점 자료형인 float과 double은 소수점 이하 자릿수가 다르며, 각각의 자료형은 다른 범위의 값까지 표현이 가능.
3. 타입 안정성
: 세분화된 자료형을 사용하면, 코드의 타입 안정성을 유지할 수 있음. 예를 들어, 정수형 자료형으로 byte를 사용하면, 해당 자료형이 가질 수 있는 값의 범위를 벗어날 경우 오류가 발생하므로, 코드의 안정성을 보장 할 수 있음.

○ 리터럴
1. 리터럴의 개념과 역할
• 프로그램에서 직접 사용되는 상수 값으로, 소스 코드에 직접 기록되어 있는 값
• C#에서 리터럴은 컴파일러에 의해 상수 값으로 처리되며, 변수나 상수에 할당되거나 연산에 사용
2. 리터럴의 종류와 예시
• C#에서는 다양한 종류의 리터럴을 지원
• 각각의 리터럴은 다른 형식으로 표현되며, 다양한 값의 범위를 가지고 있음

  1. 정수형 리터럴
    • 10(int)
    • 0x10 (16진수 int)
    • 0b10 (2진수 int)
    • 10L (long)
    • 10UL (Unsigned long)

  2. 부동소수점형 리터럴
    • 3.14 (double)
    • 3.14f (float)
    • 3.14m (decimal)

  3. 문자형 리터럴
    • 'A' (char)
    • '\n' (개행 문자)
    • '\u0022' (유니코드 문자)

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

○ C# 일반적인 코드 컨벤션 👍
1. 필드는 카멜
2. 프로퍼티는 파스칼
3. 메서드는 파스칼

○ 형변환
1. 명시적 형변환

  • 변수 앞에 원하는 (자료형)을 삽입 -> 한시적으로 자료형 변환
  1. 암시적 형변환
  • 작은 데이터 타입에서 더 큰 데이터 타입으로 대입하는 경우

■ 1-4강. 변수와 자료형2

• 주석 단축키👍 : Ctrl K C
• 주석 해제 단축키👍 : Ctrl K U

• [문자열변수명].Split : 문자열을 공백으로 구분해줌👍

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

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

• [자료형].Parse() : 정수로 영구 형변환

int num = int.Parse(Console.Read()); // 이런 형식으로 정수를 입력받기도 함

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

■ 1-5강. 연산자와 문자열 처리

○ 문자열 처리 기능 및 메서드

  1. 문자열 생성
 string str1 = "Hello, World!"; // 리터럴 문자열 사용
 string str2 = new string('H', 5); // 문자 'H'를 5개로 구성된 문자열 생성
  1. 분할👍
 string str = "Hello, World!";
 string[] words = str.Split(',');
 // 이 코드는 str문자열을 쉼표로 구분하여 분할한 문자열 배열 words를 생성
  1. 검색👍
 string str = "Hello, World!";
 int index = str.IndexOf("World);
 // 이 코드는 str 문자열에서 "World" 문자열의 첫 번째 인덱스를 찾아 index 변수에 저장 함
  1. 대체👍
 string str = "Hello, World!"
 string newStr = str.Replace("World", "Universe");
 // 이 코드는 str 문자열에서 "World" 문자열로 대체한 새로운 문자열 newStr을 생성 함
  1. 변환👍
    • 문자열 -> 숫자
 string str = "123";
 int num = int.Parse(str);
 // 이 코드는 문자열 str을 정수형 숫자로 변환 한 후, num 변수에 저장 함

• 숫자 -> 문자열

 int num = 123;
 string str = num.ToString();
 // 이 코드는 정수형 숫자 num을 문자열로 변환한 후, str 변수에 저장 함
  1. 문자열 대소 비교😥
 int compare = string.Compare(str1, str2);
 // 뒤에거가 크면 음수, 같으면 0, 작으면 양수
 // 사전순으로 비교

○ 문자열 포맷팅
1. 문자열 형식화👍

string name = "John";
int age = 30;
string messege = string.Format("My name is {0} and I'm {1} years old.", name, age);
  1. 문자열 보간👍
string name = "John";
int age = 30;
string message = $"My name is {name} and I'm {age} years old.";

■ 2-1강 ~ 2-4강. 조건문과 반복문

이미 알고 있던 내용이므로 간단한 예제 몇개만 작성하겠습니다.

// 1) 가위바위보 - 비길때까지 무한 반복
string[] choices = { "가위", "바위", "보" };
string playerChoice = "";
string computerChoice = choices[new Random().Next(0, 3)]; // 0~2까지만 랜덤 선택

while(playerChoice != computerChoice)
{
    Console.Write("가위, 바위, 보 중 하날 선택하시오 : ");
    playerChoice = Console.ReadLine();

    if (playerChoice == computerChoice)
    {
        Console.WriteLine("비겼습니다");
    }
    else if (playerChoice == "가위")
    {
        if (computerChoice == "보")
            Console.WriteLine("플레이어 승리!");
        else
            Console.WriteLine("컴퓨터 승리!");
    }
    else if (playerChoice == "바위")
    {
        if (computerChoice == "가위")
            Console.WriteLine("플레이어 승리!");
        else
            Console.WriteLine("컴퓨터 승리!");
    }
    else if (playerChoice == "보")
    {
        if (computerChoice == "바위")
            Console.WriteLine("플레이어 승리!");
        else
            Console.WriteLine("컴퓨터 승리!");
    }
}
Console.WriteLine();

// 2) 숫자 맞추기
int targetNumber = new Random().Next(1, 101); // 1~100
// new Random().Next(a, b) -> a~(b-1) 범위내 랜덤한 숫자 선택 함수
int guess = 0;
int count = 0;
Console.WriteLine("1부터 100 사이의 숫자를 맞춰보세요.");

while (guess != targetNumber)
{
    Console.WriteLine("추측한 숫자를 입력하세요 : ");
    guess = int.Parse(Console.ReadLine());
    count++;

    if (guess < targetNumber)
    {
        Console.WriteLine("좀 더 큰 숫자를 입력하세요.");
    }
    else if (guess > targetNumber)
    {
        Console.WriteLine("좀 더 작은 숫자를 입력하세요.");
    }
    else
    {
        Console.WriteLine("축하합니다! 숫자를 맞추셨습니다.");
        Console.WriteLine("시도한 횟수 : " + count);
    }
}

■ 2-5강. 배열과 컬렉션

○ 배열 선언 형태
• 1차원 배열
[자료형][] [배열변수명] = new [자료형][크기];

 int[] numbers = new int[3];  // 3개의 숫자를 저장할 배열

• 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}
};

○ 컬렉터
• C++의 STL과 비슷해 보인다
• 대표적으로 List가 있다
• 추가학습 필요!!😥

○ foreach
배열 내부 항목들을 순회한다
foreach([자료형][내부변수이름] in [배열이름])
{}

foreach (int i in list)
{
    Console.WriteLine(i);
}

■ 2-6강 ~ 2-7강. 메서드와 구조체

○ 메서드란?
• 메서드(Method)는 일련의 코드 블록으로, 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위입니다.
• 코드의 재사용성과 모듈화를 위해 사용되며, 필요할 때 호출하여 실행됩니다.

○ 메서드의 역할과 중요성👍
1. 코드의 재사용성
: 메서드를 사용하면 동일한 작업을 반복해서 구현하지 않아도 됩니다. 필요할 때 메서드를 호출하여 작업을 수행할 수 있습니다.

  1. 모듈화
    : 메서드를 사용하여 코드를 작은 단위로 분리하고 관리할 수 있습니다. 각 메서드는 특정한 기능을 수행하므로 코드의 구조가 더욱 명확해집니다.

  2. 가독성과 유지보수성
    : 메서드를 사용하면 코드가 간결해지고 가독성이 좋아집니다. 또한. 코드 수정이 필요한 경우 해당 메서드만 수정하면 되므로 유지보수가 용이해집니다.

  3. 코드의 중복 제거
    : 반복적인 작업을 메서드로 묶어서 사용하면 코드 중복을 방지할 수 있습니다.

  4. 코드의 추상화
    : 메서드를 통해 작업 단위를 추상화하고, 메서드 이름을 통해 해당 작업이 어떤 역할을 하는지 파악할 수 있습니다.

○ 메서드의 구조와 문법
1. 메서드의 기본 구조
[접근제한자][리턴 타입] 메서드 이름
{
// 메서드 실행 코드
}

  1. 접근제한자(Access Modifier)
    : 메서드에 접근할 수 있는 범위를 지정합니다. 주로 public, private, protected 등을 사용합니다.

  2. 리턴 타입(Return Type)
    : 메서드가 반환하는 값의 데이터 타입을 지정합니다. 반환 값이 없을 경우 void를 사용합니다.

  3. 메서드 이름(Method Name)
    : 메서드를 호출하기 위해 사용하는 이름입니다. 호출할 때 이 이름을 사용합니다.

  4. 매개변수(parameters)
    : 메서드에 전달되는 입력 값으로, 필요한 경우 0개 이상의 매게 변수를 정의할 수 있습니다.

  5. 메서드 실행에 코드(Method Body)
    : 중괄호 ( { } ) 안에 메서드가 수행하는 작업을 구현하는 코드를 작성합니다.

○ 메서드 오버로딩👍
1. 오버로딩 개념과 활용
• 메서드 오버로딩은 동일한 이름의 메서드를 다양한 매개변수 목록으로 다중 정의하는 개념입니다.
• 매개변수의 개수, 타입, 순서가 다른 여러 메서드를 동일한 이름으로 정의하여 메서드 호출시 매개 변수의 형태에 따라 적절한 메서드가 선택되도록 할 수 있습니다.
• 반환값만 다른건 아무의미 없다. 매개변수만 중요

namespace Study_C_
{
    internal class Program
    {
        static int AddNumbers(int a, int b)
        {
            return (a + b);
        }
        static float AddNumbers(float a, float b)
        {
            return (a + b);
        }

        static int AddNumbers(int a, int b, int c)
        {
            return a + b + c;
        }
        
        static void Main(string[] args)
        {
            // 오버로딩 실습
            int sum1 = AddNumbers(10, 20);
            float sum2 = AddNumbers(10.5f, 21.5f);
            int sum3 = AddNumbers(10, 20, 30);        
        
        }
    }
}

○ 메서드 활용 사례
1. 메서드를 사용한 코드의 재사용성
• 메서드는 일련의 작업을 수행하는 코드 블록으로, 반복적으로 사용되는 코드를 메서드는 분리함으로써 코드의 재사용성을 높일 수 있습니다.
• 동일한 작업을 수행하는 코드를 여러 곳에서 사용해야 할 때, 해당 작업을 메서드로 정의하고 필요한 곳에서 메서드를 호출하여 재사용할 수 있습니다.
• 이를 통해 중복 코드를 제거하고, 코드의 길이를 줄이고, 코드의 가독성과 유지보수성을 향상 시킬 수 있습니다.

  1. 메서드를 활용한 가족성과 유지보수성 개선
    • 메서드는 코드의 일부분을 의미 있는 이름으로 추상화하고, 해당 메서드를 호출함으로써 코드의 의도를 명확히 전달할 수 있습니다.
    • 긴 코드를 작은 단위로 분리하여 메서드로 정의하면, 코드가 간결해지고 가독성이 향상됩니다.
    • 또한, 코드를 작은 단위로 분리하여 메서드로 관리하면, 유지보수가 용이해집니다. 특정 기능을 수정하거나 추가해야 할 때, 해당 메서드만 수정하면 되기 때문에 다른 부분에 영향을 주지 않고도 유지보수가 가능합니다.

○ 구조체란?
1. 구조체 개념
: 여러 개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위한 방법입니다.
• 구조체는 값 형식(Value Type)으로 분류되며, 데이터를 저장하고 필요한 기능을 제공할 수 있습니다.
• 구조체는 struct 키워드를 사용하여 선언합니다.
• 구조체의 멤버는 변수와 메서드로 구성될 수 있습니다.

  1. 구조체 사용
    • 구조체는 변수를 선언하여 사용할 수 있습니다.
    • 구조체의 멤버에는 접근할 때 . 연산자를 사용합니다.
Person person1
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();

0개의 댓글