-
C# 2교시...C++차이점위주..@ 16. 1 ~ 17. 1/C# 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 함수명()
이렇게..
'@ 16. 1 ~ 17. 1 > C#' 카테고리의 다른 글
getter setter (0) 2016.11.18 C# 시작2 (0) 2016.11.16 C# 시작 (0) 2016.11.16 C# 3교시... (0) 2014.07.27 C# 시작하다... (0) 2014.07.25