우리가 기본적으로 배운 타입들 외에도 사용자의 편의에 맞춰서 정의한 타입들이 존재합니다.
1. 구조체
2. 공용체
3. enum
4. class
5. interface
이렇게 총 5가지의 사용자 정의 타입이 존재하는데요.
이 페이지에서는 class에 대해서 다뤄보도록 하겠습니다.
class(클래스)
객체지향의 총집합이라 할 수 있는 클래스는 데이터와 메서드를 정의한 데이터 타입입니다. 때문에 추상적인 타입이라고도 할 수 있는데요. 클래스는 구조체와 유사하게 생겼습니다.
클래스 자체는 사물의 특성 추상화하여 변수와 메서드로 정리하였고, 지정한 변수들을 보호하고 메서드로 데이터의 조작을 할 수 있게 만들어 캡슐화에 해당되기도 합니다. 또한 클래스끼리 상속을 할 수도 있으며 같은 class 내에서 같은 함수명을 사용할 수 있어 다형성의 특징을 갖고 있기도 합니다.
클래스의 형태
class pocket {
//접근지정자 타입 변수/메소드
private char type, attack
public void pocketType(type){
console.writeLine("포켓몬 타입 : {0}", type);
}
}
pocket pika = new pocket();
클래스는 기본적으로 class와 클래스명을 적고 안에는 바로 타입을 지정해 주는 게 아니라 ⭐접근지정자부터 작성해주어야합니다.
접근지정자란?
해당 클래스에 어떤 사람이 접근할 수 있는지를 정의해 주는 것
public : 누구나 접근이 가능
protected : 상속관계에서 자식클래스에서 접근이 가능, 그 외에서는 접근이 불가능
private : 작성한 클래스 내부에서만 접근이 가능하며 외부에서는 접근이 불가능
internal : 같은 프로젝트 내의 모든 클래스가 접근이 가능
protected internal : protected와 internal의 특징을 모두 갖고 있음
클래스 생성 후에 해당 클래스로 타입 선언이 가능하고, 이때 선언된 것은 변수가 아닌 객체를 생성한 것입니다.
이때 선언된 변수 즉 객체는 주소값을 갖고 있고 class에 선언된 변수들을 통해 값을 지정하거나 가져올 수 있는 것입니다.
클래스의 메모리계산
동적메모리는 기본적으로 malloc과 free를 통해서 해결하였지만 클래스는 조금 다릅니다. new를 이용하면 자동적으로 pika라는 객체에 필요한 메모리 용량을 계산해서 전체적으로 필요한 메모리를 얻을 수 있습니다.
👉 동적 메모리 할당
클래스와 생성자
생성자는 무엇일까요? 모든 변수를 선언을 하면 값을 초기화해 주듯이 객체도 본질적으로는 변수이기 때문에 선언을 하면 초기화를 해야 합니다. 이때 클래스에서 초기화를 맡은 게 바로 생성자(constructor)입니다. 생성자는 객체를 생성(선언)하게 되면 자동으로 호출하여 생성자를 사용하지 않더라도 모든 값들을 초기화해 주는데요 이때 class 만드는 사람마다 제각각의 초기화 함수명을 생성하게 된다면 어떤 게 초기화 값인지 알지 못하는 단점이 존재합니다. 이걸 방지하기 위해 우리는 클래스명과 똑같은 함수를 생성한 후에 그 안에 초기화 값을 입력해 주는 것으로 약속하였습니다.
class pocket {
public pocket(){ // 여기가 생성자
char type = "노말",
char attack = "몸통박치기"
}
public void pocketType(type){
console.writeLine("포켓몬 타입 : {0}", type);
}
}
pocket jammanbo = new pocket();
클래스와 상속
클래스의 상속은 최소 클래스가 두 개 이상일 때 발생하는데요, 이때 제공하는 클래스를 부모클래스, 제공받는 클래스를 자식 클래스라고 합니다.
왜 클래스에서 상속을 하는 걸까요? 그건 바로 코드 중복을 막으려는 이유가 큽니다.
클래스는 최상위 부모로 갈수록 사물의 특징들을 모아 놓은 것이기 때문에 자식 클래스의 코드에서도 쓰이는 경우가 존재합니다. 이때 상속을 이용하여 코드의 중복을 줄일 수 있는 것입니다.
(이때 선택지정자에 따라 에러 발생유무가 발생하는데, 상속일지라도 private는 사용할 수 없습니다. 만약 보호가 되면서 상속이 가능하려면 protected를 사용하셔야 합니다.)
class pocket {
public string type, attack;
public pocket() {
type = "없음";
attack = "없음";
}
public string getPocket(){
return $"설정된 포켓몬이 없습니다";
}
}
class pika : pocket {
public pika(){
base.type = "전기";
base.attack = "백만볼트";
}
public string getPocket(){
return $"피카츄는 {this.type}타입으로로 {this.attack}로 공격합니다";
}
}
class HelloWorld {
static void Main() {
pocket pikachu = new pika(); // 설정된 포켓몬이 없습니다.
pika pikachu = new pika(); // 피카츄는 전기타입으로로 백만볼트로 공격합니다
Console.WriteLine(pikachu.getPocket());
}
}
❓부모 class에서 선언된 메서드를 자식 class로 선언을 할 수 있는가?
❗선언을 할 수 있습니다. 대신에 선언된 자식 class와 부모 class의 메서드가 똑같이 생겼다면 재선언된 시점에서 부모 class의 메서드가 아니라 자식 class의 메서드가 호출이 됩니다.
❗ 같은 함수일지라도 선언된 class 타입에 의해 메서드가 다르게 호출이 됩니다.
(Main 안에 pocket pikachu, pika pikachu)
'프로그래밍📚' 카테고리의 다른 글
객체지향이란? (0) | 2024.02.05 |
---|---|
사용자 정의 타입이란? - interface (0) | 2024.02.05 |
사용자 정의 타입이란? - 공용체와 enum (0) | 2024.02.05 |
사용자 정의 타입이란? - 구조체 (0) | 2024.02.05 |
함수포인터란? (0) | 2024.02.04 |