개발/C# 27

[Effective C#] Boxing & Unboxing 정리 (+값타입/참조타입 정리)

.Net framework는 모든 타입의 최상위 타입을 System.Object로 정의하며 이 Object는 모든 타입의 베이스클래스이다. 타입에는 값타입, 참조타입, 포인터 타입등으로 나뉘어진다. 값 타입 주로 값을 저장할 때 쓰는 저장소, 다형적이지 못하다. 값 타입은 스택영역에 저장된다. (int, char, double ...) 값타입은 Object를 상속받은 System.ValueType을 상속받은 구조체이다.(System.ValueType) int -> System.Int32로 정의. 상속관계는 Object->ValueType->Int32 (Int32 구조체) char -> System.Char로 정의. 상속관계는 Object->ValueType->Char(Char 구조체) 참조타입 모든 타입..

개발/C# 2021.02.11

[Effective C#] new 한정자 사용

Effective C# 아이템 10 : 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라. public class MyClass { public void MagicMethod() { Console.WriteLine("MyClass"); } } public class MyOtherClass : MyClass { public new void MagicMethod() { Console.WriteLine("MyOtherClass"); } } 베이스 클래스에서 virtual로 선언한지 않은 멤버를 상속받은 클래스에서 new 한정자를 통해 재정의할 수 있다. 재정의를 통해 구현이 가능하지만 사용자에게 모호함을 줄 수 있다. object c = MakeObject(); MyClass cl = c as M..

개발/C# 2021.01.29

[C#] abstract & virtual 연산자와 override & new 연산자

virtual method(가상 함수) 1. abstract(추상) vs virtual(가상) - abstract(추상) : 선언하는 클래스도 반드시 abstract 클래스. 이 키워드로 정의한 속성이나 메서드는 본문을 정의할 수 없으며 접근 한정자는 public, internal, protected로 선언. public abstract class TestAbstractClass { public abstract int TestAbstractFunc(); } - virtual(가상) : 정적 클래스를 제외한 모든 클래스에서 사용 가능. 이 키워드로 정의한 속성이나 메서드는 본문을 정의할 수 있으며 abstract와 마찬가지로 접근 한정자는 public, internal, protected로 선언해야 한다...

개발/C# 2021.01.25

[Effective C#] nameof() 연산자

nameof() - MS Link 변수, 형식 또는 멤버의 이름을 문자열 상수로 가져온다. Console.WriteLine(nameof(System.Collections.Generic)); // output: Generic Console.WriteLine(nameof(List)); // output: List Console.WriteLine(nameof(List.Count)); // output: Count Console.WriteLine(nameof(List.Add)); // output: Add var numbers = new List { 1, 2, 3 }; Console.WriteLine(nameof(numbers)); // output: numbers Console.WriteLine(nameof(..

개발/C# 2021.01.24

[Effective C#] 문화권별로 다른 문자열을 생성하려면 FormattableString을 사용하라

문자열 보간 기능 -> 링크 문자열 보간 기능 '$'을 이용하여 생성된 문자열은 1)단순 문자열일 수도 있지만, 2)FormattableString을 상속할 타입일 수도 있다.1)문자열 : 문자열 자체string first = $"It's the {DateTime.Now.Day} of the {DateTime.Now.Month} month";2) FormattableString : format문자열과 format에 구성될 argument로 구성(MS)FormattableString second = $"It's the {DateTime.Now.Day} of the {DateTime.Now.Month} month";*FormattableString 객체라면 컴퓨터에 지정된 문화권을 고려하여 문자열을 생성할 ..

개발/C# 2021.01.21

[Effective C#] string.Format()을 보간 문자열로 대체하라

String.Format 메서드 (링크) String s = String.Format("The current price is {0} per ounce.", pricePerOunce); Console.WriteLine(s); 생성된 문자열을 직접 출력해보고 올바른 형태인지 직접 확인하기 전까지 코드를 제대로 작성했는지 확인이 어려움 - 포맷 문자열과 인자리스트를 분리하여 전달 - 포맷 문자열에 나타낸 인자의 개수와 실제 전달되는 인자의 개수가 일치하는지 확인하지 않음. - 개발자의 실수로 누락하여 런타임 에러가 발생할 수 있음 $ 문자열 보간 (링크) string name = "Mark"; var date = DateTime.Now; // Composite formatting: Console.WriteLi..

개발/C# 2021.01.17

[Effective C#] 캐스트보다는 is, as가 좋다.

C#에서의 형 변환 - as object o = Factory.GetObject(); // as 변환 MyType t = o as MyType; if (t != null) { //MyType 타입의 t 객체 사용 } else { //형변환 실패 시 } - cast(강제 형 변환) object o = Factory.GetObject(); // cast 변환 try { MyType t; t = (MyType) o; //MyType 타입의 t 객체 사용 } catch (InvalidCastException) { //형변환 실패 오류 } => as를 사용할 경우 작성하기 더 쉽고 읽기도 편하다. try/catch 문이 없기 때문에 성능도 더 좋다. as와 cast의 동작 차이- '사용자 정의 형변환을 어떻게 다..

개발/C# 2021.01.16

[Effective C#] const보다는 readonly 사용하기

const보다는 readonly 사용하기 const - 컴파일 타임 상수, 컴파일 타임에 변수가 값으로 대체된다. readonly - 런타임 파일 상수, 런타임 타임에 값이 평가된다. 컴파일 타임에 값으로 대체되지 않고 상수에 대한 참조로 컴파일 된다. //컴파일 타임 상수: public const int Millennium = 2000; //런타임 상수: public static readonly int ThisYear = 2004; const 예제) if (myDateTime.Year == Millennium) 위 코드는 컴파일시 아래와 같이 컴파일 된다. if (myDateTime.Year == 2000) - const는 컴파일 시점에 값이 대체, readonly의 경우엔 const처럼 값으로 대체되..

개발/C# 2021.01.13

[Effective C#] 지역변수 선언은 var를 사용/var 이해하기

var : 암시적 타입 지역변수(implicitly typed local variable) var i = 10; // Implicitly typed. int i = 10; // Explicitly typed. var는 데이터 타입을 개발자가 아닌 컴파일러가 결정하게 만드는 키워드이다. 위 예제에서 var i의 값은 int 10이 설정됨으로 컴파일러에 의해 int형으로 타입이 결정된다. var 사용 예제 // i is compiled as an int var i = 5; // s is compiled as a string var s = "Hello"; // a is compiled as int[] var a = new[] { 0, 1, 2 }; // expr is compiled as IEnumerable..

개발/C# 2021.01.09

C# yield 기초 이해하기

yield 호출자(Caller)에게 컬렉션 데이터를 하나씩 리턴할 때 사용한다. Enumerator(Iterator)라고 불리는 이러한 기능은 집합적인 데이터 셋으로부터 데이터를 하나씩 호출자에게 보내주는 역할을 한다. - yield return : 컬렉션 데이터를 하나씩 리턴하는데 사용 - yield break : 리턴을 중지하고 iteration 루프를 빠져나올 때 사용 예제 1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 using System; using System.Collections.Generic; class Program { static IEnumerable GetNumber() { yield return 1; // 첫번째 루프에서 리턴되는 ..

개발/C# 2021.01.04
반응형