2018/06 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/C++] 배열 shift 구현

[C/C++] 배열 shift 구현간혹 알고리즘 문제를 풀다보면 배열에서 쉬프트 연산이 필요할 때가 있다.이 경우 배열 뒤집기를 활용하여 간단히 해결할 수 있다. arr = [1, 2, 3, 4, 5] ​ arr을 왼쪽으로 2칸 Shift 연산을 진행한다면? arr = [3, 4, 5, 1, 2] ​ 이 결과가 나와야 한다. ​ ​ 1. 앞에서 부터 2번째 원소까지를 뒤집자. arr = [2, 1, 3, 4, 5] ​ 2. 2번째 이후 원소 부터 끝까지 뒤집자. arr = [2, 1, 5, 4, 3] ​ 3. 전체 배열을 뒤집는다. arr = [3, 4, 5, 1, 2] ​ 이를 응용하면 오른쪽 Shift도 가능하다. ShiftRight, ShiftLeftvoid reverse(int arr[], int..

아카이빙 2018.06.16