목록프로그래밍 언어/C# (24)
나의 지식 보관소
가변배열은 길이가 다양한 배열들을 요소로 가지는 다차원 배열이다. 1 2 3 4 5 6 7 8 9 10 // 데이터형식[][] 배열이름 = new 데이터형식[가변배열의크기][]; int[][] jagged = new int[2][] { new int[] { 100, 200 }, new int[3] { 1, 2, 3} }; int[][] jagged2 = new int[2][]; jagged2[0] = new int[] { 10, 20 }; jagged2[0] = new int[3] { 4, 5, 6 };
Annoymous Type으로 불리는 무명형식은 문자 그대로 이름이 없는 형식이다. 형식에 이름이 필요한 이유는 그 형식의 이름을 이용해서 인스턴스를 만들기 때문인데, 만약 해당 형식이 한번 쓰이고 다시는 쓰이지 않을 그런 형식이라면 따로 형식을 만들어주는게 코드의 낭비일 수 있다. 무명메서드는 다음과 같이 var키워드를 사용한다. 1 2 var temp = new { Name = "김종호", Age = 19 }; Console.WriteLine($"{temp.Name} {temp.Age + 1}"); 무명 형식의 필드의 데이터 형식 또한 var처럼 결정된다. 무명 형식의 인스턴스가 만들어지고 난 다음에는 읽을수만 있다.
은닉성 객체지향에는 크게 세 가지 특성이 있다. 그중 하나가 은닉성이라고 부르는 것인데, 은닉성은 사용자에게 필요한 최소한의 기능만을 노출하고 다른 것을 내부에 숨기는 것을 뜻한다. 즉 선풍기를 예로 들면 선풍기 날개의 분당 회전수 같은 사용자에게 불필요한 정보는 들어내지 않고 강풍, 약풍, 미풍, 정지와 같은 필요한 기능만을 노출하는 것이다. 프로퍼티 우리가 코드를 작성하다 보면 필드를 public으로 선언하고 싶을 때가 있다. 모든 것을 public으로 선언해버리면 외부에서 특별한 메서드의 도움 없이 '='를 이용해서 필드를 사용할 수 있고, 어떤 것을 private로 하고 public을 할지 생각할 필요도 없으니 귀찮음과 수고로움이 확 줄어든다. 하지만 은닉성에 좋지 않다. 그렇다면 은닉성을 지키면..
추상클래스는 인터페이스와 클래스 사이쯤 되는 친구다. 클래스처럼 구현을 가질수있지만 인터페이스처럼 인스턴스를 가질수는 없다. 추상클래스의 특징은 추상 메서드를 가질수 있다는 점이다. 추상메서드는 구현을 갖지는 않지만 자식 클래스에서 구현하도록 강제한다. 다만 추상클래스를 다른 추상클래스가 상속 하는 경우에는 부모 추상클래스의 추상메서드를 구현하지 않아도 된다. 추상 클래스와 추상 메서드는 다음과 같이 abstract 수식을 붙여 선언한다 1 2 3 4 5 6 7 8 9 10 11 12 abstract class Parent { public abstract void Something(); } class Son : Parent { public override void Something() { //구현부 } }
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/AhGCK/btqAKhHHQq9/RGU2xh1KapLEmbNwyDHOOk/img.png)
죽음의 다이아몬드란 하나의 부모 클래스를 두 개의 자식 클래스가 상속받고, 이 두 개의 자식 클래스를 다시 하나의 자식 클래스가 상속하는 것을 말한다. 다음 그림에서 혼종은 "멍!"하고 짖을까? "냥!"하고 짖을(?)까? 이러한 모호성이 죽음의 다이아몬드 문제의 핵심이다. 때문에 c#은 클래스의 다중상속을 허용하지 않는다. 하지만 인터페이스는 구현을 생략한 선언만 물려주기 때문에 이러한 문제가 발생되지 않아 인터페이스는 다중 상속이 가능하다.
인터페이스는 클래스가 따라야 하는 약속이다. 마치 플러그를 통해 전원을 공급받기 위해 따라야만 하는 전기 플러그 규격처럼 인터페이스를 상속받기위해 클래스들은 인터페이스에 선언된 모든 메서드를 구현해야 한다. 인터페이스는 메서드, 이벤트, 인덱서, 프로퍼티 등을 선언만 할 수 있고 구현부를 가질 수 없다. 또한 인스턴스를 가질 수도 없다. 하지만 자식 클래스의 인스턴스를 참조할 수 있다. 자식 클래스의 인스턴스를 참조하게 되면 인터페이스는 자신에게 선언되어있는 메서드를 호출할 수 있고 작동은 참조한 자식 클래스에 구현되어있는 대로 작동한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 interface Animal { void Breath(); } class Dog : Animal..
확장 메서드는 기존 클래스의 기능을 확장하는 방법이다. 예를 들어 int형에 제곱 기능도 넣을 수 있다. 확장 메서드를 선언하기 위하여 필요한 조건은 다음과 같다. 1. 클래스를 static으로 수식한다. 2. 메서드를 static으로 수식한다. 3. 첫 번째 매개 변수는 반드시 this 키워드와 함께 확장하고자 하는 클래스( 형식 )이어야 한다. 다음 조건을 만족하여 int형식에 제곱 기능을 추가하는 확장 메서드를 만들어 보겠다. 1 2 3 4 5 6 7 8 9 10 11 12 static class IntExtension { public static int Power(this int a, int exponent) { int temp = a; for (int i = 1; i
메서드 오버라이딩은 부모 클래스에서 정의한 메서드를 자식클래스에서 재정의 하는것을 말한다. 메서드 오버라이딩을 하기위해서는 부모 메서드의 오버라이딩할 메서드가 virtual로 수식되어있어야 하고, 자식 클래스에서는 오버라이딩을 할 메서드를 override로 수식해주면 된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Animal { public virtual void Bark() { Console.WriteLine("짖는다."); } } class Dog : Aniaml { public override void Bark() { Console.WriteLine("멍멍"); } } 메서드 숨기기라는 것도 있다. 메서드 숨기기는 자식클래스에서 부모 클래스에 선언된 메서드와 같은..