this

인스턴스 특정

현재 인스턴스를 가리키는 기능을 한다.

주로 멤버 메서드나 생성자에서 인스턴스 변수를 참조할 때 사용한다.

 

class Person {
    private string name;
    private int age;

    public Person(string name, int age) {
        this.name = name;
        this.age = age;
    }

    public void PrintInfo() {
        Console.WriteLine("Name: " + this.name);
        Console.WriteLine("Age: " + this.age);
    }
}

이와 같은 경우 this 키워드는 동일한 이름의 name과 age를 멤버와 매개변수를 구분하는 데 사용된다.

PrintInfo 내에서는 this를 사용하지 않고 호출해도 되지만 일관성을 유지하기 위해 사용하는 등 개발자의 선호도에 따라 사용여부가 다르다.

 

 

생성자 호출

다른 생성자를 호출할 때 사용할 수 있다.

class Person {
    private string name;
    private int age;

    public Person(string name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(string name) : this(name, 0) {
    }

    public void PrintInfo() {
        Console.WriteLine("Name: " + this.name);
        Console.WriteLine("Age: " + this.age);
    }
}

위와 같이 두 개의 오버로딩된 생성자가 선언되었을 때 string name 매개변수만 받는 생성자의 경우 호출될 때 Person(string name, int age) 생성자를 호출하며 이때 age 값을 0으로 호출하는 동작이 수행된다.

 

인덱서

인덱서는 클래스나 구조체 등의 객체를 배열처럼 인덱싱할 수 있게 해주는 것으로 대괄호 안에 인덱스를 전달하여 객체의 멤버 변수나 속성 값을 가져오거나 설정할 수 있다.

 

public class MyList
{
    private string[] _data = new string[10];

    public string this[int index]
    {
        get => _data[index];
        set => _data[index] = value;
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyList list = new MyList();
        list[0] = "Hello";
        list[1] = "World";
        Console.WriteLine(list[0]); // "Hello" 출력
        Console.WriteLine(list[1]); // "World" 출력
    }
}

this 키워드로 정의된 인덱서는 string 형식의 배열 _data 멤버 변수를 instance [indexer]와 같이 바로 접근하여 사용할 수 있다. 

 

인덱서를 사용하지 않을 경우에는 해당 멤버에 접근하기 위해서 별도의 public 프로퍼티나 메서드 또는 _data를 public으로 선언해야 한다.

 

 

 

728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# Method Parameter 키워드  (0) 2023.04.27
C# Namespace 키워드  (0) 2023.04.27
C# 상위 멤버 접근 키워드 : base  (0) 2023.04.25
C# 구조체 키워드 : struct  (0) 2023.04.25
C# 문자열 키워드 : string  (0) 2023.04.25

base

상위 클래스로부터 파생된 클래스에서 사용할 수 있는 키워드로 상위 클래스의 멤버에 액세스 할 때 사용된다.

예를 들어 상위 클래스에서 정의된 멤버를 파생 클래스에서 다시 구현할 때 base 키워드를 사용하면 상위 클래스의 멤버에 접근할 수 있다.

 

public class Parent{
	virtual public void CallFunc(){
    	Console.WriteLine("Parent Call");
    }
}

public class Child : Parent{
	override public void CallFunc(){
    	base.CallFunc();
        Console.WriteLine("Child Call");
    }
}

Child child = new Child();
child.CallFunc();
// Parent Call, Child Call 모두 출력됨

 

728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# Namespace 키워드  (0) 2023.04.27
C# 멤버 명시 키워드 : this  (0) 2023.04.25
C# 구조체 키워드 : struct  (0) 2023.04.25
C# 문자열 키워드 : string  (0) 2023.04.25
C# 정수형 키워드 : int, long, short ...  (0) 2023.04.25

struct

값 형식을 나타내는 키워드이다.

struct로 정의된 데이터 타입은 클래스와 비슷한 멤버를 가질 수 있지만 다른 특징이 있다.

 

클래스와 차이

struct는 클래스와 달리 상속이나 인터페이스 구현 등의 기능을 제공하지 않으며 struct는 메모리에 적재되며 개체의 인스턴스화를 할 수 있다. 또한 struct는 기본적으로 stack에 할당되어 heap 메모리를 사용하지 않기 때문에 일반적인 값 형식을 나타내기 위해서 사용된다.

 

struct는 변수에 값을 할당할 때 복사가 일어나게 된다. 예를 들어 struct로 정의된 Point 타입의 변수에 값을 할당하면 해당 값을 복사하여 새로운 메모리 공간에 저장한다.

 

struct Point
{
	public int X;
    public int Y;
}

Point p1 = new Point{X = 10, Y = 20};
Point p2 = p1;	// 이때 p1의 값 전체가 복사되어 p2에 저장된다.

구조체가 메모리에 할당될 때 데이터 멤버들 사이에는 일정한 간격을 두고 배치된다. 

이 간격을 Padding이라고 하며 데이터 멤버의 크기와 정렬을 고려해 계산된다. 이는 구조체 전체 크기가 미리 예측 가능하기 위해서이며 이 크기는 구조체 전체 크기 합에 패딩을 합한 값이다.

 

패딩은 구조체의 크기를 불필요하게 늘리기도 하므로 크기를 최소화하기 위해서는 큰 데이터를 먼저 선언하고 뒤에 작은 데이터들이 선언되도록 멤버들을 크기에 따라 정렬하는것이 좋다. 이렇게 구조체를 제대로 이해하고 사용하기 위해서는 각 타입들의 크기와 패딩의 존재에 대해 정확한 이해가 필요하다.

 

 

 

 

 

728x90
반응형

+ Recent posts