C#에서 this는 클래스나 구조체의 현재 인스턴스를 참고하는 데 사용된다.
this를 사용하면 클래스 내부에서 해당 인스턴스의 멤버 변수나 메소드에 접근할 수 있으며, 코드의 가독성을 높이고 현재 인스턴스의 컨텍스트에서 작업을 명확하게 수행할 수 있다.
this의 주요 용도
1. 현재 인스턴스의 멤버에 접근 : 클래스 내부의 메서드나 생성자에서 클래스의 필드, 프로퍼티, 다른 메서드에 접근할 때 this 키워드를 사용한다.
메서드의 매개변수 이름과 클래스의 필드 이름이 같을 때, 필드와 매개변수를 구분하기 위해 this를 사용할 수 있다.
public class Person
{
private string name;
private int age;
public Person(string name, int age) // 클래스의 필드 이름과 생성자의 매개변수의 이름이 같음
{
this.name = name;
this.age = age;
}
}
2. 생성자 오버로딩 : this 키워드를 사용하여 같은 클래스 내의 다른 생성자를 호출할 수 있다.
이를 통해 코드 중복을 줄이고, 여러 생성자에서 공통적인 초기화 로직을 한 곳에 모을 수 있다.
Public class Rectangle
{
private double width;
private double height;
public Rectangle(double length)
: this(length, length) // 정사각형 선언의 경우에는 가로, 세로가 같으므로 하나의 변으로
// 다른 생성자 호출
{
}
public Rectangle(double width, double height)
{
this.width = width;
this.height = height;
}
}
3. 메서드 체이닝(Method Chaining) : this를 반환함으로써 클래스의 인스턴스 메서드들을 연속적으로 호출할 수 있다. 이 방식은 빌더 패턴(Builder Pattern)에서 자주 사용된다.
public class Builder
{
private string data;4
public Builder SetData(string data)
{
this.data = data;
return this;
}
public Builder AppendData(string extraData)
{
this.data += extraData;
return this;
}
public void Build()
{
Console.WriteLine(this.data);
}
}
// 사용 예시
Builder builder = new Builder();
builder.SetData("Initial Data").AppendData(" and Extra Data").Build();
※ 빌더 패턴(Builder Pattern)이란? : 복잡한 객체의 생성 과정을 단순화하고, 객체를 단계적으로 생성하여 구성하는 패턴.
4. 정적 함수에서 this를 사용한 확장 메서드 : C#에서는 정적 클래스와 정적 메서드를 사용하여 확장 메서드를 만들 수 있다. 이 때, 확장 메서드의 첫 번째 매개변수에 this 키워드를 붙이면, 특정 타입의 인스턴스 메서드처럼 호출할 수 있다.
이 방법은 해당 타입을 수정하지 않고도 새 메서드를 추가하는 것처럼 사용할 수 있다.
public static class IntExtensions
{
// 정적 메서드의 첫 번째 매개변수에 this를 붙임
public static bool IsEven(this int number)
{
return number % 2 == 0;
}
}
// 사용 예시
int number = 10;
bool isEven = number.IsEven();
Console.WriteLine($"{number} is even : {isEven}");
확장 메서드는 정적 메서드로 정의해야 하고, 일반 인스턴스 메서드처럼 인스턴스를 직접 참조하는 것이 아니므로 클래스나 구조체 외부에서 제공하는 기능을 확장하는 데 유용하다.
참고 : https://velog.io/@corn1200/C-this-%ED%82%A4%EC%9B%8C%EB%93%9C
'언어(C, C++, C#)' 카테고리의 다른 글
[C#] 깊은 복사 / 얕은 복사 (Deep Copy / Shallow Copy) (2) | 2024.11.06 |
---|---|
[C#] Virtual, Abstract, Interface (0) | 2024.11.05 |
[C#] object와 var (0) | 2024.11.04 |
[C#] C#의 Collection (0) | 2024.11.04 |
[C++] C++의 STL (0) | 2024.11.03 |