코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP What is OOP

PHP 객체 지향 프로그래밍(OOP): 개념과 원리


  • *객체 지향 프로그래밍(Object-Oriented Programming, OOP)**는 프로그램을 객체라는 기본 단위로 구성하는 프로그래밍 패러다임입니다. PHP절차적 프로그래밍뿐만 아니라 **객체 지향 프로그래밍(OOP)**도 지원하는 강력한 기능을 제공합니다. 객체 지향 프로그래밍은 코드를 재사용하고, 유지보수를 용이하게 하며, 대규모 애플리케이션을 체계적으로 개발하는 데 유리합니다.

이 가이드에서는 OOP의 기본 개념, PHP에서의 OOP 원칙실용적인 예제를 통해 PHP에서 객체 지향 프로그래밍을 구현하는 방법을 살펴봅니다.


1. 객체 지향 프로그래밍(OOP)의 기본 개념

OOP는 코드의 재사용성을 높이고 프로그램을 모듈화하여 관리하기 쉬운 구조로 만드는 것이 목적입니다. OOP에서 프로그램의 주요 구성 요소는 **객체(Object)**이며, **클래스(Class)**는 이러한 객체의 청사진(설계도)입니다.

1.1 주요 OOP 개념

  • 클래스(Class): 객체를 생성하기 위한 설계도입니다. 클래스는 속성(데이터)과 메서드(기능)를 정의합니다.
  • 객체(Object): 클래스를 기반으로 생성된 실제 데이터입니다. 객체는 클래스의 인스턴스입니다.
  • 속성(Property): 객체가 가지는 데이터를 의미하며, 클래스 내에서 정의됩니다.
  • 메서드(Method): 객체가 수행할 수 있는 **기능(함수)**입니다.
  • 상속(Inheritance): 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 사용하는 기능입니다.
  • 캡슐화(Encapsulation): 객체의 데이터를 외부에서 직접 접근하지 못하게 하고, 데이터에 접근하는 방식을 제한하는 원리입니다.
  • 다형성(Polymorphism): 같은 이름의 메서드가 여러 클래스에서 다른 방식으로 동작할 수 있게 하는 기능입니다.

2. PHP에서 클래스와 객체

PHP에서 클래스를 정의하고 객체를 생성할 수 있습니다. class 키워드를 사용해 클래스를 정의하고, new 키워드로 객체를 생성합니다.

2.1 클래스 정의와 객체 생성

<?php
class Car {
    // 속성
    public $color;
    public $model;

    // 생성자 메서드
    public function __construct($color, $model) {
        $this->color = $color;
        $this->model = $model;
    }

    // 메서드
    public function drive() {
        return "Driving a $this->color $this->model";
    }
}

// 객체 생성
$myCar = new Car("red", "Toyota");
echo $myCar->drive();  // 결과: Driving a red Toyota
?>

설명:

  • 클래스(Class): Car 클래스는 색상(color)과 모델(model) 속성을 가지고 있습니다.
  • 객체(Object): new Car("red", "Toyota")Car 클래스의 객체를 생성합니다.
  • $this: 객체의 속성이나 메서드를 참조할 때 사용합니다. $this->color는 객체의 color 속성을 의미합니다.

2.2 생성자(Constructor) 메서드

생성자 메서드는 객체가 생성될 때 자동으로 호출되는 특별한 메서드로, 객체의 초기 상태를 설정하는 데 사용됩니다. PHP에서 생성자는 **__construct()**라는 이름을 가집니다.

<?php
class Animal {
    public $name;

    // 생성자
    public function __construct($name) {
        $this->name = $name;
    }

    public function speak() {
        return "$this->name is making a noise!";
    }
}

$dog = new Animal("Dog");
echo $dog->speak();  // 결과: Dog is making a noise!
?>

설명:

  • __construct(): 객체 생성 시 자동으로 호출되며, 객체의 초기 값을 설정합니다.

3. 속성과 메서드의 가시성

객체의 속성메서드는 **가시성(visibility)**에 따라 외부에서 접근할 수 있는지 결정됩니다. 가시성은 public, private, **protected**로 정의됩니다.

3.1 가시성 종류

  • public: 외부에서 자유롭게 접근할 수 있습니다.
  • private: 클래스 내부에서만 접근할 수 있습니다.
  • protected: 클래스와 그 자식 클래스 내부에서만 접근할 수 있습니다.
<?php
class Person {
    public $name;  // 외부에서 접근 가능
    private $age;  // 외부에서 접근 불가

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

    // private 속성에 접근하는 public 메서드
    public function getAge() {
        return $this->age;
    }
}

$person = new Person("Alice", 25);
echo $person->name;  // 결과: Alice
// echo $person->age;  // 오류 발생 (private 속성에 직접 접근 불가)
echo $person->getAge();  // 결과: 25
?>

설명:

  • public 속성은 클래스 외부에서 접근할 수 있지만, private 속성은 직접 접근할 수 없으며, 이를 위해 메서드를 통해 접근해야 합니다.

4. 상속(Inheritance)

상속은 자식 클래스가 부모 클래스의 속성과 메서드를 물려받아 사용할 수 있게 하는 기능입니다. 이를 통해 코드의 재사용성을 높일 수 있습니다.

4.1 상속의 기본 사용법

<?php
class Animal {
    public $name;

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

    public function speak() {
        return "$this->name makes a sound";
    }
}

// Dog 클래스는 Animal 클래스를 상속받음
class Dog extends Animal {
    public function speak() {
        return "$this->name barks";
    }
}

$dog = new Dog("Rex");
echo $dog->speak();  // 결과: Rex barks
?>

설명:

  • 상속(Inheritance): Dog 클래스는 Animal 클래스를 상속받아, Animal의 속성과 메서드를 사용할 수 있습니다.
  • 메서드 오버라이딩(Method Overriding): 자식 클래스에서 부모 클래스의 speak() 메서드를 재정의할 수 있습니다.

5. 다형성(Polymorphism)

  • *다형성(Polymorphism)**은 동일한 메서드나 속성이 여러 클래스에서 다른 방식으로 동작하는 것을 의미합니다. 이는 메서드 오버라이딩을 통해 구현됩니다.
<?php
class Shape {
    public function area() {
        return 0;
    }
}

class Circle extends Shape {
    private $radius;

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

    public function area() {
        return pi() * $this->radius * $this->radius;
    }
}

class Square extends Shape {
    private $side;

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

    public function area() {
        return $this->side * $this->side;
    }
}

$circle = new Circle(5);
$square = new Square(4);

echo "Circle area: " . $circle->area() . "<br>";  // 결과: Circle area: 78.539816339745
echo "Square area: " . $square->area();  // 결과: Square area: 16
?>

설명:

  • 다형성은 부모 클래스에서 정의된 메서드를 자식 클래스에서 각각 다르게 구현하여, 동일한 메서드 이름으로 다양한 동작을 수행할 수 있게 합니다.

6. 캡슐화(Encapsulation)

  • *캡슐화(Encapsulation)**는 객체의 속성이나 메서드를 외부에서 직접 접근하지 못하게 하고, 필요한 경우에만 접근할 수 있게 제어하는 방식입니다. 이를 통해 데이터 보호일관성 유지를 할 수 있습니다.
<?php
class BankAccount {
    private $balance = 0;

    public function deposit($amount) {
        if ($amount > 0) {
            $this->balance += $amount;
        }
    }

    public function withdraw($amount) {
        if ($amount > 0 && $this->balance >= $amount) {
            $this->balance -= $amount;
        }
    }

    public function getBalance() {
        return $this->

balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
$account->withdraw(30);
echo "현재 잔액: " . $account->getBalance();  // 결과: 현재 잔액: 70
?>

설명:

  • 캡슐화private 속성을 사용하여 외부에서 직접 수정할 수 없게 하고, 이를 제어하는 메서드를 통해 데이터를 보호합니다.

7. PHP에서 인터페이스와 추상 클래스

PHP는 **인터페이스(Interface)**와 **추상 클래스(Abstract Class)**를 통해 더욱 유연하고 일관성 있는 객체 지향 설계를 할 수 있습니다.

  • 인터페이스(Interface): 클래스가 반드시 구현해야 하는 메서드 목록을 정의합니다.
  • 추상 클래스(Abstract Class): 상속을 통해 자식 클래스에서 구체화해야 할 메서드를 정의할 수 있습니다.

7.1 인터페이스 사용

<?php
interface AnimalInterface {
    public function makeSound();
}

class Dog implements AnimalInterface {
    public function makeSound() {
        return "Bark";
    }
}

class Cat implements AnimalInterface {
    public function makeSound() {
        return "Meow";
    }
}

$dog = new Dog();
$cat = new Cat();
echo $dog->makeSound();  // 결과: Bark
echo $cat->makeSound();  // 결과: Meow
?>

설명:

  • 인터페이스는 클래스에서 반드시 구현해야 하는 메서드를 정의하며, 각 클래스는 이를 구현하여 동작을 정의합니다.

7.2 추상 클래스 사용

<?php
abstract class Animal {
    abstract public function makeSound();

    public function sleep() {
        return "Sleeping";
    }
}

class Dog extends Animal {
    public function makeSound() {
        return "Bark";
    }
}

$dog = new Dog();
echo $dog->makeSound();  // 결과: Bark
echo $dog->sleep();  // 결과: Sleeping
?>

설명:

  • 추상 클래스는 하나 이상의 추상 메서드를 포함하며, 자식 클래스는 이를 구체적으로 구현해야 합니다.
  • 추상 클래스는 일반 메서드도 가질 수 있습니다.

요약

PHP의 객체 지향 프로그래밍(OOP)은 프로그램을 클래스와 객체로 구성하여 코드의 재사용성유지보수성을 높이는 강력한 패러다임입니다. OOP의 주요 개념인 상속, 다형성, 캡슐화, 인터페이스, 추상 클래스 등을 통해 보다 체계적이고 유연한 코드를 작성할 수 있습니다. OOP를 사용하면 대규모 애플리케이션을 효율적으로 설계하고 관리할 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com