[객체지향 프로그래밍] 7장-1 클래스 선언과 생성자

0

이것이 C#이다

목록 보기
8/26

7.1 객체지향 프로그래밍과 클래스

객체는 속성과 기능으로 나눌수있습니다. 속성은 피부색, 키, 몸무게 등을 뽑을수있고, 기능으로는 달리기, 먹기, 보기, 듣기 등이 있습니다. 따라서 속성은 데이터로,기능은 메소드로 구현할수있습니다.

클래스는 객체를 만들기위한 청사진입니다. 클레스가 자동차의 설계도라면, 객체는 생산된 실제 자동차라고 표현할수있습니다. 클래스는 객체가 가지게 될 속성과 기능을 정의하지만 실체를 가지지 않습니다. 클래스를 이용해서 만든 객체가 실체를 가지죠. 동일 클래스로 객체 3개를 만들면 이 세 객체는 서로 구분되는 실체를 가지며 저마다 메모리 공간을 차지합니다.

string a = "123";
string b = "abcd";

객체의 속성(데이터)는 기본 데이터형식(변수)이나 복합데이터 형식(클래스,배열,구조체 등)에 담겨있을 것입니다. 이런 데이터형식으로 만들어진 a,b를 string의 인스턴스(instance) 라고 합니다. 그래서 객체를 인스턴스라고 부르기도 합니다 [정리: 객체 = 실체 = 인스턴스]

7.2 클래스의 선언과 객체의 생성

class Cat
{
	public string Name;		//필드
    public string Color;	//필드
    
    public void Meow()		//메소드
    {
    	Console.WriteLine($"{Name} : 야옹");
    }
}

이 코드의 클래스에 선언된 Name과 Color처럼 클래스 안에 선언된 변수들을 일컬어 필드(Field)라고 합니다.그리고 필드와 메소드를 비롯하여 프로퍼티,이벤트등 클래스 내에 선언된 요소들을 일컬어 멤버(member)라고합니다.
[정리 : 선언된 변수 = 필드],
[정리2 : 클래스 내에 선언된 요소(필드,메소드,프로퍼티,이벤트 등) = 맴버]

클래스는 기본데이터 형식을 조합하여 만든 복합 데이터형식입니다.
그리고 복합 데이터 형식은 참조 형식입니다.

Cat kitty;

이 코드에서 kitty는 null을 가집니다. kitty 자체에 메모리가 할당되는 것이 아니고 kitty는 참조로서 객체가 있는 곳을 가리킬 뿐입니다.
그래서 new 연산자와 생성자가 필요한 것입니다. new 연산자와 생성자를 이용해서 힙에 객체를 생성하고,kitty는 생성자가 힙에 생성한 객체를 가리키는 것이죠.

[정리 : 클래스는 복합데이터 형식, 복합데이터형식은 참조형식, Cat kitty = new Cat(); 중 Cat은 클래스 kitty는 참조 new Cat()은 힙에 객체 생성, =연산자로 참조가 힙을 가리키게 함.]

7.3 객체의 삶과 죽음(생성자와 종료자)

class Cat
{
	public stirng name;
    public string color;
    
	public Cat()
    {
    	name = "";
        color = "";
    }
    
    public Cat(string Name, string Color)
    {
    	name = Name;
        color = Color;
    }
}

위 코드에서 Cat()은 생성자라고 하는 메소드이며,생성자는 클래스의 이름과 동일한 이름을 가지며, 객체를 초기화하는 역할을 합니다.

Cat kitty = new Cat(Name:"키티",Color:"하얀색");
kitty.Meow();
Cat nero = new Cat(Name:"네로",Color:"검은색");
nero.Meow();

Cat() 앞에 있는 new 키워드는 생성자를 호출해서 객체를 생성하는 데 사용하는 연산자입니다.

객체가 생성될 때는 생성자가 호출되고 소멸할 때는 종료자가 호출 됩니다.
생성자는 객체를 생성하는 시점에서 객체의 필드를 원하는 값으로 초기화하는 기능을 합니다.
생성자도 오버로딩이 가능하므로 다양한 생성자를 준비해놓을 수 있습니다.

종료자는 생성자와 달리 매개변수도 없고 한정자도 사용하지 않습니다. 또한 여러 버전의 종료자를 만드는 오버로딩도 불가능 하며 직접 호출할 수도 없습니다. 종료자는 CLR의 가비지 컬렉터가 객체가 소멸되는 시점을 판단해서 종료자를 호출 합니다.

class Cat
{
	~Cat()
    {
    	//소멸시 해야 할일
    }
}

하지만 종료자는 가급적 사용하지 않는 편이 좋습니다.
이유는 가비지 컬렉터는 언제 작동할지 알 수 없습니다.
종료자를 명시적으로 구현하면 가비지 컬렉터는 클래스의 족보를 타고 올라가 객체로부터 상속받은 Finalize()메소드를 호출합니다. 그런데 이방법은 응용프로그램의 성능 저하를 초래할 확률이 높습니다.

0개의 댓글