[Hoons C# 스터디 2009 1기] 3주차 세미나 / 발표 내용 정리


 

혹시 못오신 분이나 정리 못 하신분 또는 스터디를 듣지 않는 분을 위해 간단히 정리해 봤어요~

 

참고용으로 한번 보세요~~

 

 

(Office 2007 One Note에 있던 내용을 그대로 복사해서 넣어서 조금 깨질지 몰라요~)

 

 

 

 

 

 

발표 내용

 

 

 

발표 내용

Class? Object?

  • 속성, 역할을 정의한 틀
  • 객체와 클래스의 관계
  • 객체 : 어떠한 문제
  • 클래스 : 이들에 맞는 상황을 설명하는 것
  • Class = 붕어빵 틀 , Object = 찍어낸 붕어빵
  • Abstract Class ( 추상 클래스 )
    • 어떤 클래스를 만들어 내기 위해서 기본적인 기능을 포함하는 클래스
    • 객체로 만들 수 없는 클래스
    • 이를 상속받는 클래스가 이러한 기본기능이 있어야 한다는 것을 지정한다.
  • 추상 클래스의 예
    • 붕어빵 틀과 와플빵 틀의 기본인 '무언가 만드는 틀' 이라는 추상 클래스
  • Interface? (인터페이스)
    • 객체 자체 or 객체와 객체를 엮어주기 위한 기능, 속성들의 약속(표준)
  • 마우스 클래스 : IBluetooth, IUSB, IPS2 어떤 인터페이스를 받아 마우스를 구현할 것인가?
  • IDisposable 인터페이스의 예
    • IDisposable 인터페이스는 Dispose() 라는 메소드를 구현해 주어야 한다.
    • 객체의 메모리를 해제할 수 있도록 구현하고 싶을 때 이 인터페이스를 상속 받는다.
  • Interface vs Abstract Class
    • 추상클래스(or class)는 단일 상속만 가능하다 : 상하 단계의 상속
    • Interface의 구현은 여러가지를 받아 구현할 수 있다. : 기능적으로 추가되는 수평적인 상속

 

 

 

 

 

세미나 내용

 

  1. Interface, Abstract Class, Class

 

  1. Interface
    1. 인터페이스의 상속 = implement (구현) , 추가되는 기능들을 넣는 형식
    2. 인터페이스의 상속을 받으면 '무조건' 그 안의 것들을 모두 구현해야 한다.
    3. 이기종간의 통신에 객체를 형태를 알리기 위해

 

  1. Abstract Class
    1. 추상클래스의 상속 = extends (확장) , 설계된 틀을 구현 / 확장 하는 형식

 

  1. Class
    1. 구현된 설계도

 

 

  1. OOP(Object Oriented Programming)

 

  1. 상속(Inheritance)
    1. sealed 키워드 : 성능상 장점이 있다
      1. 왜? : 더 이상 상속 받지 않는다는 것을 알려주기 때문에
      2. Class 선언시 앞에 sealed 라는 키워드를 붙여주면 된다.
      3. Ex) sealed class Bar : Foo , Idisposable { }

 

  1. 추상화(Abstraction)

 

  1. 다형성(Polymorphism)
    1. Overide
      1. 상속 받은 메소드를 (virtual 등으로 선언된) 받아 재정의 할 때 사용한다.
        1. virtual - override 둘은 같이 다닌다
      1. new 키워드를 붙여 메소드를 정의하는 것과 비교된다
      2. 다음 예제를 보자

 

// virtual - override를 사용할 때

 

class Foo

{

public virtual void M()

{

Console.Write("Foo.M()");

}

}

 

class Bar : Foo

{

public override void M()

{

Console.Write("Bar.M()");

}

}

 

 

 

// New 키워드를 사용할 때

 

class Foo

{

public void M()

{

Console.Write("Foo.M()");

}

}

 

sealed class Bar : Foo

{

public new void M()

{

Console.Write("Bar.M()");

}

}

 

 

 

 

 

class Program

{

static void Main(string[] args)

{

Foo foo = new Foo();

Bar bar = new Bar();

 

foo.M();

MM(foo);

 

bar.M();

MM(bar);

 

MM((Foo)bar); // virtual과 new의 차이

 

/*

 * virtual - override 를 사용한 경우

 * (재정의 되어 자식 클래스에 M()은 완전한 재정의가 되었다)

 * Foo.M()

 * Foo.M()

 * Bar.M()

 * Bar.M()

 * Bar.M() // 재정의 되어 Bar가 나왔다

 *

 * new를  사용한 경우

 * (재정의가 아니고 Bar에서만 쓸 M을 선언한 것이 된다.)

 * Foo.M()

 * Foo.M()

 * Bar.M()

 * Foo.M() // Foo의 특성이 그대로 나타난다

 * Foo.M() // 재정의가 덮어 씌워지지 않고 Foo가 실행되었다

 */

}

}

 

  1. Overload : 같은 이름의 메소드로 다양한 형식의 인자를 받도록 한다
    1. void Abc(string a)
    2. void Abc(int a)
    3. void Abc(bool a)
    4. ...

 

  1. 정보은닉(Encapsulation)

 

  1. Property
    1. Get , Set : 둘 다 또는 둘 중 한가지만 노출 할 수 있다.
    2. Get set을 이용해 접근을 제어한다
    3. 내부에 선언된 내부의 멤버변수에 직접 접근을 막을 수 있다.

 

 

  1. Dispose Pattern

 

  1. IDisposable 이라는 인터페이스를 사용한다.

 

  1. 이 인터페이스는 Dispose() 메소드를 재정의(Override) 해야 한다.

 

  1. 구현의 예

class DbManager : IDisposable

{

~DbManager() // Finalize

{

this.Dispose();

}

 

#region IDisposable 의 인터페이스를 구현한 부분

override void Dispose() // Dispose

{

// 어쩌고 저쩌고

}

#endregion

}

 

  1. Finalize
    1. 객체가 정말 소멸될 때 호출되므로 Dispose와는 다르다.
    2. 클래스의 명칭과 동일한 메소드
    3. 반환 타입 / 접근 제어자를 사용할 수 없다.
    4. 앞부분에 ~ 를 붙여 구분 지어주면 객체가 소멸될 때 자동으로 호출된다

~DbManager() // Finalize

{

this.Dispose();

}

 

 

  1. Dispose와 같이 사용하는 C# 구문 "using"
    1. C# 맨위에 쓰는 using과 다르다
    2. 아래는 using의 사용 구문

using(DbManager dbm = new DbManager)

{

// 이런저런 코드

// 이 안에서는 using 안에서 선언한 것이 살아 있다.

} // 여기서 dbm은 소멸된다 Finalize

// 에러가 발생한다 dbm = null 이기 때문에 NullReferenceException이 발생한다

dbm.어떤메소드();

  1. 기타 팁 : Managed 코드를 Dispose할때 GC.SuppressFinalize(this); 를 호출 한다.

 

  1. SqlHelper 의 예

 

public sealed class SqlHelper // sealed 를 이용해서 더 이상 상속받지 못하도록 한다.

{

// 생성자의 오버로드

// 기본적으로 지정된 위치의 연결 문자열을 가져옴

public SqlHelper() : this(ConfigurationManager.ConnectionStrings["connstr"].ToString());

public SqlHelper(string connStr) { … };

 

// 실행할 쿼리 메소드의 오버로드

public bool ExecuteNonQuery(string query)

{

List<string> queries = new List<string>(1);

queries.Add(query);

this.ExecuteNonQuery(queries);

}

public bool ExecuteNonQuery(List<string> queries) { … };

}

 

 

 

 

참고하세요 ^ ^



PS . 이 글은 Hoons.kr / i-ruru.com 두 곳에서만 볼 수 있습니다. 컨텐츠 변경 / 상업적 이용을 허용하지 않습니다. 링크만 참조해주세요~