인스턴스 멤버

클래스 선언은 템플릿 혹은 설계도와 같습니다. 이를 바탕으로 원하는 만큼 클래스 인스턴스를 생성할 수 있습니다.

인스턴스 멤버 : 클래스의 모든 인스턴스는 독립적인 개체로 고유한 데이터 멤버를 가지며 같은 클래스의 다른 인스턴스와 서로 영향을 주지 않습니다. 이 멤버들은 클래스 인스턴스 객체에 묶이기 때문에 인스턴스 멤버라고 부릅니다.

정적 멤버 : 기본 타입은 인스턴스 멤버입니다. 정적 멤버를 선언할 수도 있는데, 정적 멤버는 인스턴스 객체가 아닌 클래스 자체에 속합니다. 이후 강의에서 자세히 다루겠습니다.

예시를 통해 살펴보겠습니다

class Program
{
    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();
    }
}

class Factory
{

}

class Robot
{
    public string name;

    public void SayHello()
    {
        Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
    }
}Code language: C# (cs)

이 예제에는 Factory와 Robot 두 가지 클래스가 있습니다. Robot 안에는 메서드 하나와 name 필드가 존재하고 Factory에는 name 필드가 없습니다.

메인 함수에서 Factory 인스턴스 한 개와 Robot 인스턴스 세 개를 생성했습니다.

메모리 저장 구조를 확인해 보겠습니다.

세 로봇 robot1, robot2, robot3은 각자 독립적인 name 값을 가지며 메모리 주소가 분리되어 서로 영향받지 않습니다. robot1의 값을 수정해도 robot2에 변화가 생기지 않습니다.

    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();

        robot1.name = "Tom"; //각 name은 독립적, 서로 간섭 없음
        robot2.name = "Jack";
        robot3.name = "Smith";
    }Code language: C# (cs)

함수 멤버는 단 한 사본만 존재

위의 name처럼 모든 인스턴스는 별도의 값을 가지며 한쪽을 수정해도 다른 인스턴스에 영향을 미치지 않습니다. 클래스에는 필드 멤버 외에 함수 멤버도 포함됩니다.

클래스 내 함수 멤버는 단 하나만 만들어져 여러 인스턴스가 공유할까요?

함수(메서드) 코드 본문 : 전역적으로 단 한 개 존재하며 모든 인스턴스가 공유

클래스가 컴파일되면 메서드의 기계어 명령은 메서드 테이블(Method Table)에 저장되고 타입 자체에 속합니다. 힙 영역에 생성된 모든 같은 클래스 인스턴스가 이 코드를 공유하며 객체마다 함수를 복제하지 않습니다.

아래 Robot 안의 SayHello를 예로 들겠습니다

class Robot
{
    public string name;

    public void SayHello()
    {
        Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
    }
}Code language: C# (cs)

메모리에는 힙과 스택 외에도 여러 영역이 존재하며, 메서드는 Method Table 안에 보관됩니다.

클래스 함수는 메서드 테이블에 저장됩니다. 함수를 호출하면 테이블에 등록된 코드를 실행하므로 여러 인스턴스가 공유해서 사용합니다.

    static void Main(string[] args)
    {
        Factory factoryFox = new Factory();
        Robot robot1 = new Robot();
        Robot robot2 = new Robot();
        Robot robot3 = new Robot();

        robot1.name = "Tom";
        robot2.name = "Jack";
        robot3.name = "Smith";

        robot1.SayHello();
        robot2.SayHello();
        robot3.SayHello();
    }Code language: C# (cs)

위 코드에서 세 차례 호출하는 SayHello는 동일한 함수입니다. 다만 함수 내 지역 변수는 분리되고, 필드 접근 결과는 호출한 인스턴스에 따라 달라집니다.

    public void SayHello()
    {
        Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
    }Code language: C# (cs)

robot1이 SayHello를 호출하면 name은 Tom이고, robot2가 호출하면 name은 Jack이 됩니다.

인스턴스 멤버

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다