클래스(Class), 접근 제한자(Access Modifier), this
목차
클래스는 아래와 같이 선언할 수 있다.
[접근 제한자] 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 클래스명();
접근 제한자는 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 키워드는 자기 자신을 가리킬때 사용하는 키워드이다.
🔔 예제)
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의 값을 집어넣으라는 말과 같다.
[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 |