4장 - 2

2014. 11. 16. 23:39IT Books/시작하세요 C# 프로그래밍

인터페이스

추상메서드를 0개 이상 담고 있는 추상 클래스 라고 간단히 이해하면 편함.




C#에서는 다중상속이 불가능하기 때문에 
클래스가 아닌 인터페이스로부터 상속을 받아 사용이 가능하다.




장점


장점

1. C#컴파일러는 인터페이스의 메서드를 모두 가상 메서드로 간주한다. 단지 virtual / override 키워드만 지정하지 않을뿐.

때문에 동적바인딩이 그대로 적용된다.


2. 또한 특정한 목적의 빈 인터페이스를 만들고 자식 클래스가 그 인터페이스를 상속받음으로 인해

형변환 시도와 같은 방법으로 판별 기능을 만들수도 있다.


3. 상속을 받으면 반드시 구현해야 하기 때문에 이를 이용하여 콜백 구현도 가능하다.




사실상 대부분의 경우에서 델리게이트를 이용한 콜백보다는

인터페이스를 이용한 콜백을 선호하게 된다.


그 이유는?


델리게이트의 경우는 메서드마다 델리게이트 타입을 모두 정해주어야만 한다.

하지만

인터페이스의 경우는 미리 정해진 여러개의 메서드들을 콜백으로 사용하게끔 할 수 있기 때문이다.



IEnumerable 인터페이스



GetEnumerator는 열거자(Enumerator) 객체를 반환하는데 원형은 다음과 같다.






System.Array가 전형적인 IEnumerable을 상속받은 예.

MoveNext()를 이용하여 while문 순회 가능하며,

이게 싫으면 foreach 사용

in 다음에 오는 객체가 IEnumerable을 상속받았다면 foreach 순회가 가능하다.




구조체

다음 특징을 갖는다.


1. 기본생성자를 명시적으로 정의 할 수 없다.

2. 인스턴스 생성은 new 해도 그만 안해도 그만

3. 매개변수를 갖는 생성자를 정의해도 기본생성자가 C# 컴파일러에 의해 자동 포함 (클래스는 자동 포함 안됌)

4. 매개변수 받는 생성자는 반드시 모든 필드 초기화 혹은 값 할당이 필요


모든 값 형식 타입은 0으로 자동 초기화 되는데 이는 직접 초기화를 안해도 된다는 뜻은 아니다.

컴파일러는 개발자가 직접 초기화 하지 않은 코드를 오류로 판단하여 빌드 오류를 발생시킨다.



구조체는 값 형식이므로 변수 대입이나 함수의 인자등으로 사용될 때 깊은 복사를 수행한다.


그럼 어떤 경우에 구조체를 사용하는가?

정확히는 C#에서가 맞겠다.


1. 일반적으로 사용자정의타입은 모두 클래스로 구현한다.

2. 깊은/얕은 복사의 차이가 민감한 타입만 선택적으로 구조체로 구현한다.

3. 참조형식은 GC의 관리를 받게 된다. 이런 부하를 피하고 싶다면 구조체를 선택한다.



ref


값형식이든 참조형식이든 레퍼런스로 전달.

다만 주의할 점은 






결과로 null, 7이 나온다.

이유는 첫번째 함수호출에 얕은 복사로 null값이 별도의 스택에 복사되어 메모리 할당이 일어났기 때문이다.

Main의 변수는 여전히 null이며 메모리 할당은 첫번째 함수에서 별도의 변수에 일어난 것이다.


추가로

ref 인자로 전달되는 변수는 호출하는 측에서 반드시 값을 할당해야만 한다.

개발자가 명시적으로 초기화하지 않은 변수는 ref 인자로 전달 할 수 없다.



out


out또한 참조에 의한 호출을 가능하게 하지만 차이가 있다.


1. out으로 지정된 인자에 넘길 변수는 초기화 하지 않아도 된다.

초기화되어 있어도 out 인자를 받는 메서드에서는 그 값을 사용 할 수 없다.


2. out으로 지정된 인자를 받는 메서드는 반드시 변수에 값을 넣어서 반환해야 된다.


닷넷에는 기본 타입에 TryParse 라는 메서드를 제공한다.

1. 타입 크기를 넘는 상수가 대입되었는지 검사

2. 지정된 타입이 맞는지 검사하는 등

으로 사용가능



TryParse와 ToString은 서로 쌍을 이루는 함수이므로
외부(파일)에 저장한 데이터를 복원하기에 좋다.


'IT Books > 시작하세요 C# 프로그래밍' 카테고리의 다른 글

5장 - 1  (0) 2014.11.21
4장 - 3  (0) 2014.11.20
4장 - 1  (0) 2014.11.15
시작하세요 C# 프로그래밍 3장  (0) 2014.11.09
시작하세요 C# 프로그래밍 2장  (0) 2014.11.09