본문 바로가기
[ Program ]/c#스터디

36.클래스(전역변수/지역변수), 실제사용법

by 관이119 2021. 10. 9.

클래스로 들어오면서 구역개념이 생긴다.

다음예제를 보자.

public class testc
{
        private int _num = 10;

        public int getnum()
        {
            return _num;
        }

        public void addnum(int num)
        {
            int n = _num;
            n += num;

            _num = n;
        }

        public void multyplenum(int num)
        {
            int n = _num;
            n *= num;

            _num = n;
        }
}

 

참고로 일부러 쓸데없는 코드들이 추가 되있다.

위 클래스에서 addnum 메서드(=함수)를 보자.

num 을 파라미터(=매개변수=인자) 로 받고 함수내부에 n 을 정의하고 더해줬다.

그리고 _num 인 필드에는 파라미터로 받은 num 을 더해줬다.

 

그리고 밑에 있는 multyplenum 함수를 보자.

거기서도 num 이라는 파라미터를 받고 n 을 정의하고 곱해주고 _num 은 num 만큼 곱해줬다.

그런데 위에서 addnum 이라는 메서드에서 n 을 정의 해줬는데 어떻게 또 정의해줄수 있을까?

구역이 나뉘어져있기때문이다.

 

함수는 함수내에서 쓰는 변수로 끝이다.

외부에 그변수를 사용하거나 할수 없는것이다.

결론적으로 보면 _num 은 전역변수 각각 함수에 있는 n 은 지역변수이다.

이름도 직관적이라서 쉽게 이해될거라 생각된다. 

 

보통 변수의 생명주기는 자신이 속하는 { } 사이에서만 살아있다고 생각하면된다.

즉 함수내의 { } 사이에서 정의한 n 은 { } 밖을 벗어나는순간 생명이 다해서 더이상 호출할수 없게 되는것이다.

위에서 정의한 _num 도 클래스내에서 정의했기때문에 클래스내의 { } 사이에만 살아있고 다른클래스에서 _num 을 사용할수는 없다.

 

위에서말하는 전역,지역은 클래스를 기준으로 말하기때문에 클래스 전체에서 살아있는 필드는 전역변수 각각의 함수내에서만 살아있는 변수는 지역변수로 부른다.

 

클래스에 대해 기본적인 내용은 배웠으니 이제 클래스 사용하는 방법을 보자.

우리가 처음프로젝트를 만들면 아무것도 하지않아도 이미 기본적인건 다만들어 져있다.

그림1

 

 

그림1에서 보면 왼쪽에 windowsFormsApp12 라는 솔루션에 WindowsFormsApp12 라는 프로젝트가 만들어졌고 그내부에  이것저것 많은것들이 들어있다.

그리고 그중 Form1.cs 라는 파일에는 오른쪽편처럼 system 부터시작해서 여러네임스페이스를 사용한다고 되있고 아래 WindowsFormsApp12 라는 네임스페이스에 Form1 이라는 클래스가 만들어져있고 (partial 은 일단 무시) 뒤에 : Form 으로 Form 클래스를 상속받고 있다.(상속도 뒤에서 다시 살펴보자.)

그리고 그내부에 Form1 이라는 생성자까지 만들어져있고 생성자에서는 InitalizeComponenet() 라는 함수를 호출하고 있는것이다.

 

내용이 많지만 이제 대부분 기본적인것은 이해가 될거라고 생각된다.

 

우리가 클래스를 새로 만들려면 WindowsFormsApp12 네임스페이스 내에 하나 더만들거나 아니면 아예 파일을 분리해서 만들수도 있다.

 

그림2

 

그림2처럼 하면 testc 라는 클래스가 만들어진것이다.

그리고 Form1 생성자내에 testc  클래스의 객체를 만든것도 확인할 수 있다.

 

위 방법 말고 따로 파일로도 생성이 가능하다.

 

그림3

 

그림3처럼 프로젝트에서 우클릭해서 추가 > 새항목 으로 만들거나 추가>클래스 로 만들수도 있다.

 

그림4

 

그림4처럼 나오면 클래스를 선택해서 아래 이름적는곳에 내가 만들 클래스명을 적어주면 된다.

 

 

그림5

 

 

 

그림6

 

 

전체적인 형태는 그림5, 그림6 과 같이 된다.

새로만든 testc.cs 라는 클래스파일이 왼쪽에 보이고 해당클래스를 Form1 에서 객체로 만들수 있다.

Form1.cs 와 testc.cs 의 네임스페이스가 WindowFormsApp12 로 동일하기때문에 컴파일러는 둘을 같은곳에 있다고 인식한다.

즉 위에 Form1 클래스바로밑에 testc 를 만들었던 그림2와 그림5,6 처럼 파일을 분리한건 결국 완전히 동일하다.

파일로 분리하는 이유는 한군데 소스가 너무 길어지면 보기도 불편하고 클래스기능별로 파일을 나눠두면 한눈에 찾기도 좋을것이다.

대부분의 경우 클래스를 만들면 저렇게 파일로 분리하는게 좋다.

클래스를 만들때는 어느정도 범위가 있는데 너무 세세하게 분리하면 그것도 문제가 된다.

 

예를들면 비행기 게임을 만드는데 적군비행기 클래스 , 아군비행기 클래스 정도로 나누면 될것인데  적군비행기미사일클래스 , 적군비행기이동클래스 , 적군비행기시작좌표클래스  이런식으로 너무 세세하게 나누면 오히려 가져다 쓰는입장(다른개발자) 에서는 만든사람보다 더 그클래스에 대해서 더자세히 알고있어야 사용할수가 있게 된다.

그렇게되면 차라리 가져다 쓰는사람이 또 비슷한 클래스를 만들게 되고 프로그램은 점점 엉망이 되버린다.

물론 이런 어느정도라는게 사람마다 다르긴한데 너무 과도하게 나눌경우 수정하는쪽도 가져다 쓰는쪽도 서로 더힘들어진다는것을 생각하면서 만들어야한다.

적당히 만들고 , 만든클래스에대해서 누구나 알수있을만한 이름을 붙이고 , 프로그램 명세서를 만들어서 어떤역할을하고  어떤함수를 가지고있고 어떤기능을 한다 정도는 기록해두는것이 내생각에는 가장이상적이다.

 

 

 

그림7

 

그림8

 

 

그림7과 그림8을 보면 클래스를 만들고 사용하는 방법까지 다 나와있다.

그림7의 경우는 앞에서 만든 클래스를 그대로 넣어뒀고 그림8에서 보면 객체로 만든후 . 을 찍으면 클래스내에서 사용할수 있는 함수들이 나온다.

MessageBox.Show() 사용하는것처럼 만들어진 클래스를 객채화 시키고 그냥 가져다 쓰면 된다.

 

그리고 우리가 기본적으로 만들어지는 partial 클래스는 쉽게 생각하면 클래스를 쪼개놓은것이라고 생각하면된다.

namespace 대신 사용가능것 정도로 생각하면 되겠다.

딱히 쓸일은 없긴한데 아래글을 한번 읽어보자.

 

storycompiler.tistory.com/215

 

[C#] 왜 partial class를 사용하는걸까요?

안녕하세요, 러시아에서 생활하고 있는 개발자 윤진입니다. C#에는 정말 흥미로운 기능들이 많이 있더군요. 한국에서 공수해온 C# 책에서는 기능에 대한 단편적인 설명만 있어서, 해당 기능에 대

storycompiler.tistory.com

 

 

 

 

***숙제 :  임의로 클래스를 만들고 거기 어울리는 함수들도 만들어보자. 각함수는 어떤 행동을 하는지 주석으로 설명도달아보자.(함수구현은 하지말고 형태만 만들것, 34강숙제와 같음, 한번더 새로운걸로 해볼것)  , 파일로 클래스를 나눌것

'[ Program ] > c#스터디' 카테고리의 다른 글

38.const/enum/struct  (0) 2021.10.09
37.DateTime,static  (0) 2021.10.09
35.클래스(생성자오버로딩)  (0) 2021.10.09
34.클래스(생성자,소멸자)  (0) 2021.10.09
33.갑자기실습  (0) 2021.10.09

댓글