2015년 3월 6일 금요일

뇌자극 C# 5.0 - 8~9강

-8강 인터페이스와 추상 클래스-


8.1 인터페이스의 선언


interface 인터페이스이름
{
   반환형식 메소드이름1( 매개_변수_목록 );
   반환형식 메소드이름2( 매개_변수_목록 );
   반환형식 메소드이름3( 매개_변수_목록 );
   반환형식 메소드이름4( 매개_변수_목록 );
   ......
}

인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티만 가질 수 있다.
그리고 구현부와 접근 제한자도 없다. 무조껀 public로 선언된다.
인스턴스도 만들 수 없다.
단, 인터페이스를 상속 받는 클래스의 인스턴스를 만드는 것은 가능

8.2 인터페이스는 약속이다


인터페이스는 PC에 있는 USB 포트와 비슷하다.
모양이 규격화 되어 있어서 모양만 맞으면 어떤 제품이던 꽂아서 쓸수 있다.
인터페이스에 선언된 메소드들은 상속 받는 클래스에서 반드시 구현을 해야만 한다.
꼭 들어가야 하는 메소드를 인터페이스로 선언해 놓는 것이 좋다.

8.3 인터페이스를 상속하는 인터페이스


기존 인터페이스에 새로운 기능을 추가한 인터페이스를 만들고 싶을 때
인터페이스를 상속하는 인터페이스를 만들면 된다.

interface 파생인터페이스 : 부모인터페이스
{
    //..... 추가할 메소드 목록
}

8.4 여러개의 인터페이스, 한꺼번에 상속하기


클래스는 여러 클래스를 한꺼번에 상속할 수 없다.
C#에서는 클래스의 다중 상속을 허용하지 않는다.
하지만 인터페이스는 내용이 아닌 외형을 물려주기 때문에
인터페이스의 다중 상속은 허용한다.

예제)
interface IRunnable
{
   void Run();
}
interface IFlyable
{
   void Fly();
}

class FlyingCar : IRunnable, IFlyable  //인터페이스 다중 상속
{
    public void Run()
    {
        Console.WriteLine("Run! Run!");
    }
    public void Fly()
    {
        Console.WriteLine("Fly! Fly!");
    }
}

8.5 추상 클래스 : 인터페이스와 클래스 사이


추상 클래스는 인터페이스와 달리 "구현"을 가질 수 있다.
하지만 클래스와는 달리 "인스턴스"는 가질 수 없다.
그리고 "추상 메소드"를 가질 수 있다

추상 클래스 선언하는 법

abstract class 클래스이름
{
   //클래스와 동일하게 구현
}

예제)
abstract class AbstractBase
{
   public abstract void SomeMethod();
}

class Derived : AbstractBase
{
   public override void SomeMethod();
   {
      //Something
   }
}

추상 메소드는 추상 클래스를 사용하는 프로그래머가 그 기능을 정의하도록 강제하는 장치

-9강 프로퍼티-


9.1 public 필드의 유혹


프로퍼티를 이용하면 으닉성과 편의성을 다 누릴수 있다.
자바 같은 경우에는 아래와 같이 쓴다.

class MyClass
{
   private int myField;
   public int GetMyField() { return myField;}
   public void SetMyField() ( int NewValue ) { myField = newValue;}
}

MyClass obj = new MyClass();
obj.SetMyField(3);

하지만 C#은 프로퍼티를 지원한다.

9.2 메소드보다 프로퍼티


프로퍼티를 선언하는 문법

class 클래스이름
{
   데이터형싱 필드이름;

   접근한정자 데이터형식 프로퍼티이름
   {
       get
       {
           return 필드이름;  
       }

       set
       {
            필드이름 = value;
       }
   }
}

get/set은 접근자라고 한다.
get 접근자는 값을 읽어 오고, set 접근자는 필드에 값을 할당 한다.
위의 소스를 프로퍼티로 바꿔보겠다.

class MyClass
{
   private int myField;
   public int MyField
   {
      get
      {
         return myField;
      }
      set
      {
          myField = newValue;
      }
   }
}

MyClass obj = new MyClass();
obj.MyField = 3;

set 접근자를 구현하지 않으면 해당 프로퍼티는 읽기 전용이 된다.

9.3 자동 구현 프로퍼티


C# 3.0 이상부터는 코드를 더 단순하게 만드는 자동 구현 프로퍼티를 도입했다.

예제)
public class NameCard
{
    private string name;
    private string phoneNumber;

    public string Name
    {
       get { return name; }
       set { name = value; }
    }
    public string PhoneNumber
    {
       get { return phoneNumber; }
       set { phoneNumber = value; }
    }
}

를 자동 구현 프로퍼티로 바꾸면....

public class NameCard
{
    public string Name
    {
       get; set;
    }

    public string PhoneNumber
    {
        get; set;
    }
}

9.4 프로퍼티와 생성자


객체를 생성할 때 각 필드를 초기화 하는 또 다른 방법은 프로퍼티를 이용한 초기화다.

클래스이름 인스턴스 = new 클래스이름()
{
    프로퍼티1 = 값,
    프로퍼티2 = 값,  //세미클론(;)이 아니라 콤마(,) 다
    프로퍼티3 = 값
}; //세미콜론(;)이 붙어야 한다.

모든 값이 올 필요는 없고 초기화 하고 싶은 프로퍼티만 넣어서 초기화 하면 된다.

예제)
BirthdayInfo birth = new BirthdayInfo()
{
   Name = "서현",
   Birthday = new DateTime(1991, 6, 28)
};

내가 서현을 좋아하긴 하지만....;; 진짜 책에 이리 예제가 되어 있다...;

9.5 무명 형식


말 그래도 이름이 없는 형식이다. 무명 형식은 선언과 동시에 인스턴스를 할당한다.
인스턴스를 만들고 다시는 사용하지 않을 때 요긴하게 쓰인다.

예)
var myInstance = new { Name = "윤아", Age="25" }; //new 다음에 이름이 없다.

9.6 인터페이스의 프로퍼티


인터페이스는 메소드 뿐만 아니라 프로퍼티와 인덱서도 가질 수 있는데
프로퍼티나 인덱서를 가진 인터페이스를 상속하는 클래스가 "반드시" 해당 프로퍼티와
인덱서를 구현해야 한다.
인터페이스의 프로퍼티 선언이 클래스의 자동 구현 프로퍼티 선언과 동일하다.

예제)
interface IProduct
{
    string ProductName
    {
        get; set;
    }
}

class Product : IProduct
{
    private string productName;
    public string ProductName
    {
       get { return productName; }
       set { productName = value; }
    }
}

9.7 추상 클래스와 프로퍼티


추상 프로퍼티 문법

abstract class 추상클래스이름
{
   abstract 데이터형식 프로퍼티이름
   {
      get; set;
   }
}

예제)

abstract class Product
{
   private static int serial = 0;
   public string SerialID
   {
      get { return String.Format("{0:d5}", serial++) }
   }
   abstract public DateTime ProductDate
   {
       get; set;
   }
}

class MyProduct : Product
{
   public override DateTime ProductDate
   {
      get; set;
   }
}

댓글 없음:

댓글 쓰기