본문 바로가기
C#

C#] Class Variable, Class Reference, Class Instance의 차이점

by Fastlane 2024. 1. 31.
728x90
반응형

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처럼 사용된다. 

 

 

728x90
반응형

댓글