Skip to content

PHP

encapsulation

Author
siwon
Date
2023-08-16 16:12
Views
919

캡슐화(Encapsulation)는 객체지향 프로그래밍(OOP)에서 중요한 개념 중 하나로, 데이터와 해당 데이터를 다루는 동작(메서드)을 하나로 묶는 것을 의미합니다. 이를 통해 데이터와 동작이 서로 관련된 부분만을 내부에 묶어 숨기고, 외부에서는 해당 내부 구조에 직접 접근할 수 없도록 보호하는 프로그래밍 기법을 말합니다.


캡슐화의 주요 목표는 다음과 같습니다:


1. **정보 은닉:** 클래스의 내부 구현 세부사항을 외부에 숨겨, 외부에서 직접적으로 접근하거나 조작하지 못하도록 합니다. 이를 통해 코드의 유지 보수성과 신뢰성을 향상시킬 수 있습니다.


2. **보안 강화:** 중요한 데이터나 동작을 외부로부터 보호하고, 허가되지 않은 접근으로부터 방지하여 보안을 강화합니다.


3. **코드 유연성:** 내부 구현이 외부로 노출되지 않으므로 내부 구현 변경에 따른 외부 코드 변경이 최소화됩니다. 이로써 코드 유지 및 개선 작업이 용이해집니다.


4. **추상화:** 외부에는 필요한 동작만을 노출하고, 내부에서는 복잡한 로직이나 처리를 감추어 간단한 인터페이스를 제공합니다.


캡슐화는 클래스 내부의 데이터를 private 또는 protected 접근 제한자로 선언하여 외부에서 직접 접근하지 못하게 만드는 것이 일반적입니다. 이때, 메서드를 통해서만 데이터에 접근하고 조작할 수 있도록 설계합니다.


예를 들어, 다음은 PHP로 캡슐화를 구현한 간단한 예제입니다:


```php

class BankAccount {

    private $balance;


    public function __construct($initialBalance) {

        $this->balance = $initialBalance;

    }


    public function deposit($amount) {

        if ($amount > 0) {

            $this->balance += $amount;

        }

    }


    public function withdraw($amount) {

        if ($amount > 0 && $amount <= $this->balance) {

            $this->balance -= $amount;

        }

    }


    public function getBalance() {

        return $this->balance;

    }

}


$account = new BankAccount(1000);

$account->deposit(500);

$account->withdraw(200);


echo $account->getBalance(); // 출력: 1300

```


이 예제에서 `BankAccount` 클래스는 `balance` 속성을 private로 선언하여 외부에서 직접 접근할 수 없도록 합니다. 대신 `deposit`, `withdraw`, 그리고 `getBalance` 메서드를 통해 데이터에 접근하고 조작할 수 있습니다. 이렇게 함으로써 캡슐화가 실현됩니다.




`private`와 `protected`는 객체지향 프로그래밍에서 캡슐화를 구현하는 접근 제한자(access modifier)로 사용되는 키워드입니다. 이 두 가지 접근 제한자는 클래스 내부의 데이터와 메서드에 대한 접근 권한을 제어하며, 캡슐화를 강화하여 코드의 안정성과 유지 보수성을 높일 수 있습니다.


1. **private 접근 제한자:**

   - `private`은 가장 엄격한 접근 제한자로, 해당 속성이나 메서드는 외부에서 직접 접근이 불가능합니다.

   - 오직 동일한 클래스 내에서만 해당 멤버에 접근할 수 있습니다.

   - 주로 내부 데이터나 내부에서만 사용되는 동작을 보호하고 외부로부터 감추기 위해 사용됩니다.

   

2. **protected 접근 제한자:**

   - `protected`는 `private`보다 더 유연한 접근 제한자입니다.

   - 해당 멤버는 동일한 클래스 내에서만 직접 접근할 수 있으며, 그리고 해당 클래스를 상속한 하위 클래스에서도 접근할 수 있습니다.

   - 주로 상속 관계에서 부모 클래스의 속성이나 메서드를 하위 클래스에서 사용하거나 확장할 때 사용됩니다.


아래는 `private`와 `protected` 접근 제한자를 갖는 간단한 예제입니다:


```php

class ParentClass {

    private $privateProperty = "Private Property";

    protected $protectedProperty = "Protected Property";


    private function privateMethod() {

        return "Private Method";

    }


    protected function protectedMethod() {

        return "Protected Method";

    }


    public function accessPrivate() {

        return $this->privateProperty;

    }


    public function accessProtected() {

        return $this->protectedProperty;

    }

}


class ChildClass extends ParentClass {

    public function accessParentProtected() {

        return $this->protectedProperty;

    }


    public function accessParentProtectedMethod() {

        return $this->protectedMethod();

    }

}


$parent = new ParentClass();

$child = new ChildClass();


// 외부에서 private과 protected 멤버에 직접 접근할 수 없음

// echo $parent->privateProperty;  // 오류

// echo $parent->protectedProperty;  // 오류

// echo $parent->privateMethod();  // 오류

// echo $parent->protectedMethod();  // 오류


echo $parent->accessPrivate(); // 출력: "Private Property"

echo $parent->accessProtected(); // 출력: "Protected Property"


// ChildClass는 ParentClass를 상속했기 때문에 protected 멤버에 접근 가능

echo $child->accessParentProtected(); // 출력: "Protected Property"

echo $child->accessParentProtectedMethod(); // 출력: "Protected Method"

```


이 예제에서 `privateProperty`과 `protectedProperty`는 각각 `private`와 `protected` 접근 제한자로 설정되었습니다. `privateMethod`와 `protectedMethod`도 마찬가지입니다. 이로 인해 외부에서 직접 접근하는 것은 불가능하지만, 해당 클래스 내에서 정의된 메서드를 통해 접근이 가능합니다. `ChildClass`에서는 `protectedProperty`와 `protectedMethod`에 접근할 수 있으며, 상속 관계에서 `protected` 멤버를 활용할 수 있음을 보여줍니다.



캡슐화는 객체지향 프로그래밍에서 중요한 원칙 중 하나로, 데이터와 해당 데이터를 다루는 동작(메서드)을 하나로 묶는 것입니다. 이로써 데이터와 메서드의 내부 구현을 숨기고 외부에 필요한 인터페이스만을 노출하여 코드를 보다 견고하고 유지 보수 가능한 형태로 만들 수 있습니다. 아래는 캡슐화를 구현하는 방법을 보여주는 예제와 간단한 지침입니다:


1. **속성(멤버 변수) 접근 제한:**

   - 클래스 내의 속성을 `private` 또는 `protected`로 선언하여 외부에서 직접 접근하지 못하도록 합니다.

   - `private`은 해당 클래스 내에서만 접근 가능하며, `protected`는 해당 클래스와 하위 클래스에서 접근 가능합니다.


2. **메서드 접근 제한:**

   - 메서드도 `private` 또는 `protected`로 선언하여 내부 구현을 외부에 감춥니다.

   - 외부에서는 메서드를 통해서만 데이터에 접근하고 조작할 수 있습니다.


3. **게터(Getter)와 세터(Setter) 메서드:**

   - 필요한 경우, 속성에 접근하는 게터와 세터 메서드를 정의하여 데이터에 접근할 수 있는 인터페이스를 제공합니다.

   - 게터는 속성 값을 반환하고, 세터는 속성 값을 설정합니다. 이를 통해 데이터에 접근하는 방법을 제어할 수 있습니다.


예를 들어, PHP로 캡슐화를 구현하는 예제를 살펴보겠습니다:


```php

class BankAccount {

    private $balance;


    public function __construct($initialBalance) {

        $this->balance = $initialBalance;

    }


    public function deposit($amount) {

        if ($amount > 0) {

            $this->balance += $amount;

        }

    }


    public function withdraw($amount) {

        if ($amount > 0 && $amount <= $this->balance) {

            $this->balance -= $amount;

        }

    }


    public function getBalance() {

        return $this->balance;

    }

}


$account = new BankAccount(1000);

$account->deposit(500);

$account->withdraw(200);

echo $account->getBalance(); // 출력: 1300

```

이 예제에서 `BankAccount` 클래스는 캡슐화를 통해 `$balance` 속성을 내부적으로 보호하고, `deposit`, `withdraw`, `getBalance` 메서드를 통해 외부에서 접근할 수 있도록 했습니다. 이렇게 함으로써 데이터와 데이터를 조작하는 동작을 함께 묶어 안정적인 코드를 작성할 수 있습니다.

Total 0

Total 45
Number Title Author Date Votes Views
15
http request form method GET POST
siwon | 2023.08.17 | Votes 0 | Views 1414
siwon 2023.08.17 0 1414
14
printf()
siwon | 2023.08.17 | Votes 0 | Views 1071
siwon 2023.08.17 0 1071
13
heredoc 또는 nowdoc 구문
siwon | 2023.08.17 | Votes 0 | Views 1069
siwon 2023.08.17 0 1069
12
single vs double quotes
siwon | 2023.08.17 | Votes 0 | Views 904
siwon 2023.08.17 0 904
11
string functions
siwon | 2023.08.17 | Votes 0 | Views 1050
siwon 2023.08.17 0 1050
10
return types
siwon | 2023.08.17 | Votes 0 | Views 1225
siwon 2023.08.17 0 1225
9
date(), time() funtions
siwon | 2023.08.17 | Votes 0 | Views 1187
siwon 2023.08.17 0 1187
8
Superglobals
siwon | 2023.08.17 | Votes 0 | Views 813
siwon 2023.08.17 0 813
7
scalar types
siwon | 2023.08.17 | Votes 0 | Views 916
siwon 2023.08.17 0 916
6
constructor
siwon | 2023.08.16 | Votes 0 | Views 990
siwon 2023.08.16 0 990
5
composition vs inheritance
siwon | 2023.08.16 | Votes -1 | Views 1193
siwon 2023.08.16 -1 1193
4
polymorphism = method overriding => abstract(추상화)와 관련있음
siwon | 2023.08.16 | Votes 0 | Views 1155
siwon 2023.08.16 0 1155
자식 class가 부모와 같은 method를 가질경우 자식 class의 메소드가 우선한다는 원칙
siwon | 2023.08.29 | Votes 0 | Views 1209
siwon 2023.08.29 0 1209
3
encapsulation
siwon | 2023.08.16 | Votes -1 | Views 919
siwon 2023.08.16 -1 919
private, protected등 access modifier를 사용하여 property나 method의 접근을 제한 하는 oop 원칙
siwon | 2023.08.30 | Votes 0 | Views 1072
siwon 2023.08.30 0 1072
2
inheritance
siwon | 2023.08.16 | Votes 0 | Views 853
siwon 2023.08.16 0 853
1
object와 class의 차이점
siwon | 2023.08.16 | Votes 0 | Views 1145
siwon 2023.08.16 0 1145