목록프로그래밍 언어 (72)
나의 지식 보관소
포인터란 포인터는 메모리의 주소를 저장하는 변수이다. type형 변수의 주소 값을 저장하는 포인터 변수의 선언 방법은 아래와 같다. type* ptr 여기서 의문이 들수 있다. 주소 값을 저장하는 변수라면 그 크기가 모두 같을 텐데 왜 굳이 서로 다른 포인터형을 쓸까? 대답은 참조를 위해서이다. 만일 주소값만 주어졌다면 우리는 그 값을 어떻게 읽어 들여야 할까? 주어진 주소 값을 시작으로 4바이트를 읽어야 할까? 8바이트를 읽어야 할까? 이렇듯 포인터형은 메모리 공간을 참조하는 기준이 된다. 널포인터 포인터를 사용할 때 선언만 해두고 초기화를 하지 않는다면 포인터에는 쓰레기 값이 존재하게 된다. 이 상태에서 역참조 연산자를 통해 값을 변경하게 되면 어딘지도 모르는 메모리 공간을 변경해버리게 된다. 이러한..
추상클래스는 인터페이스와 클래스 사이쯤 되는 친구다. 클래스처럼 구현을 가질수있지만 인터페이스처럼 인스턴스를 가질수는 없다. 추상클래스의 특징은 추상 메서드를 가질수 있다는 점이다. 추상메서드는 구현을 갖지는 않지만 자식 클래스에서 구현하도록 강제한다. 다만 추상클래스를 다른 추상클래스가 상속 하는 경우에는 부모 추상클래스의 추상메서드를 구현하지 않아도 된다. 추상 클래스와 추상 메서드는 다음과 같이 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("멍멍"); } } 메서드 숨기기라는 것도 있다. 메서드 숨기기는 자식클래스에서 부모 클래스에 선언된 메서드와 같은..
형변환 연산자는 만일 형변환이 불가능할 경우 예외를 발생시킨다. 이러한 점 때문에 try~catch 문이 거의 강제된다.( 만일 예외처리 조차 하지않으면 프로그램이 예기치 않게 종료된다. ) 때문에 c#은 as와 is 연산자를 제공한다. is 연산자는 객체가 해당 형식에 대해 형변환이 가능한지 여부를 bool 값으로 반환한다. as 연산자는 형변환 연산자와 똑같은 역할을 하지만 형변환에 실패할 경우에 as연산자는 null을 반환한다.