Language/C# [C#] 클래스(Class), 접근 제한자(Access Modifier), this
  • 728x90
    반응형

     

     

     

    클래스(Class), 접근 제한자(Access Modifier), this


     

    목차

       

      클래스 (Class)

      클래스는 아래와 같이 선언할 수 있다.

       

      [접근 제한자] class 클래스명
      {
      	// 필드, 메소드 ...
      }

       

      위의 예제에서 보이는 접근 제한자는 해당 클래스로의 접근을 제한하고자 할 때 넣는 공간이다. 클래스 내에서 필드, 메소드가 있는데 상태를 필드(field)로 나타내고, 행동을 메소드(method)로 가진다고 볼 수 있다.

       

      아래는 개를 추상화 하여 클래스로 선언한 예제이다. 여기서 추상화란, 불필요한 부분은 없애버리고 중요한 부분에만 중점을 두어 간략화 시킨 것을 뜻한다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Dog
          {
              public string name;        // 개의 이름을 나타내는 필드
              public string gender;      // 개의 성별을 나타내는 필드
              public string ownernames;  // 개의 주인 이름을 나타내는 필드
      
              public void Bark()  // 짖는 행동
              {
                  Console.WriteLine("{0} : 멍멍!", name);
              }
          }
      
          class Program
          {
              static void Main(string[] args)
              {
                  Dog dog = new Dog();
                  dog.name = "칸";
                  dog.gender = "남";
                  dog.ownernames = "철수";
      
                  dog.Bark();
      
                  Console.WriteLine("개의 이름: {0}, 개의 성별: {1}, 개의 주인이름: {2}", dog.name, dog.gender, dog.ownernames);
              }
          }
      }

       

      결과)

      칸 : 멍멍!

      개의 이름: 칸, 개의 성별: 남, 개의 주인이름: 철수

      계속하려면 아무 키나 누르십시오 . . .

       

      코드를 보면 Dog라는 클래스가 등장한다. 이 클래스 안을 살펴보면 개의 이름을 나타내는 필드, 성별을 나타내는 필드, 주인 이름을 나타내는 필드와 짖는 행동을 취하는 메소드가 존재한다.

      Dog dog = new Dog();

       

      위 코드는 new 키워드 뒤에 등장하는 Dog 클래스를 기반으로 하여 dog라는 객체를 만든다.  아래는 new 키워드를 이용한 객체의 생성 방법이다.

       

      클래스명 식별자 = new 클래스명();

       

       

       

      접근 제한자 (Access modifier)

      접근 제한자는 public, protected, internal, private가 있다. 아래는 4개의 접근 제한자를 정리해놓은 표이다.

       

      접근 제한자 설명
      private 클래스 내부에서만 접근이 가능하다.
      public 모든 곳에서 해당 멤버로 접근이 가능하다.
      internal 같은 어셈블리에서만 public으로 접근이 가능하다.
      protected 클래스 외부에서 접근할 수 없으나 파생 클래스에서는 접근이 가능하다.
      protected internal 같은 어셈블리에서만 protected으로 접근이 가능하다.

       

      다음과 같은 클래스가 있다고 가정해본다.

       

      class A
      {
      	int B;
      	int C;
      	...
      }

       

      클래스 A내에 B와 C라는 멤버 변수가 존재한다. A클래스에 기반을 둔 객체를 생성하고 이 객체로 접근을 해보도록 한다.

       

      A a = new A();
      a.B = 1;	// 보호 수준 에러

       

      💡 오류 CS0122 '보호 수준 때문에 'A.B'에 액세스할 수 없습니다.

       

      클래스의 멤버를 접근 제한자로 수식하지 않으면 멤버의 보호 수준(접근 수준)은 무조건 private로 자동으로 지정이 된다. private로 지정되면 클래스 내부에서만 접근이 가능함으로 외부에서는 접근할 수 없다. 접근이 가능하게 멤버의 접근 수준을 public로 지정해본다.

       

      class A
      {
      	public int B;
      	public int C;
      	...
      }

       

      public으로 지정하게 되면, 모든 곳에서 이 멤버에 접근할 수 있게 된다. internal로 접근 수준이 지정되면 동일한 어셈블리 즉 동일한 프로그램에서만 접근할 수 있다. 만약 어셈블리 외부에서 참조하게 되면 오류가 발생한다.

       

      protected는 클래스 외부에서는 접근할 수 없지만 파생된 클래스에서 접근할 수 있는 특징을 가지고 있다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class A
          {
              protected int x = 123;
          }
      
          class B : A
          {
              static void Main(string[] args)
              {
                  A a = new A();
                  B b = new B();
      
                  // 에러 CS1540 발생, X는 오직 A에서 파생된 클래스에서만 접근이 가능하기 때문
                  a.x = 10;
      
                  // A에서 파생된 클래스인 B에선 접근이 가능하다.
                  b.x = 10;
              }
          }    
      }

       

      💡 오류 CS1540 A' 형식의 한정자를 통해 보호된 멤버 'A.x'에 액세스할 수 없습니다. 한정자는 'B' 형식이거나 여기에서 파생된 형식이어야 합니다.

       

      오류를 살펴 보자면 즉 'A.x 멤버에 접근하려면 B클래스이거나, B 클래스로부터 파생된 클래스여야 접근이 가능 하다'는 것을 말하고 있다. 

       

       

      this

      this 키워드는 자기 자신을 가리킬때 사용하는 키워드이다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class A
          {
              private int num;
      
              public A(int num)
              {
                  this.num = num;
              }
      
              public void Show()
              {
                  Console.WriteLine("num:" + num);
              }
          }
      
          class Program
          {
              static void Main(string[] args)
              {
                  A a = new A(50);
      
                  a.Show();
              }
          }    
      }

       

      결과)

      num: 50

      계속하려면 아무 키나 누르십시오 . . .

       

      생성자는 객체를 생성하기 위해 존재하며, 객체를 생성할 때 객체의 멤버 변수를 원하는 값으로 초기화 하고 싶을때 주로 사용된다. 위 코드와 같이 this 키워드를 사용하면 클래스 내에 정의한 멤버 변수 num을 가르키게 된다. 즉, 클래스 내에 정의한 멤버 변수 num에 매개변수 num의 값을 집어넣으라는 말과 같다.

       

       

       

       

      728x90
      반응형

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

      [WPF] 사용자 설정 저장(윈도우 상태, 크기, 위치)  (0) 2020.04.03
      [C#] 생성자와 소멸자(Constructor and Destructor)  (0) 2019.09.06
      [C#] 배열(Array)  (0) 2019.09.06
      [C#] foreach, Method  (1) 2019.09.06
      [C#] 연산자(Operators)  (0) 2019.09.06
    상단으로