객체지향 시작하기

yu-podong·2021년 4월 29일
1

CPP

목록 보기
6/9
post-thumbnail

클래스와 객체의 기본 개념


클래스와 객체

클래스(Class)

  • 객체가 가지는 공통된 특성을 기술하는 것
  • 변수라는 저장공간과 프로시저(함수, 기능)가 포함되어 있다.

객체(Object)

  • 클래스 형에 의해 만들어진 실제 사용되는 변수(instance)
  • 함수보다 높은 수준의 모듈화 방법이다.

    클래스를 정의하고 객체를 생성해야만 memory 공간이 생긴다.

객체의 특징

  1. 객체는 캡슐화(encapsulation)된다.
    • encapsulation 목적 : 객체 내 데이터에 대한 보안, 보호, 외부 접근 제한 -> 외부로부터 안전하게 지키기 위함이다.
  2. c++객체는 멤버변수(state)와 멤버 함수(behavior)로 구성된다.

C++에서 제공되는 클래스

1. string 클래스 -> #include <string>
    : 문자열에 대한 처리 제공
2. vector 클래스 -> #include <vector>
    : 실행 중에 크기를 변경할 수 있는 배열 기능 제공

Vector 클래스

vector class

  • 가변 길이 배열을 구현한 제네릭 클래스(Template Class)
    -> 개발자는 '배열 길이 & 타입'에 대해 고민할 필요가 없다.
  • 원소의 저장, 삭제, 검색 등 다양한 멤버 함수 지원이 가능하다.
  • 배열처럼 벡터에 저장된 원소를 인덱스로 접근 가능하다.

vertor 객체의 선언 및 원소 추가

원소로 사용할 값의 데이터 형을 <>로 지정
새로운 원소를 추가하려면 push_back() 멤버함수 사용

vector<int> v1;		//int값을 저장하는 배열(비어있음)
vector<int>v2(3);	//기본값 0으로 초기화된 3개의 원소를 가지는 배열
vector<string>v3;	//string 객체를 저장하는 배열
vector<Student*>v4;	//Student 구조체 포인터를 저장하는 배열

//push_back() : 배열의 마지막에 해당 원소 추가
v1.push_back(3);
v3.push_back("yu-podong");
v4.push_back(new Student);

다양한 vector 멤버함수

  1. v.capacity() : 할당된 공간의 크기 return
  2. v.size() : 실제 우효한 원소의 개수 return
  3. v.at(n) : n번째 원소 참조 (v[index]로 참조하는 것보다는 느리지만, 유효성을 검사하므로 안전 보장)
  4. v.front()/v.back() : 첫 번째/마지막 element 참조
  5. v.clear() : 모든 원소 제거 but 메모리는 남아있음 (size: 0, capacity: 유지)
  6. v.reserve(n) : n개의 원소를 저장할 위치 예약 (capacity 지정)
  7. v.begin() / v.end() : 첫 번째/마지막 index 참조 (마지막 index는 마지막 원소가 저장된 다음 index 번호 가리킴)
  8. v.push_back(x) / v.pop_back(x) : 맨 끝에 원소 삽입/삭제
  9. v.empty() : v가 비어있음 & size가 0 -> true

C++에서의 클래스 및 객체 정의 및 사용


C++클래스 만들기

class 키원드를 사용하여 클래스를 정의하고, class 내의 멤버를 정의할 때 접근 지정자를 사용할 수 있다.

접근 지정자 : private, protected, public
-> 접근 지정자를 사용하여 정보 은닉과 캡슐화를 구현할 수 있다.

그리고 클래스를 작성할 때는 클래스 선언부클래스 구현부로 구성한다. 그래서 class 작성 시, 선언부와 구현부를 file을 2개로 나눠서 작성한다.

  1. 클래스 선언부 (class declaration)

    • class 키워드를 이용하여 클래스 선언한다.
    • 멤버 변수는 class 선언 내에서 초기화할 수 없다.
    • 멤버 함수는 원형(prototype) 형태로 선언한다.
    • 각 멤버에 대한 접근 권한을 지정한다. (디폴트 접한이 정해져 있음)
  2. 클래스 구현부 (class implementation)

    • 클래스에 정의된 모든 멤버 함수 구현한다. 정의가 짧은 경우에는 선언부에 함께 작성할 수도 있다. -> 선언부에 구현된 멤버 함수는 자동 인라인 함수로 처리한다. (inline으로 선언할 필요X)

이렇게 클래스 선언과 클래스 구현으로 분리하는 이유는 클래스를 '다른 파일에서도 활용'하기 위함이다.

//클래스 선언부 - test.cpp
class Studnet {
	public:
    		//멤버 변수
    		int studentNum;
            	string studentName;
                //멤버 함수
                void printStdInfo();
);         

//클래스 구현부 - implementation.cpp
//어떤 클래스의 멤버함수인지 `클래스 이름::`을 작성해야 함
void Student::printStdInfo() {
	cout << "학생의 학번은 "<< studentNum << "입니다.";
   	cout << "학생의 이름은 "<< studnetName << "입니다.";
}

객체 생성 및 활용

// 1. 객체 생성
Student yuPodong;

// 2. 객체의 멤버 접근 -> 구조체와 비슷
yuPodong.studentNum = 2021001001;
yuPodong.studentName = "yu-podong";
yuPodong.printStdInfo();
  • 멤버 변수의 메모리 할당 시점 : 클래스의 객체를 생성하는 시점
  • 멤버 변수/ 멤버 함수에 접근하는 방법
    1. 일반 객체 : .연산자 사용
    2. 동적 객체 : ->연산자 사용
  • 멤버 함수는 객체마다 만들어지는 것이 아니고, 클래스 선언할 때 한번만 정의되고 같은 클래스의 객체들이 공유해서 사용한다.
  • 멤버함수에서 사용되는 멤버 변수 -> 멤버 함수를 호출한 객체의 변수를 사용한다.

멤버 함수

멤버 함수도 함수이기 때문에, 오버로딩디폴트 인자 지정이 가능하다.
항상 해당 클래스의 객체만이 멤버 함수를 부를 수 있고, 같은 클래스에 정의된 멤버를 사용할 때는 객체 이름을 지정하지 않아도 된다. (클래스 구현부에서의 얘기)

// 멤버 호출 시, 객체 이름을 지정하지 않아도 되는 이유는, 멤버 함수를 호출한 객체의 것으로 자동적으로 인식이 되기 때문이다.
void Student::printStdInfo() {
	cout << "학생의 학번은 "<< studentNum << "입니다.";
   	cout << "학생의 이름은 "<< studnetName << "입니다.";
}

멤버 함수 안에서는 접근 지정자에 상관없이 클래스의 모든 멤버를 사용할 수 있다.

0개의 댓글