ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OOP의 기초
    Web 개발/디자인 패턴 2022. 11. 18. 09:40

    OOP의 기초

    부모클래스와 자식클래스 상속

    자식 클래스들은 부모로부터 상태행동들을 상속 받고, 그 중에서 부모와 무언가 다른 것들만을 정의한다.

     

    연관된 비지니스 요구사항이 있다면, 여기서 더 나아가 Organisms(모든 생명체)라는 더욱 일반적이 클래스를 추출할 수도 있다. 이 클래스는 Animals(동물들) 및 Plants(식물들)에 대한 부모 클래스가 될 것이다. 이러클래스들의 피라미드가 바로 계층구조이다. 이러한 계층구조에서 Cat(고양이) 클래스는 Animal(동물)과 Organism(생명체) 클래스 양쪽의 모든 내용을 상속받는다.

     

    자식클래스들은 무보 클래스들에서 상속한 메서드들의 행동을 오버라이드(Override)할 두 있다. 또 자식 클래스들은 디폴트 행동들을 완전히 대체하거나 몇 가지 행동들을 추가하여 그 기능들을 향상 시킬 수 있다.

     

    OPP의 기둥들

    OPP는 다른 프로그래밍 틀 체계들과 차별화되는 4가지 기본 개념들으 기반으로 한다.

     


    추상화

    프로그램의 객체들은 실테 원본 객체들의 속성들은 100% 정확하게 나타내지 않는다. 대신 프로그램의 객체들은 특정 맥락에서만 실제 객체들의 속성들과 행동을 모델링한다.

    두가지 프로그램에서 필요한 비행기 Class의 속성은 다르다. 비행시뮬레이터가 실제 비행과 관련된 세부 정보들을 담고 있다면, 항공 좌석 예약 앱에서는 신경써야 하는건 좌석 배치도와 예약 가능한 좌석 같은 정보들이다.

     

    추상화는 맥락에 따라  실제 객체 또는 현상을 핵심적인 개념 또는 기능들로 제한한다. 핵심 기능과 관련된 모든 세부 정보는 높은 정확도로 나타내고 나머지는 모두 생략한다.

     


    캡슐화

    자동차 시동을 걸려면 운전자는 키를 꽂고 돌리기만 하면 된다. 이외에 시동을 걸기위에 후드 아래에서 일어나는 세부적인 과정에 대해 알 필요는 없다. 왜냐하면 그런한 세세한 작업들은 자동차의 후드 아래에 숨겨져 있기 때문이다. 운전자에게 노출된건 시동 스위치, 핸들, 그리고 몇개의 페달이라는 단순한 인터페이스가 전부이다. 위 예시는 각 객체가 인터페이스를 갖는 방식을 설명해준다. 인터페이스는 다른 객체와 상호작용할 수 있는 객체의 공개된 부분이다.

     

    캡슐화는 객체가 그 상태와 행동의 일부를 다른 객체들로 부터 숨기고 프로그램에는 제한된 인터페이스만 노출할 수 있는 기능이다.

     

    무언가를  캡슐화 한다는 것은 그것을 private(비공개)로 만든다는 뜻으로, 그러면 그 무언가를 자신의 클래스의 메서드에서만 접근 할 수 있다. 조금 더 제한적인protected(보호된) 접근제한자라는 것도 있는데, 이것은 클래스의 멤버(속성, 메서드)를 자식 클래스에서도 사용할 수 있게 해준다.


    대부분 프로그래밍 언어의 인터페이스, 추상 클래스 그리고 추상 메서드들은 추상화 및 추상화 및 캡슐화 개념들에 기반을 둔다.  현대 OOP 언어들에서의 인터페이스 매커니즘 (일반적으로 interface 또는 protocol로 선언됨)은 객체 간의 상호 작용에 대한 계약을 정의할 수 있도록 한다. 이는 인터페이스들이 객체의 행동에만 관심을 두는 이유 중 하나이자, 인터페이스에서 필드를 선언할 수 없는 이유 중 하나이다. 

     

    인터페이스라는 단어는 객체의 공개된 부분을 나타낸다. 동시에 대부분의 프로그래밍 언어에는 interface라는 유형도 있다.

     

    Flying Transport 인터페이스

    fly(origin,destination,passengers){
    	...
    }

    (출발지, 목적지, 승객) 인수로 받는 fly()라는 메서드가 있는 Flying Transport(비행 운송 수단) 인터페이스가 있다고 가정해 보자. 항공 운송 시뮬레이터를 설계할 때 Airport(공항) 클래스를 FlyingTransport 인터페이스를 구현하는 객체들과만 작동할도록 제한할 수 있다. 이렇게 만들면 airplane(비행기)이든,Helicopter(헬리콥터)든 DomesticatedGryphon(집에서 키운 그리폰)이든, 공항객체에 전달된 어떤 객체라도 해당 하는 유형의 공항에 착륙할 수 있을 것이라고 확신할 수 있다.

     

     

    화살표

     

    기본 화살표는 한클래스가 다른 클래스에 의존함을 나타낸다.

     

     

    빈 삼각형 머리와 점선이 있는 화살표는 클래스들이 인터페이스를 구현함을 나타낸다.

     

     

    위와 같은 클래스들의 fly()매서드에 대한 구현을 원하는 방식으로 변경할 수 있다. 메서드의 시그니처들이 인터페이스에 선언된 것들과 같게 유지한 Airport클래스의 인자로 들어가게 될  모든 인스턴스는 비행객체들은 잘 동작할 것이다. 

     

    상속

    상속은 기존 클래스를 토대로 새 클래스를 구축하는 기능이다. 상속의 가장 큰 이점은 코드 재사용이다. 기존에 존재한는 클래스와 약간 다른 클래스를 만들고 싶을 때 기존 코드를 코드를 복제할 하는 대신 기존(부모)클래스를 확장한 후 부모 클래스를 확장한 후 부모 클래스의 필드와 메서드를 상속한 결과인 자식 클래스에 필요한 추가 기능들을 추가하면 된다.

    *Oxygen Breather:산소 호흡기관

     

    상속을 사용하면 결과적으로 자식 클래스들은 부모 클래스와 같은 인터페이스를 갖게된다. 어떤 메서드가 부모 클래스에서 선언 되었다면 자식 클래스에서 그 메서드를 숨길수 없다. 또한 자식클래스에 어울리지 않더라도 부모클래스에 포함된 모든 추상메서드를 구현해야 한다.

    대부분의 프로그래밍 언어에서 자식클래스는 하나의 부모 클래스만 확장할 수 있다. 반면에 클래스는 동시에 여러 인터페이스를 구현할 수 있다. 하지만 특정클래스를 부모로 가지는 자식클래스의 경우 부모클래스가 가지는 모든 인터페이스를 구현해야한다.

     

    다형성

    Animal에대한 예시를 살펴보자 대부분은 Animal은 소리를 낼 수 있다. 따라서 우리는 모든 자식 클래스들이 기초 makeSound(소리내기) 매서드를 오버라이드해야 각 자식 클래스가 그에 해당하는 동물의 소리를 올바르게 내는 메서드를 올바를게 오버라이드 해서 구현할 것이다. 그러므로 이 매서드는 구체가 아니바 추상으로 선언할 수 있다. 

     

    이렇게 하면 부모클래스에서 이 메서드의 디폴트 구현을 생략할 수 있다. 하지만 모든 자식 클래스들은 강제적으로 이 메서드를 각자 구현해야 한다. 즉 추상인 인터페이스를 사용하면 어떻게 구현할지는 자유이지만 구현을 해야한다는 사실은 강제 된다.

     

    추상 클래스들 및 메서드들의 이름은 이탤릭테로 표시된다.

     

    큰 가방에 고양이와 개를 넣었다고 가정해 보다 그런 다음 눈을 감을 다음 동물들을 하니씩 꺼낸다. 가방에서 동물을 꺼낸 직후는 그 동물이 어떤 동물인지 확실히 모른다. 하지만 그 물을 힘껏 꺄 안아 본다면 그 동물은 그 구상 클래스에 따라 특정한 소리를 낼 것이다.

    const bag =[new Cat(), new Dog()];
    
    bag.forEach((a: Animal) => {
      a.makeSound;
    });
    
    //야옹!
    //멍멍!

    프로그램은 a변수 안에 포함된 객체의 구상(구체화되어 정의된)유형을 알지 못합니다. 하지만 다형성이라는 특별한 메커니즘 덕분에, 프로그램은 그 메서드가 실행되어(구상된) 적절한 실제 행동을 실행하는 객체의 자식 클래스를 추적할 수 있다.

     

    다형성은  객체의 실제 클래스(구상 클래스)를 감지하고 해당 객체의 구현을 현재 맥락에서 이것의 실제 유형을 알 수 없는 경우에도 호출할 수 있는 프로그램 기능이다.

     

    다형성은 객체가 다른 무언가인 척 '가장'을 할 수 있는 기능이라고도 생각할 수 있다. 일반적으로는 객체가 확장하는 클래스 또는 구현하는 인터페이스인 척가장한다. 위 예시에서는 가방에 든 개와 고양이가 일반 동물인 척 가장하고 있다.

     

    댓글

Designed by Tistory.