C#클래스

#1. 객체 지향 프로그래밍과 클래스


클래스를 하기전에 객체 지향 프로그래밍(Object Oriented Programming)에 대해서 간단하게 정리하고 넘어간다.

객체 지향 프로그래밍(이하 OOP)이란 현실에 존재하고 있는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화시키는 행태의 프로그램을 말한다.

객체(Object)란 세상의 모든 것을 지칭한다. 사람, 자동차, 모니터 컴퓨터 등등.. 이 모든 것들이 바로 객체가 될 수 있다.

객체에는 두 두가지의 속성이 있다. 하나는 기능, 또하는 속성이다.

사람이란 객체를 예로 들자면 속성은 피부색, 키, 몸무게 등의 수치화할 수 있는 것들을 말하고, 기능은 걷고, 뛰고, 보고, 듣고 등의 행동을 들 수 있다.

이렇듯 객체 지향 프로그래밍을 하기 위해서는 객체가 갖고 있는 속성과 기능을 골라낼 수 있는 안목이 필요하다.

클래스(Class)는 객체를 만들기 위한 일정의 틀을 말한다. 아래의 코드를 보면서 정리해보자.

int a =10;
int b =20;

여기서 int는 클래스고 a와 b는 객체를 말한다.

int라는 것은 32bit정수를 담는 객체를 위한 틀이며, a와 b는 실제로 데이터를 담을 수 있는 실제 객체이다.

a와 b를 일컬어서 int의 실체(instance)라고 한다.

일반적으로 실체라는 단어보다는 '인스턴스'라는 말을 더많이 쓴다.

#2 클래스 선언, 객체생성


먼저 클래스를 선언하는 방법에 대해서 얼아보자. 클래스는 class라는 키워드를 이용해서 선언하는데, 아래와 같이 선언하면 된다.

class 클래스이름
{
   //데이터와 메소드

}

간단하지 아니한가? 아래에 예제를 통해서 클래스를 선언하고 객체를 생성하는 방법에 대해서 계속 알아보자

namespace CSharp
{
   class cat
  {  
     public string Name;
     public string Color;

     public void Meow()
     {
       Console.WriteLine("{0} : 야옹",Name);
      }

    }
}

Cat이라는 클래스 안에 선언되어 있는 변수 Name, Color등을 필드(field)라고 부른다. 그리고 그 밑에 보면 Meow()라는 메소드도 보인다. 필드나 메소드 외에도 프로퍼티나 이벤트 등도 클래스 안에 포함할 수 있는데, 이같이 클래스 내에 선언되어 있는 요소들을 멤버(Member)라고 부른다.

이번에는 Main()메소드에 객체를 생성하고 활용하는 방법에 대해서 알아보자.

class Program
{
   static void Main(string[] args)
  {
    Cat kitty=new Cat();
    kitty.Color="하얀색";
    kitty.Name="키티";
    kittu.Meow();
    Console.Write("{0} : {1}",kitty.Name, kitty.Color);

    Cat nero= new Cat();
    nero.Color="검은색";
    nero.Meow();
    Console.WriteLine("{0} : {1}". nero.Name, nero.Color);
    }

}

Cat kitty=new Cat();

Cat는 int, float같은 자료형이라고 생각하면 편하다.

kitty는 당연히 변수(객체)의 이름이 된다.

new라는 키워드는 객체를 새로 생성하며 생성자를 호출하는 역할을 한다.

Cat()는 생성자(Constructor)라고 하는데 자세한건 바로 다음에 설명하기로 하고, 여기서는 new와 생성자는 서로 뗄레야 땔 수 없는 관계라는 정도만 알아두자.

객체가 속한 클래스의 멤버를 사용하기 위해서는 멤버 참조 연산자인 점(Period(.))을 사용하면된다. ex) Object.Memeber;

#3.생성자


생성자는(Constructor)는 클래스와 이름이 같으며 변환 형식이 없다. 생성자는 객체가 생성이 될 때 자동으로 호출이 된다. 즉 생성시 한번만 호출된다.

클래스를 선언할 때 프로그래머가 명시적으로 생성자를 구현하지 않아도 컴파일러에서 자동으로 생성자를 만들어 준다.

생성자를 직접 구현하는 이유 멤버 변수(필드,Field)를 객체를 생성하면서 초기화해야 하는 경우가 있기 때문이다.

   class Program
    {
        static void Main(string[] args)
        {
            Exams ex = new Exams();
            ex.Meow();
            ex.name = "ss";
            Console.Write("{0} : {1}", ex.name, ex.color);
        }

    }
    class Exams{
        public string name;
        public string color;

        public void Meow()
        {
            Console.WriteLine("{0} : 야옹", name); 
        }
        public Exams(){
            name = "lee";
            color = "black";
          
        }
 }


또한 이런식으로 생성자에 매개 변수를 넣을 수도있다. 이럴 경우 객체를 생성할 때 생성자 메소드의 괄호()안에 해당 매개 변수를 입력해주면 된다. 생성자도 다른 메소드처럼 메소드 오버로딩이 가능하다.

  class Program
    {
        static void Main(string[] args)
        {
            Exams ex = new Exams("wefwef","sss"); //생성자 오버로딩
            ex.Meow();
            ex.name = "ss";
            Console.Write("{0} : {1}", ex.name, ex.color);
        }

    }
    class Exams{
        public string name;
        public string color;

        public void Meow()
        {
            Console.WriteLine("{0} : 야옹", name);
        }
        public Exams(){
            name = "lee";
            color = "black";
          
        }

        public Exams(string _name, string _color) //생성자 오버로딩.
        {
            name = _name;
            color = _color;
        }
}

#4.소멸자


소멸자(Destructor)는 객체의 이름 앞에 ~ 기호를 붙인 형태를 하고 있다. 소멸자는 생성자와는 달리 매개 변수가 없으며, 한정자와 반환값도 사용하지 않는다. 또한 메소드 오버로딩도 되지 않는다. 소멸자는 말 그대로 객체가 소멸할 때 소멸자를 호출하게 된다.

c#에서는 소멸자를 사용하지 않는 것을 권장하고 있다. c++에서는 객체를 new로 생성했으면 delete로 해제하는 등 메모리 관리를 프로그래머가 직접 해주기 때문에 소멸자의 사용은 거의 필수나 다름 없는데.. c#에서는 쓰지 말라고 한다


그 이유를 알아보니 CLR의 가비지 컬렉터(쓰레기 수집)가 언제 동작을 하는지 예측을 할 수 없기때문이다. 또한 굳이 우리가 소멸자를 통해서 객체를 소멸시키는 것 보다는 CLR의 가비지 컬렉터가 더좋게 처리할 수 있기 때문에 소멸자를 쓰지 않아도 된다고 한다.

 public Exams(){
            name = "lee";
            color = "black";
          
        }

        public Exams(string _name, string _color)
        {
            name = _name;
            color = _color;
        }

        ~Exams()
        {

            Console.WriteLine("{0}: 바이바이~ ", color);
        }



Post a Comment

다음 이전