@ 16. 1 ~ 17. 1/C#

C# 2교시...C++차이점위주..

namoeye 2014. 7. 26. 21:23

c++ 에서는 객체 생성시..

클래스 a;

이런식인데..

C#에서는

클래스 a = new 클래스();

이런식이다 a가 포인터도 아닌데..

그냥 클래스 a를 할 경우..

a는 NULL을 가진다..

왜냐면 c#에서는 모든 클래스는 참조 형식이기 때문에..?

(포인터가 없다는 이야기도..)

그리고 클래스내 맴버나 메서드 선언시..

한정자..를 계속 붙여줘야..

 

public 반환값 메서드 이름 (매개변수)

 

...더 큰 충격적인 사실..

소멸자를 구현하지 말라고 한다..왜냐면 가비지 컬렉터가 우리보다 훨씬 똑똑하게 객체의 소멸을 처리한단다..응?

 

A a=new A();

A.data=10;

 

A b=a;

b.data=20;

ab의 값은? a는 20 b도 20...왜냐고?

C#에서 new 로 항상 클래스의 객체를 생성하니까 이것은 참조형식이기 때문이다.

그럼 c#에서의 깊은 복사는?

객체를 힙에 새로 할당해서 그곳에 자신의 멤버를 일일이 복사해 넣는다??

public 객체 deepcopy()
{

객체 newCopy=new 객체();

newCopy.data=this.data;

return newCopy; //이게 중요함..

}

 


 

this() 생성자??

이건뭔가..this랑 같긴하다 근데..이것은 자기 자신의 생성자를 가리킨다.

this()는 생성자에서만 사용될 수 있고 또한 코드 블록의 안쪽이 아닌 앞쪽에서 (멤버 이니셜라이저)에서 사용이 가능하다..

생성자()

{

a=1;

}

생성자(int) : this()  //(이건 생성자()를 호출한다.)

이런식으로...

 


 

C++과 똑같이 접근 한정자로 수식하지 않은 클래스의 멤버는 모두 private!

이젠 상속부분..!

부모클래스의 생성자가 매개변수를 입력받고록 선언되어 있다면 자식클래스의 인스턴스를 생성할 때 호출되는 부모클래스의 생성자에게 어떻게

매개변수를 전달해 줄 수 있을까? C++에서는 멤버이니셜라이저에 : 부모클래스(매개변수) 했던것으로 기억나는데..

c#에서는 base라는 키워드가 있다.

this가 자기자신을 가리키면 base는 부모클래스를 가리킨다. this를 통해 자기 자신의 멤버에 접근했으니까 base를 통해서도 부모클래스의 멤버에 접근 할 수 있다.

헐..자세히보니 위에 C++ 방법하고 같은데..그냥 base(매개변수) 이렇게 하는게 전부임..

* 상속봉인! sealed class 이름

!!

C++ 의 형변환은 무엇이 있었는가?

static_cast 와 reinterpret_pret와... dynamic_cast 그리고 const관련된것 이렇게 있었다

C#에서는 형변환을 위해 연산자를 2개나 지원해준다.

is as가 있다.

is는 객체가 해당 형식에 해당하는지를 검사하여 그 결과를 bool값으로 반환

as는 이것은 변환에 실패하는 경우 객체 참조를 null로 만든다.

사용법은

비교원본객체 is 배교대상객체

as도 같다.(근데 참조 형식에서만 가능..값은 기본 형식변환을 사용)

비교후......................

 

 


 

오버라이딩에서..

C++에서는

단순 virtual 함수 였지만..

C#에서는 오버라이딩할 메소드는 virtual 이고

재정의하는곳에서는

override로 해야한다...

또 메소드 숨기기?란게 있는데..그냥 오버라딩을 흉내내게 부모클래스의 메소드를 숨기는것..

사용법은

public new 부모클래스의 메소드를 오버라이딩..()

virtual 오버라이딩도 막을 수 있다 무엇으로? 상속 접근금지 처럼..public sealed override 함수명()

이렇게..