g) 왜 클래스 이름으로 type을 만들까, static과 매니저

C#에서 클래스의 이름으로 타입을 만든다는 것은 클래스 자체가 새로운 사용자 정의 타입(user-defined type)으로 사용된다는 의미입니다.

클래스는 객체 지향 프로그래밍의 기본 단위로, 데이터(속성)와 동작(메서드)을 하나의 단위로 묶어서 표현합니다.

따라서, 클래스를 정의하는 것은 새로운 데이터 타입을 정의하는 것과 같습니다.

 

 

예를 들어, 다음과 같은 클래스 정의가 있다고 가정해봅시다:

 
public class Person 
{ public string Name { get; set; } 
public int Age { get; set; } 
public void SayHello() 
{ Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old."); } 
}
 

위 코드에서 Person이라는 클래스는 새로운 타입을 정의합니다.

이제 Person 타입의 객체를 생성하고 사용할 수 있습니다:

 

 

 

 
Person person = new Person();
person.Name = "Alice"; 
person.Age = 30; 
person.SayHello();
 

이처럼 클래스의 이름으로 타입을 만들면:

  1. 데이터 캡슐화: 클래스는 관련된 데이터를 하나의 단위로 묶어서 관리할 수 있게 합니다.
  2. 재사용성: 한 번 정의된 클래스를 여러 곳에서 재사용할 수 있습니다.
  3. 유형 안정성: C# 컴파일러는 클래스를 새로운 타입으로 인식하고, 해당 타입에 대한 컴파일타임 검사를 수행합니다.
  4. 객체 지향 프로그래밍: 클래스는 상속, 다형성 등의 객체 지향 프로그래밍의 개념을 구현할 수 있게 합니다.

 

따라서, 클래스의 이름으로 타입을 만드는 것은 C#에서 새로운 데이터 구조와 동작을 정의하고 사용할 수 있는 기본적인 메커니즘 중 하나입니다.

 

 
 
 
static 으로 선언하면 유일성이 왜 보장되는건가?
 
 

 

 
 

C#에서 static으로 선언된 멤버는 특정 클래스의 모든 인스턴스에서 공유되는 단 하나의 멤버를 의미합니다. 즉, static 멤버는 클래스 자체에 속하며, 해당 클래스의 어떤 객체에서도 동일한 값을 가지거나 동일한 메서드를 공유합니다. 이러한 특성 때문에 유일성이 보장됩니다.

 

 

static 멤버의 유일성 보장 이유

  1. 클래스 수준의 멤버:
    • static 필드나 메서드는 클래스 수준에서 선언되며, 클래스의 인스턴스가 아닌 클래스 자체에 속합니다. 즉, 클래스가 로드될 때 메모리에 한 번만 할당됩니다.
    public class Example { public static int Counter = 0; }
     
     
  2. 인스턴스 공유:
    • static 멤버는 모든 인스턴스에서 공유되기 때문에, 특정 인스턴스가 아닌 클래스 전체에서 접근할 수 있습니다. 이로 인해 특정 클래스의 모든 인스턴스가 동일한 static 멤버를 참조하게 됩니다.
     
    Example obj1 = new Example(); Example obj2 = new Example(); obj1.Counter = 5; Console.WriteLine(obj2.Counter); // 출력: 5 (obj1과 obj2가 동일한 Counter를 공유)
     
     
  3. 초기화 시점:
    • static 멤버는 클래스가 처음으로 로드될 때 초기화됩니다. 이는 프로그램이 시작될 때 딱 한 번 수행되며, 그 후에는 변경되지 않습니다.
     
    public class Example { static Example() { Counter = 0; } public static int Counter; }
     
     
  4. 메모리 할당:
    • static 멤버는 클래스당 하나의 메모리 위치를 가집니다. 이는 클래스의 모든 인스턴스가 동일한 메모리 위치를 참조하게 함으로써 유일성을 보장합니다.

 

 

예제 코드

다음 예제는 static 멤버의 유일성을 보여줍니다:

 
 
 
public class MyClass { 
public static int Counter = 0; 
public void Increment() { Counter++; } 
} 

public class Program { 

public static void Main() { 
MyClass obj1 = new MyClass(); 
MyClass obj2 = new MyClass(); 
obj1.Increment(); 
obj2.Increment(); 
Console.WriteLine(MyClass.Counter); // 출력: 2 
} 

}

위 코드에서 Counter는 static으로 선언되었기 때문에 obj1과 obj2가 동일한 Counter를 공유합니다. 따라서, 두 인스턴스의 Increment 메서드 호출은 동일한 Counter 값을 증가시키게 됩니다.

이와 같이 static 멤버는 클래스 자체에 속하며, 모든 인스턴스가 공유하는 유일한 멤버로 동작하므로 유일성이 보장됩니다.

 

 

 

그럼 static은 객체를 생성하지 않아도 바로 사용할 수 있나?
 
 
 

 

 
 

네, static 멤버는 객체를 생성하지 않고도 바로 사용할 수 있습니다. 이는 static 멤버가 클래스의 인스턴스가 아닌 클래스 자체에 속하기 때문입니다.

 

 

static 멤버 사용 예시

static 필드와 메서드

다음 예제는 static 필드와 메서드를 정의하고 사용하는 방법을 보여줍니다.

 
 
 
public class Utility { 
public static int Counter = 0; 
public static void IncrementCounter() { Counter++; } 
public static void DisplayCounter() { Console.WriteLine($"Counter: {Counter}"); } 
} 

public class Program { 

public static void Main() { 
// 객체 생성 없이 static 멤버에 접근 
Utility.IncrementCounter(); Utility.DisplayCounter(); // 출력: Counter: 1 
Utility.IncrementCounter(); Utility.DisplayCounter(); // 출력: Counter: 2 
} 

}

위 예제에서 Utility 클래스의 Counter 필드와 IncrementCounter, DisplayCounter 메서드는 모두 static으로 선언되었습니다.

따라서 Utility 클래스의 인스턴스를 생성하지 않고도 Utility.Counter, Utility.IncrementCounter(), Utility.DisplayCounter()와 같이 바로 접근할 수 있습니다.

 

static 클래스

또한, 클래스 자체를 static으로 선언할 수도 있습니다. static 클래스는 인스턴스를 생성할 수 없으며, 모든 멤버가 static이어야 합니다.

 

static 클래스 예시

 
 
 
public static class MathUtilities { 
public static int Add(int a, int b) { return a + b; } 
public static int Subtract(int a, int b) { return a - b; } 
} 

public class Program { 

public static void Main() { 
int sum = MathUtilities.Add(5, 3); 
int difference = MathUtilities.Subtract(5, 3); 
Console.WriteLine($"Sum: {sum}"); // 출력: Sum: 8 
Console.WriteLine($"Difference: {difference}"); // 출력: Difference: 2 
} 

}

위 예제에서 MathUtilities 클래스는 static으로 선언되어 있으며, 인스턴스를 생성할 수 없습니다. 대신 MathUtilities.Add와 MathUtilities.Subtract 메서드를 바로 호출할 수 있습니다.

요약

  • static 멤버는 클래스 인스턴스가 아닌 클래스 자체에 속합니다.
  • 객체를 생성하지 않고 클래스 이름을 통해 직접 static 멤버에 접근할 수 있습니다.
  • static 클래스는 인스턴스를 생성할 수 없으며, 모든 멤버가 static이어야 합니다.

'그때 그때 메모' 카테고리의 다른 글

g) 순수 가상함수랑 그냥 가상함수랑 차이  (0) 2024.09.17
g) Action Delegate, Invoke() 메서드  (0) 2024.07.26
리플렉션 (요약)  (0) 2024.07.25
g) nullable  (0) 2024.07.25
유니티 UI 앵커에 대해  (1) 2024.07.21