C# 31

[C#] 인터페이스를 상속하는 인터페이스

[C#] 인터페이스를 상속하는 인터페이스인터페이스는 클래스만 상속받을 수 있는 게 아니다.기존의 인터페이스에 새로운 기능을 추가한 인터페이스를 만들고 싶을 때 인터페이스를 상속하는 인터페이스를 만들면 된다.ILogger 인터페이스interface ILogger { void WriteLog(string msg); }ILogger를 상속받은 인터페이스interface IFormattableLogger : ILogger { void WriteLog(string msg, params Object[] args); }보이지는 않지만 void WriteLog(string msg) 메소드를 포함하고 있다.ILogger를 상속받은 인터페이스를 상속받은 클래스class ConsoleLogger : IFormattableL..

아카이빙/C# 2018.06.18

[C#] 인터페이스

[C#] 인터페이스인터페이스는 클래스 또는 구조체에서 구현할 수 있는 기능에 대한 정의를 포함한다.클래스나 구조체는 인터페이스를 상속받아 인터페이스의 기능을 정의해준다.인터페이스를 상속받은 클래스나 구조체는 인터페이스의 모든 메소드를 구현해야 한다.IEquatable 인터페이스interface IEquatable { bool Equals(T obj); }인터페이스를 상속받은 클래스public class Car : IEquatable { public string Model {get; set;} public int Year {get; set;} ​ public bool Equals(Car car) { if(this.Model == car.Model && this.Year == car.Year){ return..

아카이빙/C# 2018.06.18

[C#] 구조체

[C#] 구조체C#에도 구조체(Structure)가 있다.구조체와 클래스차이는?1. 클래스는 참조형식, 구조체는 값 형식이다. - 구조체의 인스턴스는 스택에 할당되고, 인스턴스가 선언된 블록이 끝나면 메모리에서 사라진다. 2. 클래스는 얕은 복사, 구조체는 깊은 복사 3. 클래스는 매개변수 없는 생성자 선언 가능, 구조체는 불가능 구조체 예시struct Vector3 { public float x, y, z; public Vector3(float x, float y, float z) { this.x = x; this.y = y; this.z = z; } ​ public override string ToString() { return string.Format("({0}, {1}, {2})", x, y, z..

아카이빙/C# 2018.06.18

[C#] 확장 메소드 (Extension Method)

[C#] 확장 메소드 (Extension Method)기존의 클래스를 확장하는 기법C#에서는 int, float형도 클래스이기 때문에 이를 확장하는 메소드를 넣을 수 있다.메소드를 선언하되, static 한정자로 수식해야 한다. 그리고 첫 번째 매개변수는 반드시 this 키워드와 확장하려는 클래스의 인스턴스여야 한다.public static class 클래스이름 { public static 반환형식 메소드명 (this 형식 이름, 매개변수 목록) { } } FloatExtension 예시public static class FloatExtension { public static float Square(this float myFloat) { return myFloat * myFloat; } ​ public ..

아카이빙/C# 2018.06.18

[C#] 오버라이딩

[C#] 오버라이딩객체지향의 특징인 다형성(Polymorphism)같은 이름을 갖는 메소드를 오버라이딩하여 새롭게 구현할 수 있다. 1. virtual-overrideclass Cat { public virtual void Init() { Console.WriteLine("고양이다냥!"); } } ​ class CatBlack : Cat { public override void Init() { base.Init(); Console.WriteLine("턱시도를 입었다냥"); } } ​ class CatCheese : Cat { public override void Init() { base.Init(); Console.WriteLine("치즈냥이지롱!"); } }오버라이딩할 메소드는 virtual 로 선언...

아카이빙/C# 2018.06.18

[C#] 형변환과 is, as

[C#] 형변환과 is, asC#에서는 형변환을 위해 is와 as 연산자를 제공한다.is는 객체가 해당 형식에 해당하는 지를 검사하여 bool 값을 결과로 반환.as는 형 변환 연산자와 같은 역할을 하지만, 형변환 연산자가 변환에 실패하는 경우에는 예외를 던지는 반면, as 연산자는 객체 참조를 null로 만든다.일반적으로 as 연산자를 사용하는 쪽을 권장. 준비using System; ​ class Mammal{} class Dog : Mammal{} class Cat : Mammal{} 테스트1Mammal m1 = new Dog(); Dog dog; Cat cat; ​ if(m1 is Dog) { dog = (Dog)m1; Console.WriteLine("m1 is dog"); }else{ Cons..

아카이빙/C# 2018.06.18

[C#] this() 생성자

[C#] this() 생성자다음과 같은 3개의 생성자를 오버로딩하는 클래스가 있다고 하자class Sample { int a, b, c; ​ public Sample() { this.a = 1; } ​ public Sample(int b) { this.a = 1; this.b = b; } ​ public Sample(int b, int c) { this.a = 1; this.b = b; this.c = c; } }문법상으로 문제는 없지만, 같은 코드가 중복되어 있다.Sample(int)에서 Sample() 생성자를 호출하고, b만 초기화 시켜줄 수는 없을까?이러한 문제를 해결하기 위해 C#에서는 this() 생성자를 제공해준다. this() 생성자를 활용한 예제class Sample { int a, b,..

아카이빙/C# 2018.06.18

[C#] 얕은 복사와 깊은 복사

[C#] 얕은 복사와 깊은 복사C#에서 클래스는 태생적으로 참조 형식이다.스택영역에 있는 참조가 힙영역에 할당된 객체의 메모리를 가리킨다.SampleClass a = new SampleClass(); SampleClass b = a;와 같은 코드에서는 a와 b는 서로 같은 객체를 가리키고 있다.같이 a의 필드를 변경하면 b의 필드도 변경된다. 이를 얕은 복사(Shallow Copy)라 한다.반면, a 인스턴스를 힙영역에 새로운 객체를 할당하여 복사하는 것은 깊은 복사(Deep Copy)이다. 간단한 복사using System; ​ class TestDeepCopy { public int field1; public int field2; ​ public TestDeepCopy DeepCopy() { Test..

아카이빙/C# 2018.06.18

[C#] static 필드와 메소드

[C#] static 필드와 메소드C#에서 static 필드나 메소드는 인스턴스가 아닌, 클래스 자체에 소속된다.해당 클래스에서 단 하나만 존재해야하는 필드나 메소드일 경우 사용인스턴스가 아닌 클래스에서 직접 호출할 수 있다. Global classusing System; ​ class Global { public static int Count = 0; ​ public static void StaticMethod() { Console.WriteLine("StaticMethod()"); } } ClassA, ClassBclass ClassA { public ClassA() { Global.Count++; } } ​ class ClassB { public ClassB() { Global.Count++; } ..

아카이빙/C# 2018.06.18

[C#] FieldInfo와 PropertyInfo

[C#] FieldInfo, PropertyInfo제네릭 타입의 클래스의 필드 혹은 프로퍼티에 접근해야할 때가 있다.그러나 타입을 정확히 모르기 때문에 직접 접근할 수는 없는데 이를 해결하는 것이 FieldInfo와 PropertyInfo이다.재사용성이 높은 코드를 작성하기에 유용하며, 본 포스팅의 예제 외에도 다양한 용도로 활용될 수 있을 것 같다.다른 설명 필요없이 코드로 직접 확인하는 게 가장 이해하기 쉽다. GetFieldspublic void GetFields(T obj){ System.Reflection.FieldInfo[] fields = typeof(T).GetFields(); ​ foreach(var field in fields){ Debug.Log (string.Format ("{0}...

아카이빙/C# 2017.05.06