[Chapter7] 객체지향 프로그래밍

Minseok Jo·2023년 4월 17일
0

1. 클래스와 객체

객체지향 프로그래밍(Object-oriendted Programming)은 객체(Object)를 중심으로 프로그래밍이 진행된다.

객체의 내부에서 사용되는 속성은 일종의 변수로서 멤버 변수(Member Variable)라고도 불린다. 메소드는 일종의 함수이며 멤버 함수(Member Function)라고도 한다.
클래스는 객체를 만들기 위한 틀로서, 객체를 만들기 위해서는 클래스(Class)를 먼저 정의하여야 한다.

<?php
    class Person {					// Person 클래스를 정의
        public $name;	
        public $age;				// $name과 $age 속성을 포함
        public function intro() {	// intro() 메소드를 포함
            printf("이름: %s, 나이: %d", $this->name, $this->age);
        }
    }

    $low = new Person();		// Person 클래스로부터 $low 객체 생성
    
    $low->name = "LowAngle";	// $low 객체의 $name 속성에 'LowAngle' 저장
    $low->age = 20;				// $low 객체의 $age 속성에 20을 저장

    $low->intro();
?>

⏬실행 결과


2. 속성과 메소드

객체지향 프로그래밍에서는 제일 먼저 클래스의 속성과 메소드를 정의하여야 한다.

객체지향 방식으로 사각형의 넓이를 구하는 예

<?php
    class Rect{
        public $width;
        public $height;

        public function getArea() {
            return ($this->width*$this->height);
        }
    }

    $rect1 = new Rect();

    $rect1->width = 20;
    $rect1->height = 10;

    printf("사각형의 넓이: %d", $rect1->getArea());
?>

⏬실행 결과


3. 생성자와 소멸자

생성자(Constructor): 객체를 생성할 때 자동으로 실행되는 메소드
소멸자(Destructor):   객체가 소멸될 때 자동으로 실행되는 메소드

1) 생성자
이전까지는 객체를 생성하고 나서 속성에 값을 저장하였으나,
생성자는 객체를 생성하는 동시에 속성에 값을 설정할 수 있도록 해준다.

<?php
    class Triangle {
        public $width;
        public $height;

        public function __construct($width, $height) {
            $this->width = $width;
            $this->height = $height;
        }

        public function getArea() {
            return (($this->width*$this->height)/2);
        }
    }

    $tri1 = new Triangle(10, 5);
    printf("넓이: %d", $tri1->getArea());
?>

클래스로부터 객체 생성 시, Triangle(10, 5)와 같이 클래스에 인수가 존재하면 생성자 함수 (__construct)가 실행되며 따라서 객체 생성과 동시에 속성에 값이 각각 10, 5로 설정된다.

⏬실행 결과

2) 소멸자
소멸자는 객체가 소멸될 때 실행된다.

<?php
    class Person {
        public $name;

        public function __construct($name) {
            $this->name = $name;
        }

        public function __destruct() {
            printf("name: %s", $this->name);
        }
    }

    $person = new Person("LowAngle");
?>

소멸자 함수 __destruct()는 생성된 객체가 소멸, 즉 프로그램이 종료될 때 실행되게 된다

⏬실행 결과


4. 클래스의 상속

클래스는 extends 키워드를 이용하여 다른 클래스로부터 속성과 메소드를 상속받을 수 있다.

<?php
    class Rect {
        public $width;
        public $height;

        public function __construct($width, $height) {
            $this->width = $width;
            $this->height = $height;
        }

        public function getArea() {
            return ($this->width * $this->height);
        }
    }

    class Square extends Rect {
        public function isSquare() {
            return ($this->width == $this->height);
        }
    }

    $rect = new Square(10, 10);

    if ($rect->isSquare())
        printf("정사각형 넓이: ");
    else
        printf("직사각형 넓이: ");

    printf("%d", $rect->getArea());
?>

Square 클래스는 Rect 클래스의 모든 자산, 즉 속성, 생성자, 메소드를 상속받게 된다

⏬실행 결과


5. 접근 제어자

클래스를 정의하다 보면 속성과 메소드의 접근을 제한할 필요가 있다.

public: 속성과 메소드가 어느 곳에서든 다 접근 가능
protected: 속성과 메소드가 해당 클래스와 그 클래스를 상속받은 클래스 네에서만 접근 가능
private: 속성과 메소드가 해당 클래스 내에서만 접근 가능

1) public 접근 제어자

<?php
    class Member {
        public $name;

        public function getName() {
            return $this->name;
        }
    }

    $mem = new Member();

    $mem->name = "LowAngle";	// 외부에서도 접근가능
    printf("name: %s", $mem->name);
?>

⏬실행 결과

2) private 접근 제어자

<?php
    class Member {
        private $name;

        public function getName() {
            return $this->name;
        }
    }

    $mem = new Member();

    $mem->name = "LowAngle";    // 접근 오류 발생
    printf("name: %s", $mem->name);
?>

private 접근 제어자로 선언된 속성과 메소드는 클래스 내부에서만 사용가능하고 외부에서 접근할 수 없다.

⏬실행 결과

3) Setter & Getter
private 접근 제어자로 선언된 속성에 값을 저장하기 위해서는 Setter(세터)를 사용하여야 한다.
Setter는 객체의 메소드에서 속성 값을 저장하는데 사용되며, 반대로 값을 가져오는데 사용되는 메소드를 Getter(게터)라고 한다.

<?php
    class Member {
        private $name;

        public function setName($name) {
            $this->name = $name;
        }

        public function getName() {
            return $this->name;
        }
    }

    $mem = new Member();

    $mem->setName("LowAngle");
    printf("name: %s", $mem->getName());
?>

⏬실행 결과


0개의 댓글