8. 멤버변수와 지역변수

C#/과제 2019. 3. 26. 03:09

멤버변수?

멤버변수란 Class 내에 선언되는 변수를 뜻한다. Class의 멤버로는 멤버변수와 멤버메서드가 있다.

멤버변수도 2가지로 나뉘는데 바로 클래스변수와 인스턴스변수 이다.

클래스변수는 static으로 선언하여 인스턴스를 생성하지 않아도 접근하여 사용할 수 있으며, new를 통한 인스턴스 생성시 static은 제외하고 생성된다.

인스턴스변수는 new를 통하여 인스턴스를 생성 시 메모리가 할당되어 인스턴스 생성 후 부터 사용할 수 있다.

private수준의 변수에 접근할 때에는 Class내에서 "this."를 이용하여 접근하고,

public수준의 변수에 접근할 때에는 Class밖에서도 ClassName.변수명 을 통하여 접근이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Pc
{
    private int age = 10;
    public static string name = "삼보컴퓨터";
    public Pc()
    {
    }
}
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Pc.name);
        }
    }
}
 
cs

위의 예제를 보면, 클래스변수를 이용하는 예제인데, 분명 우리는 Pc라는 Class의 인스턴스를 Main에서 생성하지 않았지만,

Pc.name으로 Pc클래스 내의 name변수에 접근하여 값을 가져올 수 있다.

또한 결과값은 위와 같이 정상적으로 name이 가리키는 string 값인 "삼보컴퓨터"가 출력이 된다.



그럼 인스턴스변수는 어떨까?

위와 같이 클래스변수인 name에는 접근할 수 있지만,

Pc라는 Class의 인스턴스가 생성되지 않았으므로 age라는 변수는 실체하지 않아 접근이 불가하다.

하지만, 이처럼 Pc 클래스의 인스턴스를 생성하고 난 후라면 멤버변수인 age에 접근할 수 있게 된다.

but! 클래스변수인 name은 존재하지 않는다. static 멤버로서 프로그램 실행시에 바로 메모리가 할당되어 더 이상 생성하지 않기 때문이다.





지역변수?

지역변수는 한마디로 Method내에서 선언되고 존재하는 변수이다.

Method가 호출되면서 Stack에 변수포함 데이터들이 쌓이고, Method가 소멸하면서 Stack이 비워지기 때문에 지역변수는 Method가 소멸할 때 같이 소멸한다.

그 말인 즉슨, 지역변수는 Method내부가 아닌 다른 곳에서 사용하려고 하면 사용할 수 없다.

예제를 보고 확인해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
MakeInt();
            Console.WriteLine(a);
        }
        static int MakeInt()
        {
            int a = 10;
            return a;
        }
    }
}

cs

    위의 예제는 정적Method MakeInt 내에 integer형 a라는 변수에 10이라는 값을 넣어주었다.

그 후 리턴을 했으나, 그 값을 받는 자는 없고, Main에서 a의 값을 출력하는 코드이다.

이 프로그램은 오류가 난다. 왜일까?


바로 integer형 a라는 변수는 Method내에 존재하는 지역변수 이므로, MakeInt Method에서 return a;를 함으로서 Method가 종료됨과 동시에

integer형 a라는 변수는 메모리에서 소멸한다.

그렇기 때문에 Main에서 Console.WriteLine을 통하여 a의 값을 출력하려고 하지만

이와 같이 오류가 발생하는 것이다.



이렇게 두 가지의 변수 종류를 알아보았는데, 정리해보자면

Class에 존재하는 멤버변수는 프로그램이 실행되거나(클래스변수), 인스턴스가 생성되었을 때(인스턴스변수)로 나뉘며,

메모리가 할당되어 있는 동안에는 엑세스하여 사용할 수 있다.

Method에 존재하는 지역변수는 Method가 호출됨과 동시에 생성되며, Method가 return하고 종료됨과 동시에 소멸한다.

즉, Method가 존재하는 동안에는 엑세스하여 사용할 수 있다.



참조

Microsoft Docs

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/fields (필드(C# 프로그래밍 가이드))

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/members (멤버(C# 프로그래밍 가이드))


Blog

C# 변수의 범위 (꿈꾸는느티나무)

https://dreamzelkova.tistory.com/entry/C-%EB%B3%80%EC%88%98%EC%9D%98-%EB%B2%94%EC%9C%84


지역 변수와 멤버 변수 (사는거 징그럽다...)

https://bsj10k2.tistory.com/23


[Unity로 배우는 C#] C# 멤버변수와 지역변수 (Programmers)

https://www.youtube.com/watch?v=AMCoUEpbWj4

'C# > 과제' 카테고리의 다른 글

10. Class의 생성흐름 읽기 (동영상)  (0) 2019.03.27
9. WoW캐릭터 만들기 [~ing .0326]  (0) 2019.03.26
7. 형식변환  (0) 2019.03.26
6. using  (0) 2019.03.26
5. Stack과 Heap  (0) 2019.03.25
: