2주차(2) - C# 문법 강의 2주차 내용
1. 코드 버스정류장 만들기(디버깅 방법)
원하는 줄에가서 왼쪽클릭, 혹은 F9입력
해당 줄을 기준으로 스크립트가 멈춘다
F10을 누르면 다음 작동 지점까지 넘어간다.
▲[이거 정말 유용했다. Debug.Log만 쓰던 나한테는 신세계가 열린 느낌]
2. 3항 연산자(if else로 완벽하게 대체 가능)
(조건식) ? 참일 경우의 값 : 거짓일 경우의 값;
ex)
int x = 1200;
int y = 2000;
string result = (x >=y ) ? "x가 더 크다" : "y가 더 크다"
Console.WriteLine(result);
위를 if else문으로 써보면
if(x >= y)
{
Console.WriteLine("레벨업 가능");
}
else
{
Consloe.WriteLine("레벨업 불가능")
}
3.switch case 문 팁
2개의 case가 있으나 결과는 똑같은 경우
case 10:
case 9:
result = "10~9"
break;
와 같이 작성해도 괜찮다.
4.Console.ReadLine(); 맨 앞에 입력한 한글자만 가져오기
char input = Console.ReadLine()[0]; 인덱싱을 통해 가져올 숫자의 순서를 입력해준다.
5.알파벳인지 판별하기
나는 이때까지 유니코드로만 판별할 수 있는줄 알았는데 아니였다.
if((input >= 'a' && input <= 'z') ||(input >= 'A' && input <= 'Z'))
이런식으로 조건에 직접 알파벳을 입력해도 가능하더라..
한글도 가능한진 모르겠다.
6.for 문 반복을 수정할 때(강의 보다가 궁금해져서 튜터님에게 질문함)
for문 자체를 수정한다면 혼란스러우니
for문의 조건에 큰 변화가 필요하다면
for문이 반환하는 결과값을 수정해줘도 괜찮다.
7.for 반복문이 끝났을 때 i의 값을 쓰고싶다면?
for문의 밖에 변수를 선언하여 주고 해당 변수를 i 대신 쓰면 된다.
8.while문 조건식이 참인경우에 코드를 반복적으로 실행
for문은 반복 횟수를 정해놓고 쓰기 좋다면
while문은 ~~가 될때까지 를 정해놓고 쓰기 좋다.
요약하자면 둘 다 동일한 역할을 하는 코드지만
조건이 더 중요한 경우는 while
회차가 더 중요한 경우는 for
을 사용하면 좋다.(코드를 직관적으로 이해할 수 있도록)
예시)자주 쓰는 while문 코드
int count = 0;
while (count < 10)
{
Console.WriteLine("적을 처치했습니다! 남은 적 수 : " + (10 - count - 1));
}
Console.WriteLine("축하합니다! 게임에서 승리하셨습니다!");
9.do while 조건이 맞건 맞지않던 최초에 한번은 실행하는 반복문 코드가 필요한 경우
예시)
do
{
Console.Write("숫자를 입력하세요 (0 입력 시 종료) : ");
num = int.Parse(Console.ReadLine());
sum += num;
}
while (num != 0);
Console.WriteLine("합계 : " + sum);
10.foreach문
특정한 배열이나 컬렉션을 기준으로 보는 반복문
예시)
string[] inventory = {"검", "방패", "활", "화살", "물약" };
foreach(string item in inventory) //리스트 데이터 출력
{
Console.WriteLine(item);
}
11.중첩 반복문
for 5번 반복문
{
for 3번 반복문
}
내부의 3번 반복문을 5번 반복하는 코드가 된다.
행, 열 기준으로 반복할 때 자주 사용
12.break와 continue
break : 자기를 감싸고 있는 반복문 '하나'를 탈출
이중 반복문이였다면 바깥의 반복문은 탈출하지 않음.
continue : 반복문을 탈출하는것이 아닌 이번 회차만 넘기고
증감으로 떠남 (해당 회차에서 continue 아래의 코드는 무시한다.)
기초 예시)
for (int i = 1; i <= 10; i++)
{
if (i % 3 == 0) //
{
continue; // 3의 배수인 경우 다음 숫자로 넘어감
}
Console.WriteLine(i);
if (i == 7)
{
break; // 7이 출력된 이후에는 반복문을 빠져나감
}
}
응용 예시
int sum = 0;
while (true)
{
Console.Write("숫자를 입력하세요: ");
int input = int.Parse(Console.ReadLine());
if (input == 0)
{
Console.WriteLine("프로그램을 종료합니다.");
break;
}
if (input < 0)
{
Console.WriteLine("음수는 무시합니다.");
continue;
}
sum += input;
Console.WriteLine("현재까지의 합: " + sum);
}
Console.WriteLine("합계: " + sum);
여기서 while (true) 로 while 의 무한루프를 사용했는데
for 문도 동일하게 for(;;)로 무한루프가 가능하다(조건 제거)
13. 배열(동일한 자료형이 연속적으로 저장된 것)
인덱스를 사용할땐 항상 0부터 시작
14. 계산
반환값과 계산식에 사용한 자료형이 다르다면
숫자의 경우 double = int + int 라면
결과값이 int만 나오므로
둘 중 하나는 반드시 double로 바꿔주어야 정상적인 값이 나온다.
15.배열
인상적인 부분없어서 스킵
16.다차원 배열 = 맵을 만들 때 자주 사용한다.)
여러 개의 배열을 하나로 묶어 놓은 배열
예시(2차원 배열)
int[,] array2D = new int[3, 4];
라고 한다면 3개의 배열이 있고, 각 배열은 4개의 방을 가진다는 뜻이다.
바로 초기화 시 형태
int[,] array2D = new int[3, 4] {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
예시2(3차원 배열) + 초기화 == 2개의 집에 3개의 방, 각 방에 4명의 사람이 있는 것
int[, ,] array3D = new int[2, 3, 4]
{
{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}, {{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}
}
배열은 인덱싱만 주의해주면 문제없다.
다차원 배열에는 for문이 거의 필수적으로 따라오네
17.(Collection)컬렉션
자료를 모아 놓은 데이터 구조
System.Collections.Generic 네임스페이스가 필요하다
배열과는 다르게 가변적임
1)List
가변적인 크기를 가진 배열과 유사한것
List를 생성할 때는 List에 담을 자료형을 지정
List는 Length가 존재하지 않는다.
반복문을 돌릴 땐 count를 사용함.
x.add 로 리스트에 추가하고
x.Remove 로 리스트에서 제거함
예시
List<int> nums = new List<int>();
num.Add(1);
num.Add(2);
num.Add(3);
num.Remove(2);
foreach(int num in nums) // nums라는 List에 있는 값들을 num으로 하나씩 꺼내오겠다
{
Console.WrutLine(num)
}
예시 2
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Remove(2);
foreach(int i in list)
{
Console.WriteLine(i); // 1,3
}
for(int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
2)Dictionary
키값과 밸류값이 쌍을 이루어 데이터를 저장
Dictionary<string, int> scores = new Dictionary<string, int>(); // 빈 딕셔너리 생성
scores.Add("Alice", 100); // 딕셔너리에 데이터 추가
scores.Add("Bob", 80);
scores.Add("Charlie", 90);
scores.Remove("Bob");
foreach(KeyValuePair<string, int> pair in scores) // 딕셔너리 데이터 출력
{
Console.WriteLine(pair.Key + " : " + pair.Value);
}
키값을 사용한다는걸 제외하면 List와 사용 방법이 유사함
3)Stack
후입 선출(LIFO) 구조를 가진 자료 구조
바구니를 생각하면 된다.
먼저 들어온 자료가 바닥부터 쌓이고,
나중에 들어온 자료가 내보낼 때 먼저 나간다.
Stack<int> stack1 = new Stack<int>(); //int형 Stack선언
//요소 추가(Push == Add)
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);
//요소 가져오기
int value = stack1.Pop(); // 제일 마지막에 추가한 3부터 나온다.
4)Queue
선입 선출(FIFO) 구조를 가진 자료 구조
파이프라고 생각하면 된다.
먼저 들어온 자료가 출구로 밀어지며
먼저 들어온 순서대로 불러올 때 보내지는 것
Queue<int> queue1 = new Queue<int>(); //int형 Queue선언
//요소 추가(Enqueue == Add)
stack1.Enqueue(1);
stack1.Enqueue(2);
stack1.Enqueue(3);
//요소 가져오기
int value = queue1.Dequeue(); // 제일 먼저 추가한 1부터 나온다.
5)HashSet
'중복되지 않은' 요소들로 이루어진 집함
HashSet<int> set1 = new HashDet<int>(); //선언
//요소 추가(List와 동일)
set1.Add(1);
set1.Add(2);
set1.Add(3);
//요소 가져오기
foreach(int element in set1)
{
Console.WriteLine(element);
}
18.배열과 리스트
리스트가 가변적이라 더 편한거 아닌가? 아니다.
리스트가 배열보다 메모리를 더 먹는다.(동적이므로)
연결 리스트로 구현하므로 데이터 접근 시간이 오래 걸린다.
유연함 = 코드 복잡해짐 = 유지보수성이 저하
정리하자면 배열 = 데이터 여러개 묶어놓은거임
19.메서드와 구조체
내용 정리 - 메서드를 호출하고 반환값과 매개변수를 사용하는 방법을 알아보고
오버로딩에 대해 이해하며, 구조체에 대해서 확인
메서드 = 하나의 목적을 가진 코드들을 한 묶음으로 만들겠다.
우리가 잘 아는 함수임.
매개변수 = 메서드에서 사용할 수 있는 값을 호출자한테 받아오는거임
함수이름(이곳이 매개변수가 들어가는곳, 자료형 + 변수이름 지정)
여러개 받아올 수 있다.
반환값 = 리턴 타입
보통 보이는 void 부분이다.
해당 경우에는 메서드에 반드시 return 반환값이 포함되어야 함.
반환값은 리턴 타입과 같은 자료형이여야 함
예시
int ExFs(int num)
{
sum = num +3
return sum;
}
*디버그 체크 후 F11은 지정 코드 파고들기임
20.메서드 오버로딩
같은 이름 다른 동작의 메서드 오버로딩
메서드 오버로딩이란?
매개변수의 개수, 타입, 순서가 다른 여러 매서드를 동일한 이름으로 정의한 메서드가
매개변수의 형태에 따라 적절하게 선택되도록 할 수 있다.
메서드의 기능이나 작업은 동일하지만, 입력값에 따라 다르게 동작해야하는 경우 사용한다.
예시
void PrintMsg(string message)
{
Console.WriteLine("Message : " + message);
}
void PrintMsg(int number)
{
Console.WritLine("Number : " + number);
}
//특정 위치에서 호출
PrintMsg("string매개변수를 가진 PrintMsg를 호출함");
PrintMsg(10); // int 매개변수를 가진 PrintMsg를 호출함
반환값은 달라도 동일한 메서드로 취급한다.
하지만 매개변수는 순서, 자료형, 개수 뭐든 하나라도 달라야 한다.
21. 재귀 호출
자기가 자기를 호출하는것
잘못한면 스택 오버플로우 생김
종료 조건을 꼭 넣어야 한다.
구조가 살짝 반복문이랑 비슷함
예시)
void CountDown(int n)
{
if (n <= 0)
{
Console.WriteLine("Done");
}
else
{
Console.WriteLine(n);
CountDown(n - 1); // 자기 자신을 호출
}
}
// 메서드 호출
CountDown(5);
활용 사례
// 원의 넓이를 계산하는 메서드
double CalculateCircleArea(double radius)
{
double area = Math.PI * radius * radius;
return area;
}
// 사각형의 넓이를 계산하는 메서드
double CalculateRectangleArea(double width, double height)
{
double area = width * height;
return area;
}
// 메서드 활용
double circleArea = CalculateCircleArea(5.0);
double rectangleArea = CalculateRectangleArea(3.0, 4.0);
Console.WriteLine("원의 넓이: " + circleArea);
Console.WriteLine("사각형의 넓이: " + rectangleArea);
22.struct구조체
여러 개의 데이터를 묶어서 하나의 사용자 형식으로 만들기 위한 것
멤버 변수를 필드, 멤버 함수를 메서드라 부른다
struct Person
{
public string Name;
public int Age;
public void PrintInpo()
{
Console.WritLine($"Name : (Name), Age: (Age)");
}
}
Person person1
person1.Name = "dd";
person1.PrintInpo();
쉽게 말하면 사용자가 직접 생성하고, 사용하는 자료형이다