티스토리 뷰
oop의 main
객체로서 모든것을 표현하기 위한 틀
- 복합 데이터 형식
- 또다른 데이터 형식의 데이터와 메소드들의 묶음
ex)
class exClass
{
public int ex1;
public int ex2;
public void Ex()
{
}
}
필드(Field) : 클래스 내에 선언된 변수 (exClass 의 ex1, ex2)
멤버(Member) : 필드, 메소드 프로퍼티, 이벤트 등 클래스내에 선언된 모든 요소
클래스를 가지고 객체 만들기
exClass classTest = new exClass();
인스턴스, 객체... 등으로
클래스는 참조형식이다.
exClass classTest;
이렇게 두면 null을 가짐 , 데이터 그 자체가 아니라 데이터가 있는곳을 가리키기만 할 참조형식이기 때문
new : 생성자 호출 객체생성
exClass() : 생성자호출
생성자 : 클래스이름()
객체 생성만 해주는 역할을 함 따라서 반환형식이 필요없다.
객체를 호출 할 때 반드시 호출된다.
클래스 생성할 때 명시적으로 생성자를 구현하지 않아도 컴파일러에서 알아서 생성해주주만
객체의 필드를 생성하는 시점에서 원하는 값으로 초기화 할 때는 필수적으로 직접 구현해주어야함
오버로딩도 가능하므로 값을 받는 생성자를 만들 수 도 있다.
public exClass()
{
ex1 = 0; ex2 = 0;
}
public exClass(int _ex1, int _ex2)
{
ex1 = _ex1; ex2 = _ex2;
}
클래스 안에 프로래머가 생성자를 한개라도 직접 정의한다면 컴파일러는 프로그래머가 원하는 형식의 생성자가 있다고 간주하여 생성자를 따로 제공하지 않는다.
소멸자
~클래스명();
이런형식을 가진다.
ex) ~exClass();
매개변수, 한정자 없음, 오버로딩 불가능
CLR 의 가비지 컬렉터가 객체 소멸시점에 알아서 호출
CLR 의 가비지 컬렉터가 언제 동작할 지 는 알 수 없는데다가 명시적으로 소멸자를 구현해놓으면 가비지 컬렉터가 할일이 더 많아짐( object로부터 상소받은 Finalize() 메소드를 클래스 족보 타고 올라가며 호출) 성능저하확률 높다. 따라서 소멸은 명시적으로 구현 하지 말고 그냥두기..
객체를 얕은복사하기
exClass classTest1= new exClass();
exClass classTest2 = new exClass();
classTest1= classTest2;
클래스는 참조형식이다 따라서 위와같이 복사하게 되면 힙 영역에 있는 같은 메모리를 둘이 가리키고 있는 꼴이 된다.
위와 같은 복사가 필요해서 한것이라면 상관이 없지만 그렇지 않을 경우에는 위와같이 복사해서는 안된다.
객체 깊은 복사하기
c# 은 깊은 복사 제공하지 않으므로 직접구현필요
exClass 내에 다음과 같은 함수 추가
public object Clone()
{
exClass class = new exClass();
class.ex1 = this.ex1;
class.ex2 = this.ex2;
return class;
}
this
클래스내에 있는 객체들이 자기자신을 지칭할 떄 사용한다.
예를 들어 클래스 외부에서 내부의 객체에 접근할 때
exClass classTest = new exClass();
classTest.ex1;
객체명.멤버 이런식으로 호출하는데
내부에서 자기자신을 호출하고 싶을 때
this. 이렇게만 붙여주면 자기자신을 가리킬 수 있다.
굳이 쓰지 않지만 생략이 되어 있다고 생각하면 됨
public void Test(int ex2);이런식의 함수를 클래스 내부에 구현하였을 때
클래스내부의 ex2 를 호출하려면 this.ex2 = ex2
이렇게 쓰면 this.ex2 는 클래스의 멤버변수를 말하고 ex2 는 인자로 들어온 데이터를 말하는것
'
this() 생성자
public exClass();
public exClass(int ex1);
public exClass(int ex1, int ex2);
이런식으로 구현을 하고 싶을 때
세 개의 생성자 안에 같은 코드를 세번 복사 해 넣는 것보다
exClass(int ex1) : this();
exClass(int ex1,int ex2) : this(int ex1) ;
요롷게
접근한정자(Access Modifier)
은닉성(Encapsulation)을 위해 꼭 필요한 요소
public /protected /private : c++과 동일
internal : 같은 어셈블리 내의 코드에 대해 public , 다른 어셈블리 코드에서는 private
protected internal 같은 어셈블리 내의 코드에 대해 protected, 다른어셈블리 코드에서는 private
접근한정자 지정하지 않으면 무조건 private
상속
class 기반
{
}
class 파생: 기반
{
}
생성자 호출순서 : 기반클래스 -> 파생클래스
소멸자 호출순서 : 파생클래스 -> 기반클래스
base : 기반클래스에 접근할 때 사용
파생()
{ base.- (); }
파생() : base();
상속 불가능한 클래스 만들기
sealed class exClass
{
}
상속봉인이됨 상속못하는 클래스가됨
------------------------------------- 다음에 또 추가..
참고 : 뇌를 자극하는 c# 프로그래밍