클래스
클래스는 객체지향 프로그래밍 환경의 핵심이다. 함수, 변수, 상수 등 모든 것이 클래스에 소속되며 어떤 것도 전역으로 존재할 수 없다. 닷넷의 라이브러리는 클래스의 집합이고 int 같은 타입도 클래스로 표현되기 때문에 클래스를 제대로 모르면 프로그래밍을 할 수 없다.
클래스에 속한 변수를 필드(Field), 함수를 메서드(Method)라고 부른다. 클래스에 포함되는 것을 통틀어 '멤버'라고 부르는데 멤버에는 필드와 메서드는 물론 상수, 이벤트, 생성자, 연산자 등 더 복잡한 것도 포함된다.
internal class Program
{
private static void Main(string[] args)
{
//클래스의 변수를 만든다.
//객체(Object)화 한다
//인스턴스(Instance)화 한다. = 클래스는 설계도
// 객체는 변수
Human Kim;
Kim = new Human(); //생성자 메서드 호출
Kim.Name = "김상형";
Kim.Age = 25;
Kim.Intro();
}
}
class Human
{
//필드(멤버 변수)
public string Name;
public int Age;
//메서드(멤버 함수)
public void Intro()
{
Console.WriteLine($"{Age}살 {Name}입니다.");
}
}
Human 클래스를 만들고, 클래스 안에 Name 과 Age를 선언한 후 Intro() 메서드를 통해 콘솔에 이름과 나이를 출력한다. Main에서는 Human타입의 Kim 객체를 선언한 후 new 연산자로 생성한다.
클래스는 참조 타입이기 때문에 선언 후 new 연산자로 힙에 객체를 생성해야 실체가 된다.
지정자
멤버 앞에 성질을 결정하는 여러 가지 지정자(Modifier)를 붙인다.
액세스 지정자
액세스 지정자는 누가 이 멤버를 읽고 쓸 수 있는지 권한을 지정하며 외부에서 함부로 값을 변경하지 못하도록 한다.
- public: 외부에서 마음대로 액세스 가능.
- private: 클래스 내부에서만 액세스 가능
- protected: 클래스 내부 또는 파생된 클래스에서만 액세스 가능.
- internal: 같은 어셈블리내에서만 액세스 가능.
클래스의 멤버
클래스는 객체와 다르다. 클래스는 객체를 만들기 위한 형틀이며 객체는 클래스가 메모리에 구현되어 생성된 실체이다. 메모리에 구현된 클래스의 실체를 인스턴스라고 한다. 객체와 인스턴스는 약간의 의미 차이 외에는 같은 뜻이라고 보면 된다.
정적 멤버
정적 멤버는 멤버 선언문 앞에 키워드 static을 붙여 지정한다. 정적 필드는 객체가 아닌 클래스에 소속된다. 객체가 아무리 많아도 정적 필드는 단 하나만 생성되며 객체가 전혀 없어도 하나는 생성된다. 딱 하나만 생성되어 모든 객체가 공유한다. 어떤 객체에서 정적 필드의 값을 변경하면 같은 클래스 소속의 모든 객체가 영향을 받는다. 특정 객체에 대한 처리를 하는 것이 아니어서 호출 객체 'this'를 전달받지 않으며 객체가 없어도 호출 가능하다. this가 없어 인스턴스 필드는 차마조할 수 없으며 정적 필드만 액세스할 수 있다.
상수 멤버
상수 멤버는 한 번 초기화되면 변경할 수 없는 멤버이다. (수치 상수와는 다름 123, 3.14 같은 진짜 상수는 리터럴(Literal)이라고 부른다.) 값이 초기화 되는 시점에 따라 두 가지 종류가 있는데 const 상수와 readonly 키워드 이다.
- const: 컴파일할 때 초기화되어 실행중에 변경할 수 없다. 필드 선언문에 const 키워드를 붙이고 = 다음에 초기값을 지정하여 선언하는데 선언할 때 초기값을 반드시 지정해야 한다. (생략시 에러)
- readonly: 읽기 전용 필드를 지정한다. 상수와 읽기 전용은 변경할 수 없는 것은 같지만 초기화 시점이 달라 차이점이 있다. 상수는 컴파일시에 초기화되지만 읽기 전용은 생성자에 의해 초기화된다.
const 는 한 번 결정되면 절대로 바꿀 수 없지만 readonly는 생성자에서 딱 한 번 값을 결정할 수 있는 기회가 제공된다. 두 종류의 상수는 용도가 다른데, const는 기억의 용이함이나 효율적인 소스 관리가 목적이며 readonly는 부주의한 변경 방지가 주된 목적이다.
References
액세스 한정자 - C# 프로그래밍 가이드
C#의 모든 형식과 형식 멤버에는 다른 코드에서 사용될 수 있는지 여부를 제어하는 액세스 가능성 수준이 있습니다. 이 액세스 한정자 목록을 검토합니다.
learn.microsoft.com
SoEn:소프트웨어 공학 연구소
soen.kr
'개발 > C#' 카테고리의 다른 글
[C#] 자습서 7장 - 상속(1) (0) | 2023.01.13 |
---|---|
[C#] 자습서 6장 - 함수 (0) | 2023.01.11 |
[C#] 자습서 4장 - 제어문 (1) | 2023.01.05 |
[C#] 자습서 3장 - 변수 (0) | 2023.01.04 |
[C#] 자습서 2장 - 입출력 (0) | 2023.01.03 |