CS 25

string.Format()을 보간 문자열로 대체하라

개발을 하다 보면 정말 많이 사용하는 것이 바로 문자열입니다. 보통 문자열을 표현할 때에는 정말 순수하게 문자열만 표현할 수도 있지만, 간혹 숫자와 같이 작성하거나 다른 특수 기호와 함께 사용되어야 할 때에도 많이 존재하는데요. C#에서는 조금 더 편리한 기능을 제공하는 보간 문자열에 대해서 알아보고자 합니다. 보간 문자열? 이름이 되게 어색하게 들릴 수 있지만 C# 6.0에 도입된 기능입니다. 제일 좋은 것은 바로 코드 가독성이 대폭 향상됩니다. 코드 가독성이 향상되었다는 것은 미연에 개발자의 실수를 줄이고 조금 더 복잡한 문제에 집중할 수 있게 된다는 뜻도 있습니다. 기존에 널리 사용되었던 string.Format() 또한 문자열 변환 과정을 잘 수행하지만, 생성된 문자열을 직접 출력해보고 올바른 형..

CS/Effective C# 2023.05.06

캐스트보다는 is, as가 좋다

캐스트의 경우에는 스타크래프트로 따지면, 드랍쉽에는 여러 유닛을 태울 수 있는데요. 여러 유닛의 각 특징들의 메서드(행동)를 가져오려고 할 때 그 유닛으로 캐스팅을 해야 그 유닛의 고유의 능력이나 행동을 가져올 수 있습니다. 그럴 때 캐스트가 필요하게 되는데요. 캐스트에 대해서 어떻게 하면 더 효율적으로 사용할 수 있는지에 대해서 알아봅시다. C#은 정적 타이핑을 수행하는 언어입니다. 그래서 보통 판단은 정적으로 하려고 하는데요. 위와 같은 상황에서 런타임에서(게임 실행 중)에 반드시 타입을 확인해야할 필요가 있는 경우가 있습니다. C#에서는 2가지 캐스트를 지원합니다. 1. as 연산자를 사용하는 방법 (더 방어적으로 사용하는 is 연산자로 형변환이 가능한지를 확인한 후에 실제 형변환 진행) 2. 일반..

CS/Effective C# 2023.05.06

const보다는 readonly가 좋다.

간혹 성능을 위해서 상수형을 작성하게 될 때 엄청난 고민을 하게 됩니다. 이때 누구는 const를 쓰고, 또 누구는 readonly를 쓰고 있습니다. 어떨 때 이걸 쓰고, 또 어떨 때 이걸 쓰는지 코드를 작성하다 보면 고민이 깊어져 2시간가량을 먹었던 기억이 있습니다. 그 답 오늘 해결해봅시다! C#은 컴파일타임 상수와 런타임 상수 2 유형의 상수를 가집니다. 컴파일타임 상수는 const를 의미하고, 런타임 상수는 readonly를 의미합니다. // 컴파일타임 상수 public cosnt int Millennium = 2000; // 런타임 상수 public static readonly int ThisYear = 2004; 컴파일타임 상수가 약간 더 빠르긴 하지만, 런타임 상수에 비해서 유연성이 떨어집니..

CS/Effective C# 2023.04.23

지역변수는 var를 사용하는 것이 낫다.

최근에 인턴으로 들어오신 팀원이 지난 주에 직군 면접을 봤었습니다. 직군 면접에 대해서 이것저것 얘기하다 보니 생각난 것이 있습니다. 바로 Effective C#인데요. 사수님께서 입사 후 제일 먼저 사주신 책입니다. 예전에 직군 면접 보기 전에 한번 정독했던 기억도 나고, 블로그에 정리하면서 내실을 다지는 것이 어떨까하여 시작합니다. 가장 흥미로우면서도 편리한 var 에 대해서 설명하는 단원이네요. 득 보다 실이 많다. 정확한 반환 타입을 알지 못한 채 올바르지 않은 타입을 명시적으로 지정하게 되면 오히려 손해라는 뜻입니다. 극단적으로 값 타입을 object 형으로 받아버리는 것도 마찬가지죠. 버그가 발생하여 유지보수를 하려고 할 때에 많은 코드 분석을 하게 됩니다. 이럴 때 너무 긴 코드는 오히려 집..

CS/Effective C# 2023.04.23

접두어 방식과 접미어 방식의 차이

어떤게 더 좋을까? // 접미어 for (int i = 0; i < n; i++) { ... } // 접두어 for (int i = 0; i < n; ++i) { ... } 접미어 방식이나 접두어 방식 모두 논리적으로는 아래 블록으로 들어오게 되면 i 자체는 논리적으로 모두 +1씩 증가하게 됩니다. 접미어 방식과 접두어 방식의 선택이 프로그램의 행동에 영향을 주지 않더라도, 이런 선택이 때때로는 실행 속도에 작게 나마 영향을 준다고 합니다. 접미어 방식은 1. 값의 복사본을 만든다. 2. 복사본의 값을 증가시킨다. 3. 복사본을 리턴한다. 접두어 방식은 1. 값을 증가시킨다. 2. 그 값을 리턴한다. 복사본을 만든다는 과정의 차이가 생깁니다. 복사본이라는 것은 작은 프리미티브 타입이라면 괜찮으나, 사용자..

CS/C++ 2023.03.05

[C#] 무명 형식, 인터페이스와 프로퍼티, 추상 클래스의 프로퍼티

프로퍼티의 마지막 시간입니다. 무명 형식, 인터페이스와 프로퍼티, 추상 클래스의 프로퍼티 배울 것이 많아 보입니다. 빠르게 공부해봅시다! # 무명 형식 (Anonymous Type) 제목 그대로 이름이 없는 형식을 무명 형식이라고 합니다. 보통은 임시로 사용하는 경우 특별히 다시 사용하지 않기 때문에 람다처럼 이름을 붙이지 않습니다. 무명 형식은 형식의 선언과 동시에 인스턴스를 할당합니다. 인스턴스를 만들고 다시는 사용하지 않을 때 무명 형식이 요긴합니다. var tempInstance = new {Name = "나, 무명", Age = 20}; 무명 형식의 프로퍼티에 할당된 값은 변경 불가능합니다. 읽기만 가능하죠. 나중에 LINQ(링큐)에서 요긴하다고 합니다. using System; namespac..

CS/C# 2021.12.21

[C#] Record 와 Property

프로퍼티 두 번째 시간입니다. # 프로퍼티란? 레코드에 들어가기 전에 참조 형식과 값 형식에 대해서 잠깐 언급하고 가보겠습니다. 값 형식은 필드가 많으면 많을수록 복사 비용이 커지게 됩니다. 왜냐하면 깊은 복사로 새 객체가 기존에 가진 모든 필드를 1:1 복사하기 때문이죠. 그렇지만 참조 형식에서는 이런 오버헤드가 없습니다. 객체가 참조하는 메모리 주소만 복사하면 되기 때문입니다. 하지만 참조는 얕은 복사를 진행하며, 깊은 복사가 필요한 경우 따로 프로그래머가 구현해줘야 합니다. 더 들어가봅시다. 값 형식은 객체를 비교할 때에도 기본적으로 내용을 비교하는데 모든 필드를 1:1 비교합니다. 불변 객체에서 필요한 방법입니다. 참조 형식은 내용 비교를 할 수 있으려면 프로그래머가 직접 비교 코드를 작성해야 합..

CS/C# 2021.12.21

[C#] property, 프로퍼티

오늘은 프로퍼티에 대해서 배워보겠습니다. 기존에 C++을 공부를 했었고, 은닉성을 위해서는 public으로 필드 멤버를 선언하는 것이 아닌 private로 감추고 필요한 부분만 getter, setter를 구현해서 사용하라고 배웠습니다. 맞는 방법이지만 한 변수에 getter와 setter까지 하면 변수가 많아질수록 이 수 또한 엄청 많아지게 될 것입니다. C#에서는 이러한 것들을 한 뭉치로 묶을 수 있는 프로퍼티를 제공합니다! # 프로퍼티 class Program { private int age; public int Age { get { return age; } set { age = value; } } } age라는 것을 Age라는 프로퍼티로 제공하게 됩니다. Program p = new Program..

CS/C# 2021.12.21

[C#] 인터페이스와 추상 클래스

객체지향 프로그래밍의 '꽃'인 인터페이스와 추상 클래스에 대해서 공부했습니다. 배우기에 앞서서는 인터페이스와 추상 클래스가 많이 비슷하기도 하고 다른 점이 뭐가 있을까에 대해서 궁금했었는데 빠르게 알아봅시다! # 인터페이스 선언 C#의 인터페이스는 다음과 같이 생겼습니다. interface flyable { void fly(); } 인터페이스에서는 메서드, 이벤트, 인덱서, 프로퍼티만을 가질 수 있고, 클래스의 선언과 비슷하지만 언뜻 보면 구현부가 없고 함수의 정의 부분만 있습니다. 인터페이스에서는 접근 제한 한정자를 사용할 수 없으며, 모든 것들이 public으로 선언됩니다. 클래스와는 다르게 인스턴스화를 만들 수 도 없고요. 다만, 인터페이스를 상속한 클래스에서는 인스턴스를 만드는 것이 가능합니다. ..

CS/C# 2021.12.20

[C#] 정적 필드와 메서드(static)

C#에 오면서 헷갈리는 부분이 바로 정적 필드와 메서드 부분이었습니다. 아마도 이쪽 부분에 대해서 개념이 흔들려서 그런 것 같기도 했으나 오늘 공부로 한 층 더 업그레이드해보겠습니다. # static 메서드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자라고 합니다. 하나의 프로그램에는 인스턴스는 여러 개가 존재할 수 있으나, 붕어빵을 만드는 틀(클래스)은 단 하나만 존재합니다. 어떤 필드가 클래스에 소속된다는 것은 그 필드가 프로그램 전체에서 유일하게 존재한다는 것을 의미합니다. 유심히 살펴보면 Main 함수도 static으로 선언되어 있습니다. 말이 어렵죠. 일반적으로 만드는 인스턴스와 static을 비교해보겠습니다. # 정적 필드 using System; class Ins..

CS/C# 2021.12.12