클래스 선언은 템플릿 혹은 설계도와 같습니다. 이를 바탕으로 원하는 만큼 클래스 인스턴스를 생성할 수 있습니다.
인스턴스 멤버 : 클래스의 모든 인스턴스는 독립적인 개체로 고유한 데이터 멤버를 가지며 같은 클래스의 다른 인스턴스와 서로 영향을 주지 않습니다. 이 멤버들은 클래스 인스턴스 객체에 묶이기 때문에 인스턴스 멤버라고 부릅니다.
정적 멤버 : 기본 타입은 인스턴스 멤버입니다. 정적 멤버를 선언할 수도 있는데, 정적 멤버는 인스턴스 객체가 아닌 클래스 자체에 속합니다. 이후 강의에서 자세히 다루겠습니다.
예시를 통해 살펴보겠습니다
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이 됩니다.
인스턴스 멤버