'2007/04'에 해당되는 글 2건

  1. 2007.04.04 Class (클래스)
  2. 2007.04.02 Object (객체)

Class (클래스)

분류없음 2007.04.04 02:03
클래스란 객체를 표현하기 위해 프로그래밍 언어가 언어적인 관점에서 지원하고 있는 객체 생성 방법이다.

일단 객체란 무엇인지 확실히 머릿속에 이해하고 있어야 한다. 객체 설명으로 바로 가기

나는 객체를 "현실 세계에 존재하는 사물을 프로그램으로 옮겨오기 위한, 특징과 행위를 가지는 하나의 단위"라고 정의했는데 이렇게 설명하면서 객체를 프로그램 언어적으로 어떻게 표현하면 좋을지에 대해서는 생각하지 말자고 했다. 클래스는 이 객체를 생성하고 사용하기 위한 프로그램 언어적인 방법이다.

위 설명에 있는대로 객체는 속성과 메소드를 가지고 있다. C에선 학생 한 명을 표현하기 위해 보통 이런 방법을 사용한다.
struct STUDENT
{
     int stu_no;          // 학번
     int grade;          // 학년
     char name[10];    // 이름
}
이건 구조체를 이용한 코드이다. 이렇게 구조체를 이용하면 하나의 이름 아래에 그 이름에 해당하는 하위 항목을 묶어놓을 수 있다. 위의 예시에서는 학생이라는 이름 아래에 학번, 이름, 학년이라는 세 가지 항목을 묶어놓았다.

그러면 이번엔 이 구조체를 사용해서 변수를 생성해 보자.
STUDENT stu[3];
stu[0].stu_no = 1;
stu[0].grade = 1;
stu[0].name[] = "홍길동";
stu[1].stu_no = 2;
stu[1].grade = 1;
stu[1].name[] = "임꺽정";
stu[2].stu_no = 3;
stu[2].grade = 1;
stu[2].name[] = "일지매";
보통 이런 식으로 사용할 것이다. 그러면 stu[0]은 학번이 1번이고 1학년인 홍길동 학생이 되고 stu[1]은 학번이 2이고 1학년인 임꺽정 학생이 된다.

여기서 내가 했던 객체의 설명을 잘 떠올려보자. 객체는 분명 "특징과 행위를 갖는 단위"라고 했다. 그 정의를 기억한 채 위의 코드를 다시 한번 살펴보자. stu[0]은 STUDENT라는 단위(타입)로 되어 있으며 그의 특징은 학번이 1번이라는 것과 1학년이라는 것, 이름이 홍길동 이라는 것이 된다. 즉, stu[0]의 특징(속성)은 학번이 1번, 학년이 1학년, 이름은 홍길동이라는 식으로 표현할 수 있는 것이다.

이제 다시 객체와 클래스의 관한 이야기로 다시 넘어가서 위의 객체의 정의 중 메소드 부분만 빼놓고 생각해 보자. 메소드를 빼고 생각한 객체의 정의는 "특징(속성)을 갖는 하나의 단위"이다. 어째 구조체와 정의가 같다고 생각되지 않는가? 이건 구조체와 클래스는 발상의 출발점이 연관이 있는 것을 묶는다는, 동일한 개념에서 출발했다는 것을 의미한다.

클래스는 이 기본적인 구조체라는 형식에 행위(메소드)라는 함수를 추가한 것에 지나지 않는다(물론 정확히는 그 내부적으로 캡슐화 등등의 특징이 있겠지만, 기본적인 것은 구조체와 거의 같다). 예를 들어 위의 구조체(클래스)엔 학번, 학년, 이름의 속성이 있는데 여기에 발표시킨다, 심부름시킨다, 벌준다 등등의 행위(함수)를 추가한 것이 학생 클래스가 된다(여기서 행위를 추가하기 위해선 어떻게 하느냐는 의문이 생길수도 있지만 그것은 클래스에 대한 설명이라기보다는 프로그래밍 언어에 대한 설명이 되므로 생략한다).

우리는 구조체를 선언하여 그 구조는 신경쓰지 않은 채 마치 새로운 데이터 타입인 양 사용한다. 마찬가지로 클래스는 객체를 표현할 수 있도록 (마치 구조체처럼) 속성(멤버변수)과 메소드(멤버함수)를 묶어놓고 이름을 붙여 그것의 복사본을 언제든지 생성할 수 있는 하나의 새로운 데이터 타입인 양 사용하게 해 준다.

여담으로 클래스와 객체의 관계를 설명할 때 가장 많이 사용하는 예제가 붕어빵 틀(클래스)와 붕어빵(객체)이다. 붕어빵 틀(클래스)을 이용하여 붕어빵(객체)을 만들기 때문이다.

ps. C 문법을 쓰다 보니 Code Highlight 플러그인이 심하게 그리워지는군요. 쓸만한 Code Highlight 플러그인 있나요?
Posted by マサキ君

Object (객체)

분류없음 2007.04.02 09:31
객체란 이 세상 속의 여러가지 눈에 보이는 모든 것을 프로그래밍 언어로 옮겨오기 위한 기법이다.

이 세상 속에 존재하는 모든 것들은 각각 그것들의 특징과 행동을 갖고 있다. 흔한 예제는 자동차이지만 자동차는 잘 모르므로-_- 자전거를 예로 들면 자전거는 이런 특징(properties)을 가지고 있다.
  • 자전거의 종류(산악용, 경주용 등)
  • 경적의 유무
  • 라이트 플래시의 유무
  • 바퀴의 직경
  • 기어의 변속비
  • 짐칸의 여부
  • 기타 등등
그리고 자전거가 행할 수 있는 행동(method)에는 이런 것들이 있다.
  • 페달 밟기 (달리기)
  • 브레이크 (멈추기)
  • 기어 변속
  • 라이트 플래시 켜기
  • 라이트 플래시 끄기
  • 경적 울리기
자연계의 모든 존재들은 이러한 속성(properties- C++에서는 멤버 변수라 칭한다)과 메소드(method- C++에서는 멤버 함수라 칭한다)를 갖고 있다는 기본 발상 하에 프로그래머가 표현하려는 존재(이하 존재)를 구조체와 같이 여러가지 특징을 담을 수 있는 그릇을 생성한 후 그 존재의 속성과 메소드를 하나의 그릇 안에 담아서 생성해 낸 것을 객체라고 한다. 이 객체는 자연상의 존재를 표현할 수도 있지만 컴퓨터에서 사용하는 각종 UI용 컨트롤(버튼, 입력창 등)도 객체로 표현할 수 있다.

물론 이것은 어디까지나 개념적인 이야기이고 머릿속에 객체를 프로그램적으로 어떻게 표현할 것인가 하는 내용은 굳이 생각하지 않아도 된다. 그것은 클래스를 이해한 뒤 직접 클래스를 만들고 객체를 생성해 보면서 이해할 수 있기 때문이다. 객체를 어떻게 프로그램적으로 표현하는가 하면 클래스의 도움을 받아 객체를 표현하기 때문에 객체란 "현실 세계에 존재하는 사물을 프로그램으로 옮겨오기 위한, 특징과 행위를 가지는 하나의 단위"라고만 생각해 두는 것이 좋을 것 같다.

객체는 객체 지향 프로그래밍(OOP - Object-Oriented Programming)의 가장 핵심이 되는 기본적인 개념이다. 절차적 프로그래밍(Procedural Programming)과 구조적 프로그래밍(Structured Programming)을 사용할 때 함수의 개념이 없이는 아무것도 할 수 없듯이 객체 지향 프로그래밍시에는 객체에 대한 개념 없이는 객체 지향 프로그래밍의 특징을 이해할 수 없기 때문에 객체에 대한 정확한 이해는 필수적이다.
Posted by マサキ君