Developer

7.(C++) 클래스 (1) 본문

Programming Language/C++

7.(C++) 클래스 (1)

DPhater 2020. 8. 1. 22:46

C++은 객체 지향 프로그램을 지원한다고 했다. 현실에 존재하는 객체(Object)와 객체의 상태(State)와 동작(Behavior)을 소프트웨어로 구현한 것이다. 예를들어 시계라는 객체가 있고 이러한 시계의 상태는 현재 시간, 동작은 시간이 흐르고, 알람 설정 등...이 있다. 이러한 것을 소프트웨어로 구현하는 것이다.

위에서 설명한 객체를 소프트웨어에서 표현하기 위해 사용하는 것이 클래스(class)이다. 이전 글인 구조체에서 class는 구조체의 확장판이고 둘의 차이도 설명하였다.

코드를 통해 Class를 직접 사용해보자.

#include<iostream>
#include<string>
using namespace std;

class student{ //학생이라는 객체의 설계도

	string name;         //default 접근 지정자가 private
	int id;              
	int age;
	string phonenumber;
	
	public:
		void print();

		void setname(string aname);   //멤버변수를 사용하기위한 accessor
		void setid(int aid);          
		void setage(int aage);
		void setphonenumber(string aphonenumber);
};

void student::print(){
	cout<<name<<" "<<id<<" "<<age<<" "<<phonenumber;
}

void student::setname(string aname){
	name=aname;
}

void student::setid(int aid){
	id=aid;
}

void student::setage(int aage){
	if(aage<=100)
		age=aage;
	else 
		cout<<"input error"<<endl;
}

void student::setphonenumber(string aphonenumber){
	phonenumber=aphonenumber;
}

int main(){
	student a1;   //객체 생성 (인스턴스)
	a1.setid(123456);
	a1.setname("김모군");
	a1.setage(21);
	a1.setphonenumber("010xxxxxxxx");
	a1.print();
}

코드1 실행 결과

Class는 구조체와 다르게 기본 접근 지정자가 private로 되어있으므로 접근 지정자를 작성하지 않은 name, id, age, phonenumber은 외부에서 직접 접근이 불가능하다. 이런 멤버 변수의 값을 변경하거나 할당하기 위해 멤버 변수에 접근해주는 set_으로 시작하는 멤버함수인 Accessor를 선언해 주었다. 또한 멤버함수는 함수 원형만 클래스 내부에 작성해주고 함수의 구현은 외부에서 작성해 주었다.

이렇게 작성한 코드를 여러개의 파일로 다시 작성해보자.

 

student.h

#include<iostream>
#include<string>

using namespace std;

class student {
	string name;
	int id;
	int age;
	string phonenumber;

public:
	void print();
	void setname(string aname);
	void setid(int aid);
	void setage(int aage);
	void setphonenumber(string aphonenumber);
};

student.cpp

#include"student.h"

void student::print() {
	cout << name << " " << id << " " << age << " " << phonenumber;
}

void student::setname(string aname) {
	name = aname;
}

void student::setid(int aid) {
	id = aid;
}

void student::setage(int aage) {
	if (aage <= 100)
		age = aage;
	else
		cout << "input error" << endl;
}

void student::setphonenumber(string aphonenumber) {
	phonenumber = aphonenumber;
}

main.cpp

#include"student.h"

int main() {
	student a1;
	a1.setid(123456);
	a1.setname("김모군");
	a1.setage(21);
	a1.setphonenumber("010xxxxxxxx");
	a1.print();
}

student.h라는 헤더파일에 클래스를 선언하였고, student.cpp에서 클래스의 멤버함수를 정의하고있다. 그리고 마지가 main.cpp에서는 student.h라는 헤더파일을 추가해주는 것으로 쉽게 student라는 클래스를 이용할 수 있다. 굳이 이렇게 나누는 이유는 코드의 재활용성이 높기 때문이다.

자세한 구현을 알 필요없이 student.h파일을 보면 무엇을 위해 사용할 수 있는지 최소한의 정보가 들어있기 때문에 student.h를 추가해 사용하기만 하면된다. 물론 내 자신이 다른 코드에서도 사용할 수 있다.

위와같이 간단한 클래스를 작성하는 방법은 이미 구조체를 배우면서 충분히 익혔을 것이다. 본격적으로 클래스를 학습하기전에 객체지향 프로그래밍에 중요한 개념들을 알아보자.

1.클래스(Class)

클래스는 표현하려는 개체의 특징을 서술한 것이다. 표현 대상의 공통 부분을 서술한 것이고 이는 실체가 없는것이다. 객체를 생성 하기 위한 설계도 라고 생각 하면 된다. 또한 이러한 설계도를 작성하기 위해 대상의 특징을 뽑아 내는것을 추상화(Abstraction)라고 한다.

2.객체(Object)

클래스를 실체화 한것 이 object 즉 객체이다. 이는 인스턴스라고 하며 코드1의 a1이 인스턴스 이다.

3.캡슐화

위에서 코드로 알아본것 처럼 데이터와 해당 데이터를 다루는 방법을 묶는것을 캡슐화라고 한다.

캡슐화의 첫 번째 목적은 데이터와 해당 데이터를 다루는 알고리즘이 묶여있어 사용자를 편하게 하는 것이고, 두 번째 목적은 내부 구현을 감추고 외부 인터페이스를 제공하는 것으로 정보 은닉을 하는 것이다.

4.상속

이미 작성된 클래스를 활용해 새로운 클래를 만드는 것이다. 모체가 되는 클래스를 부모 클래스, 새로 생성되는 클래스를 자식 클래스라고 한다.

자동차라는 클래스가 있다고 생각해보자 여러 자동차들의 공통점이 이 클래스에 들어있다. 하지만 자동차별로 차이점이 있을 수 있다. 예를들어 트럭, 버스, 승용차는 차이점이 분명히 존재한다. 이를 위해 자동차라는 부모 클래스로 부터 자동차의 공통적인 특징은 그대로 물려 받고 각각 고유의 특징을 다시 추가하는 트럭, 버스, 승용차의 자식클래스를 만드는 것을 상속이라고 한다.

5.다형성

객체가 취하는 동작이 상황에 따라 달라지는것을 말한다.

도형이라는 하나의 클래스가있고 이 도형의 자식 클래스로 삼각형, 사각형, 원 이 있다고 생각해보자. 이 클래스들에는 모두 draw()라는 도형을 화면에 출력해주는 함수가 필요하다. 이처럼 개념은 동일하지만 실제 동작은 달라도 모두 draw라는 같은 이름으로 부여할 수 있는것을 다형성이라고 한다.

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

8.(C++) 클래스(2)_생성자,파괴자(소멸자)  (0) 2020.08.01
6.(C++) 구조체  (0) 2020.08.01
5.(C++) 함수  (0) 2020.08.01
4.(C++) 레퍼런스 (Reference)  (0) 2020.08.01
3.(C++) 제어문  (0) 2020.08.01
Comments