본문 바로가기

C++ 응용

Chapter.09 객체와 클래스 (1)

객체 : 명확하게 구별되는 실제 세계에서의 개체(요소)를 나타냄.

ex) 학생, 책상, 대여(물건을 빌리는 것) 등등등

 

객체 -> 자신만의 고유한 특성과 상태(state), 행동(behavior)

상태(state) = 데이터 필드

행동(behavior) = 함수

 

인스턴스 멤버변수 = 인스턴스 변수 = 우리가 알고 있는 그냥 변수 : 생성된 객체에서의 변수

인스턴스 멤버함수 = 인스턴스 함수 = 우리가 알고 있는 그냥 함수 : 생성된 객체에서의 함수

=> 특정한 인스턴스에 종속적 / 특정한 인스턴스에 대해서만 함수가 호출

* 인스턴스 함수를 호출하는 객체를 호출 객체(calling object)라고 부름

 

객체 : 선언 / 인스턴스 : 실체화

 

클래스(class) : 생성될 임의의 객체에 대한 '설계도' 

-> 하나의 데이터 유형

 

클래스를 이용해서 생성된 객체 = 인스턴스(instance)

 

멤버변수 : 클래스 상에서의 변수

멤버함수 : 클래스 상에서의 함수

=> 실재 하지 않은 것

= 인스턴스가 만들어져야 세상에 나타나는 것

ex) 아파트가 설계도 상에 있다고 실제로 존재하는 것이 아닌 것과 같음.

 

객체 생성 -> 어떤 객체를 생성할 지에 대한 설계도는 클래스 안에서 선언한 후 main함수에서 생성

 

- 접근지시자

private : 아래에 쓰여진 것들은 모두 객체 내에서 보호되고 있다라는 의미

-> 자기 객체 안에서만 접근할 수 있을 뿐 객체 외부에서는 접근할 수 없음.

private : 
int food;
int weight;

#1 

void set_animal(int _food, int _weight) {
food = _food;
weight = _weight;
}

#2

int main() {
Animal animal;
animal.food = 100;
}

 

#1과 같이 같은 객체 안에서는 food 와 weight에 접근하는 것이 가능

#2처럼 객체 밖에서 인위적으로 food에 접근하는 것은 불가능

 

public : 말 그대로 공개된 것

-> 외부에서 마음껏 접근 할 수 있음

public : 
void set_animal(int _food, int _weight) {
food = _food;
weight = _weight;
}

void increase_food(int inc) {
food += inc;
weight += (inc / 3);
}

void view_stat() {
cout << "이 동물의 food : " << food << endl;
cout << "이 동물의 weight : " << weight << endl;
}

멤버함수들을 public으로 지정

animal.set_animal(100, 50);
animal.increase_food(30);
animal.view_stat();

외부인 main함수에서도 마음껏 접근할 수 있음

 

* 접근지시자를 명시하지 않으면 기본적으로 private으로 설정

 

- 생성자(constructor)

: 특별한 유형의 함수

 

생성자 특성

1. 생성자는 클래스 자신과 같은 이름을 가져야 함.

2. 생성자는 반환 유형이 없음(void도 사용x)

3. 생성자는 객체가 생성될 때 호출됨 + 객체 초기화의 역할을 수행

 

+ 생성자에도 오버로딩을 적용할 수 있음

= 이름은 같지만 괄호 안에 있는 인수 부분이 서로 다른 여러 개의 생성자 작성 o

 

* 클래스 멤버로서 데이터 필드는 선언될 때 초기화할 수 없다

-> 생성자에서 초기화 되어야 한다.

 

+ 클래스는 인수 없는 생성자를 제공한다

ex) Circle() : 인수 없는 생성자

 

클래스는 생성자 없이 정의 될 수도 있음

-> 인수 없는 생성자가 암시적으로 클래스 내부에서 정의됨

= 기본 생성자(default constructor)

 

* 클래스 안에 어떠한 생성자도 명시적으로 정의되지 않을 경우에만 자동으로 제공

 

- 클래스 정의와 구현 분리

 

클래스 정의 : 모든 데이터 필드와 생성자 원형, 함수 원형을 목록으로 만드는 것

-> 클래스의 규약 사항을 기술하는 것

확장자 : .h

 

클래스 구현 : 생성자와 함수를 작성하는 것

-> 클래스의 규약 사항을 실현하는 것

확장자 : .cpp

 

장점

1. 정의에서 구현 부분을 숨길 수 있고 자유롭게 구현 내용을 변경 할 수 있음

+ 클래스를 사용하는 클라이언트 프로그램은 정의가 변경되지 않는 한 변경할 필요가 없음

2. 소프트웨어 공급업체 관점에서 클래스를 구현하는 소스코드를 공개하지 않고도 클래스 객체 코드와 헤더 파일을 제공 가능

-> 소프트웨어공급업체의 지적 재산권 보호

 

- 다중 포함 방지

: 프로그램 내에서 같은 헤더파일을 여러번 포함 시키는 일이 발생

 

포함 감시자(inclusion guard) : 헤더 파일이 여러번 포함되는 것을 방지

#ifndef (if not defined) : 헤더 파일이 정의되어 있는지를 검사함

#define : 헤더 파일이 정의되어 있지 않다면 정의

#endif : 헤더 파일의 끝을 나타내기 위해 필요

 

* #이 표시되어 있는 문장은 전처리기 지시자

'C++ 응용' 카테고리의 다른 글

Chapter.09 객체와 클래스 (2)  (0) 2024.10.05