[c++] 객체와 클래스

나경·2024년 9월 27일
1

객체지향 프로그래밍 (OOP, Object-Oriented Programming)

프로그래밍에 객체를 사용하는데, 모든 객체의 속성과 행동을 결합시킨다

객체

  • 명확히 확인이 가능한 실제 세계에서의 존재물을 대표하는 것이다
  • 자신만의 특성과 상태(state), 행동(behavior)을 가진다

ex) 학생, 책상, 원, 버튼 등

상태

현재 값을 가지고 있는 데이터 필드(속성)에 의해 표현된다

행동

일련의 함수에 의해서 정의되고, 함수를 호출해서 객체에게 어떤 일을 수행하도록 요구한다

실체화

클래스에서 인스턴스를 생성하는 것

생성자

새로운 객체가 셍성될 때 호출되는 특별한 유형의 함수이다 보통은 객체의 데이터 필드에 초기 값을 주는 초기화 과정을 수행하기 위해 설계된다

class Square {
public:
	double length; // 데이터 필드

	Square() { // 생성자
		length = 10;
	}

	Square(double newLength) { // 생성자
		length = newLength;
	}

	double getArea() { // 함수
		return length * length;
	}
};

다이어그램(UML, Unified Modeling Language)

클래스 템플릿과 객체의 설명은 UML 표기법을 사용하여 표준화할 수 있다
위의 코드를 다이어그램으로 나타내면 아래와 같다

위의 사진에서 생성자와 함수 부분에서 +기호를 볼 수 있는데, 이는 public을 의미한다

객체에 대한 UML 표기법은 아래와 같다

생성자

  • 클래스의 이름가 같다
  • 다른 특징들을 갖는 여러 개의 생성자를 사용하여 오버로딩 가능하다
  • 반환값을 가지지 않는다

인수 없는 생성자


위의 다이어그램을 다시 자세히 보면 Square()라는 생성자에는 인수가 존재하지 않는다 이런 생성자를 인수 없는 생성자라고 부른다

기본 생성자라고도 부르며, 어떠한 생성자도 선언하지 않을 경우에만 자동으로 주어진다

객체 생성

인수 없는 생성자를 생성하는 코드

ClassName variableName; // 기본 구조

인수 있는 생성자를 생성하는 코드

ClassName variableName(인수); 

객체 멤버 접근 연산자

객체를 생성한 후에 데이터에 접근하고 함수를 호출하기 위해서는 객체 멤버 접근 연산자인 점(.)을 사용해야 한다

objectName.dataField // 객체에서 데이터 필드를 참조
objectName.funcion(인수) // 객체에 대한 함수를 호출

코드 예시

#include <iostream>
using namespace std;
class Square {
public:
	double length;

	Square() {
		length = 10;
	}

	Square(double newLength) {
		length = newLength;
	}

	double getArea() {
		return length * length;
	}
};
int main() {
	Square square1;
	Square square2(5);
	cout << "square1의 한 변의 길이는 " << square1.getArea() << "이고, square1의 넓이는 " << square1.getArea() << "입니다." << endl;
	cout << "square2의 한 변의 길이는 " << square2.getArea() << "이고, square2의 넓이는 " << square2.getArea() << "입니다." << endl;

	return 0;
}

출력 결과:

square1의 한 변의 길이는 100이고, square1의 넓이는 100입니다.
square2의 한 변의 길이는 25이고, square2의 넓이는 25입니다.

square1는 인수 없는 생성자이고, square2는 인수가 있는 생성자이다

클래스 선언과 구현 분리

위에서는 하나의 cpp 파일에 코드를 구현했다 하지만 이렇게 구현했을 경우에는 이 클래스를 다른 프로그램에서 사용할 수 없다 따라서 다른 프로그램에서도 사용할 수 있게 하기 위해서는 분리된 헤더 파일에서 클래스를 선언해야 한다

클래스 선언

클래스의 규약 사항을 기술하는 것이다
모든 데이터 필드와 생성자 원형, 함수 원형을 목록으로 만든다
확장자는 .h인데, h는 헤더를 의미한다

클래스 구현

클래스의 선언은 클래스의 규약 사항을 기술하는 것이라면, 클래스 구현은 그 규약을 실현하는 것이다
생성자와 함수를 정의한다
확장자는 .cpp이다

클래스 선언과 구현은 두 개의 분리된 파일로 저장할 수 있고
두 파일의 이름은 같지만 다른 확장자를 가진다

코드 예시

Square.h

class Square {
public:
	double length;
	Square();
	Square(double);
	double getArea();
};

헤더 파일의 마지막에 세미콜론이 꼭 있어야 한다

Square.cpp

#include "Square.h"

Square::Square() {
	length = 10;
}

Square::Square(double newLength) {
	length = newLength;
}

double Square::getArea() {
	return length * length;
}

TestSquare.cpp

#include <iostream>
#include "Square.h"
using namespace std;

int main() {
	Square square1;
	Square square2(5);
	cout << "square1의 한 변의 길이는 " << square1.getArea() << "이고, square1의 넓이는 " << square1.getArea() << "입니다." << endl;
	cout << "square2의 한 변의 길이는 " << square2.getArea() << "이고, square2의 넓이는 " << square2.getArea() << "입니다." << endl;
	
	return 0;
}

0개의 댓글