본문 바로가기
Programming/C#

C# _6

by 공부합시다홍아 2020. 6. 9.

구조체 [ Structure ]

클래스는 참조 형식이고, 구조체는 값 형식입니다.
- 구조체의 인스턴스는 스택에 할당되고 인스턴스가 선언된 블록이 끝나는 지점의 메모리에서 사라집니다.
- 인스턴스의 사용이 끝나면 즉시 메모리에서 제거된다는 점과 가비지 콜렉터를 덜 귀찮게 한다는 점에서 구조체는 클      래스에 비해 성능의 이점을 가진다.
- 구조체는 값 형식이기 때문에 할당 연산자 = 를 통해 모든 필드가 그대로 복사됩니다.

- 구조체는 생성자를 호출할 때가 아니면 굳이 new연산자를 사용하지 않아도 인스턴스를 만들 수 있습니다. 
- 구조체는 매개변수가 없는 생성자는 선언할 수 없다. 
- 구조체의 각 필드는 CLR이 기본값으로 초기해주기 때문에 매개변수가 없는 생성자를 선언하지 못하는 문제는 걱정하    지 않아도 된다.

 

인터페이스와 추상메소드

인터페이스의 선언

인터페이스의 선언 방법


Interface 인터페이스 이름
{
반환 형식 메소드 이름1(매개변수목록);
반환 형식 메소드 이름2(매개변수목록);
반환 형식 메소드 이름N(매개변수목록)
};

위를 보면 인터페이스의 선언은 클래스를 선언하는 것과 비슷한 것을 확인 할 수 있습니다.

겉으로 보면 비슷하지만 인터페이스는 '메소드', '이벤트', '인덱서', '프로퍼티만'을 가질 수 있다는 차이가 있습니다.

인터페이스는 '메소드', '이벤트', '인덱서', '프로퍼티만'을 가질 수 있는데 그나마도 구현부가 없다. 클래스는 접근 제한 한정자로 수식하지 않으면 기본적으로 private로 선언되지만, 인터페이스는 접근 제한 한정자를 사용할 수 없고 모든 것이 public으로 선언됩니다. 게다가 인터페이스는 인스턴스도 만들수가 없습니다. 

인터페이스는 인스턴스를 가질 수는 없지만, 인터페이스를 상속받는 클래스의 인스턴스를 만드는 것은 가능하다.
파생클래스는 인터페이스에 선언되어 있는 모든 메소드를 구현해줘야 하며, 이 메소드들은 public한정자로 수식해야 한다.

인터페이스는 인스턴스를 만들지 못하지만, 참조는 만들 수 있다. 참조에 파생 클래스의 객체의 위치를 담는 것이다.
파생 클래스는 부모 클래스와 같은 형식으로 간주한다. 그래서 인터페이스와 인터페이스로 부터 상속받는 클래스의 관계에도 그대로 적용된다. 

 

인터페이스를 상속하는 인터페이스

인터페이스를 상속할 수 있는 것은 클래스 뿐만이 아닌 클래스의 사촌인 구조체는 물론 인터페이스도 인터페이스를 상속할 수 있다 기존의 인터페이스에 새로운 기능을 추가한 인터페이스를 만들고 싶을 때 인터페이스를 상속하는 인터페이스를 만들면 된다.

상속하려는 인터페이스가 소스 코드가 아닌 어셈블리로만 제공되는 경우
: .NET Framework SDK에서 제공하는 인터페이스들이 그 예이다. 어셈블리 안에 있기 때문에 인터페이스를 수정 할 수 없다.
: 이 인터페이스에 새로운 기능을 추가한 인터페이스를 만들고 시픙면 상속하는 수 밖에 없다. 

상속하려는 인터ㅔ이스의 소스 코드를 갖고 있어도 이미 인터페이스를 상속하는 클래스들이 존재하는 경우
: 클래스는 반드시 인터페이스의 "모든" 메소드와 프로퍼티를 구현해야한다. 인터페이스에 사소한 수정이라도 이루어지면
  이 인터페이스를 상속하는 기존 클래스들은 소스 코드를 빌드할 때 컴파일 에러를 내뱉는다.
: 기존 소스 코드에 영양을 주기 않고 새로운 기능을 추가하기 위해서는 인터페이스를 상속하는 인터페이스를 사용해야한다.

: 인터페이스가 인터페이스를 상속하기 위해 사용하는 문법은 클래스의 문법과 똑같다. 
: 파생 인터페이스의 이름 옆에 ' : '을 찍고 그 오른편에 상속할 인터페이스의 이름을 붙여주면 된다.

interface 파생 인터페이스 : 부모 인터페이스
{
추가할 메소드 목록
} 

 

여러 개의 인터페이스, 한꺼번에 상속하기

클래스는 여러 클래스를 한꺼번에 상속할 수 없습니다.  
죽음의 다이아몬드란 다음과 같이 한의 할아버지 클래스를 두 개의 파생클래스가 상속하고,
이 두 개의 파생 클래스를 다시 하나의 자식 클래스가 상속하는 것을 말한다.

- 인터페이스는 내용이 아닌 외형을 물려준다. 속은 어떨지 몰라도 겉모습 만큼은 정확하게 자신을 닮기를 강제합니다.
- 다른 클래스의 기능을 새로운 클래스에 넣는 방법에 꼭 상속만 있는 것은 아니다. 포함(Containment)이라는 기법이 있    다.
  : 이 기법은 클래스 안에 물려받고 싶은 기능을 가진 클래스들을 필드로 선언해 넣습니다. 

 

추상 클래스 : 인터페이스와 클래스 사이

- 추상 클래스는 인터페이스와는 달리 "구현"을 가질 수 있다. 하지만 클래스와는 달리 인스턴스를 가질 수는 없습니다.
- 추상 클래스는 구현을 갖되 인스턴스는 만들지 못한다. 

추상 클래스는 abstract 한정자와 class 키워드를 이용해 선언하다.
  : abstract class 클래스 이름 
   {
    }

- 인터페이스에서는 모든 메소드가 public으로 선언되는 반면, 클래스는 한정자를 명시하지 않으면 모든 메소드가          private로 선언된다. 

- 추상 클래스는 '추상 메소드'를 가질 수 있다는 클래스와의 차이점을 보여준다.

※ 추상 클래스는 또 다른 추상 클래스를 상속할 수 있으며, 이 경우 자식 추상 클래스는 부모 추상 클래스의 추상 메소     드를 구현하지 않아도 된다. 추상 메소드는 인스턴스를 생성할 클래스에서 구현하면 된다. 

 

728x90

'Programming > C#' 카테고리의 다른 글

c#_8 : 배열과 컬렉션 그리고 인덱서  (0) 2020.06.10
c# _7 : 프로퍼티  (0) 2020.06.10
C# _ 5  (0) 2020.06.08
c# 연습3  (0) 2020.06.05
c# 연습 2  (0) 2020.06.04