본문 바로가기

C#/기본적인 팁

(7)
C#에서 날짜와 시간 처리 (DateTime 객체) 1. DateTime 객체를 생성한다. var dt1 = new DateTime(2021, 8, 24); var dt2 = new DateTime(2021, 8, 24, 10, 24, 20); string 형과 마찬가지로 DateTime 형은 불변 객체이므로 속성값을 수정하는 코드를 작성할 수 없다. 2. 요일을 구하려면 DateTime 구조체에 있는 DayOfWeek 속성을 참조한다. DayOfWeek 속성의 형은 DayOfWeek 열거형이다. 3. 날짜 형식의 문자열을 DateTime 객체로 변환 날짜 형식의 문자열을 DateTime 객체로 변환하려면 DateTime 구조체에 있는 TryParse라는 정적 메서드를 사용한다. TryParse 메서드는 첫 번째 인수에 변환 대상이 되는 날짜 형식의 문자..
딕셔너리와 비슷하지만 '키' 부분만 저장하고 '값'을 저장하지 않는 HashSet<T> 클래스 딕셔너리를 사용할 때 키가 딕셔너리에 저장돼 있는지 여부가 중요하고 그 값은 중요하지 않을 때가 있다. 예를 들어 중복되지 않는 단어 목록을 작성하고 싶을 때 단어를 '키'로 저장하고, '값'에는 저장하고 싶은 정보가 없어 따로 필요하지 않다. 이 경우에 List에 저장하는 방법도 있지만 새로운 단어를 저장할 때 리스트에 중복되는 단어가 있는지 리스트 전체 내용을 읽고 판단한 후 저장해야 하기에 이 방법은 효율적이지 않다. 이럴 때 딕셔너리와 비슷한 HashSet 클래스를 사용하면 된다. HashSet 클래스는 Dictionary와 비슷하지만 키 부분만 저장하고 값은 저장하지 않는다는 점이 다르다. 중복을 허용하지 않는 요소의 집합을 나타내는 클래스이다. var wordsList = new HashSet..
배열과 List<T>의 다양한 처리 (조건을 만족하는 요소 구하기, 중복 제거, 순서대로 나열, 컬렉션 연결) 배열과 List 둘 다 IEnumerable 인터페이스를 가지고 있다는 공통점이 있다. LINQ를 이용하면 배열도 List도 동일한 코드로 다양한 처리를 수행할 수 있다. LINQ를 사용한 코드와 LINQ를 사용하지 않는 코드를 모두 사용할 수 있지만 대부분의 경우에 LINQ를 사용해서 코드를 작성하는 것이 바람직하다. 코드양을 줄일 수 있고 무엇을 하는가 코드안에서 파악하기가 쉽기 때문이다. 과거에 작성된 코드를 유지보수해야하는 상황이 생길 수 있기 때문에 LINQ를 사용하지 않은 코드도 이해해야할 필요가 있다. [LINQ] Average 메서드 : 평균값 Sum 메서드 : 합계 Min 메서드 : 최소값 Max 메서드 : 최대값 Count 메서드 : 조건에 일치하는 요소의 개수를 셀 수 있다. Any메..
기본적인 관용구 1. 변수 선언과 초기화는 동시에 이뤄져야 하는 것이 원칙이다. 2. return 문을 통해 '체로 걸러 남는 것만 처리하는' 코드는 조건에 대해 잊어버리면서 코드를 읽어나갈 수 있으므로 편리하다. 3. 루프 도중에 처리를 중단하고 싶다면 break 문을 이용한다. 불필요한 임시변수를 도입하거나 인덱스를 제어하거나 return으로 처리를 중단하기보다 break문으로 루프를 빠져나가서 호출한 메서드로 돌아가는 것이 가장 좋다. 4. null 합체 연산자를 이용하면 편리하다. null 조건일 경우 기본값을 사용해야할 경우가 많이 있다. null 합체 연산자(??)를 사용하면 다음과 같이 간결하게 작성할 수 있다. var message = GetMessage(code) ?? DefaultMessage(); 5..
구체적인 클래스가 아니고 인터페이스에 대해 프로그래밍하자. 메서드의 반환값이나 인수를 인터페이스로 지정하면 좋은 점 --> 프로그램을 수정하기 좋아진다. 예를 들어 구체적으로 리스트를 받아들이도록 구현했는데 추후 배열로도 받아들일 수 있도록 수정이 필요할 경우. 처음 프로그래밍할 때 인터페이스를 활용하여 IEnumerable를 받도록 구현했다면 배열도 IEnumerable를 구현한 것이기 때문에 따로 수정할 필요가 없다. 구체적인 형이 아니라 인터페이스를 대상으로 코드를 작성했다면 아무것도 수정하지 않아도 된다. 인터페이스는 공산품의 규격이다. A 클래스가 I 인터페이스를 구현했다면 A 객체는 I 형 변수에 대입될 수 있다. I 형 변수는 I 인터페이스가 정의하는 속성과 메서드를 사용할 수 있다. 속성이나 메서드가 실행할 수 있는 구체적인 동작은 I 인터페이스가..
형식적으로 인스턴스를 생성하는 것은 낭비이다. 클래스(참조형, Reference Type)를 선언함과 동시에 인스턴스를 new로 받을 수 있다. 이후 메서드에서 반환한 인스턴스를 참조변수에 대입한다. MyClass mc = new MyClass(); //여기서 생성한 인스턴스는 사용하지 않게 된다. mc = GetMyClass(); //반환값이 MyClass인 메서드 이렇게 될경우 처음 선언과 동시에 생성한 인스턴스는 프로그램 동작도중 한번도 사용하지 않아 메모리 낭비의 원인이 된다. 클래스를 이용하려면 new를 사용해야 한다는 표면적인 지식밖에 없다면 비효율적인 코드를 작성하기 쉽다. 문법적으로 틀리지 않았기 때문에 컴파일할 때 오류가 발생하지 않고 실제로 프로그램을 동작시켜도 의도한 대로 동작하기 때문에 수정이 필요한 코드라는 사실을 알기 힘들다..
C# 응용프로그램에서 상수를 정의할 때 static readonly를 사용하자 상수를 정의할 때 public으로 지정해서 다른 클래스가 접근할 수 있게 한 경우에는 const 대신 static readonly를 사용 (응용 프로그램을 개발할 때 버전 수정을 통해 변경될 가능성이 없는 고정값 숫자는 실제로 거의 없기 때문에 실질적으로는 const대신 전부 static readonly를 사용하는 것이 추천된다.) const 키워드로 상수를 정의해서 고정 숫자값을 한 곳에서 정의할 수 있다. const는 매우 편리한 기능이지만 주의해야 할 점이 있다. const로 지정한 상수는 public으로 지정하지 않는 것이 좋다는 것이다. private으로 지정했을 경우에는 문제가 없지만 public으로 지정해서 다른 클래스가 참조할 수 있게 했을 경우에는 버전 관리에 관한 문제가 발생할 위험이 ..