c# 18

간단한 Snake 게임 만들기1

C#과 콘솔을 이용해서 간단한 Snake 게임을 만들어보려고 한다. 시작하면 뱀의 머리가 생성되고 음식을 먹으면 늘어나는 간단한 게임이다. 벽도 몇 개 랜덤으로 생성해주려고 한다. 구현은 Point, Snake, Map, Wall, FoodCreator 5가지 클래스를 중심으로 만드려고한다. Point 클래스는 x, y 좌표와 해당 점에 그려질 문자를 필드로 가지고 있다. 점을 콘솔에 그리고 지우는 메소드도 가지고 있다. public class Point { public int x; public int y; public string sym; public Point(int x, int y, string symbol) { this.x = x; this.y = y; sym = symbol; } public v..

부트캠프 2023.08.16

C# 제네릭과 var, dynamic

코드를 작성하다보면 타입만 달라지고 기능은 똑같은 메소드나 클래스등을 만들 경우가 있다. 매번 오버로드하기엔 코드 중복이 너무 많이 되고 들어오는 모든 타입을 확실히 모를 경우도 있다. 그럴 때 일반적으로 쓰기 위한 제네릭 프로그래밍 C#에서는 어떻게 하는지 알아봤다. ●Generic 제네릭 Class 만들기 class GenericClass() { } 이런 방식으로 선언한다. 인스턴스화는 new GenericClass()와 같이 사용한다. 형식 매개 변수라고 불리는 T는 런타임에 인스턴스화 할 때 주어진 타입으로 구체화된다. 클래스 전체에 제네릭이 필요한 것이 아니라면 특정 메소드만 제네릭으로 선언할 수도 있다. void GenericMethod(T arg) { } 위와 같이 선언하고 호출할때 Gene..

부트캠프 2023.08.14

정규표현식

문자열을 처리할 때 string 클래스도 좋지만 특정한 패턴을 추출하고 싶을 때가 있다. 이럴 때는 정규표현식을 사용하면 좋다. 정규표현식은 특정한 형식의 문자열의 집합을 표현하는 형식 언어다. 쉽게 말하면 문자열의 패턴을 표현하는 방법이다. . ^ $ * + ? {} [] \ | () 다음과 같은 메타문자를 사용해서 여러 패턴을 표현한다. . : 와일드카드다. 줄바꿈 문자 \n을 제외한 모든 문자를 나타낼 수 있다. ^ : 문자열의 시작을 뜻한다. ^s 는 시작이 s인 문자열이다. []나 () 안에서 사용된다면 반대의 의미인 NOT이라고 생각하면 된다. 그 문자가 아님을 나타낸다. $ : 문자열의 끝을 뜻한다. e$는 e로 끝나는 문자열이다. 시작과 끝은 주어진 전체 문자열의 시작과 끝을 의미한다. "..

부트캠프 2023.07.24

C# ref, out, in, 박싱과 언박싱

C#을 하다보면 자주 쓰게 되는 ref, out, in 키워드. 정확히 어떤 역할일까? 이 셋은 매개변수 한정자라고 한다. 글자 그대로 매개변수를 어떤 역할로 한정시켜준다. ●ref C++에서 & 참조 연산자와 비슷한 역할이다. ref 키워드를 사용하면 call by reference를 명시적으로 할 수 있다. ref 키워드를 붙이면 기존 변수의 별명이 되어서 수정하게 되면 원래 변수도 변하게 된다. 이름만 다르지 기존 변수 그대로 가져다 쓴다고 생각해도 된다. 값 타입의 경우 명시적으로 call by reference가 되니 확실한 차이가 있다. 참조타입처럼 원본이 수정될 수 있다는 점도 있겠지만 또 하나 중요한 것은 boxing이 일어나지 않는다는 것. 이점 때문에 참조 타입과 다르다. ※ boxin..

부트캠프 2023.07.19

C# 문자열 보간($)

문자열을 매번 작성할 때마다 변수와 + 를 이용하니 너무 불편하다. 예전에 한 번에 작성하는 방법이 있었던 걸로 기억해 찾아보니 문자열 보간이라고 한다. 문자열 보간은 C#6.0부터 이용 가능하다. 사용하는 방법은 간단하다. 큰따옴표 앞에 $를 붙인다. 사용할 변수는 {}로 감싸준다. $"제 이름은 {name} 입니다." 와 같이 사용하면 name 변수에 해당하는 값이 들어간 문자열이 된다. 여기서 형식 지정과 정렬도 지정해줄 수 있다. {:} {,} {,:} 위와 같은 방법으로 작성하면 된다. 자세한 건 microsoft 문서를 참조하자. https://learn.microsoft.com/ko-kr/dotnet/csharp/tutorials/string-interpolation C#의 문자열 보간 문자..

부트캠프 2023.07.18

C# Nullable Reference Type

코드를 작성하다보니 CS8600 경고 코드를 마주하게 되었다. string str = Console.ReadLine(); 바로 이 코드에서 발생하게 되는 경고 메시지. 찾아보니 ReadLine() 메소드를 통해 null값이 들어올 수 있기에 생기는 경고 메시지라고 한다. 참조 타입으로 null 값이 리턴되어 예외가 나는 경우가 많았기에 C# 8.0부터 Nullable Reference Type을 도입했고 컴파일러가 위처럼 경고해주게 되었다. 경고 기능은 전처리 구문으로 원할 때 사용할 수 있다. Nullable Reference Type은 기존 타입에서 ?를 붙여서 이 타입이 Nullable 하다는 것을 나타낸다. string? str = Console.ReadLine(); 위와 같이 사용하고 str에 ..

부트캠프 2023.07.18

C#에서 클래스의 크기와 메모리 패딩

멤버가 존재하지 않는 클래스를 만들다가 문득 궁금증이 들었다. 이렇게 텅 빈 클래스는 메모리에 어떻게 할당되는거지? 그래서 직접 찾아보았다. 먼저 C#의 모든 클래스는 object를 상속받는다. 계층 구조에서 루트를 차지하는 클래스가 되겠다. 때문에 비어있는 클래스를 만들면 object 클래스와 같은 크기를 가진다. object 클래스가 차지하는 크기는 x64를 기준으로 24바이트다. object 배열을 만들어 디버그 모드에서 직접 메모리를 확인해본 결과 24바이트 단위로 객체가 들어가 있었다. 왜 24바이트인지 검색해보니 16바이트의 오버헤드와 8바이트의 여유공간이 있다고 한다. 여유 공간인 8바이트는 실제 데이터가 들어갈 수 있다고 한다. 오버헤드 부분은 정확히 어떤 데이터가 어떻게 들어가있는지는 알..

부트캠프 2023.07.18

C# Convert vs Parse(TryParse)

C# 에서 Convert와 Parse는 어떤 차이가 있을까? ●Convert Boolean, Char, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Double, Single, Decimal, DateTime, String 과 같은 기본 형식으로 또는 기본 형식끼리 변환할 수 있다. null일 경우 0값을 리턴한다. ●Parse String을 해당하는 형식으로 변환할 수 있다. null일 경우 null exception 예외를 리턴한다. ●TryParse 변환이 가능할 경우 out 연산자를 통해 해당 변수에 값을 집어넣고 true값을 리턴한다. null일 경우 out 연산자를 통해 해당 변수에 0값을 집어넣고 false 값을 리턴한다.

부트캠프 2023.07.18