클래스의 정의 Class

XE는 객체 지향 웹프로그램

XE코어는 클래스(Class)로 정의된 메서드(Method)에 의해 객체(Object)를 생성하는 객체 지향 웹프로그램이다.

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임의 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.

기본 구성 요소

  • 클래스(Class) - 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형(user define data type)이라고 할 수 있다. 클래스는 프로그래머가 아니지만 해결해야 할 문제가 속하는 영역에 종사하는 사람이라면 사용할 수 있고, 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다.
  • 객체(Object) - 클래스의 인스턴스(실제로 메모리상에 할당된 것)이다. 객체는 자신 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다. 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.
  • 메서드(Method), 메시지(Message) - 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라 할 수 있다. 메서드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다. 또 객체 간의 통신은 메시지를 통해 이루어진다.

※ 위키사전 인용글

클래스(Class)의 정의

XE코어는 각 모듈(독립된 단위 프로그램) 별로 속성(Property)과 메서드(Method)를 묶어 클래스(Class)로 정의하였다.(PHP로 작성한다.)
클래스의 정의 방법을 알아본다. 각각의 프로그램 언어는 이해를 돕기 위해 예제와 함께 내 나름대로 의미를 살려 작성하였다.

<?php

class assemblePC {

}

?>

클래스(집합)는 같은 일을 하는 함수(function)들을 한 곳에 모아두는 역할로 속성(재료)과 메서드(해야 할 일)를 미리 정의(준비된 약속) 해 둔다.
클래스를 정의할 때는 class 클래스이름 { ... } 으로 작성한다. "조립컴퓨터"라는 클래스를 만들기 위해 클래스의 이름을 assemblePC로 하였다.
"조립컴퓨터"를 클래스로 정의하는 가장 큰 목적은 컴퓨터의 구매자가 한 사람이 아닌 여러 사람일 경우 각각의 요구하는 부품과 추가 부품의 견적을 미리 정의한 클래스에 의해서 얼마든지 재활용(상속) 할 수 있기때문이다.

<?php

class assemblePC {
   var $cpu, $board, $vga;

}

?>

속성(Property)에 대한 정의를 한다. 속성은 재료와 같은 의미이다. 컴퓨터를 조립하기 위해서는 반드시 필요한 기본 재료들이 있고 이것을 미리 준비하는 것이다. 속성의 정의는 필요한 만큼 사전에 정의할 수도 있고 메서드(해야 할 일)에서도 얼마든지 추가 할 수 있다.
클래스의 속성을 정의할 때는 예약어 var 과 함께

var $cpu;
var $board;
var $vga;


처럼 세로 방향으로 작성할 수도 있다. 우선 간단히 3개의 속성만 정의하였다.

<?php

class assemblePC {
   var $cpu, $board, $vga;

   function assemblePC($c, $b, $v) {
      $this->cpu = $c;
      $this->board = $b;
      $this->vga = $v;
   }

}

?>
  • function은 함수라고도 말하는데 이것을 Class의 메서드(Method) 즉, 해야 할 일(방법)의 구체적인 내용을 말한다. 그런데 Class가 정의되었다고 해서 객체(여기서는 컴퓨터)가 생성되지 않는다. 해야 할 일(function)을 작성한 메서드(Method) 중에서 클래스(Class) 이름과 같은 이름을 가진 메서드가 있어야 비로서 무엇(객체)인가를 만들 수 있다.

    예를 들어서 컴퓨터를 구매하고자 하는 손님은 "조립컴퓨터를 만들어 주세요! = new assemblePC()" 라고 말하지 "조립컴퓨터 만드는 방법! = class assemblePC{}" 이라고 말하지는 않는다. 이렇게 클래스 이름과 같은 이름을 가진 메서드(function)는 부르는 것만으로도 클래스(Class) 전체를 자동으로 실행시키기 때문에 이것을 생성자(constructor)라고 부른다. 생성자라는 이름에서 알 수 있듯이 Class로 정의된 내용과 방법에 따라 무엇(객체)인가는 반드시 만들어 내놓기 때문에 특별히 객체생성을 위한 생성자라는 별명이 붙게 된다.
  • 생성자 안에 받아온 변수 ($c, $b, $v)는 객체생성에 필요한 재료(속성)의 이름(구체적인 내용)을 임시로 받아오는 매개변수이다. 객체생성을 요구한 변수(컴퓨터를 만들어 달라고 요구한 변수)는 조립에 사용될 부품을 순서대로 알려줄 뿐 클래스(Class)에서 정의된 속성의 변수이름을 모른다. 따라서 생성자는 객체생성에 필요한 재료의 이름값을 간단히 받아온 후 객체생성을 위해 각각의 속성값으로 나누어 준다. 매개변수는 $vga라고 자세히 작성해도 상관없고 1개일 경우 $value로 작성하기도 한다. 매개변수가 갖는 의미를 이해하기 쉽게 설명하면, 객체생성을 요구한 손님이 컴퓨터의 CPU와 마더보드, 그래픽카드의 정확한 속성을 모른다고 가정할 때 막연히 "인텔CPU, 아수스 보드, 지포스가 좋을까요?"라고 말하면 생성자는 이것을 각각 매개변수로 받아 와서 클래스에서 정의한 속성에 차례대로 대체하여 나누어 담는다는 것을 의미한다.
  • 생성자가 매개변수로 받아온 내용을 속성에 할당하는 $this는 객체변수이다. 객체변수란 객체생성을 요구한 변수를 암시적으로 가리킨다.

    객체생성을 요구한 변수가 클래스(Class)에서 정의한 속성을 모르는 것처럼 클래스 역시 객체생성을 요구한 변수의 이름을 모른다. 아니 알 필요가 없다. 클래스는 단순히 "손님이 원하는 CPU, 손님이 원하는 마더보드, 손님이 원하는 VGA"라고만 정의하면 된다. 따라서 클래스는 $this->cpu, $this->board, $this->vga 라고 작성한 것이다. -> 는 객체변수의 속성 하나하나를 가리키는 지정연산자이다. 결과적으로 객체생성을 요구한 변수가 $woojinhome 이라고 할때 $woojinhome = new assemblePC('인텔','아수스','지포스'); 라고 객체생성을 요구할 것이고 이때 $this는 객체변수 $woojinhome 을 가리킨다. 따라서 $woojinhome->cpu = '인텔'; $woojinhome->board = '아수스'; $woojinhome->vga = '지포스'; 가 된다.

    만약 새로운 변수 $XE가 $XE = new assemblePC('AMD','GIGABYTE','라데온'); 라고 객체생성을 재차 요구하면 클래스는 "손님이 원하는 CPU"로 $this->cpu 가 되고 이때 객체변수 $this는 $XE를 가리킨다. 따라서 $XE->cpu = 'AMD'; 이다.
<?php

class assemblePC {
   var $cpu, $board, $vga;

   function assemblePC($c, $b, $v) {
      $this->cpu = $c;
      $this->board = $b;
      $this->vga = $v;
   }

   function ram($ram) {
      $this->ram = $ram;
   }

}

?>

메모리에 대한 속성을 추가로 정의하기 위해서 생성자 아래에 메서드(해야 할 일)를 하나 추가하였다. 만약 객체생성을 요구할 때 메모리에 대한 추가를 별도로 요구할 수 있다. 생성자와는 별도로 작성되었기 때문에 객체생성을 요구할 때는 $woojinhome->ram('4기가'); 와 같이 추가로 요청해야 한다. 이것은 "제가 원하는 메모리는 4기가입니다." 와 같고 클래스는 메서드 ram()에서 정의한대로 "손님이 원하는 메모리는 4기가" 라는 뜻으로 $this->ram = '4기가'; 로 속성을 추가하고 할당한다.

<?php

class assemblePC {
   var $cpu, $board, $vga;

   function assemblePC($c, $b, $v) {
      $this->cpu = $c;
      $this->board = $b;
      $this->vga = $v;
   }

   function ram($ram) {
      $this->ram = $ram;
   }

   function make_info() {
      echo '*CPU : '.$this->cpu.'<br />';
      echo '*BOARD : '.$this->board.'<br />';
      echo '*VGA : '.$this->vga.'<br />';
      echo '*RAM : '.$this->ram;
   }

}

?>

make_info() 는 매개변수 없이 호출한 클래스 assemblePC의 객체변수($this)가 가진 모든 속성값들을 하나씩 출력한다.