C++ 클래스

프로그래밍/C++ 2019.10.14 댓글 Plorence

객체 지향 프로그래밍의 꽃, 클래스(Class)

객체 지향 프로그래밍(OOP,Object-Oriented Programming)에서 클래스는 OOP의 꽃같은 존재입니다.(C++ 말고도 OOP면 해당합니다.)
OOP의 기능은 다음과 같습니다.
  • 추상화(abstraction)
  • 캡슐화(encapsulation)와 데이터 은닉(data hiding)
  • 다형성(polymorphism)
  • 상속(inheritance)
  • 코드 재활용(reusability of code)

데이터형이란 무엇인가?

먼저 무엇이 데이터형을 구성하는지 잠시 생각해봅시다.
메모리에 저장되는 형태만으로 데이터형을 생각하기 쉽습니다.
예를들어 char는 1바이트, double은 8바이트 메모리를 나타냅니다.
그러나 좀 더 깊게 생각해보면, 데이터형이란 그것을 대상으로 수행할 수 있는 연산에 의해 정의된다는 것을 알 수 있습니다.
예를 들어 int형은 모든 산술 연산(+, -, /, % 등)을 수행할 수 있습니다.
 
포인터는 int형과 같은 크기의 메모리를 요구하고 내부적으로는 int형을 나타냅니다.
그러나 포인터는 int형에 적용할 수 있는 연산을 허용하지 않습니다.
예를 들어, 두 개의 포인터를 서로 곱하는 연산은 불가능합니다.
이런 연산은 무의미하기 때문에 C++는 이것을 구현하지 않았습니다.
 
그러므로 어떤 변수를 int형으로 선언하거나 float형을 지시하는 포인터로 선언한다고 할 때, 그러한 선언은 단지 메모리만 대입하는 것이 아니라 그 데이터형으로 수행할 수 있는 연산까지도 함께 정의하는 것입니다.
 
결국에 데이터형을 서술하는 것은 다음과 같은 세 가지 결정을 하는 것입니다.
 
  • 데이터 객체에 필요한 메모리의 크기를 결정합니다.
  • 메모리에 있는 비트들을 어떻게 해석할 것인지 결정합니다.(long과 float는 같은 비트수를 가지고 있지만 다른 수치값으로 해석됨.)
  • 수행할 수 있는 연산이나 메서드를 결정합니다.
 
내장된 기본 데이터형의 경우에, 동작에 관한 정보들이 컴파일러에 내장됩니다.
C++에서 사용자 정의 데이터형을 정의한다면, 프로그래머가 이와 같은 정보를 제공해야 하며 이 대가로, 실세계의 요구에 더 잘 대응하는 새로운 사용자 정의 데이터형을 정의할 수 있는 능력과 융통성을 부여받습니다.
 
말이 길었는데, 결론은 데이터형을 정의한다는 것은 그와 관련된 연산도 함께 정의해야합니다.
 

C++의 클래스

클래스는 추상화를 사용자 정의 데이터형으로 변환해 주는 C++의 수단입니다.
클래스는 데이터 표현과 데이터를 조작하는 메서드(위에서 말한 연산)들을 하나의 패키지 안에 결합합니다.
일반적으로, 클래스 서술은 두 부분으로 이루어집니다.
 
  • 클래스 선언(class declaration): 데이터 멤버와 public 인터페이스, 멤버 함수(메서드)를 이용하여 데이터 표현을 서술합니다.
  • 클래스 메서드 정의:(class method definitions): 클래스 멤버 함수가 어떻게 구현되는지를 서술합니다.
 

간단한 클래스 선언해보기

도서관 책 재고 관리 프로그램을 간단하게 예시로 들겠는데, 추상화를 하면
  • 책을 관리할 배열
  • 책이 존재하는가?
  • 책을 삭제한다.
  • 책을 추가한다.
class Library {
private:
       std::string books[100]; //최대 100개
public:
       bool Insert(std::string & bookName); //책 넣기
       bool Delete(std::string & bookName); //책 삭제
       bool IsExist(std::string & bookName); //책이 존재하는지
};
해당 클래스를 선언하게 되면 Library라는 하나의 데이터 형으로 사용할 수 있습니다.
int main(void) {
       Library lib;
}
이 선언으로 Library형의 변수인, 객체(object)나 인스턴스(instance)를 선언할 수 있습니다.
에 자세하게 설명되어 있습니다.

댓글