1. Variable of a Class : 초기화 되지 않은 class의 copy
2. Instance of a Class : new keyword를 사용하여 초기화된 class, 메모리를 갖고 있고 다른 instance와 메모리 공유하지 않는다.
3. Reference of a Class : 존재하는 instance를 사용하여 초기화된 class의 copy, memory 공간이 없으며, 동일한 instance의 메모리를 공유한다.
Class란?
간단히 말해서, C#의 사용자 정의 타입이다. string을 data type이라고 하지만, string data type은 C#에 class로 만들어져있다. 미리 정의된 class 또는 사용자정의 class 모두 data types이다.
우리는 class를 직접적으로 사용할 수 없다. 반드시, class의 copy를 만들어야 한다. int data type을 예로들어보자.
우리는 다음과 같이 int를 사용할 수 있는가?
int = 10;
불가능하다. data 메모리 할당을 하려면 아래와 같이 사용해야 한다. data type을 copy하지 않으면 메모리가 할당되지 않는다.
int I = 10; // 'I'는 int data type의 copy이다.
string도 마찬가지로 다음과 같이 사용해야 한다.
string s = "Hello";
집을 지을때 설계도가 필요하다. 여기도 int와 string은 설계도와 같다. i 와 s는 건축된 집이다. 집에서 살려면 설계도를 기반으로한 집이 필요하다.
data type은 설계도와 같고, data type의 copy는 설계도의 구현이다.
Type 사용법
using System;
namespace VariablesDemo
{
internal class Example
{
int x = 10;
static void Main(string[] args)
{
Console.WriteLine(x);
Console.ReadKey();
}
}
}
이렇게 작성하면 에러 발생한다. x는 instance member 또는 non-static member이고 Main method는 static block이기 때문에 non-static member를 직접적으로 사용할 수 없다.
x에 접근하려면 Example class의 instance를 생성해야 한다.
using System;
namespace VariablesDemo
{
internal class Example
{
int x = 10;
static void Main(string[] args)
{
Example e = new Example();
Console.WriteLine(e.x);
Console.ReadKey();
}
}
}
e는 Example class의 instance이다. 아니면 간단히, Example class의 copy라고 한다. e에 메모리가 할당되어 있다. class instance는 new 키워드를 통해서만 생성된다.
x는 class instance를 통해서만 값을 print할 수 있다.
Variable of a Class
using System;
namespace VariablesDemo
{
internal class Example
{
int x = 10;
static void Main(string[] args)
{
//Variable
//Uninitialized copy of class Example
Example e;
Console.WriteLine(e.x);
Console.ReadKey();
}
}
}
variable of a class는 초기화되지 않은 class의 copy이다. 위의 코드에서 e이다. 'Use of unassigned local variable e' 에러가 발생한다.
요점은 class의 non- static member에 접근하려면 반드시 instance를 사용해야 한다.
using System;
namespace VariablesDemo
{
internal class Example
{
int x = 10;
static void Main(string[] args)
{
Example e; //e is Variable of class Example
e = new Example(); //e is instance of class Example
Console.WriteLine(e.x);
Console.ReadKey();
}
}
}
처음 변수를 선언하고, 다음에 초기화했다. 초기화하면 instance가 되어 non-static member에 접근할 수 있다.
Variable of a Class와 Instance of a Class의 차이점
변수는 초기화되지 않아서, 메모리를 차지하지 않는다. null이다. new 키워드를 사용해서 초기화하면 instance가 된며, 메모리를 차지한다.
Reference of a Class
using System;
namespace VariablesDemo
{
internal class Example
{
int x = 10;
static void Main(string[] args)
{
Example e1 = new Example(); //e1 is Instance of class Example
Example e2 = new Example(); //e2 is Instance of class Example
Console.WriteLine($"e1.x: {e1.x} and e2.x: {e2.x}");
e1.x = 50; //Modifying the x variable of e1 instance
Console.WriteLine($"e1.x: {e1.x} and e2.x {e2.x}");
e2.x = 150; //Modifying the x variable of e2 instance
Console.WriteLine($"e1.x: {e1.x} and e2.x {e2.x}");
Console.ReadKey();
//output
//e1.x: 10 and e2.x: 10
//e1.x: 50 and e2.x: 10
//e1.x: 50 and e2.x: 150
}
}
}
class instance는 원하는 만큼 생성할 수 있으며, 각 instance는 개별 메모리 할당된다. 하나의 instance에 할당된 메모리는 다른 instance와 공유되지 않는다.
이것이 OOP의 보안성이다. 각 instance는 그 자체로 유일하다. 하나의 instance의 변경은 다른 instance에 영향을 주지 않는다.
이제 Reference of a class에 대해 이야기해보자. e1은 instance of a class 이지만 e2는 reference of a class이다.
e2는 new 키워드로 초기화하지 않았으므로 instance가 아니다. 존재하는 instance로 초기화되었다. 간단히 말해서, e2는 e1의 pointer이다. e2는 별도의 메모리 공간이 없고, e1과 동일한 메모리 공간을 가리킨다.
using System;
namespace VariablesDemo
{
internal class Example
{
int x = 10;
static void Main(string[] args)
{
Example e1 = new Example(); //e1 is Instance of class Example
Example e2 = e1; //e2 is Reference of class Example
Console.WriteLine($"e1.x: {e1.x} and e2.x: {e2.x}");
e1.x = 50; //Modifying the x variable of e1 instance
Console.WriteLine($"e1.x: {e1.x} and e2.x {e2.x}");
e2.x = 150; //Modifying the x variable of e2 reference
Console.WriteLine($"e1.x: {e1.x} and e2.x {e2.x}");
Console.ReadKey();
//output
//e1.x: 10 and e2.x: 10
//e1.x: 50 and e2.x: 50
//e1.x: 150 and e2.x: 150
}
}
}
변경사항이 e1에 있든 e2에 있든 양쪽 모두에 영향을 준다.
결론
- 변수를 이용해서 class의 non-static members에 접근할 수 없다. 하지만 instance, reference를 사용해서는 class의 non-static memebers에 접근할 수 있다. 왜냐하면 reference는 존재하는 instance에 의해 초기화되었고, 변수는 초기화되지 않았기 때문이다.
- reference는 자신의 메모리 공간이 없고, 존재하는 메모리를 가리킨다. 하지만 reference는 instance처럼 사용된다.
'C#' 카테고리의 다른 글
C#] Virtual VS Abstract 함수 차이점 (2) | 2024.02.02 |
---|---|
C#] Value VS Reference Types (0) | 2024.02.01 |
C#] SOLID 원칙 3. Liskov Substitution Principle(리스코프 치환 원칙) (0) | 2024.01.26 |
C#] SOLID 원칙 1. Single Responsibility Principle (SRP 원칙) (2) | 2024.01.26 |
C#] SOLID 원칙 2. Open Closed Principle (OCP 원칙) (1) | 2024.01.23 |
댓글