언어/C++

클래스(Class)

에린_1 2024. 11. 26. 23:05
728x90

클래스(Class)

  • 키워드 struct를 대신해서 class를 사용하면, 구조체가 아닌 클래스가 된다.
  • 클래스는 기본적으로(별도의 선언을 하지 않으면) 클래스 내에 선언된 변수는 클래스 내에 선언된 함수에서만 접근이 가능하다.
  • 클래스는 정의를 하는 과정에서 각각의 변수 및 함수의 접근 허용범위를 별도로 선언해야 한다. 이것이 struct를 이용해서 정의하는 구조체와 class를 이용해서 정의하는 클래스의 차이점이다.접근제어 지시자(접근제어 레이블)
  • C++의 접근제어 지시자는 다음과 같이 총 세가지가 존재한다.
    • public : 어디서든 접근허용
    • protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근 허용
    • private : 클래스 내(클래스 내에 정의된 함수)에서만 접근허용
  • 접근제어 지시자가 선언되면, 그 이후에 등장하는 변수나 함수는 지시자에 해당하는 범위 내에서 접근이 가능하다.
  • 함수의 정의를 클래스 밖으로 빼도, 이는 클래스의 일부이기 때문에, 함수 내에서는 private으로 선언된 변수에 접근이 가능하다.
  • 키워드 struct를 이용해서 정의한 구조체에 선언된 변수와 함수에 별도의 접근제어 지시자를 선언하지 않으면, 모든 변수와 함수는 public으로 선언된다.
  • 키워드 class를 이용해서 정의한 클래스에 선언된 변수와 함수에 별도의 접근제어 지시자를 선언하지 않으면, 모든 변수와 함수는 private으로 선언된다.

멤버변수, 멤버함수

  • 클래스를 구성하는(클래스 내에 선언된) 변수를 가리켜 멤버변수라고 한다.
  • 클래스를 구성하는(클래스 내에 정의된) 함수를 가리켜 멤버함수라고 한다.

C++에서의 파일분할

  • C++은 클래스 별로 헤더파일과 소스 파일을 생성해서 클래스의 선언과 정의를 분리하는 경우가 많기 때문에 많은 수의 파일이 만들어진다.
  • .h 클래스의 선언을 담는다.
  • .cpp 클래스의 정의(멤버함수의 정의)를 담는다.
  • 이를 가르켜 클래스의 선언(declaration)이라 한다.
  • 클래스와 관련된 문장의 컴파일 정보로 사용되는 클래스의 선언은 헤더파일에 저장을 해서, 필요한 위치에 쉽게 포함될 수 있도록 해야 하며, 클래스의 정의는 소스 파일에 저장해서, 컴파일이 되도록 하면 된다.

객체지향 프로그래밍

객체지향 프로그래밍의 이해

  • 객체지향 프로그래밍은 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍이다.
  • 객체는 하나 이상의 상태 정보(데이터)와 하나 이상의 행동(기능)으로 구성이 되며, 상태 정보는 변수를 통해서 표현이 되고(변수에 상태 정보를 저장할 수 있으므로), 행동은 함수를 통해서 표현이 된다.
  • 클래스의 멤버변수 선언문에서 초기화까지 하는 것을 허용하지 않는다.

클래스 기반의 두 가지 객체생성 방법

  • 일반적인 변수의 선언방식
  • 동적 할당방식

객체간의 대화 방법

  • 하나의 객체가 다른 하나의 객체에게 메시지를 전달하는 방법은(어떠한 행위의 요구를 위한 메시지 전달) 함수호출을 기반으로 한다. 그래서 객체지향에서는 이러한 형태의 함수호출을 가리켜 메시지 전달(Message passing)이라 한다.

정보은닉

  • 제한된 방법으로의 접근만 허용을 해서 잘못된 값이 저장되지 않도록 도와야 하고, 또 실수를 했을 때 실수가 쉽게 발견되도록 해야 한다.
  • 멤버변수를 private으로 선언하고, 해당 변수에 접근하는 함수를 별도로 정의해서, 안전한 형태로 멤버변수의 접근을 유도하는 것이 바로 정보은닉이다.
  • 해당 변수에 접근하는 함수를 엑세스 함수(access function)이라고 하는데, 이들은 멤버변수를 private으로 선언하면서 클래스외부에서의 멤버변수 접근을 목적으로 정의되는 함수들이다.

const 함수

  • 이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다는 것을 의미한다. 매개변수도 아니고, 지역변수도 아닌, 멤버변수에 저장된 값을 변경하지 않겠다는 선언이다. const 선언이 추가된 멤버함수 내에서 멤버변수의 값을 변경하는 코드가 삽입되면, 컴파일 에러가 발생한다.
  • 이렇게 함수를 const로 선언하면, 실수로 자신의 의도와 다르게 멤버변수의 값을 변경했을 때, 컴파일 에러를 통해서 이를 확인할 수 있다.
  • const 함수 내에서는 const가 아닌 함수의 호출이 제한된다. const로 선언되지 않은 함수는 아무리 멤버변수에 저장된 값을 변경하지 않더라도, 변경할 수 있는 능력을 지닌 함수이다. 따라서 이러한 변경이 가능한 함수의 호출을 아예 허용하지 않는다.

생성자

  • 클래스의 이름과 함수의 이름이 동일하고 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다면 이러한 유형의 함수를 가리켜 생성자(constructor)라 하며 객체 생성시 딱 한번 호출된다.
  • 생성자도 함수의 일종이니 오버로딩이나 매개변수에 디폴트 값을 설정할 수 있다

멤버 이니셜라이저(Member Initializer)

  • 멤버 이니셜라이저는 멤버변수로 선언된 객체의 생성자 호출에 활용된다.
  • 객체의 생성과정
    • 메모리 공간의 할당
    • 이니셜라이저를 이용한 멤버변수(객체)의 초기화
    • 생성자의 몸체부분 실행
  • 멤버 이니셜라이저는 객체가 아닌 멤버의 초기화에도 사용할 수 있다. 따라서 프로그래머는 생성자의 몸체에서 초기화 하는 방법과 이니셜라이저를 이용하는 초기화 방법 중에서 선택이 가능하다. 그러나 일반적으로 멤버변수의 초기화에 있어서는 이니셜라이저를 선호하는 편이다.
    • 초기화의 대상을 명확히 인식할 수 있다.
    • 성능에 약간의 이점이 있다.
  • 이니셜라이저를 이용하면 선언과 동시에 초기화가 이뤄지는 형태로 바이너리 코드가 생성된다. 반면, 생성자의 몸체부분에서 대입연산을 통한 초기화를 진행하면, 선언과 초기화를 각각 별도의 문장에서 진행하는 형태로 바이너리 코드가 생성된다.
  • const 멤버변수도 이니셜라이저를 이용하면 초기화가 가능하다.

디폴트 생성자(Default Constructor)

  • 메모리 공간의 할당 이후에 생성자의 호출까지 완료되어야 객체라고 할 수 있다. 즉, 객체가 되기 위해서는 반드시 하나의 생성자가 호출되어야 한다.이러한 기준에 예외를 두지 않기 위해서 생성자를 정의하지 않는 클래스에는 C++ 컴파일러에 의해서 디폴트 생성자가 자동으로 삽입된다. 디폴트 생성자는 인자를 받지 않으며, 내부적으로 아무런 일도 하지 않는 생성자이다.

private 생성자

  • 클래스 내부에서만 객체의 생성을 허용하려는 목적으로 생성자를 private으로 선언하기도 한다.
  • 객체의 생성방법을 제한하고자 하는 경우에는 매우 유용하게 사용된다.

소멸자

  • 소멸자는 클래스의 이름 앞에 ~가 붙은 형태의 이름을 갖는다.
  • 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다.
  • 매개변수는 void형으로 선언되어야 하기 떄문에 오버로딩도, 디폴트 값 설정도 불가능하다.
  • 소멸자는 객체소멸과정에서 자동으로 호출이 된다. 그리고 프로그래머가 직접 소멸자를 정의하지 않으면, 디폴트 생성자와 마찬가지로 아무런 일도 하지 않는 디폴트 소멸자가 자동으로 삽입된다.
  • 이러한 소멸자는 대개 생성자에서 할당한 리소스의 소멸에 사용된다.

this 포인터

  • 멤버함수 내에서는 this라는 이름의 포인터를 사용할 수 있는데, 이는 객체 자신을 가리키는 용도로 사용되는 포인터이다.
728x90

'언어 > C++' 카테고리의 다른 글

구조체(Struct)  (0) 2024.11.24
참조자(Reference)  (0) 2024.11.24
인라인(inline) 함수  (0) 2024.11.24
Call by Value/Call by Reference  (0) 2024.11.24
추상 클래스/인터페이스  (0) 2024.11.22