본문 바로가기

프로그래밍/C#.net30

[effective C#] item #9: ReferenceEquals(),static() Equals(),instance Equals(),operator==의 상호 연관성을 이해하라. ■ITEM#9 ReferenceEquals(),static() Equals(),instance Equals(),operator==의 상호 연관성을 이해하라. 새로운 타입을 만드는 경우 동일성의 의미를 정확히 규정하는 것은 매우 중요하다. C#에서 동일함을 비교하는 메서드 public static bool ReferenceEquals(object left, object right) ←재작성X public static bool Equals(object left, object right) ←재작성X public virtual bool Equals(object right) ←재작성O public static bool operator==(Myclass left, Myclass right) ←재작성O 하지만,2개의.. 2009. 8. 24.
[effective C#] item #4 : #if 대신 Confitional Attribute를 사용하라. ■item#4 #if 대신 Confitional Attribute를 사용하라. Confitional Attribute의 제한사항 - 메서드에 대해서만 지정이 가능하다. - Conditional Attribute를 지정하는 메서드는 반드시 void형태의 리턴 타입을 가져야 한다. - 메서드 내의 일부 문장에 대해서만 Conditional Attribute를 지정해야 한다며 ,해당 문장을 독립된 메서드로 분리하는 것이 좋다. Conditional Attribute는 - #if/#endif를 사용하는 것보다 좀 더 효율적인 IL코드를 생성한다. - 메서드 단위로만 Attribute를 지정할 수 있기 때문에, 조건적으로 생성되는 코드들을 일반 코드들과 격리시키고, 보다 구조적으로 프로그램을 만들 수 있도록 한다.. 2009. 8. 24.
[effective C#] item #3 : cast보다는 is나 as가 좋다. ■item#3 cast보다는 is나 as가 좋다. C#언어에서는 많은 경우에 System.Object타입의 인자를 받아들이는 메서드를 만들어야 하는데, 이는 닷넷 프레임워크가 이미 그렇게 구성되어 있기 때문에 불가피하다. 타입을 변경하는 방법 1.as연사자를 사용 2.cast연산자를 사용 방어적 프로그램 형변환의 가능성 여부는 is 연산자가 수행 형변환 수행을 위해서는 as 연산자를 사용 형변환을 피할 수 없다면,C#언어의 as나 is연산자를 쓸 수 있는지를 먼저 검토하자. 강제적인 형변환은 가끔 예기치 않은 결과를 초래할 수 있다. as와 is는 항상 일관된 동작을 보여주며 형변환이 정확히 수행될 수 있는지를 확인하고 정확한 형변환을 수행한다. 따라서 cast연산을 수행하였을 때 발생할 수 있는 의도하.. 2009. 8. 24.
Interface 인터페이스(interface)라는 의미를 직역하면 경계면이 됩니다. 다시말해, 물건과 물건의 사이를 중개하는 부분을 애기합니다. 예를 들어, PC와 주변기기를 연결할때, 어떤 물리매체를 이용해서, 어떤 신로를 보낼까라는 규약을 정할 필요가 있습니다. 이런 규약을 기본으로 해서 만들어진 케이블이나 커넥터를 인턴페이스라고 부르는 것입니다. 오프젝트지향 프로그램의 세계에 있어서는, 인터페이스란 클래스가 실제구현해야되는 규약을 정하는것입니다.다시말해서, class설계자와 class이용자 사이를 연결하는 역활을 하는것이 인터페이스입니다. ■메소드의 규약과 실제구현 메소드를 설계하는 경우, 규약의 결정과 실제구현이라는 2개의 단계를 거치는 것이 됩니다. 규약혹은 계약(constract)는 클래스외부에서 보는 클래스.. 2009. 8. 24.
추상화 추상메소드란 실체를 가지지않고, 메소드 의미만을 정의한 메소드입니다. 추상메소드의 실체는 base class에서 만들지 않고, 파생클래스에서 만듭니다. 또한, 추상클래스는 인스턴스를 생성할 수 없는 클래스로, 계승을 하는것을 전제로 한 클래스입니다. ■추상화 다용성에서 가상메소드의 이용예로써 Person클래스를 들었습니다. 이 Person base클래스에는 Age라는 프로퍼티가 있습니다만, 이 프로파티자체는 의미있는 값을 돌려주지않고,실체는 파생클래스의 Age프로퍼티에서 되었습니다. class Person { // 여기서 상관없는 이름은 생략. protected int age; public Person(int age){this.age = age;} public virtual int Age { // bas.. 2009. 8. 24.
virtual method virtual 수식어를 붙인 메소드를 가상메소드(virtual method)라고 부릅니다. 또한, 가상메소드를 파생글래스에서 재정의하는 것을 오버라이드(override:위에 덮어씌우다)라고 합니다. C#에서는 base클래스의 멤버은패와 동일하게, 프로그래머가 생각지도 않은곳에서 메소드가 오버라이드되는것을 막기위해서, 메소드를 오버라이드할때는 override수식어를 명시적으로 부쳐야 합니다. 예를 들어, 나이를 취득하는 프로파티 age를 virtual로 해서, 일단 의미없는 값을 돌려줍니다. class Person { protected string name; protected int age; public Person(string name, int age) { this.name = name; this.age.. 2009. 8. 24.
계승 계승(inheritance)이란 오브젝트지향의 중심을 다루는 개념으로, 어떤 클래스에서 성질을 물려받아서 새로운 클래스를 만드는 것이다. 계승은 파생(derivation) 이라고도 부른다. ■계승관계 예를 들면 인간과 학생이라는 2개의 클래스에 관해서 생각해 보자. 학생이라면 반드시 인간이라는 특징을 가지고 있다. 그것과 반대로 인간이라고 반드시 학생이지는 않다. 즉, 학생은 인간의 특별한 경우라고 할 수 있다. 다시말해서, 인간은 이름,나이 등의 속성이 있다. 학생은 인간의 일부분이기때문에 당연히 2개의 속성을 가지고 있다. 여기에다 학생은 학번이라는 속성도 가지고 있다. 이것처럼, 어떤 클래스A에 클래스B를 포함하는 관계에 있을때는, 이런 관계를 계승관계라고 하고, B는 A를 계승한다. 혹은 B는 A.. 2009. 8. 24.
정적변수,정적메소드 정적변수(static variable),정적메소드(static mathod)는 특정 오브젝트가 아니라,클래스에 속하는 멤버변수나 메소드를 말한다. ■사용방법 static 형 변수이름 예를 들어 class Person { public string name; // 이름.개인별로 다르기 때문에 인스턴스변수로. public int age; // 나이.개인별로 다르기 때문에 인스턴스변수로. public static string scientificName; // 학명. 사람마다가 아니라 분류에 의해 정해지는 것이라, 정적변수로. } 특정오브젝트는 사람마다,클래스는 인간이라는 종별,자체가 되는것이라,이름과 나이는 사람마다 달라지지만,인간이라는 종의 학명[Homo sapiens]은 공통이다. 그래서, 사람이라는 클래스.. 2009. 8. 24.
프로퍼티 프로퍼티(property)는 자바나 C++에는 없는 기능으로, 클래스외부에서 보면 멤버변수처럼 보이고,클래스내부에서 보면 메소드처럼 보이는 것이다. ■프로퍼티사용법 엑세스레벨 형 프로퍼티이름 { set { // set엑세서 // 여기에 값이 변경될때 처리를 쓴다. // value 라고 하는 이름의 변수에 대입된 값이 들어간다. } get { // get엑세서 // 여기에 값을 얻을때 처리를 쓴다. // 메소드의 경우와 같이 값은 return 키워드를 사용해서 돌려준다. } } 예를 들어 실제로 클래스를 이용하는 쪽의 코드는 복잡해진다. ■프로퍼티를 사용하지 않은 클래스 using System; //실체를 숨겨서 만든 복소수 클래스 class Complex { //실체는 외부에서 숨김(private로 해놓.. 2009. 8. 24.