일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 튜플
- 메소드숨기기
- 클래스
- 인덱서
- c#
- 가변배열
- System.Array
- 배열초기화
- 분할 클래스
- 인터페이스 상속
- as
- 접근 한정자
- 일반화 클래스
- base()
- 프로퍼티
- 오버라이딩
- 자동구현프로퍼티
- 형식변환
- 추상 프로퍼티
- 중첩클래스
- 배열
- 컬렉션 초기화
- this 키워드
- 인터페이스 예제
- 인터페이스의 프로퍼티
- 무명형식
- 이것이C#이다
- 클래스 연습문제
- is
- 프로퍼티와 생성자
- Today
- Total
제로의영역
7.15 확장 메소드 본문
* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.
* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.
(1) 정의: 기존 클래스의 기능을 확장하는 기법 (이게 뭔소리인가요?) >> 시스템에서 제공하는 클래스와 다른 사용자가 작성한 클래스의 기능에 사용자가 새로운 메소드를 추가시키는 기법
(2) 용도: 기존의 클래스(시스템에서 제공하는 클래스 포함)안에 새로운 메서드 추가 또는 새로운 클래스를 생성을 하지 않고 새로운 기능을 추가하기 위해 사용.
(3) 사용법
1) static 한정자로 클래스 선언
' class + 클래스 이름 //일반적인 클래스 선언
--> 한정자 + static + class + 클래스 이름 // 확장 메소드 사용 가능 클래스 선언( class에 한정자와 static이 붙는 기존에 볼 수 없었던 형식 ) '
2) static 한정자로 메소드 선언
'한정자 + 반환형식 + 메소드 이름(매개변수) // 일반적인 메소드
--> 한정자 + static + 반환형식 + 메소드 이름(매개변수) // 확장 메소드1 '
3) 첫번째 매개 변수에 this키워드로 수식
'한정자 + 반환형식 + 메소드 이름(매개변수) // 일반적인 메소드
--> 한정자 + static + 반환형식 + 메소드 이름(this 대상형식 식별자, 매개변수) // 확장 메소드2 '
4) 첫번째 매개 변수(this 대상형식 식별자)는 확장하고자 하는 클래스의 인스턴스(객체)를 입력: 일반 매개변수처럼 호출시에 입력된 매개변수가 적용되지 않고 입력된 객체가 있는 클래스에 의해 호출 됨.
5) 다음 매개 변수에 호출할 때 입력되는 매개 변수를 입력
* static 한정자: 메소드나 필드가 클래스의 인스턴스(객체)가 아닌 클래스 자체에 소속되도록 지정하는 한정자로 초기화하지 않고(생성자를 만들지않고) 호출해야 함.
확장 메소드 형식: '한정자+static+반환형식+메소드이름(this 대상형식 식별자, 매개 변수)'
예제)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyExtension;
namespace MyExtension
{
public static class IntegerExtension //static으로 클래스 선언
{
public static int Square(this int myInt) //int클래스에서 호출되는 myInt변수를 갖는 메소드를 static으로 선언
{
return myInt * myInt; //호출자에게 반환
}
public static int Power(this int myInt, int exponent) //int클래스에서 호출되는 myInt변수와 exponent매개변수를 갖는 메소드
{
int result = myInt; // result는 myInt값을 가리킨다
for (int i = 1; i < exponent; i++) // i는 1로 초기화하고 입력된 변수보다 작으면 1씩 계속상승
result = result * myInt; // i가 계속 상승할 때마다 result는 result*myInt값으로 변환
return result; //for문이 적용이 끝난 result를 호출자에게 반환
}
}
}
namespace ExtensionMethod
{
class MainProgram
{
static void Main(string[] args)
{
Console.WriteLine($"3^2:{3.Square()}"); //int클래스에서 호출되는 3을 갖는 Square()메소드 호출
Console.WriteLine($"3^4:{3.Power(4)}"); //int클래스3과 변수4를 가지는 Power()메소드 호출
Console.WriteLine($"2^10:{2.Power(10)}"); //int클래스2와 변수4를 가지는 Power()메소드 호출
}
}
}
출력결과
3^2:9
3^4:81
2^10:1024
this가 가리키는 클래스의 인스턴스라는 말이 이해가 안되서 많이 헤매었습니다.
여태까지 클래스라고 하면 제가 작성했던 눈에 보이는 클래스만 생각해서요.
예제에 있는 'this int myInt'의 int는 시스템에서 제공하는 클래스입니다.
확장 메소드는 시스템에서 제공하는 클래스들까지 포함하여 사용되는 기능이네요. ㅋ
추가: 메인 메소드에 있는 '3.Square()'의 의미를 몰라 한참 고생했습니다. 기존에 예제들을 보면 메소드를 호출할 때는 'Console.WriteLine()'처럼 '클래스+메소드(변수)'의 구성으로 되어있었는데 클래스가 들어가는 자리에 '3'이 들어가서 완전 당황했습니다.
설명을 찾아봐도 잘 안나와 있네요. ㅜㅜ 추론해보기로는 확장 메소드의 변수에서 'this로 수식된 클래스의 인스턴스'가 맨앞에 위치하기 때문에 호출하는 메소드에서 '클래스의 변수+메소드(변수)'로 호출하면 해당하는 클래스를 자동으로 찾아가서 호출해주는 것 같습니다. 확인이 되면 좀더 정확히 적도록 하겠습니다.
호출할 때 호출되는 메소드가 static으로 수식되면 '호출class'+'.'+'호출 메소드'+'(매개변수)'로 호출하며 아닌 경우는 '호출객체'+'.'+'호출 메소드'+'(매개변수)'로 호출한다고 합니다. 확장 메소드의 변수에서 this로 수식된 클래스의 객체를 보고 해당하는 클래스를 자동으로 찾아서 호출해줍니다.
'C#' 카테고리의 다른 글
7.17 튜플 (0) | 2019.06.18 |
---|---|
7.16 구조체 (0) | 2019.06.16 |
7.14 분할 클래스(Partial Class) (0) | 2019.06.10 |
7.13 중첩 클래스 (0) | 2019.06.07 |
7.12 오버라이딩 봉인하기 (0) | 2019.06.05 |