1. 인터페이스(Interface)
1.1 인터페이스 메소드와 프로퍼티 선언문과 같은 선언문 목록을 가지고 있습니다.
1.2 인터페이스는 클래스와 함께 쓰이는데, 클래스가 인터페이스에 선언된 항목에 대해 그 코드를 정의합니다. 즉,
1.2 인터페이스는 메소드와 프로퍼티 선언문만 갖고 있고 그 선언문 항목에 대한 코드는 클래스에서 정의한다는 말 입니다.
1.3 구조체도 인터페이스의 사용이 가능합니다.
1.4 클래스는 여러 개의 인터페이스 사용이 가능하다.
이 말들을 정리하여 비유하자면 호빵에 비유할 수 있습니다. 인터페이스는 호빵의 내용물 팥을 말할 수 있습니다. 호빵의 겉은 클래스로 말입니다. 이는 클래스는 클래스를 상속할수 있기때문 입니다. 실제로 클래스와 인터페이스의 관계는 상속이라고 하지 않고 구현이라고 합니다. 하지만 표현을 위해 상속이라고 표현하고 이를 수학적으로 표현해 보겠습니다.
클래스 ⊃ 클래스(호빵 틀 ⊃ 내용물 팥 : 단일 상속)
그런대 클래스는 인터페이스를 구현합니다.
클래스 ⊃ 인터페이스(호빵 틀 ⊃ 어떤 내용물? 팥, 피자, 고구마 등 : 다중 구현)
그리고 인터페이스는 인터페이스를 상속받습니다.
인터페이스 ⊃ 인터페이스(딱히 표현방법이 없음 : 다중 상속)
클래스는 인터페이스에 명시된 모든 메소드를 구현해야 합니다. 인터페이스에서 접근 권한자가 보이지 않는대 이는 무조건 public이기 때문입니다. 이는 공용으로 사용할 메소드, 속성 등을 기술하기 때문입니다. 또한 이는 묵시적으로 가상 메소드 이기도 합니다. 이를 토대로 소스를 보짜보면 다음과 같습니다.
interface ISample // 관례적으로 인터페이스에 표현을 " I "를 붙임 { void itfSample(); } class classSample : ISample { public void itfSample() { ; // 인터페이스의 메소드를 구현 } }
소스 위에서 인터페이스에 접근 권한자가 보이지 않게 public이라고 말했습니다. 때문에 클래스 안에서도 public으로 명시해 줘야 합니다.(동일한 접근 권한자) 그리고 동일한 반환값(void), 메소드명(itfSample()), 동일한 인자리스트여야 합니다. 좀더 자세한 내용의 인터페이스 개요는 다음에 링크를 참고하시기 바랍니다.
2. 델리게이트(Delegate)
델리게이트는 메소드를 대신 수행해주는 역활로 메소드를 참조할 수 있는 객체 입니다. C에서는 함수포인터라는걸 사용하는대 C#에서는 포인터를 사용하지 않기 때문에 이를 대신할 역활을 담당하고 있습니다.(주로 객체간 이벤를 전달하기 위해 사용) 그래서 델리게이트를 이용해 윈도우 프로그래밍에서의 이벤트를 처리할 수 있습니다. 또한 사용자가 원하는 메소드를 다른 메소드에 전달이 가능해 집니다.
delegate int degateSum(int a, int b); public class sampleClass { public static int sumFunc(int a, int b) { return a + b; } static void Main() { degateSum dgSum = new degateSum(sumFunc); int dgResult = dgSum(2, 4); Console.WriteLine(dgResult); } }
위 코드를 보면 델리게이트는 지정한 형태의 메소드를 가리킬 수 있는 타입이 됩니다. new 키워드를 이용하여 사용하며 생성자의 인수로 연결을 원하는 메소드에 이름(sumFunc)을 적어주면 됩니다. 이런식으로 사용이 가능하며 델리게이트 형태의 객체는 하나의 객체에 여러 메소드를 대입이 가능합니다. 위 결과물은 예상하신대로 6이 출력됩니다.
3. 오브젝트(Object)
어떤 값이든 저장이 됩니다. 예를 들자면
// 정수형 object objInt = 1; // 실수형 object objFla = 3.14; // 문자형 object objCha = 'A'; // 문자열형 object objStr = "Hello World"; // 컴파일시 에러가 납니다. ↓ object sampleIntA = 1; object sampleIntB = 2; object sampleIntC = sampleIntA + sampleIntB;
이는 object 끼리는 연산이 불가능 하기 때문입니다. 오브젝트에는 형식에 상관없이 저장이 되기 때문에 저장되어 있는 값이 어떤 자료형에 어떤 값인지 알수가 없습니다. 그래서 GetType()과 ToString()을 이용해 알아낼 수 있습니다.
object objA = 1; object objB = 3.14; object objC = 'A';object objD = "Hello World"; Console.WriteLine(objA); Console.WriteLine(objA.GetType()); Console.WriteLine(objA.ToString()); Console. WriteLine("\r"); Console.WriteLine(objB); Console.WriteLine(objB.GetType()); Console.WriteLine(objB.ToString()); Console. WriteLine("\r"); Console.WriteLine(objC); Console.WriteLine(objC.GetType()); Console.WriteLine(objC.ToString()); Console. WriteLine("\r"); Console.WriteLine(objD); Console.WriteLine(objD.GetType()); Console.WriteLine(objD.ToString());
출력은 다음과 같이 출력이됩니다.
1
System.Int32
1
3.14
System.Double
3.14
A
System.Char
A
Hello World
System.String
Hello World
4. 문자열형(String)
유니코드 문자의 집합으로 문자열 값을 표현하고 다루는데 사용합니다. 문자형이나 문자열은 다시 여러가지 포멧으로 변경표현이 가능합니다. 다음은 System.String.Format 메서드를 사용하여 적용된 문자열 포멧입니다.
종류 |
사용 형식
(대소문자 가리지 않음)
|
사용 예 | 결과 |
통화 Currency |
C | Console.WriteLine("{0:C}", 2.5); | $2.50 |
10진법 Decimal |
D | Console.WriteLine("{0:C}", 25); | 00025 |
과학적 지수 Scientific |
E | Console.WriteLine("{0:E}", 25); | 2.500000E+005 |
고정 소수점 Fixed-point |
F | Console.WriteLIne("{0:F2}", 25); Console.WriteLine("{0:F0}", 25); |
25.00 25 |
일반 General |
G | Console.WriteLine("{0:G}", 25); Console.WriteLine("{0:G}", 2.5); |
25 2.5 |
숫자 Number |
N | Console.WriteLine("{0:N}", 2500000); | 2,500,000.00 |
백분율 Percentage |
P | Console.WriteLine("{0:P}", .2534160789); Console.WriteLine("{0:P1}", .2534160789); |
25.34 % 25.3% |
16진법 Hexadecimal |
X | Console.WriteLine("{0:X}", 250); Console.WriteLine("{0:X}", 0xFFFF); |
FA FFFF |
숫자 형식
종류 |
사용 형식
|
사용 예 | 결과 |
간단한 날짜 패턴 | d | DateTime dt = new DateTime(2009, 1, 1); Console.WriteLine("{0:d}", dt); |
2009-01-01 |
자세한 날짜 패턴 | D | Console.WriteLine("{0:D}", dt); | 2009년 1월 1일 목요일 |
전체 날짜/ 시간 패턴 (간단한 시간) |
f | DateTime dt = new DateTime(2009, 1, 1, 12, 34, 56); Console.WriteLine("{0:f}", dt); |
2009년 1월 1일 목요일 오후 12:34 |
전체 날짜/ 시간 패턴 (자세한 시간) |
F | Console.WriteLine("{0:F}", dt); | 2009년 1월 1일 목요일 오후 12:34:56 |
일반 날짜/ 시간 패턴 (간단한 시간) |
g | DateTime dt = new DateTime(2009, 1, 1, 12, 34, 56); Console.WriteLine("{0:g}", dt); |
2009-01-01 오후 12:34 |
일반 날짜/ 시간 패턴 (자세한 시간) |
G | Console.WriteLine("{0:G}", dt); | 2009-01-01 오후 12:34:56 |
월 일 패턴 | M / m | DateTime dt = new DateTime(2009, 1, 1, 12, 34, 56); Console.WriteLine("{0:M}", dt); |
1월 1일 |
간단한 시간 패턴 | t | Console.WriteLine("{0:t}", dt); | 오후 12:34 |
자세한 시간 패턴 | T | Console.WriteLine("{0:T}", dt); | 오후 12:34:56 |
정렬 가능한 유니버설 날짜/ 시간 패턴 |
u | DateTime dt = new DateTime(2009, 1, 1, 12, 34, 56); Console.WriteLine("{0:u}", dt); |
2009-01-01 12:34:56Z |
유니버설 전체 날짜/ 시간 패턴 (국제표준시각) |
U | Console.WriteLine("{0:U}", dt); | 2009년 1월 1일 목요일 오전 3:34:56 |
년 월 패턴 | Y / y | Console.WriteLine("{0:Y}", dt); | 2009년 1월 |
날짜 형식
(날짜 형식은 시스템 로케일이 "한국/한국어 ko-kr"로 설정된 경우이며 시스템 로케일에 따라 다르게 출력 됩니다.)