2015년 3월 6일 금요일

뇌자극 C# 5.0 - 7강 - 1

클래스

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


객체가 가지고 있는 두 가지, 속성과 기능.
속성 = 데이터(변수), 기능 = 메소드

클래스 = 객체를 만들기 위한 장치

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


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

예제)
class Cat
{
    //데이터(필드)
    public string Name;
    public string Color;
 
    //메소드
    public void Meow()
    {
        Console.WriteLine("{0} : 야옹", Name);
    }
}

객체 생성법

Cat kitty = new Cat();
kitty.Color = "하얀색";
kitty.Name = "키티";
kitty.Meow();
Console.WriteLine("{0} : {1}", kitty.Name, kitty.Color);

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

7.3 객체의 삶과 죽음에 대하여 : 생성자와 소멸자


-생성자-

생성자의 역할 = 객체를 생성하는 것.

class 클래스이름
{
   한정자 클래스이름( 매개변수 목록 )
   {
       //
   }
   //필드
   //메소드
}

생성자를 구현해야 하는 이유
= 객체를 생성하는 시점에 객체의 상태를 원하는 값으로 초기화 하고 싶을 때

예제)

class Cat
{
   public Cat()
   {
      Name = "";
      Color = "";
   }
   public Cat( string _Name, string _Color )
   {
      Name = _Name;
      Color = _Color;
   }
}

-소멸자-

객체를 소멸할 때 쓰는 소멸자
가비지 컬렉터가 객체가 소멸되는 시점을 판단하여 소멸자를 호출

class 클래스이름
{
   ~클래스이름()
   {
      //
   }
   //필드
   //메소드
}

7.4 정적 필드와 메소드


static = 메소드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정

예 - 인스턴스에 소속된 필드의 경우)

class MyClass
{
   public int a;
   public int b;
}

//

public static void Main()
{
    MyClass  obj1 = new MyClass();
    obj1.a = 1;
    obj1.b = 2;
}

예 - 클래스에 소속된 필드의 경우(static))

class MyClass
{
   public static int a;
   public static int b;
}

//

public static void Main()
{
   MyClass.a = 1;
   MyClass.b = 2;
}

정적 필드와 메소드를 사용하면 객체를 만들 필요 없이 바로 사용가능하다.
프로그램 전체에 걸쳐 공유해야하는 변수가 있다면 정적 필드를 이용하면 된다.

7.5 객체 복사하기 : 얕은 복사와 깊은 복사


얕은 복사 : 객체를 복사할 때 참조만 복사하는 것(같은 곳을 참조한다)
깊은 복사 : 객체를 복사할 때 참조와 값까지 복사하는 것 (서로 각자 다른 곳을 참조한다)

7.6 this 키워드


객체 외부에서는 객체의 필드나 메소드에 접근할 때 객체의 이름을 사용한다면,
객체 내부에서는 자신의 필드나 메소드에 접근할 때 this 키워드를 사용한다.

예)

class Employee
{
   private string Name;
   public void SetName( string _Name )
   {
      this.Name = _Name;
   }
}

7.7 접근 한정자로 공개 수준 결정하기


클래스에 선언되어 있는 필드와 메소드 중에
어떤 것들을 공개하고 비공해 할 것인지 결정하는 한정자

public :  클래스의 내부/외부 모든 곳에서 접근할 수 있다.

protected : 클래스의 외부에서는 접근할 수 없지만, 파생 클래스에서는 접근 가능

private : 클래스의 내부에서만 접근할 수 있다.(기본 한정자)

internal : 같은 어셈블리에 있는 코드에 대해서만 public로 접근 가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가짐

protected internal : 같은 어셈블리에 있는 코드에 대해서만 protected로 접근할 수 있다.
다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가진다.

7.8 상속으로 코드 재활용하기


class 기반 클래스
{
   //멤버선언
}
class 파생 클래스 : 기반 클래스
{
   //아무 멤버를 선언하지 않아도 기반 클래스의 모든 것을 물려 받아 갖게 된다.
   //단, private로 선언된 멤버는 제외
}

파생 클래스의 인스턴스를 생성할 때
호출되는 기반 클래스의 생성자에게 매개변수를 전달하려면 base 키워드를 사용한다
this는 자기 자신을 가리킨다면 base는 기반 클래스를 가르킨다.

예제)
class Base
{
    public void BaseMethod();
}

class Derived:Base
{
    public void DerivedMethod()
    {
       base.BaseMethod();
    }
}

7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is 와 as


기반 클래스와 파생 클래스 사이에서는 족보를 오르내리는 형식 변환이 가능하며,
파생 클래스의 인스턴스는 기반 클래스의 인스턴스로도 사용할 수 있다.

예제)
Mammal mammal = new Mammal();
mammal.Nurse();

mammal = new Dog();
mammal.Nurse();

Dog dog = (Dog)mammal;
dog.Nurse();
dog.Bark();

mammal = new Cat();
mammal.Nurse();

Cat cat = (cat)mammal;
cat.Nurse();
cat.Meow();

형변환을 위한 연산자 is, as

is : 객체가 해당 형식에 해당하는지 검사하여 그 결과를 bool 값으로 변환

as : 형식 변환 연산자와 같은 역할을 한다. 다만, 형변환 연산자가 변환에 실패하는 경우 예외를 던지는 반면, as 연산자는 객체 참조를 null로 만든다.

댓글 없음:

댓글 쓰기