참고자료

아두이노, 오렌지보드 등의 오픈소스하드웨어를 사용하는데 필요한 것들을 알아봅니다.

클래스 (Class)

2014-08-12 09:06:32

클래스 (Class)

클래스를 설명하자면 클래스란 프로그램내에서 객체를 나타내기 위해 객체의 변수와 속성 특징등을 함수로 나타내서 묶어놓은 하나의 설계도나 틀이라고 생각하면 편하다.
예를 들자면 하나의 자동차를 뽑기위해서는 바퀴가 프레임이 필요하고 바퀴도 필요하고 엔진도 필요하고 여러 가지 기계장치들이 필요하다. 또한 모든 자동차들은 모양이 천편일률적이지 않다.
어떤 자동차는 자체의 색깔이 검정색일수도 있고 어떤 자동차는 흰색, 어떤 자동차는 빨강색일 수도 있다. 현실적이지 않을수도 있지만 어떤 자동차는 바퀴가 동그라미가 아니고 세모일수도 있고
또 어떤 자동차는 바퀴가 네모일 수도 있다. 이처럼 자동차를 뽑아내기 위해 그 자동차의 여러가지 속성들을 함수로 정의해놓은 것이 바로 클래스라고 생각하면 편하다.

항상 클래스를 언급하면 같이 붙어다니는 용어가 객체(Object)인데 이때 객체는 자동차이다. 클래스는 추상적인 틀이지만 객체는 구체적이다.


클래스는 붕어빵을 찍어내는 틀이라고 생각하면 된다. 이때 붕어빵은 클래스를 통해 생성된 객체이다. 

예를 들어 하나의 클래스를 생성해 보자
 

class student {
private:
   char * name;
   int age;
public:
   void info(); //student의 정보 출력
   void setInfo(char * stu_Name, int stu_Age); //stedunt정보 setting
   void grow(); //student성장
};

void student::info() {
   cout << "이름 : " << name << "나이 : " << age << endl;
}

void student::setInfo(char * stu_Name, int stu_Age) {
   name = stu_name;
   age = stu_Age;
}

void student::grow() {
   age = age + 1;
}   


위 소스는 Student를 찍어낼 수 있는 클래스이다. 이름과 나이를 어떻게 주느냐에 따라 여러가지의 student 객체를 생성할 수 있다.
student클래스를 생성하면 이 student 클래스에는 이름과 나이라는 변수가 포함되어 있고 정보를 나타내고
학생의 정보를 set하는 함수, 학생의 나이를 +1하는 grow함수가 포함되어 있다. 

이때 객체 내의 변수는 Private영역에 선언하고 멤버함수는 Public영역에 선언한다. 밑에 잠깐 얘기하겠지만 이러한 영역은 정보 접근권한에 따라 접근이 가능하고 불가능하게 한다. 
Private내의 변수들은 직접적인 접근이 불가능하여 함부로 값을 바꿀 수가 없다. 객체 지향 프로그래밍의 특징 중 하나이다.

이 클래스 생성을 통해 우리는 student속성의 객체를 계속적으로 찍어낼 수 있는것이다.

 

int main() {
   student stu1;

   stu.setInfo("홍길동", 18);
   stu.info();

   for(int a = 1; a <= 12; a++) {
      cout << a <<"월이 지났습니다."<   }
   stu.grow();
   stu.info();

   return 0;
}


위와 같은 main함수를 통해 만든 student클래스를 돌려본다면 12월까지 지난다음 홍길동은 19살이 되어있을것이다.
클래스를 통해 main함수에서 student라는 객체를 생성할 수 있고 이 생성된 객체를 클래스의 멤버함수를 통해 이리저리 다룰 수 있는 것
이것이 클래스의 목적이라고 보면 된다.

멤버함수란 클래스내에서 정의되는 함수로 객체가 쓰는 함수이다. 객체없이는 호출이 불가능한 함수라고 보면 된다.


클래스로 사람을 정의할 경우 다음과 같은 변수들과 함수들이 들어갈 수 있다.
이런 클래스를 통해 프로그램에서는 사람 객체를 여러개 뽑아내는것이 가능하다.

클래스를 한번 정의해 놓으면 똑같은 객체를 생성할때 번거롭게 다시 함수생성하고 변수 정의하고 이럴 필요가 없기때문에 소스가 상당히 간단해진다. 
현재 대부분의 프로그래밍 언어는 객체 지향 언어(Object-Oriented Programming)를 추구하고 있고 대표적인 것들이 CJava, Object Pascal같은 언어이다.
객체 지향 언어의 특징은 데이터가 중심이 아닌 객체가 중심으로 현실세계의 "사물"의 속성을 그대로 표현하려고 하는것이 특징이다.

객체 지향 언어
1. Private와 Public같은 공개영역 설정을 통해 데이터를 은닉하거나 캡슐화 할 수 있고

2. 만든 클래스에서 동일한 부분이 있다면 이 부분을 또 만들지 않고 물려받아서 새로운 클래스를 생성하는 상속이라는 개념도 있다. 상속이라는 개념을 잘 쓰기 위해서는 공통적인 메소드(함수)들을 기본 클래스에서 정의해 놓고 이 부분이 필요할때마다 상속해서 받아쓰는 개념으로 쓰면 편하다. 상속을 할 경우 중복된 개념을 또 다시 코딩할 필요없이 재사용할 수 있기 때문에 잘 사용할 경우에는 프로그램의 개발시간이 확 줄어들게 된다.

3. 다형성의 특징이 있다.(연산자나 함수의 오버로딩이 가능) 함수이름은 동일하지만 함수에서 받는 매개변수를 다르게 해서 동일한 이름의 함수를 여러번 정의가 가능하고, 사용중인 연산자를 다른용도로 사용하고 싶을때 원하는 용도로 재정의해서 사용할 수 있는데 이를 오버로딩이라고 한다. 객체 지향 언어에서는 이런 오버로딩이 가능하다.

아두이노에서는 자체에서 직접 클래스를 작성하거나 멤버함수를 정의하는 일은 아마도 없을 것이기 때문에 깊게 이해할 필요는 없다. 하지만 라이브러리를 불러와서 쓸때 객체를 정의해서 쓰거나 하나의 객체만을 사용하는 경우가 있다. Servo모터를 사용할때는 객체를 직접 정의해서 모터를 작동시키며 시리얼 통신을 할때에는 Serial통신을 할때에는 사실상 하나의 객체만 사용하기 때문에 클래스를 불러와서 쓰는 것이라고 생각하는 것이 사실 객체를 불러와서 쓰는것이다. 

클래스의 정의를 잡고 객체가 무엇인지 이해한다면 소스를 이해하고 작성하는데 도움이 될 것이다.

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

클래스, Class, 기타