본문 바로가기

프로그래밍/C++ language

10. 객체 지향(object-oriented) 개념

10.2 string class

 

- 문자열 처리는 배열에 '\0'을 사용하는 C-문자열 또는 string클래스로 가능함

- string class를 쓰는 것이 프로그래밍하기 편함

- 문자열 추가 함수 : append

- 문자열 대입 함수 : assign

- at, clear, erase, empty // 검색, 제거, 삭제, 비었는지 확인

- length, size, capacity, c_str // 길이, 크기, 용량, c-문자열로 반환

- 문자열 비교 : compare

- 부문 문자열 : substr

- 문자열 검색 : find

- 문자열 삽입 및 교체 : insert, replace

- 문자열 연산자 사용가능 ex) =, +등

 

ex1)

string s1 = "Welcome"; //argument없이 생성후 복사(비효율적)

string s1("Welcome"); //argument있이 생성(효율적)

 

s1.append(" to C"); // Welcome to C

s1.assign("Dallas"); // Dallas

s1.at(1); // a

s1.erase(2, 4); // Da

s1.clear(); // 비어있음

s1.empty(); // True

 

ex2)

string s1("Welcome");

s1.length(); // 7

s1.size(); // 7

s1.capcity(); // 15, 실제 저장공간 크기

s1.c_str(); // c문자열로 반환

string s2("Welcomg");

s1.compare(s2); // -1 (False)

s1.compare("Welcome"); // 0 (True)

s1.substr(3,3); // com

s1.find("co"); // 3

s1.insert(6, "e to C"); // Welcome to C

s1.insert(11, 3, "C"); // Welcome to CCC

s1.replace(11, 2, "BB"); //Welcome to BBC

 

ex3)

string s1("Welcomg");

s1 = "Welcome"; // 문자열 복사

s1 += " to C"; // 문자열 연결

cout << s1; // 문자열 스트림에 삽입

 

10.3 함수에 객체 전달

 

- 기본적으로 함수에 변수를 전달하는 것은 pass by value임. 객체도 동일

- 객체는 크기가 크기 때문에, 참조에 의하 전달이 효율적임

 

ex)

void printCircle(Circle &c){ //참조에 의한 전달

...

}

int main(){

Circle c1;

printCircle(c1);

...

}

 

10.4 객체의 배열

 

- 객체를 element로 갖는 배열을 선언가능

 

ex)

Circle circleArray1[3];

Circle circleArray2[3] = {Circle(1), Circle(2), Circle(3)};

 

10.5 인스턴스(instance) 멤버와 정적(static) 멤버

 

- class내에서 object들 사이에 공유되는 변수를, static variable(또는 class variable)

- class내에서 object들 사이에 공유되지 않고 instance에 제한적인 변수를, instance variable

- class내에서 object를 생성하지 않고 사용할 수 있는, instance에 독립적인 함수를 정적함수라고 함

- 정적 변수와 정적 함수는 object를 생성하지 않아도 접근 가능함

- 정적함수는 class이름으로 접근하는 것이 좋음

 

ex)

//Circle.h

 

class Circle{

...

private:

double radius;

static int numberOfObject; // static variable

public:

static int getNumberOfObject(); // static function

...

};

 

// Circle.cpp

 

int Circle::getNumberOfObject(){

return numberOfObject;

}

 

// main

 

int main(){

...

cout << Circle::getNumberOfObject() << endl; //정적 함수는 class이름으로 접근하는것이 좋음

}

 

10.6 상수 멤버 함수(constant member function)

 

- const키워드를 이용하여, 함수에 argument를 전달할 때 특정 객체가 변경되지 않도록 할 수 있듯,

- 함수자체에 const를 적용하여, 함수에서 객체내 데이터 필드가 변경되지 않도록 할 수 있음

- static function이 아닌, instance function에만 적용 가능

 

ex)

class Circle{

...

public:

double getArea() const; // instance function에 대한 constant function 선언

...

};

 

double Cicle::getArea() const{

return radius * radius * 3.14159; // constant function 구현

}

 

10.8 객체 합성(composition)

 

- 객체의 합성(composition)이란, 집합(aggregation)관계 중 has-a의 특수한 경우임

- has-a란 하나만을 포함(소유)하는 관계임(A has a B)

- student, name, address 클래스가 존재한다고 가정하자

- student has a name을 만족하고 name은 하나의 student에 고유하므로, 합성(composition)관계임

- student has a address를 만족하고 address는 하나의 student에 고유하지 않고 공유되므로, 합성관계가 아님

- 소유하는 객체를 aggregating object, 소유당하는 객체를 aggregated object

- class가 자신의 class를 소유하는 관계도 가능

 

ex)

class Student{

private:

Name name; // student class는 name class를 소유

Address address; // student class는 address class를 소유

...

};

 

class Person{

private:

Person supervisor; // Person class는 자신의 class를 소유

...

};

 

10.10 클래스 설계 지침

 

- Cohesion : 클래스는 단일 요소를 설명해야하고, 동작은 분명한 목적이 있어야함

- Consistency : 표준 프로그래밍형식과 명명규칙을 잘 따라야 함

- Encapsulation : private를 사용함으로서, 직접적인 접근으로부터 데이터를 숨겨야함

- Clarity : 설명하기 쉽고 이해하기 쉬운 명확한 규칙을 가져야함, 다른 필드로 부터 유도되는 필드 선언x

- Completeness : 많은 사용자들이 사용할 수 있도록, 다양한 응용을 할 수 있도록 설계