아카이빙/C# 32

[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#] 유니티에서 foreach 성능은 개선되었을까

예전에 잠깐 이슈가 되었던 유니티에서 foreach 성능문제를 다뤄보려고한다. 나도 그냥 foreach는 안좋구나 정도로만 알고 있었는데 이번 NDC 2017에서 오지현 에반젤리스트님의 강연에서 잠깐 지나가는 말로 유니티 5.2~3버전 쯤에서 foreach 성능이 개선되었다는 얘기를 들었다. 나는 foreach문이 코드가 훨씬 간결해서 선호하는 편인데, 성능 개선이 되었다니..! 이제 맘놓고 써도 되는걸까하는 기대를 가지고 한번 테스트를 해보기로 마음먹었다. 테스트는 GeekCoders님의 블로그 글을 참고하여 진행했다.​[Unity] 유니티 프로그래머가 알아야 할 최적화 스크립트 코드 작성법GeekCoder님은 유니티 4.6.1 기준으로 테스트했고, 그 결과 For문이 2.2배이상 빠른 것으로 나타났고..

아카이빙/C# 2017.05.06