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; } } } |
그 후 리턴을 했으나, 그 값을 받는 자는 없고, 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)
'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 |