티스토리 뷰

카테고리 없음

클래스, 객체

몰라아 2017. 9. 3. 00:08

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# 프로그래밍

댓글