본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 21. this

캐릭터 클래스에 hp를 설정하는 setHp를 만들었다고 해보자

public void SetHp(int _hp)
{
hp = _hp;
}

이런식으로 구현하였다.


hp = _hp는 내 클래스의 맴버 변수 hp 를 파라미터로 받은 _hp 로 설정하는것이다.

근데 파라미터 의 _hp에서 앞에 _가 너무너무 신경쓰여 미칠지경이라 정말정말 어떻게든 파라미터명으로 _hp가 이날 그냥 hp로 받고싶다.


public void SetHp(int hp)
{
hp = hp;
}

이렇게 말이다.

하지만 C#에서는 이렇게되면 저 함수에서 hp라는 것은 더 가까이있는 파라미터의 hp만을 의미하게 된다

즉 파라미터hp를 파라미터hp로 초기화하는 쓸데없는 함수가 되어버린다.


비주얼 스튜디오가 친절하게 알려준다.



1. this

C#에서는 자기자신 객체를 가르키는 this 라는것을 제공한다.

즉 위의 setHP 코드에서 자신의 맴버변수 hp인것은 자신을 가르키는 this를 이용해서 사용하면 되는것이다.


public void SetHp(int hp)
{
this.hp = hp;
}


다음과 같이 쓰면 자신의 맴버변수 hp를 파라미터 hp로 초기화하는것이 가능하다.



그럼 this가 정말 자기 자신을 가르키는지 확인해보자


using System;

namespace ConsoleApp1
{
class Character
{
private int speed;

private int hp;

public Character(int _hp)
{
hp = _hp;
}

public void SetHp(int hp)
{
this.hp = hp;
}

public Character ReturnThis()
{
return this;
}

}
class Program
{
static void Main(string[] args)
{
Character mario = new Character(50);
Character marioThis = mario.ReturnThis();

if (mario == marioThis)
{
Console.WriteLine("같다!");

}
}
}
}

같다고 나온다.



2.this는 왜있는가.

그럼 이 this 왜 필요한것일까?

저런 파라미터 이름과 맴버변수 이름을 같게 하고싶은 강박증 걸린사람을 위해서 this라는 거창한 개념을 만든것일까?

this는 체이닝과 함수 동작원리와 관련이있다.

함수를 선언하고 정의하면 메모리에 해당 함수에 대한 코드가 할당된다.

그리고 그 함수가 호출되면 해당 메모리로 이동하여 함수 기능을 수행하고 다시 호출한 지점으로 돌아오게 된다.



즉 함수 내용자체는 1번만 만들어지고 두고두고 사용하는것이다.

클래스의 맴버 변수들은 객체가 만들어질때마다 해당 변수들이 메모리에 할당되지만

함수와 같이 방대한 내용을, 그것도 같은 내용인데 굳이 여러번 메모리에 올릴필요가 없기때문에

어딘가에 1번 메모리에 올리고 내부적으로 각 객체의 this 를 함수에게 넘겨주어 어떤 객체가 해당 함수를 호출했는지 알도록 하는것이다.


C++에서 그랬는데 뭐 C#에서도 이렇게 작동할것이다..


ps. 나중에 확장메서드를 배우면 this를 명시적으로 파라미터로 사용하게된다.



3. this()

this()는 자기자신의 생성자이다

this(10)이라면 자기자신의 생성자중에 int를파라미터로 받는 생성자이다.


요런게 왜 필요하느냐면..


using System;
namespace ConsoleApp1
{
class Character
{
public int speed;

private int hp;

public Character()
{
speed = 10;
}
public Character(int _hp):this()
{
hp = _hp;
}

public void SetHp(int hp)
{
this.hp = hp;
}


}
class Program
{
static void Main(string[] args)
{
Character mario = new Character(50);
Console.WriteLine(mario.speed);
}
}
}

요련식으로 생성자끼리 중복되는 부분이있을때

:this() 와 같이 다른 생성자의 과정을 굳이 복붙안해주어도 사용할수있다.

new Character(50)을 하면 speed도 10이되고 (this()에 의하여), hp=_hp도 되어 hp는 50이 된다.

728x90