12/29 본캠프#6

guno park·2023년 12월 29일
0

본캠프

목록 보기
6/77

강의 내용 정리

1주차

C# 언어의 특징

객체 지향 프로그래밍 언어이며, 안전하고 형식이 분명하다

강력한 형식 시스템과 가비지 컬렉션 기능을 제공한다
-강력한 형식 시스템 : 변수나 객체의 자료형이 미리 정의되어 있어 데이터 타입에 대한 안전성과 정확성이 보장됨
-가비지 컬렉션 기능 : 동적 할당된 메모리를 자동으로 회수해주는 기능
-C,C++,Java 등 다른 언어들과 문법 및 구조적으로 유사함

프로그래밍 기본 요소

메인메서드 프로그램 시작시 자동호출 하나가 필수적으로 포함되있어야됨

이스케이프 시퀸스 : 문자열 내에 특수한 문자를 포함시키기 위해 사용되는 특별한 문자 조합
여러 개가 있지만, 쓰다보면 외워질테니 알아만두자
이스케이프 문자

주석

주석은 코드의 설명이나 개발자간의 의사소통을 위해 사용함
주의할 점
1. 주석은 코드를 대체하지 않는다.
2. 주석의 내용은 정확하고 명확해아한다.
3. 주석은 업데이트 되어야 한다.
4. 주석은 필요한 경우에만 사용해야 한다.

변수와 자료형

변수를 세분화해서 사용하는 이유
1. 메모리의 효율적인 사용
세분화된 자료형을 사용하면, 해당 자료형이 필요한만큼 메모리를 할당하여 효율적인 사용 가능
2. 정확한 데이터 표현
3. 타입 안정성

리터럴

  1. 리터럴의 개념과 역할
    프로그램에서 직접 사용되는 상수 값으로, 소스 코드에 직접 기록되어 있음.
    float 사용할 때 10f 이렇게 f 붙이는 것처럼 사용함
  • 정수형 리터럴
    • 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 num1, num2, num3;
초기화도 한번에 가능
num1 = num2= num3 = 10
int num1, num2, num3 =10; > num3만 초기화됨

변수명

  1. 키워드는 사용 못함
  2. 식별자 - 변수,메서드,클래스.인터페이스 등에 사용되는 이름을 말함
    식별자를 사용할 때에는 다음과 같은 규칙을 따라야함
  • 첫문자는 알파벳, 언더스코어가 올수있다. 두번재 문자부터 알파벳,언더스코어,숫자가 올수잇음
  • 대소문자를 구분함, 키워드와 같은 이름으로 사용할 수 없음.
  1. 코드컨벤션 - 변수명 명명 규칙
  • 빈 줄 사용
  • 관련 없는 코드 사에이는 빈 줄을 사용하여 구분
  • 메소드 사이에 빈줄 두줄
  • 필드는 camelCase, 프로퍼티는 PaascalCase

형변환

명시적 형변환

int num1 = 10;
long num2 = (long)num1;
int를 long으로 명시적 형변환 num1이 long으로 바뀌는게 아니고num1의 값 10이 long으로 바뀌는거임

암시적 형변환

작은 데이터 타입에서 더 큰 데이터 타입으로 대입하는 경우
1. byte,short,char 등 작은 타입에서 int, long,float 등 더 큰 데이터 타입으로 대입 할때 발생
byte num1 =10;
int num2 = num1;
2. 리터럴 값이 대입되는 경우
float result = 1; 1은 int형 리터럴 값이지만 float형으로 암시적 형변환
3.정수형과 부동소수점형 간의 연산을 수행하는 결과
int num1 = 10;
float num2 = 3.14f;
float result = num1 + num2; //int형과 float형의 덧셈에서 float형으로 암시적 형변환

다중입력기초

예시) 숫자 두개 입력 받을 때
string input = Console.ReadLine();

string[] numbers = input.Split(' ')
//문자열을 공백으로 구분하여 배열로 만듬 ''안에 넣는거 기준으로 분할함
만약에 string[] numbers = ["1","2"]면 분리할 때 Split(',');
int num1 = int.Parse(numbers[0]); //명시적 형변환
int num2 = int.Parse(numbers[1]);

C#의 마법같은 키워드 'var' (익숙해지기 전까지 안쓰는걸 추천)

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

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

연산자와 문자열 처리

비트연산자

데이터의 비트 단위로 연산을 수행

int a = 0b1100; // 12 (2진수)
int b = 0b1010; // 10 (2진수)
int and = a & b; // 0b1000 (8) //AND (두 비트 값이 모두 1일 때 1 반환)
int or = a | b; // 0b1110 (14) //OR (두 비트 값중 하나라도 1일 때 1 반환)
int xor = a ^ b; // 0b0110 (6) //XOR (두 비트 값이 서로 다를 때 1 반환)
int c = 0b1011; // 11 (2진수)
int leftShift = c << 2; // 0b101100 (44) //비트를 왼쪽으로 2칸 밀어냄 = 뒤에 0 두개 붙임
int rightShift = c >> 1; // 0b0101 (5) //비트를 오른쪽으로 한칸 밈 = 소숫점 삭제
int d = 0b1100; // 12 (2진수)
int bit3 = (d >> 2) & 0b1; // 1 (3번째 비트) //d를 오른쪽으로 두칸 밀고 &

복합대입연산자

+= / -= /*= / /= / %= 모두 다 사용가능

증감연산자

++ / --
변수 앞에붙냐 뒤에붙냐로 전위형, 후위형이 나눠짐
++x 는 더하고 x를 사용, x++은 사용 끝나고 더함 (;뒤에서 더한다)

문자열 처리 기능 및 메서드

string str2 = new string('H',5); 문자 H를 5개로 구성된 문자열 생성

연결

string str1= "Hello";
string str2 = ",world";
str1 + str2;

검색

str.IndexOf("찾는 단어") 단어가 시작되는 지점의 숫자를 반환

대체

str.Replace("바꿀 단어","바뀔 단어")

변환

Parse 파스 / TryParse 트라이파스 되는지 안되는지 체크기능까지 겸함

문자열 값 비교

bool isEqual = str1 == str2; 이런거 편해서 좋아보임

문자열 대소 비교

.Compare -1,0,1로 나옴 앞이 뒤보다 작으면 -1 같으면 0, 소문자가 값이 더 큼
근데 유니코드로 쓰는거라 많이 쓸지 모르겠음.

문자열 포맷팅

형식화
string name = "John";
int age = 30;
string message = string.Format("my name is {0} and I'm {1} years old.",name,age); //뒤에 들어간 변수들을 0,1 차례대로 넣음

//////

2주차

조건문과 반복문

else 밑에 if가 한개면 괄호삭제가능 -> else if 가 된다. 그렇다

switch문에 모든 케이스문에 해당하지 않는 경우에 실행되는 코드는 default:
if문 할 때 else랑 같음

3항연산자 (조건식) ? 참일경우값: 거짓일경우값;

인덱싱

char input = Console.ReadLine()[0] //내가 뭘 입력해도 맨 첫번쨰것만가져옴

do-while (이거 좀 써보면 좋을 거 같음)

for문과 while문은 동작하지 않고 끝나버릴수도있다.
하지만 do-while문은 조건식을 검사하기전에 먼저 코드블록을 한번 실행한다
-> 한번은 무조건 실행된다.

do
{
//조건
}
while(조건식);

아까부터 만들던 입력값 제한하는거 조건걸때 이거 쓰면 괜찮을듯
그리고 조건되는 bool 따로 안만들고 break로 끝내버려도 될 듯
튜터님한테 물어봤는데 아까 쓰던 bool로 거는 것도 메이저한 방법이라 하심.

foreach

※foreach문 이후에도 계속 사용한다고 함
foreach문은 배열이나 컬렉션에 대한 반복문을 작성할 때 사용함

string[] inventory = { "검","방패","활","화살","물약");
foreach (string item in inventory)
{
	Console.WriteLine(item);
}

배열이나 콜렉션을 할때 자주 사용한다고 함.

배열

배열 = 동일한 자료형들에 대한 연속적인 자료 구조 = Array

  • 선언 방법 : 데이터 유형[] 배열 이름;
  • 초기화 방법 :배열이름 = new 데이터유형[크기];

배열이 나오면 거의 반복문이 나옴

다차원 배열 (꼭 꼭 기억해두자)

행과 열로 이루어진 표 형태와 같은 구조

int[,] array3 = new int[2,3] //2행3열의 int형 2차원 배열 선언
array[0,0] =1 //이런식으로 초기화할수도 있고
//선언과 함께 초기화
int[,] array2D = new int{{1,2,3,4},{5,6,7,8},{9,10,11,12}}
//3차원 배열 선언과 초기화
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}}
}

컬렉션

자료를 모아놓은 데이터 구조를 의미

List (이거 가장 많이 사용된다고 함)

특징

  • 가변적인 크기를 가짐
  • List를 생성할 때는 List에 담을 자료형을 지정
    리스트의 데이터 출력 주의사항 : Length가 없고 Count만 있음.
foreach(int number in numbers) //크기 호출할 때 List.Count 이렇게함
{
	Console.WriteLine(number);
}

사전형

	Dictionary<string, int> scores = new Dictionary<string, int>();
	score.Add("Alice",100);
	score.Add("Bob",80);
	score.Add("Charlie",90);
	score.Remove("Bob");
	foreach(KeyValuePair<string,int> pair in scores)
	{
	Console.WriteLine(pair.key+": " +pair.Value);
	}

선언할 때 매개변수를 가지고 선언됨, 이 경우 앞의 string = Key, 뒤에 숫자가 Value

Stack은 후입선출(LIFO)구조를 가진 자료
staic stack1 = new Stack();
stack.Push(1);
stack.Push(2);
stack.Push(3);
int value = stack1.Pop();

Queue는 선입선출(FIFO) 구조를 가진 자료 구조
Queue queue1 = new Queue();
queue1.Enqueu(1);
queue1.Enqueu(2);
queue1.Enqueu(3);
int value = queue1.Dequeue();

HashSet
중복되지 않은 요소들로 이루어진 집합 알아만 두자

주의점

배열과 리스트의 차이를 알고 적절히 사용하도록 하자
배열 > 리스트 갈때 차이점
1. 메모리 사용량 증가 : 동적으로 크기를 조정할 수 있어 더많이사용함
무분별하게 사용하면 성능 저하 유발
2. 리스트는 연결 리스트로 구현되기 때문에, 인덱스를 이용한 데이터 접근이 배열보다는 느리다. 엄청 느린건 아님
3. 코드 복잡도 증가 : 데이터 추가, 삭제등의 작업이 배열보다 간편하지만 이 유연성이 코드 복잡도를 증가시킬수있음.

메서드와 구조체

메서드

  • 반복되는 일련의 작업들을 하나로 뭉쳐둠 - 나중에 호출해서 재사용하기 편함 + 동작 수정을 한번만하면 됨
  • 코드를 왜 뭉치는지, 매개변수를 어떨때 사용하는지, 반환값이 왔을 때 어떻게하는지 파악해야됨
  • 코드의 재사용성과 '모듈화'를 위해 사용됨

메서드의 역활과 중요성

  • 코드의 재사용성
  • 모듈화
  • 가독성과 유지보수성
  • 코드의 중복제거
  • 코드의 추상화
    메서드를 통해 작업 단위를 추상화하고, 메서드 이름을 통해 해당 작업이 어떤 역할을 하는지 파악

메서드의 구조

[접근 제한자][리턴 타입] [메서드 이름] "(매개변수)"
{
//메서드 실행 코드
}
접근제한자 : public, protected(나랑 관련있는 애만), private

메서드 오버로딩 - 같은 이름 다른 동작의 메서드 오버로딩

동일한 이름의 메서드를 다양한 매개변수 목록을 다중 정의하는 개념
매개변수의 개수,타입,순서가 다르면 다른 메서드로 취급한다.
//매개변수 같고 반환값이 다른건 아무 의미가 없다.

void PrintMessage(string message)
{
Console.WriteLine("Message : " + message);
}
void PrintMessage(int number)
{
Console.WriteLine("Message : " + message);
}

반환값이 달라도 동일한 메서드로 취급함.

재귀호출 - 자칫 잘못하면 무한루프에 빠질 수 있는 재귀호출

재귀 호출은 메서드가 자기 자신을 호출하는 것을 의미
재귀 호출은 문제를 작은 부분으로 분할하여 해결하는 방법 중 하나

void CountDown(int n)
{
    if (n <= 0)
    {
        Console.WriteLine("Done");
    }
    else
    {
        Console.WriteLine(n);
        CountDown(n - 1);  // 자기 자신을 호출
    }
}
// 메서드 호출
CountDown(5);

호출 스택이 쭉 쌓였다가 해소되면서 메인으로 돌아옴

  • 재귀호출 명확히 멈출수 있게 해줘야됨, 안그러면 호출스택오버플로우 일어나서 뻗어버림
    알고리즘할때 재귀호출 많이쓴다함

구조체

우리만의 사용자정의
여러 개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위한 방법
구조체는 값형식,

struct Person
{
public string Name;
public int Age;

public void PrintInfo()
{
Console.WriteLine($"name : {Name}, Age: {Age}");
}
}

Person person1;
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();

enum 쓰던거랑 좀 닮은 듯 하다.

1주차 숙제 풀이

사용자로부터 입력받기

이건 그냥 강의 내용에 그대로 나오기 때문에 넘어간다.

간단한 사칙연산 계산기 만들기

사실 문제 자체 기능만 구현하는거면 되게 간단하게 했다.
근데 진짜 문제는 숫자 2개 입력한 후, 사칙연산 기호들을 입력하게 해놨는데
그 이외의 것이 입력됬을 때 다시 입력을 받게 하는 것이였다.
그래서 여러가지 시도하다가 이게 Unity랑 연동해서 하는거랑 많이 다르더라.
일일이 변수도 다 초기화한 후에 사용해야되고 그래서 많이 헷갈렸는데
문득 이 Main() 밖에다가 숫자 두개를 묻는 Method를 만들어보자 싶어서 만들어서 돌려봤는데
그게 돌아가서 어떻게 더 정리할 수 없나 하고 찾아보니 굳이 Main() 밖에 있을 필요가 없더라. 다시 넣어줬다. 내가 막힌 부분만 간단하게 정리하고 넘어가자.

 bool ok = false;
 string[] numbers = new string[2];
 while (ok == false) //'숫자'로 '2개'일때만 넘어가도록
 	{
		Console.Write("숫자를 입력해주세요. ex)5 5 :");
        string input = Console.ReadLine();
        numbers = input.Split(' ');
        if (numbers.Length != 2)
        	continue;
        bool check1 = int.TryParse(numbers[0], out num1);
        bool check2 = int.TryParse(numbers[1], out num2);
        if (!(check1 && check2))
        	continue;
		ok = true;
	}

일단 입력값 2개부터 검사해주고, 그 길이가 2개일 때 TryParse를 통해 입력받은 값들이 다 숫자인지 검사해주는 식으로 진행했다. 두 조건을 모두 만족했을 때 ok가 false가 되면서 반복문에서 빠져 나올수 있는 구조다.

남은 숙제들은 입력값 제한만 해둘 수 있으면 너무나 쉬운 문제라 따로 풀이하지 않는다. 대신 발생한 오류와 Math Class에 대해 포스팅하겠다.

코드 경로 중 일부만 값을 반환합니다.

(출처 : 상추님)
Method가 반환값을 가지고 있을 때에는 무조건 값이 반환되야된다.
근데 특정 조건에서만 값을 반환하고, 아닐때는 반환하지 않으면 이 오류가 발생하는 것 같다. 해결 방법은 어떤식으로든 값을 주면 해결된다.

Math Class

(출처 : [BeomBeomJoJo(https://afsdzvcx123.tistory.com/entry/C-%EB%AC%B8%EB%B2%95-C-Math-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%82%AC%EC%9A%A9-%EB%B0%8F-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A2%85%EB%A5%98)]
수학 함수가 담겨있는 클래스이다. 자세히 외우지 않아도 알아두면 유용하게 많이 써먹을 수 있는 클래스라서 나중에 꺼내보려고 포스팅한다.

코딩 팁

콘솔앱에서 빌드하고 실행하기

빌드하기 : 빌드 - 빌드 솔루션 or F6
실행하기 : 디버그 메뉴에서 Start Without Debugging을 선택하거나 ctrl+ F5를 누른다
왼쪽에 빨간점 누르거나 코드에 대고 F9누르면 한칸한칸 이동시키면서 확인가능
시작방법은 f5
디버그 할 때 호출스택, 조사식 보면 좋음.
비유하자면 F9정류장만들기 F10버스이동
디버깅할 때 F10은 메소드는 안파고듬 F11써야됨 끌때 쉬프트 F5

intellisense

※메서드나 변수를 입력하는 도중에 crtl + spcae를 눌러 intellisense를 호출하면 해당 메서드나 변수에 대한 정보와 예제를 볼수있음

readline은 항상 string값으로 돌려준다.

중복된 코드는 좋지 않음.

**스위치문에서 중복된 부분은 붙여서 쓰면 동일한 처리가됨

case 10:
case 9:
playerRank
break;**

※분명 계산하면 정수로 딱 안떨어지는데 그렇게 될 경우에는
둘다 int라서 안되는 경우가 있다. 그럴때는 둘중 double/float로 만들어주자.

여러줄 주석처리하기

//처리 : Ctrl + k + c
/*처리 : Ctrl + Shift + /

Random

코딩 하다보면 Random 많이 써야될 때가 있다. 그럴때마다 Random.randomragne하기 그러니까 이걸 선언해서 쓰는 방법이 있더라

Random rand = new Random();
for (int i = 0; i < playerStats.Length; i++)
{
  playerStats[i] = rand.Next(1, 11);
}

근데 기억 안나면 그냥 쓰던대로 써도 괜찮을 것 같다.

학습 팁

강의에서 나온 학습 팁들이 몇개 있길래 적어나보자

코드 템플릿을 처음 공부할 때는 많이 쓰지 말자

예를 들어 for를 작성할때 키워드 입력하고 탭 두번 누르면 기본적인 코드 템플릿이 자동 생성하는데 for문의 구조도 익히고 해야되니 그렇다. 근데 for문말고 쓸 줄 모른다.

공부를 시작하는 여러분에게 해주고 싶은 말

  1. 무엇일까 고민하는 것보다 중요한 것은 왜에 집중하는 것
    키워드는 "의도", 우리는 자동차가 무엇인지? 어떻게 굴러가는지보다 브레이크를 왜 밟아야 하는지를 먼저 학습한다.

2.빠르게 실패하기
얼마나 좋은 코드를 작성했는가 보다 얼마나 많은 코드를 접해보고 오류를 해결해 보았는지가 진정한 실력으로 이어진다.
새로운 코드를 만난다면 이게 좋은지 나쁜지 찍먹을 해봐야한다.

0개의 댓글