클래스의 기본

장석원·2024년 1월 30일

클래스..

클래스는 객체 지향 프로그래밍에서 핵심적인 개념이다.
데이터와 해당데이터를 처리하는 연산을 함께 묶어둔 "사용자 정의 데이터 형식"이다.

특징

총 4가지의 특징이 있다

1. 캡슐화

  • 데이터와 그 데이터를 다루는 메서드를 하나의 단위로 묶어 외부에서 접근을 제한하는 개념.
  • 정보 은닉을 통해 객체의 내부 구현을 숨길 수 있다.

2. 추상화

  • 복잡한 시스템에서 핵심적인 기능만 간추려 표현하는 것.
  • 객체의 특징을 추상화하여 모델링 가능. "타입추론"

3. 다형성

  • 같은 이름의 메서드가 다양한 객체에서 다양한 방식으로 동작 할 수 있도록 하는 개념.
  • 오버로딩과 오버라이딩을 통해 구현된다.

4. 상속성

  • 클래스는 다른 클래스의 특징을 상속받아 새로운 클래스를 정의할 수 있음.
  • 코드 재사용성 높이고, 계층적 구조 구성 가능.

생성자

생성자는 클래스의 객체가 생성될 때 호출되는 특별한 메서드. 객체의 초기화 담당.
typescript에선 보통 constructor 쓰임

특징
1. 이름은 클래스와 동일해야한다.
2. 리턴 타입이 없다.
3. 오버로딩이 가능하다.
4. 자동 호출이 된다.

상속성

상속성은 기존 클래스의 특징을 그대로 물려받아 새로운 클래스를 정의 하는 개념.

typescript에선 private, public, protected 등이 있다.

특징
1. 부모 클래스와 자식 클래스가 있다
2. 코드를 재사용 가능하다.
3. 메서드 오버라이딩
4. 다중 상속

오버로딩

같은 이름의 함수나 연산자를 여러개 정의하여 "매개변수의" 타입, 개수, 순서에 따라 다르게 동작하는프로그래밍 기법

2가지가 있음
함수 오버로딩과 연산자 오버로딩이 있음
이건 함수 오버로딩

#include <iostream>

// 정수형 매개변수 두 개를 받는 함수
int add(int a, int b) {
    return a + b;
}

// 실수형 매개변수 두 개를 받는 함수 (동일한 이름의 함수 오버로딩)
float add(float a, float b) {
    return a + b;
}

int main() {
    std::cout << add(3, 5) << std::endl;        // 정수형 매개변수 사용
    std::cout << add(2.5f, 4.7f) << std::endl;  // 실수형 매개변수 사용

    return 0;
}

여기선 add가 2개 정수형 매개변수를 받는 버전과 실수형 매개변수를 받는 버전

오버라이딩

상속 관계에서 부모클래스의 메서드를 자식 클래스에서 재정의하여 사용하는 프로그래밍 개념.

규칙

  • 메서드 시그니처가 동일해야 함
  • 접근 제어자는 확장 가능
  • 예외 처리는 확장 가능
#include <iostream>

class Animal {
public:
    // 가상 함수
    virtual void sound() const {
        std::cout << "동물 소리" << std::endl;
    }
};

class Dog : public Animal {
public:
    // 부모 클래스의 메서드를 오버라이딩
    void sound() const override {
        std::cout << "멍멍" << std::endl;
    }
};

class Cat : public Animal {
public:
    // 부모 클래스의 메서드를 오버라이딩
    void sound() const override {
        std::cout << "야옹" << std::endl;
    }
};

int main() {
    Animal animal;
    Dog dog;
    Cat cat;

    // 다형성을 통해 각 객체의 오버라이딩된 메서드 호출
    animal.sound();  // "동물 소리"
    dog.sound();     // "멍멍"
    cat.sound();     // "야옹"

    return 0;
}

여기에서 Animal 클래스의 sound 메서드를 각각 Dog와 Cat에 오버라이딩 하고있음.

인터페이스

추상적인 개념.
특징

  • 추상 메서드
  • 다중 상속
  • 클래스의 행위 정의
  • 인터페이스 간의 상속

람다

는 익명 함수를 생성하는 편리한 방법.


// 클래스
class Animal {
  // 생성자이죠
  constructor(public name: string, public species: string) {}
  
// makeSound 메서드는 추상 메서드로, 하위 클래스에서 구현해야 함
  makeSound(): string {
    return ''; // 하위 클래스에서 구현해야 함
  }
}

// 상속
class Dog extends Animal {
  makeSound(): string {
    return '멍멍!';
  }
}

class Cat extends Animal {
  makeSound(): string {
    return '야옹!';
  }
}

// 인터페이스
interface SwimmingCreature {
  swim(): string;
}

// 다중 상속 및 인터페이스 구현
class Dolphin extends Animal implements SwimmingCreature {
  makeSound(): string {
    return '이야아아아아!';
  }

  swim(): string {
    return '수영 중!';
  }
}

// 객체 생성 및 사용
const dog = new Dog('멍멍이', '개');
const cat = new Cat('야옹이', '고양이');
const dolphin = new Dolphin('돌고래', '돌고래');

0개의 댓글