ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 좋은 객체지향이란 무엇일까? (객체지향의 특징)
    OOP (객체지향) 2022. 10. 2. 02:54
    반응형

    지난번 포스트를 통해 우리는 객체지향 프로그래밍이 패러다임으로 자리 잡게 된 배경과 독립된 객체 간의 유기적인 상호작용을 통해 로직을 이룬다고 알아보았습니다.

     

     

    객체지향은 어떻게 생겨나게 되었을까?

    객체지향은 어떻게 생겨나게 되었을까? 우리는 객체지향을 이해하기 전에 어떤 배경으로 이것이 등장했으며, 그 전에는 어떤 방식의 프로그래밍 기법이 있었는지 알아야 한다. 순차적, 비구조

    b-story.tistory.com

     

    그렇다면 좋은 객체지향 프로그래밍을 위해서 어떻게 해야 할까요?

     

    우리는 이를 알아보기 위해 객체지향을 이루는 4가지 특징에 대해서 알아보도록 하겠습니다.

     

     

    객체지향을 이루는 4가지 특징

     

    • Abstraction (추상화)

    모델링된 Car, Bike, Scooter는 공통 요소를 추출하여 Vehicle이라는 슈퍼 클래스로 추상화가 가능합니다.

    추상화가 가지는 목적은 중복 코드의 제거 입니다.

     

    우리는 설계에 앞서 도메인 모델링을 진행하게 되는데, 모델링이란 도메인 지식(현실의 객체)의 속성과 동작을 소프트웨어 객체의 필드와 메소드로 정의하는 과정입니다.

     

    이 과정에서 불필요한 속성 또는 기능을 제거함으로써 핵심 정보만을 남겨 객체의 복잡성을 낮춥니다. (일반화, 단순화) 

     

    이렇게 모델링된 객체들의 공통된 성질들을 추출하여 슈퍼 클래스로 선정하는 것을 추상화라고합니다. 

     

     

    • Polymorphism (다형성)

    운전자는 아반떼, 쏘나타, 그랜저에 영향받지 않고 운전할 수 있습니다.

    다형성의 목적은 확장과 변화에 대한 정적인 대응입니다.

     

    예를 들어 운전자라는 타입은 자동차라는 인터페이스만 알면 자동차가 구현된 구현체에 영향받지 않고 운전을 할 수 있으며 구현체의 확장과 변화에도 유연하게 대처할 수 있습니다.

     

     Java에서는 다형성을 구현하기 위해 아래 2가지 개념을 제공하고 있습니다.

     

    Overloading (오버로딩)

    오버로딩은 하나의 클래스내에서 같은 이름 사용하지만 다른 파라미터를 가진 메서드를 여러 개 정의하는 것 입니다.

     

    Overridding (오버라이딩)

    오버라이딩은 부모클래스에서 정의한 메서드를 자식클래스에서 재정의하는 것 입니다.

     

    이처럼 하나의 타입(운전자)으로 여러개의 객체(아반떼, 쏘나타, EV6 ETC...)를 참조할 수 있도록 설계하는 것을 다형성이라고합니다. 

     

     

    • Inheritance (상속)

     

    Vehicle class에서 정의된 메서드나 필드는 이를 상속받은 Bus, Car, Truck에서 재정의 되거나 다른 기능을 추가 할 수 있습니다.

    상속의 목적은 코드의 재사용성입니다.

     

    상속을 통해 클래스를 구현하다 보면 적은 양의 코드로 새로운 클래스를 작성할 수 있고, 코드를 공통적으로 관리 할 수 있습니다.

     

    상속은 마치 자식이 부모로 부터 물려받은 집과 같습니다. 부모님이 가꾸시던 집을 자식이 물려받아 고칠곳은 고치고 평수를 넓혀 새로운 공간을 추가할 수 있습니다. 

     

    이처럼 부모 클래스의 메소드 혹은 필드를 자식 클래스가 물려받아 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는것을 상속이라고 합니다. 

     

     

    • Encapsulation (캡슐화)

     

    캡슐화된 Class A는 내부 필드는 숨기며 getter와 setter을 통한 접근만 가능하도록합니다.

    캡슐화의 목적은 모듈화입니다.

     

    일반적으로 캡슐화란 연관 있는 필드와 메서드를 클래스로 묶는 작업을 말합니다.

     

    하지만 여기에 정보 은닉이라는 개념을 합쳐서 말하곤하는데 사실 이 두가지는 같은 개념은 아닙니다. 

     

    캡슐화된 객체는 프로그램 구현에 필요한 필드와 메서드를 외부와 단절시키고 관련 컴포넌트 간에 응집도를 높입니다.

     

    Information hiding (정보 은닉)은 캡슐화된 클래스 내부의 필드와 메서드를 외부에 노출하지 않고 객체 간 상호작용을 위한 인터페이스만 공개하여 자연스럽게 객체 내부의 정보가 은폐되도록 유도하는 것을 말합니다.

     

    이 두 개념은 객체의 응집도와 독립성을 높이고 모듈화를 지향합니다. 

     

    Java에서는 캡슐화된 객체를 4가지 접근제어자를 통해 접근 범위를 분리합니다.

    • public: 다른 객체에서 해당 객체의 인스턴스를 생성하여 접근할 수 있다.
    • protected: 해당 객체를 상속받은 객체 내부에서 접근할 수 있다. 단순 인스턴스에선 접근할 수 없다.
    • default: 동일한 패키지 내의 객체에서 인스턴스를 생성하여 접근할 수 있다.
    • private: 선언된 객체 내부에서만 사용 가능하다.

    이처럼 객체 내부의 세부사항을 외부로부터 감추고 인터페이스만 공개하여 응집도와 보안성을 높이고 변경하기 쉬운 코드를 만드는 것을 캡슐화 (+정보 은닉)라고 합니다.

     

     

     

    여기까지 좋은 객체지향을 하기 위해 첫번째로 객체지향을 이루는 4가지 특징에 대해서 알아보았습니다. 

     

    다음 시간에는 좋은 객체지향 코드를 설계하기 위한 5가지 원칙인 SOLID에 대해 알아보겠습니다.

    반응형

    댓글

Designed by Tistory.