본문 바로가기

프로그램&DB/C#

[C# 강좌] C# 프로그래밍 #06 - 변수와 상수

2.4 변수와 상수

2.4.1 변수

 

1) 변수의 선언

변수는 변수의 데이터 타입과 변수의 이름과 값으로 이루어진다. 변수의 선언이라 함은 미리 어떤 형의 변수를 이용하겠다고 컴파일러에게 알려주기 위해 이용되는 일련의 행위라고 보면 된다. 그럼, 왜 변수를 사용하는가?

고급 언어들 중 변수의 선언을 굳이 필요로 하지 않는 언어도 있지만, 이는 언어에 따른 차이일 뿐, 대부분의 프로그래밍 언어는 변수의 선언를 사용자에게 요구한다. 변수를 선언하지 않을 경우, 컴파일러는 다양한 형들에 대해 값이 쓰인 용도를 파악해가며 변수의 형을 내부적으로 재정의 해야한다. 이는 프로그램의 성능에 좋지 않은 영향을 미치게 된다. 다른 이유로 정의되지 않은 형은 결과에 어떤 영향을 줄지 모르며 실행시간에 런타임 에러를 일으킬 소지를 가지게 된다.

 

2) 변수명

변수명은 C에서와 마찬가지로 만들어 주면 된다.

 

 

2.4.2 상수

아래의 소스에서 Hello, C#.이라는 문자열 값은 컴파일 시에 바이너리에 만들어지며, 컴파일 후 실행 중 이 값을 바꾸는 것이 불가능 하다. 이와 같이 컴파일시에 값이 결정되는 값을 상수라고 부르며, 정해진 값은 변경이 불가능하다.

Console.WriteLine("Hello, C#.");

 

상수를 선언하기 위해서 C#에서는 const라는 키워드를 이용할 수 있다. 상수명은 일반 변수명 명명 규칙을 따라 선언하면 되며, 한번 선언된 상수의 값은 변경이 불가능하다. 코드상에서 상수값에 대한 변경을 시도하면 컴파일 오류가 발생하게 된다. 또한, 선언된 상수는 내부적으로 클래스의 static 멤버 형태로 정의되며, 따라서 외부 클래스에서 공개된 상수에 대한 접근을 위해서는 static 멤버에 대해 접근하는 것과 동일한 방법으로 접근해야 한다. 상수는 static의 특성을 가지기 때문에 static 키워드와 함께 사용할 수 없다.

상수를 이용하는 이유는 미리 정의된 값을 알아보기 쉬운 형태의 이름을 줘서 명시적인 의미를 알아보기 쉽도록해서 사용하기 편하도록 하기 위해서라 보면 된다. 다음 소스를 보자.

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.Text;

 

namespace Constant_Sample

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine(Math_Const.PI);   // 상수 PI 출력

            Console.Read();           

        }

 

    }

 

    public class Math_Const

    {

        public const double PI = 3.141592;  // 상수 PI 선언

    }

}

 

11번째 라인은 선언된 상수값을 출력하는 것을 보여주고 있다. static 멤버가 아님에도 불구하고 출력시 바로 클래스 이름뒤에 .을 찍고 변수명을 사용하는 것을 볼 수 있다.

19번째 라인은 PI라는 상수를 선언하고 있다. 이값은 컴파일 시에 초기화 되며, 이후 변경이 불가능하다.

 

 

* 런타임시 초기화 가능하고 상수와 같이 처음 선언된 값이 변경이 불가능한 멤버 변수를 만들기 위해서는 readonly 키워드를 이용할 수 있다.

 

 

 

2.4.3 변수의 범위

 

1) 지역변수(Local Variable)와 전역변수(Global Variable)

지역 변수는 메서드 내부에 선언되는 변수를 말한다. 지역 변수는 메서드가 호출될 때 초기화되고 사용이 끝난 후 반환된다.

전역 변수는 클래스에 멤버 필드로 선언되는 변수를 말한다. 전역 변수는 선언된 클래스 내의 모든 메서드들에서 접근이 가능하다. 클래스의 인스턴스가 생성될 때 초기화되며 클래스에 대한 자원이 반환될 때 같이 반환된다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Variable_Test

{

    class Program

    {

        string var1 = "전역 변수.";

 

        static void Main(string[] args)

        {

            new Program().MyMethod1();

            new Program().MyMethod2();

 

            Console.Read();

        }

 

        private void MyMethod1()

        {

            string var2 = "MyMethod1의 지역 변수.";

            Console.WriteLine(var1);

            Console.WriteLine(var2);

        }

 

        private void MyMethod2()

        {

            string var2 = "MyMethod2의 지역 변수.";

            Console.WriteLine(var1);

            Console.WriteLine(var2);

            Console.WriteLine(var3);

        }

    }

}

 

전역 변수.

MyMethod1의 지역 변수.

전역 변수.

MyMethod2의 지역 변수.

 

9번째 라인은 전역 변수 var1을 선언하고 있고 21, 28번째 라인은 지역변수 var2를 선언하고 있다. 9번째 라인의 전역변수 var1을 보면 Program 클래스의 멤버 필드로 선언된 것을 볼 수 있다. 이에 반해, 21번째 라인의 var2 MyMethod1 메서드의 지역변수로, 28번째 라인의 var2 MyMethod2의 지역변수로 선언되어 있다. MyMethod1 MyMethod2는 모두 var1 var2를 출력하고 있는데, var1은 전역 변수로 선언되어 있기 때문에 결과에서와 같이 동일한 값이 출력되고, var2는 지역 변수이므로 각각 다른 값이 출력된다. MyMethod2 28번째 라인인 var2 선언부를 지우게 되면 지역 변수 var2가 선언없이 30번째 라인에 사용되었다고 컴파일 오류가 발생한다. MyMethod1 MyMethod2에 동일한 이름의 var2를 선언하고 있는 것을 볼 수 있는데 이는 메서드 내부의 지역변수이기 때문에 이름이 같아도 상관없다.

일반적으로 변수의 범위는 중괄호 {} 안에서 선언된 변수는 그 범위에서만 사용가능하다고 보면 쉬울 것이다.

 

2) 정적 변수(Static Variable)

정적 변수는 static 키워드와 함께 선언된 변수를 말한다. 정적 변수는 개체의 인스턴스를 단 한번만 생성하며, 프로그램이 종료될때까지 리소스를 반환하지 않는다. 따라서, 공개범위에 따라 정적 변수는 사용상에 좀더 자유로움이 주어진다. 그러나 메모리 상에 프로그램의 생명주기와 함께 상주하기 때문에 과다한 사용은 많은 메모리를 점유하게 되는 원인이 될 수 있다. 메서드 내부의 지역 변수에 대해서는 static 키워드를 이용한 선언이 불가능한데, 앞서 설명한 정적 변수의 특성때문이라고 보면 된다. 정정 변수와 정적 메서드는 프로그램의 생명주기와 함께 한다는 것만 기억하면 사용하는데 어려움이 없을 것이다.


/* 출처 */
inobae의 놀이터
http://blog.naver.com/inobae