1. 객체 지향 프로그래밍


1.1 객체 지향 프로그래밍 OOP


  • 객체 지향 프로그래밍 Object-Oriented Programming , OOP 는 컴퓨터 프로그래밍의 패러다임 중 하나이다.

  • 객체 지향 프로그래밍 OOP 는 시간이나 사건의 흐름에 따른 명령어들의 목록이라는 시각을 벗어나 독립된 단위인 객체 Object들의 집합으로 보고자 하는 것이다. 각각의 객체 Object는 메시지를 주고받고, 데이터를 처리할 수 있다.

  • 객체 지향 프로그래밍 OOP 는 대규모 소프트웨어 개발에 많이 사용되고 소프트웨어 개발과 유지보수, 직관적인 코드 분석에 장점이 있다.

  • Java, C++, C#, Python, PHP, Ruby, Object-C

1.2 객체 지향의 요소


  • 클래스 Class

    • 같은 종류의 혹은 문제해결을 위한 집단에 속하는 속성attribute과 행위behavior를 정의한 것이다.

    • 객체Object를 만들기 위한 설계도라고 볼 수 있다.

  • 객체 Object

    • 클래스Class에 선언된 모양 그대로 생성된 인스턴스Instance이다.

    • 클래스Class의 인스턴스Instance 라고도 한다.

    • 인스턴스Instance는 객체가 구현된 실체이고 실체화된 객체인 인스턴스는 메모리에 할당된다. 즉, 객체가 메모리에 할당되어 실제로 사용되면 인스턴스라고 부른다.

  • Method, Message, Attribute, Constructor, etc.

1.3 객체 지향의 특징


  • 추상화 Abstraction

    • 세부정보를 숨기고 중요한 정보만 표현해 프로그램을 간단히 표시하는 것이다.

    • TV 리모콘 같은 경우, 사용자 입장에서는 리모콘 안에서 어떻게 작동하는지 세부정보는 모르지만 리모콘의 버튼들이 무슨 기능을 하는지는 알 수 있다. 제작자는 전원버튼을 표시하고 On/Off 한다는 중요한 정보는 표현하지만 그 기능을 구현되게 하는 세부정보는 숨긴다.

  • 캡슐화 Encapsulation

    • 변수(데이터)와 함수를 하나의 단위로 묶는 것이다.

    • 정보은닉 information hiding

      • 내부의 구현을 감추고 외부로의 노출을 최소화하고 외부로부터의 접근을 차단한다.

      • 클래스의 외부에서는 외부로 노출된 특정 메서드에만 접근이 가능하고 클래스 내부에서 어떤 식으로 처리하는지는 알 수 없다.

    • 높은 응집력high cohesion과 약한 결합력weak coupling이 목적이다.

      • 응집력 cohesion

        객체 내에서 특정 목적을 위해 구성한 요소인 메서드, 데이터들의 밀접함.

      • 결합력 coupling

        클래스와 클래스 사이의 의존성.

  • 상속 Inheritance

    • 클래스가 다른 클래스의 특성과 기능들을 물려받는 것을 말한다.

    • 상위클래스를 하위클래스가 상속받아 상위클래스의 특성과 기능들을 재사용 할 수 있다.

  • 다형성 Polymorphism

    • 하나의 객체나 메서드가 여러 형태를 가질 수 있는 것을 말한다.

    • overloading, overriding, generic, 형 변환 upcasting downcasting

1.4 객체 지향 설계의 5원칙 SOLID


SRP 단일 책임 원칙

  • Single Responsibility Principle (SRP)

  • 객체는 오직 하나의 책임만 가져야 한다.

  • 클래스의 목적을 명확히 해야 구조가 난잡하지 않고 코드를 유지, 보수하기 쉽다.

OCP 개방 - 폐쇄의 원칙

  • Open-Closed Principle (OCP)

  • 객체는 확장은 개방적이고 수정은 폐쇄적이어야 한다.

  • 기존의 코드를 변경하지 않으면서 기능은 추가할 수 있도록 설계해야 한다.

LSP 리스코프 치환 원칙

  • Liskov Substitution Principle (LSP)

  • 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다.

  • 부모 클래스 대신 자식 클래스를 넣어도 동작하는데 문제가 없어야 한다.

  • 다형성 polymorphism

ISP 인터페이스 분리 원칙

  • Interface Segregation Principle (ISP)

  • 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.

  • 하나의 큰 인터페이스 보다는 여러개의 구체적인 인터페이스로 분할하는 것이 좋다.

DIP 의존성 역전 원칙

  • Dependency Inversion Principle (DIP)

  • 상위 모듈은 하위 모듈에 의존해서는 안되고, 둘다 추상화에 의존해야 한다.

  • 클래스 사이의 의존관계는 구체적인 클래스 보다는 추상화한 클래스에 의존해야 한다.

  • 인터페이스interface를 활용하라는 의미이기도 하다.

profile
real.great.code

0개의 댓글