본문 바로가기
C# 기초문법

[C#] (8) class 알아보기 - 접근제어자, 생성자

by novices 2022. 9. 13.
반응형

class는 프로그래밍을 작성하는 명세 단위이자 인스턴스화(컴퓨터에서의 메모리화) 되기 전에 상태입니다. 지금까지 예시 작성에 사용된 class는 Main함수를 포함하고 있어 인스턴스화 하지 않아도 실행되었지만 그 외의 class는 new 키워드를 통해 인스턴스화 하지 않으면 class는 껍데기로 존재할 뿐 컴퓨터 세계에서 실존하지 못한다고 볼 수 있습니다. 컴퓨터(운영체제)는 프로그램들을 실행(연산) 하기 위해서 컴퓨터의 주 기억장치에 데이터를 업로드하고 로드된 데이터를 CPU가 연산하여 데이터를 처리합니다. 컴퓨터는 컴파일러를 통해 이해한 내용을 기준으로 class 코드를 분석해 저장할 공간을 파악 계산하여 해당되는 만큼 메모리를 프로그램에 나눠주고(할당하고) 지정된 이름으로 맵핑하여 코드를 실행합니다. 그러므로 class는 인스턴스화를 통해 메모리에 공간을 운영체제에게 할당받고 cpu가 연산(실행) 할 수 있는 상태가 될 수 있습니다. class는 저장공간 명세와 데이터 간의 처리 절차 데이터 간의 연결 정보 등을 포함하고 있습니다. 이번 포스팅에서는 class의 선언과 초기화 그리고 접근하는 방법에 대해 알아보겠습니다.

 

 

1. class 선언하기

아래는 새로운 class를 Character를 선언하는 코드입니다. 클래스를 선언하고 레벨과 이름을 저장할 수 있는 변수 2개를 선언했습니다.

public class Character
{
    int level;
    string name;
}

 

class 요점

  • 클래스는 설계도와 같은 개념을 가지고 있습니다.
  • 클래스를 new 키워드로 인스턴스화(설계도로 실물을 만들어냄) 할 수 있습니다.
  • class 키워드와 클래스 이름, {}로 class를 선언할 수 있다.

 

 

2. 접근 제어자

class나 변수 함수에 모두 사용되는 키워드입니다. 클래스, 함수, 변수를 어떤 걸 선언하든 가장 처음 입력하는 키워드입니다. 예) public, private 키워드를 생략할 경우 private입니다. 아래는 위의 변수에 접근 제어자를 생략하여 private으로 선언된 지시자를 public 명시한 코드입니다. 접근제어자는 클래스 단위로 외부에서 접근할 때 public 이면 접근이 가능하고 private 동일 클래스 내에서만 접근이 가능하다는 뜻입니다.

public class Character
{
    public int level;
    public string name;
}

 

2-1. 외부 클래스에서 접근 예시

아래의 예시는 Character 클래스 기준 외부 클래스인 Program 클래스에서 Character클래스를 인스턴스화 하고 해당 변수에 접근하여 값을 저장하고 출력하는 예시입니다. 만약 Character 클래스의 변수들의 접근제어자가 private로 선언되었다면 Program 클래스에서는 해당 변수에 접근할 수 없습니다.

using System;

namespace Program
{
    public class Character
    {
        public int level;
        public string name;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Character character = new Character();

            character.level = 1;
            character.name = "king";

            Console.WriteLine("케릭터 " + character.name + "은 레벨 " + character.level + "입니다.");

            Console.ReadKey();
        }
    }
}

 

접근제어자 요점

  • 접근제어자를 통해 외부에서 접근하는 다른 객체들의 접근을 제어할 수 있습니다.
  • public 은 접근을 허용하고 private 접근을 차단합니다.
  • 접근제어자를 생량 할 경우 private으로 자동 처리됩니다.

 

 

3. 생성자

생성자는 클래스 생성 시 한번 실행되는 함수이자 초기화 문법이고 미 작성 시 아무 일도 벌어지지 않습니다. 아래 예시는 2-1항의 예시의 캐릭터의 변수 초기화 부분을 Character의 생성자로 이동하여 처리하는 예시입니다. 실행결과는 위의 예시와 동일합니다.

using System;

namespace Program
{
    public class Character
    {
        public int level;
        public string name;

        public Character()
        {
            level = 1;
            name = "king";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Character character = new Character();

            Console.WriteLine("케릭터 " + character.name + "은 레벨 " + character.level + "입니다.");

            Console.ReadKey();
        }
    }
}

 

3.1 생성자의 입력

생성자 또한 함수와 같이 입력을 받을 수 있습니다. 인자는 클래스 생성할 때 입력합니다. 아래는 예시 코드입니다. 아래의 코드 마찬가지로 위의 코드랑 실행결과가 동일합니다.

using System;

namespace Program
{
    public class Character
    {
        public int level;
        public string name;

        public Character(int inputLevel, string inputName)
        {
            level = inputLevel;
            name = inputName;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Character character = new Character(1, "king");

            Console.WriteLine("케릭터 " + character.name + "은 레벨 " + character.level + "입니다.");

            Console.ReadKey();
        }
    }
}

 

생성자 요점

  • 생성자는 클래스를 생성할 때 초기화에 이용된다.
  • 생성자는 작성하지 않을 경우 무시된다.
  • 생성자 또한 함수처럼 입력을 받을 수 있다.
  • 생성자를 통해 초기값을 쉽게 할당할 수 있다.

 

 

4. 예시 코드

위의 항목에서 사용된 문법과 이전에 배운 내용을 조금씩 추가하여 성한 예시 코드입니다. 아래 코드를 수정 실행해 보시면서 학습 내용을 쉽게 이해할 수 있습니다. 이해가 안 되시면 안 되는 부분의 포스팅을 다시 학습하시기를 권장합니다.

using System;

namespace Program
{
    public class Character
    {
        public string name;
        public int energe;
        public int gold;

        public Character(string initName, int initGold)
        {
            name = initName;
            gold = initGold;
            energe = 100;
        }

        public void DoWork()
        {
            if(energe >= 10)
            {
                energe -= 10;
                GetGold();
            }
            else
            {
                Console.WriteLine("에너지가 부족합니다.!");
            }
        }

        public void GetGold()
        {
            gold += 500;
        }

        public void DoSleep()
        {
            energe = 100;
        }

        public void DisplayStatus()
        {
            Console.WriteLine("케릭터 " + name + "의 에너지는 " + energe + " 이고 "+ gold +"금을 모았습니다.");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Character character1 = new Character("티모", 2000);
            Character character2 = new Character("애니", 1000);
            Character character3 = new Character("룰루", 5000);

            character1.DoWork();
            character2.DoWork();

            character1.GetGold();
            character3.GetGold();

            character2.DoWork();
            character2.DoWork();
            character2.DoSleep();

            Character[] characters = new Character[] {character1, character2, character3};

            foreach(Character c in characters)
            {
                c.DisplayStatus();
            }

            Console.ReadKey();
        }
    }
}
실행결과
케릭터 티모의 에너지는 90 이고 3000금을 모았습니다.
케릭터 애니의 에너지는 100 이고 2500금을 모았습니다.
케릭터 룰루의 에너지는 100 이고 5500금을 모았습니다.

 

 

반응형

댓글