객체(object)와 클래스(Class)에 대한 설명 - object에 대한 일반적인 개념이 바로 Class (ex> 책 - Class, 열혈강의 C++ - Object)
Class를 이용해서 Object를 만드는 것을 instance를 만든다고 부른다.
클래스는 속성(data, 필드)과 행위(메서드 == 함수)를 갖는다.
클래스 선언 하는 법
class A {
}
ex> class Book {
string name;
string author;
decimal isbn;
void Open() {
}
}
객체를 만들 때는 new를 사용한다
new를 하면 생성자(Constructor, Ctor로 줄여서라고도 씀)가 호출된다. 생성자는 return 타입이 없다
생성자를 아무것도 정의하지 않았으면 기본 생성자(매개 변수도 없는 기본 껍데기)를 만들어서 넣어 준다.
ex> 위의 Book class에서 기본 생성자는 public Book() { }
소멸자(Destructor를 dtor로 줄여서라고도 씀)
C++과 동일하게 ~
ClassName()를 사용.
소멸자는 무조건 매개변수가 없어야 함.
소멸자에는 접근 제한자(public, private, protected 등)를 쓸 수 없다.
소멸자는 언제 호출되는지? CLR ==> GC, 안 쓰는거 같으면 알아서 지워줌.
근데 GC가 동작하는 시점은 아무도 모른다.
근데 소멸자를 명시적으로 호출할 수 없음
소멸자는 평상시에는 GC가 알아서 해주니까 쓸모가 없음.
관리 메모리(GC), 비관리 메모리(GC가 관리 안 함, C 또는 C++에서의 동적할당과 비슷함) --> 비관리 메모리에서 소멸자를 사용. 그래도 명시적으로 호출은 못 하고 비관리 메모리를 할당해제 해주는 함수가 있음
static
클래스 --> 데이터 멤버(필드) + 메서드 멤버 --> 인스턴스
static은 '정적'이라는 의미, 개념(Class)과 관련이 있지 사물(instance)와는 관련이 없음
Class에서 정의해둔 static method는 instace에 점 찍고 쓰면 에러가 나도 Class에 점 찍고 써야한다.
static을 쓴 것은 Class에 종속적이게 됨.
static을 안 썼으면 계속 힙에 새로 생기니까 멤버 변수를 인스턴스 수로 써도 공유해서 못 쓰는데 static을 붙이면 공유해서 쓸 수 있음. static 멤버가 아니면 무조건 instance 멤버임.
static 멤버를 쓰듯이 static 메서드도 쓸 수 있는데, static 메서드의 내부에서는 instance의 멤버 변수는 사용할 수 없고 static 멤버 변수만 쓸 수 있음
정적 생성자(static constructor == cctor) --> 맨 처음에 단 한번만 생성 됨(메인보다 먼저 실행), 이것도 접근 제한자 붙이면 오류가 납니다. static 변수를 초기화 할 때 사용
네임스페이스를 배워봅시다
FQDN(Fully Qualified Domain Name)
ex> System.console 이런 것 처럼 속해있는 곳을 전부 나열해주는 것을 FQDN임(C#은)
접근 제한자 - 클래스에 있는 멤버들을 누구에게 보여줄 것인지를 정하는 녀석. public(누구나), private(자기 자신만), protected(자기 자신 + 자기 자식), internal(동일 어셈블리), internal protected(동일 어셈블리 + 자기 자신 + 자기 자식)
internal protected 이면 internal 또는 protected 입니다
필기하지 않겠어 위키 코드가 올라오겠지, getter setter가 좀 독특하게 쓸 수 있음 싱기방기함
문맥 예약어 - 특정 문맥에서만 예약어로 변신
readonly(static이 됨), const(static이 될 수 없음)
상수를 쓰려면 무조건 기본 자료형만 가능, 대신 class는 readonly는 가능하다
상수는 생성자 안에서 초기화 할 수 없다
const는 define과 비슷한 개념
메서드 오버로딩 가능합니다. 시그니쳐로 구분합니다.(C언어에서는 함수 이름으로만 판단하는데 여기서는 아닙니다)
연산자 오버로딩 가능합니다.
쓰는 법
접근 제한자 static Class명 operator +(Class명 변수1, Class명 변수2) // <, > true, false 같은 것은 하나를 만들면 다른 하나도 반드시 만들어야 함.
중첩 클래스 가능합니다.