○ 학습 목표
○ 학습 회고
○ TIL 작성계획
○ TIL 작성후기
○ C# 특징
○ 강력한 형식 시스템
○ 가비지 컬렉션 기능 👍
• 자동완성 기능 IntelliSense 👍
○ using System;
○ namespace
○ class Program
○ static void Main()
○ 출력문
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
○ 입력문
○ Escape Squence
○ 변수를 세분화 해서 사용하는 이유
1. 메모리의 효율적인 사용
: 세분화된 자료형을 사용하면, 해당 자료형이 필요한 크기만큼의 메모리를 할당하여 메모리의 효율적인 사용을 가능하게 함.
2. 정확한 데이터 표현
: 세분화된 자료형을 사용하면, 데이터의 특성에 따라 정확한 표현이 가능. 예를 들어, 부동소수점 자료형인 float과 double은 소수점 이하 자릿수가 다르며, 각각의 자료형은 다른 범위의 값까지 표현이 가능.
3. 타입 안정성
: 세분화된 자료형을 사용하면, 코드의 타입 안정성을 유지할 수 있음. 예를 들어, 정수형 자료형으로 byte를 사용하면, 해당 자료형이 가질 수 있는 값의 범위를 벗어날 경우 오류가 발생하므로, 코드의 안정성을 보장 할 수 있음.
○ 리터럴
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)
• "문자열 내 "따옴표" 사용하기 "
• @"문자열 내 개행 문자 사용하기 "
○ C# 일반적인 코드 컨벤션 👍
1. 필드는 카멜
2. 프로퍼티는 파스칼
3. 메서드는 파스칼
○ 형변환
1. 명시적 형변환
• 주석 단축키👍 : 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 키워드
• 변수 선언할 때 사용
• 변수의 자료형이 컴파일러에 의해 자동으로 결정됨.
• 즉, 초기화하는 값의 자료형에 따라 변수의 자료형이 결정 됨.
○ 문자열 처리 기능 및 메서드
string str1 = "Hello, World!"; // 리터럴 문자열 사용
string str2 = new string('H', 5); // 문자 'H'를 5개로 구성된 문자열 생성
string str = "Hello, World!";
string[] words = str.Split(',');
// 이 코드는 str문자열을 쉼표로 구분하여 분할한 문자열 배열 words를 생성
string str = "Hello, World!";
int index = str.IndexOf("World);
// 이 코드는 str 문자열에서 "World" 문자열의 첫 번째 인덱스를 찾아 index 변수에 저장 함
string str = "Hello, World!"
string newStr = str.Replace("World", "Universe");
// 이 코드는 str 문자열에서 "World" 문자열로 대체한 새로운 문자열 newStr을 생성 함
string str = "123";
int num = int.Parse(str);
// 이 코드는 문자열 str을 정수형 숫자로 변환 한 후, num 변수에 저장 함
• 숫자 -> 문자열
int num = 123;
string str = num.ToString();
// 이 코드는 정수형 숫자 num을 문자열로 변환한 후, str 변수에 저장 함
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);
string name = "John";
int age = 30;
string message = $"My name is {name} and I'm {age} years old.";
이미 알고 있던 내용이므로 간단한 예제 몇개만 작성하겠습니다.
// 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);
}
}
○ 배열 선언 형태
• 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);
}
○ 메서드란?
• 메서드(Method)는 일련의 코드 블록으로, 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위입니다.
• 코드의 재사용성과 모듈화를 위해 사용되며, 필요할 때 호출하여 실행됩니다.
○ 메서드의 역할과 중요성👍
1. 코드의 재사용성
: 메서드를 사용하면 동일한 작업을 반복해서 구현하지 않아도 됩니다. 필요할 때 메서드를 호출하여 작업을 수행할 수 있습니다.
모듈화
: 메서드를 사용하여 코드를 작은 단위로 분리하고 관리할 수 있습니다. 각 메서드는 특정한 기능을 수행하므로 코드의 구조가 더욱 명확해집니다.
가독성과 유지보수성
: 메서드를 사용하면 코드가 간결해지고 가독성이 좋아집니다. 또한. 코드 수정이 필요한 경우 해당 메서드만 수정하면 되므로 유지보수가 용이해집니다.
코드의 중복 제거
: 반복적인 작업을 메서드로 묶어서 사용하면 코드 중복을 방지할 수 있습니다.
코드의 추상화
: 메서드를 통해 작업 단위를 추상화하고, 메서드 이름을 통해 해당 작업이 어떤 역할을 하는지 파악할 수 있습니다.
○ 메서드의 구조와 문법
1. 메서드의 기본 구조
[접근제한자][리턴 타입] 메서드 이름
{
// 메서드 실행 코드
}
접근제한자(Access Modifier)
: 메서드에 접근할 수 있는 범위를 지정합니다. 주로 public, private, protected 등을 사용합니다.
리턴 타입(Return Type)
: 메서드가 반환하는 값의 데이터 타입을 지정합니다. 반환 값이 없을 경우 void를 사용합니다.
메서드 이름(Method Name)
: 메서드를 호출하기 위해 사용하는 이름입니다. 호출할 때 이 이름을 사용합니다.
매개변수(parameters)
: 메서드에 전달되는 입력 값으로, 필요한 경우 0개 이상의 매게 변수를 정의할 수 있습니다.
메서드 실행에 코드(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. 구조체 개념
: 여러 개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위한 방법입니다.
• 구조체는 값 형식(Value Type)으로 분류되며, 데이터를 저장하고 필요한 기능을 제공할 수 있습니다.
• 구조체는 struct 키워드를 사용하여 선언합니다.
• 구조체의 멤버는 변수와 메서드로 구성될 수 있습니다.
Person person1
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();