본문 바로가기
KNOU/C++

[C++ 프로그래밍] 클래스와 객체

by bottlesun 2022. 12. 1.
728x90

객체(Object) 란?

  • 소프트웨어 시스템 안의 어떠한 대상을 표현한 것으로
    • 정해진 처리를 수행 → 행위, 메소드, 멤버함수
    • 처리 과정에 따라 내부 상태가 변화할 수 있음 → 속성, 데이터 멤버
    • 다른 객체와 상호작용 할 수 있음 → 메시지 전달(멤버 함수 호출)

클래스(Class)란?

  • 객체의 설계도
  • 객체가 포함할 데이터 멤버의 선언과 멤버 함수의 정의를 포함한다.

클래스 선언문 형식

class ClassName {
private: // 가시성 지시어 - 멤버 공개 범위를 나타냄 (public,private,protected)
int value; // 데이터 멤버 - 값을 저장 할 변수 (속성)
void reset()

······
};

가시성 지시어

  • class의 공개 범위를 나타낸다.
  • private (기본값) - 소속 클래스의 멤버 함수, 친구클래스의 멤버함수 및 친구함수 에게만 공개
  • public - 전 범위 공개
  • protected - 블럭 안에서만 공개

캡슐화

객체 내부의 상세한 구현 부분과 외부 사용자의 관점을 분리한다.

내부 속성 등 구현에 대한 부분은 공개 하지 않음 (정보은닉)

객체 외부에서는 공개 된 인터페이스를 통해 객체를 사용 한다.

객체 사용 형식

객체 이름에 멤버 선택 연산자(.) 를 사용한다.

cin >> objName.dataMember;
objName.memFunc( ······ );

객체의 멤버 함수 안에서 그 객체에 속한 멤버를 사용할 때는 멤버 이름 만으로 액세스함

사용형식

class Counter {
int value; // 프라이빗 부분 
public: // 가시성 설정
void reset()
{ value = 0; }
void count()
{ ++value; }
int getValue() const
{ return value; }
};

int main() {
Counter c; // c에 Counter 객체의 정의
// c.value = 0; // private 부분 멤버 접근 이기에 error 접근 불가
c.reset(); // 초기화 객체 사용
cout << "계수기의 현재 값 : " << cnt.getValue() << endl;
c.count(); // 증가 객체 사용

cout << "계수기의 현재 값 : " << cnt.getValue() << endl;
return 0;
······
}

const 멤버함수

데이터의 값이 수정 되지 않는 곳에서만 사용 할 수 있다.

class Counter {
int value;
public:
void reset()
{ value = 0; }
void count() // 사용 불가
{ ++value; }
int getValue() const // 사용 가능
{ return value; }
};

값이 변경 되지 않는 부분에서는 반듯이 지정 해주는 게 좋다.

void f(Counter& c) // 참조변수로 받을 경우에 
{
cout << c.getValue(); // const 를 지정 해줘야 한다.
······
}

생성자

  • 객체가 생성 될 때 수행할 작업을 정의하는 특수한 함수
  • 생성자에 인수를 전달 할 수 있도록 매개변수를 선언 할 수 있다.
  • 클래스의 이름을 사용하여 선언 한다.
  • return 값을 반환 할 수 없다. → void 로 표기 하는 것이 아닌, 자료형 자체를 표기 x
  • public 으로 선언해야 클래스 외부에서 객체 생성 가능
class ClassName {
······
public:
ClassName()

ClassName(fParameterList){ // 자료형을 표기하지 않는다.
······ // 객체 생성을 위한 준비 작업
}
······
};

초기화 리스트

생성자의 머리에 데이터 멤버를 초기화 하는 값들을 나열한 리스트

데이터멤버이름{초깃값} 형태로 지정

class Counter {
int value;
public:
Counter() : value{0} { } // 생성자 초기화
······
};

소멸자

  • 객체가 소멸 될 떄 수행할 작업을 정의하는 특수한 멤버함수 (일반적으로 public으로 선언)
  • 클래스 이름에 ~ 를 붙혀 선언
  • 자료형 표시 (x) return 명령 값 반환 (x)
  • 매개변수 (x) 클래스에 하나의 소멸자만 정의 할 수 있음
  • 파생 클래스를 정의하는 경우 가상함수로 지정해둬야 한다.
class ClassName {
······
public:
ClassName(fParameterList) {
······ // 객체 생성을 위한 준비 작업
}
~ClassName() {
······ // 객체 제거를 위한 정리 작업
}
······
};

디폴트 생성자

  • 매개변수가 없는 생성자 or 모든 매개변수에 디폴트 인수가 있는 생성자
  • 클래스 선언할 때, 생성자를 선언하지 않으면 묵시적으로 디폴트 생성자를 정의한다.
  • 생성자가 하나라도 선언 되면 컴파일러는 묵시적 디폴트 생성자를 정의하지 않음

묵시적 디폴트 생성자

생성자를 선언하지 않으면 묵시적으로 생성자가 있다고 판단한다.

class Counter {
int Value;
public:
Counter() {} // 디폴트 생성자
void reset() { value = 0; }
void count() { ++value; }
int getValue() const
{ return value; }
};

// main
int main()
{
Counter cnt; // value 라는 데이터 멤버를 가진 객체 하나가 선언 
······
}

디폴트 생성자가 없는 클래스

생성자가 하나라도 있으면 디폴트 생성자가 생성이 되지 않는다.

class CounterM {
const int maxValue; // 제일 큰 카운터 값
int value; // 실제 카운터 값
public:
CounterM(int mVal) // 생성자 생성 
: maxValue{mVal}, value{0} {} // 초기화리스트 사용
void reset() { value = 0; }
void count() {
value = value < maxValue ?
value + 1 : 0;
}
······
};

//main
int main()
{
CounterM cnt1(999); // 999 라는 값이 매개변수로 전달
CounterM cnt2; // 매개변수가 없기에 error
······
}

객체 배열의 선언

class Counter {
int Value;
public:
// Counter() {} -> 묵시적 디폴트 생성자가 생성
void reset() { value = 0; }
void count() { ++value; }
int getValue() const
{ return value; }
};

//main
int main()
{
Counter cntArr[4]; // OK
Counter *pt =
new Counter[10]; // OK
······
}

복사 생성자

  • 동일 클래스의 객체를 복사하여 객체를 만드는 생성자
  • 묵시적 복사 생성자 → 객체 데이터 멤버를 그대로 복사하여 객체를 만들도록 묵시적 정의
class ClassName {
······
public:
ClassName(const ClassName& obj){ // ClassName 참조형 전달(수정X)
······ // 생성되는 객체에 obj를 복사하는 처리
}
······
};

얕은복사 (VecF)

벡터 객체를 만들 수 있는 VecF 클래스를 정의하고자 한다. VecF 객체는 저장할 수 있는 float 값의 수를 인수로 지정하여 생성되며, 저장할 값의 배열이 제공될 경우 그 값으로 초기화한다. 인수로 전달된 VecF 객체와 덧셈한 결과를 반환할 수 있으며, 객체에 저장된 벡터를 출력할 수 있다.

rvalue 참조

전통적 의미의 lvalue 와 rvalue

a = b + 10; → a - lvalue , b+10 - rvalue

rvalue 참조의 선언

  • & 기호로 선언하는 lvalue 참조와 달리 rvalue 참조는 && 기호로 선언함
VecF v1(3), v2(3);
VecF& vLRef = v1; // lvalue 참조로 lvalue를 참조함
int& a = 10; // 오류: lvalue 참조로 rvalue를 참조할 수 없음
const int& b = 20; // 상수 lvalue 참조로는 rvalue를 참조할 수 있음
int&& c = 30; // rvalue는 rvalue 참조로 참조할 수 있음
VecF&& vRRef1 = v1.add(v2); // 함수의 반환 객체는 rvalue임
VecF&& vRRef2 = v2; // 오류: rvalue 참조로 lvalue를 참조할 수 없음

이동생성자

  • rvalue 참조로 전달된 같은 클래스의 객체의 내용을 이동하여 객체를 만드는 생성자

객체(Object) 란?

  • 소프트웨어 시스템 안의 어떠한 대상을 표현한 것으로
    • 정해진 처리를 수행 → 행위, 메소드, 멤버함수
    • 처리 과정에 따라 내부 상태가 변화할 수 있음 → 속성, 데이터 멤버
    • 다른 객체와 상호작용 할 수 있음 → 메시지 전달(멤버 함수 호출)

클래스(Class)란?

  • 객체의 설계도
  • 객체가 포함할 데이터 멤버의 선언과 멤버 함수의 정의를 포함한다.

클래스 선언문 형식

class ClassName {
private: // 가시성 지시어 - 멤버 공개 범위를 나타냄 (public,private,protected)
int value; // 데이터 멤버 - 값을 저장 할 변수 (속성)
void reset()

······
};

가시성 지시어

  • class의 공개 범위를 나타낸다.
  • private (기본값) - 소속 클래스의 멤버 함수, 친구클래스의 멤버함수 및 친구함수 에게만 공개
  • public - 전 범위 공개
  • protected - 블럭 안에서만 공개

캡슐화

객체 내부의 상세한 구현 부분과 외부 사용자의 관점을 분리한다.

내부 속성 등 구현에 대한 부분은 공개 하지 않음 (정보은닉)

객체 외부에서는 공개 된 인터페이스를 통해 객체를 사용 한다.

객체 사용 형식

객체 이름에 멤버 선택 연산자(.) 를 사용한다.

cin >> objName.dataMember;
objName.memFunc( ······ );

객체의 멤버 함수 안에서 그 객체에 속한 멤버를 사용할 때는 멤버 이름 만으로 액세스함

사용형식

class Counter {
int value; // 프라이빗 부분 
public: // 가시성 설정
void reset()
{ value = 0; }
void count()
{ ++value; }
int getValue() const
{ return value; }
};

int main() {
Counter c; // c에 Counter 객체의 정의
// c.value = 0; // private 부분 멤버 접근 이기에 error 접근 불가
c.reset(); // 초기화 객체 사용
cout << "계수기의 현재 값 : " << cnt.getValue() << endl;
c.count(); // 증가 객체 사용

cout << "계수기의 현재 값 : " << cnt.getValue() << endl;
return 0;
······
}

const 멤버함수

데이터의 값이 수정 되지 않는 곳에서만 사용 할 수 있다.

class Counter {
int value;
public:
void reset()
{ value = 0; }
void count() // 사용 불가
{ ++value; }
int getValue() const // 사용 가능
{ return value; }
};

값이 변경 되지 않는 부분에서는 반듯이 지정 해주는 게 좋다.

void f(Counter& c) // 참조변수로 받을 경우에 
{
cout << c.getValue(); // const 를 지정 해줘야 한다.
······
}

생성자

  • 객체가 생성 될 때 수행할 작업을 정의하는 특수한 함수
  • 생성자에 인수를 전달 할 수 있도록 매개변수를 선언 할 수 있다.
  • 클래스의 이름을 사용하여 선언 한다.
  • return 값을 반환 할 수 없다. → void 로 표기 하는 것이 아닌, 자료형 자체를 표기 x
  • public 으로 선언해야 클래스 외부에서 객체 생성 가능
class ClassName {
······
public:
ClassName()

ClassName(fParameterList){ // 자료형을 표기하지 않는다.
······ // 객체 생성을 위한 준비 작업
}
······
};

초기화 리스트

생성자의 머리에 데이터 멤버를 초기화 하는 값들을 나열한 리스트

데이터멤버이름{초깃값} 형태로 지정

class Counter {
int value;
public:
Counter() : value{0} { } // 생성자 초기화
······
};

소멸자

  • 객체가 소멸 될 떄 수행할 작업을 정의하는 특수한 멤버함수 (일반적으로 public으로 선언)
  • 클래스 이름에 ~ 를 붙혀 선언
  • 자료형 표시 (x) return 명령 값 반환 (x)
  • 매개변수 (x) 클래스에 하나의 소멸자만 정의 할 수 있음
  • 파생 클래스를 정의하는 경우 가상함수로 지정해둬야 한다.
class ClassName {
······
public:
ClassName(fParameterList) {
······ // 객체 생성을 위한 준비 작업
}
~ClassName() {
······ // 객체 제거를 위한 정리 작업
}
······
};

디폴트 생성자

  • 매개변수가 없는 생성자 or 모든 매개변수에 디폴트 인수가 있는 생성자
  • 클래스 선언할 때, 생성자를 선언하지 않으면 묵시적으로 디폴트 생성자를 정의한다.
  • 생성자가 하나라도 선언 되면 컴파일러는 묵시적 디폴트 생성자를 정의하지 않음

묵시적 디폴트 생성자

생성자를 선언하지 않으면 묵시적으로 생성자가 있다고 판단한다.

class Counter {
int Value;
public:
Counter() {} // 디폴트 생성자
void reset() { value = 0; }
void count() { ++value; }
int getValue() const
{ return value; }
};

// main
int main()
{
Counter cnt; // value 라는 데이터 멤버를 가진 객체 하나가 선언 
······
}

디폴트 생성자가 없는 클래스

생성자가 하나라도 있으면 디폴트 생성자가 생성이 되지 않는다.

class CounterM {
const int maxValue; // 제일 큰 카운터 값
int value; // 실제 카운터 값
public:
CounterM(int mVal) // 생성자 생성 
: maxValue{mVal}, value{0} {} // 초기화리스트 사용
void reset() { value = 0; }
void count() {
value = value < maxValue ?
value + 1 : 0;
}
······
};

//main
int main()
{
CounterM cnt1(999); // 999 라는 값이 매개변수로 전달
CounterM cnt2; // 매개변수가 없기에 error
······
}

객체 배열의 선언

class Counter {
int Value;
public:
// Counter() {} -> 묵시적 디폴트 생성자가 생성
void reset() { value = 0; }
void count() { ++value; }
int getValue() const
{ return value; }
};

//main
int main()
{
Counter cntArr[4]; // OK
Counter *pt =
new Counter[10]; // OK
······
}

복사 생성자

  • 동일 클래스의 객체를 복사하여 객체를 만드는 생성자
  • 묵시적 복사 생성자 → 객체 데이터 멤버를 그대로 복사하여 객체를 만들도록 묵시적 정의
class ClassName {
······
public:
ClassName(const ClassName& obj){ // ClassName 참조형 전달(수정X)
······ // 생성되는 객체에 obj를 복사하는 처리
}
······
};

얕은복사 (VecF)

벡터 객체를 만들 수 있는 VecF 클래스를 정의하고자 한다. VecF 객체는 저장할 수 있는 float 값의 수를 인수로 지정하여 생성되며, 저장할 값의 배열이 제공될 경우 그 값으로 초기화한다. 인수로 전달된 VecF 객체와 덧셈한 결과를 반환할 수 있으며, 객체에 저장된 벡터를 출력할 수 있다.

rvalue 참조

전통적 의미의 lvalue 와 rvalue

a = b + 10; → a - lvalue , b+10 - rvalue

rvalue 참조의 선언

  • & 기호로 선언하는 lvalue 참조와 달리 rvalue 참조는 && 기호로 선언함
VecF v1(3), v2(3);
VecF& vLRef = v1; // lvalue 참조로 lvalue를 참조함
int& a = 10; // 오류: lvalue 참조로 rvalue를 참조할 수 없음
const int& b = 20; // 상수 lvalue 참조로는 rvalue를 참조할 수 있음
int&& c = 30; // rvalue는 rvalue 참조로 참조할 수 있음
VecF&& vRRef1 = v1.add(v2); // 함수의 반환 객체는 rvalue임
VecF&& vRRef2 = v2; // 오류: rvalue 참조로 lvalue를 참조할 수 없음

이동생성자

  • rvalue 참조로 전달된 같은 클래스의 객체의 내용을 이동하여 객체를 만드는 생성자

객체(Object) 란?

  • 소프트웨어 시스템 안의 어떠한 대상을 표현한 것으로
    • 정해진 처리를 수행 → 행위, 메소드, 멤버함수
    • 처리 과정에 따라 내부 상태가 변화할 수 있음 → 속성, 데이터 멤버
    • 다른 객체와 상호작용 할 수 있음 → 메시지 전달(멤버 함수 호출)

클래스(Class)란?

  • 객체의 설계도
  • 객체가 포함할 데이터 멤버의 선언과 멤버 함수의 정의를 포함한다.

클래스 선언문 형식

class ClassName {
private: // 가시성 지시어 - 멤버 공개 범위를 나타냄 (public,private,protected)
int value; // 데이터 멤버 - 값을 저장 할 변수 (속성)
void reset()

······
};

가시성 지시어

  • class의 공개 범위를 나타낸다.
  • private (기본값) - 소속 클래스의 멤버 함수, 친구클래스의 멤버함수 및 친구함수 에게만 공개
  • public - 전 범위 공개
  • protected - 블럭 안에서만 공개

캡슐화

객체 내부의 상세한 구현 부분과 외부 사용자의 관점을 분리한다.

내부 속성 등 구현에 대한 부분은 공개 하지 않음 (정보은닉)

객체 외부에서는 공개 된 인터페이스를 통해 객체를 사용 한다.

객체 사용 형식

객체 이름에 멤버 선택 연산자(.) 를 사용한다.

cin >> objName.dataMember;
objName.memFunc( ······ );

객체의 멤버 함수 안에서 그 객체에 속한 멤버를 사용할 때는 멤버 이름 만으로 액세스함

사용형식

class Counter {
int value; // 프라이빗 부분 
public: // 가시성 설정
void reset()
{ value = 0; }
void count()
{ ++value; }
int getValue() const
{ return value; }
};

int main() {
Counter c; // c에 Counter 객체의 정의
// c.value = 0; // private 부분 멤버 접근 이기에 error 접근 불가
c.reset(); // 초기화 객체 사용
cout << "계수기의 현재 값 : " << cnt.getValue() << endl;
c.count(); // 증가 객체 사용

cout << "계수기의 현재 값 : " << cnt.getValue() << endl;
return 0;
······
}

const 멤버함수

데이터의 값이 수정 되지 않는 곳에서만 사용 할 수 있다.

class Counter {
int value;
public:
void reset()
{ value = 0; }
void count() // 사용 불가
{ ++value; }
int getValue() const // 사용 가능
{ return value; }
};

값이 변경 되지 않는 부분에서는 반듯이 지정 해주는 게 좋다.

void f(Counter& c) // 참조변수로 받을 경우에 
{
cout << c.getValue(); // const 를 지정 해줘야 한다.
······
}

생성자

  • 객체가 생성 될 때 수행할 작업을 정의하는 특수한 함수
  • 생성자에 인수를 전달 할 수 있도록 매개변수를 선언 할 수 있다.
  • 클래스의 이름을 사용하여 선언 한다.
  • return 값을 반환 할 수 없다. → void 로 표기 하는 것이 아닌, 자료형 자체를 표기 x
  • public 으로 선언해야 클래스 외부에서 객체 생성 가능
class ClassName {
······
public:
ClassName()

ClassName(fParameterList){ // 자료형을 표기하지 않는다.
······ // 객체 생성을 위한 준비 작업
}
······
};

초기화 리스트

생성자의 머리에 데이터 멤버를 초기화 하는 값들을 나열한 리스트

데이터멤버이름{초깃값} 형태로 지정

class Counter {
int value;
public:
Counter() : value{0} { } // 생성자 초기화
······
};

소멸자

  • 객체가 소멸 될 떄 수행할 작업을 정의하는 특수한 멤버함수 (일반적으로 public으로 선언)
  • 클래스 이름에 ~ 를 붙혀 선언
  • 자료형 표시 (x) return 명령 값 반환 (x)
  • 매개변수 (x) 클래스에 하나의 소멸자만 정의 할 수 있음
  • 파생 클래스를 정의하는 경우 가상함수로 지정해둬야 한다.
class ClassName {
······
public:
ClassName(fParameterList) {
······ // 객체 생성을 위한 준비 작업
}
~ClassName() {
······ // 객체 제거를 위한 정리 작업
}
······
};

디폴트 생성자

  • 매개변수가 없는 생성자 or 모든 매개변수에 디폴트 인수가 있는 생성자
  • 클래스 선언할 때, 생성자를 선언하지 않으면 묵시적으로 디폴트 생성자를 정의한다.
  • 생성자가 하나라도 선언 되면 컴파일러는 묵시적 디폴트 생성자를 정의하지 않음

묵시적 디폴트 생성자

생성자를 선언하지 않으면 묵시적으로 생성자가 있다고 판단한다.

class Counter {
int Value;
public:
Counter() {} // 디폴트 생성자
void reset() { value = 0; }
void count() { ++value; }
int getValue() const
{ return value; }
};

// main
int main()
{
Counter cnt; // value 라는 데이터 멤버를 가진 객체 하나가 선언 
······
}

디폴트 생성자가 없는 클래스

생성자가 하나라도 있으면 디폴트 생성자가 생성이 되지 않는다.

class CounterM {
const int maxValue; // 제일 큰 카운터 값
int value; // 실제 카운터 값
public:
CounterM(int mVal) // 생성자 생성 
: maxValue{mVal}, value{0} {} // 초기화리스트 사용
void reset() { value = 0; }
void count() {
value = value < maxValue ?
value + 1 : 0;
}
······
};

//main
int main()
{
CounterM cnt1(999); // 999 라는 값이 매개변수로 전달
CounterM cnt2; // 매개변수가 없기에 error
······
}

객체 배열의 선언

class Counter {
int Value;
public:
// Counter() {} -> 묵시적 디폴트 생성자가 생성
void reset() { value = 0; }
void count() { ++value; }
int getValue() const
{ return value; }
};

//main
int main()
{
Counter cntArr[4]; // OK
Counter *pt =
new Counter[10]; // OK
······
}

복사 생성자

  • 동일 클래스의 객체를 복사하여 객체를 만드는 생성자
  • 묵시적 복사 생성자 → 객체 데이터 멤버를 그대로 복사하여 객체를 만들도록 묵시적 정의
class ClassName {
······
public:
ClassName(const ClassName& obj){ // ClassName 참조형 전달(수정X)
······ // 생성되는 객체에 obj를 복사하는 처리
}
······
};

얕은복사 (VecF)

벡터 객체를 만들 수 있는 VecF 클래스를 정의하고자 한다. VecF 객체는 저장할 수 있는 float 값의 수를 인수로 지정하여 생성되며, 저장할 값의 배열이 제공될 경우 그 값으로 초기화한다. 인수로 전달된 VecF 객체와 덧셈한 결과를 반환할 수 있으며, 객체에 저장된 벡터를 출력할 수 있다.

rvalue 참조

전통적 의미의 lvalue 와 rvalue

a = b + 10; → a - lvalue , b+10 - rvalue

rvalue 참조의 선언

  • & 기호로 선언하는 lvalue 참조와 달리 rvalue 참조는 && 기호로 선언함
VecF v1(3), v2(3);
VecF& vLRef = v1; // lvalue 참조로 lvalue를 참조함
int& a = 10; // 오류: lvalue 참조로 rvalue를 참조할 수 없음
const int& b = 20; // 상수 lvalue 참조로는 rvalue를 참조할 수 있음
int&& c = 30; // rvalue는 rvalue 참조로 참조할 수 있음
VecF&& vRRef1 = v1.add(v2); // 함수의 반환 객체는 rvalue임
VecF&& vRRef2 = v2; // 오류: rvalue 참조로 lvalue를 참조할 수 없음

이동생성자

  • rvalue 참조로 전달된 같은 클래스의 객체의 내용을 이동하여 객체를 만드는 생성자
728x90

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

[C++프로그래밍] 예외처리  (0) 2022.12.01
[C++ 프로그래밍]템플릿  (0) 2022.12.01
[C++ 프로그래밍]연산자 다중정의  (0) 2022.12.01
[C++ 프로그래밍] 함수  (1) 2022.12.01

댓글