Skip to content

Instantly share code, notes, and snippets.

@trilliwon
Created December 12, 2021 06:48
Show Gist options
  • Save trilliwon/8abad6f56ee3909dbeb4b964ccc91988 to your computer and use it in GitHub Desktop.
Save trilliwon/8abad6f56ee3909dbeb4b964ccc91988 to your computer and use it in GitHub Desktop.

상속보다는 추상화를!

So what is OOP?

  • OOP stands for “Object Oriented Programming”. 일명 객체지향프로그래밍 (오오피)
  • 프로그램을 여러개의 “객체”로 나누고 그 객체들의 상호작용으로 서술하는 방식.
  • Objects 의 개념을 바탕으로한 프로그래밍 패러다임 이다.
  • Objects 는 fields 와 methods 를 포함한다.
  • 상호작용하는 객체들의 집합

프로그래밍 패러다임이란 프로그래머에게 프로그래밍의 관점을 갖게 해주고, 결정하는 역할을 한다. 예를 들어 객체지향 프로그래밍은 프로그래머들이 프로그램을 상호작용하는 객체들의 집합으로 볼 수 있게 하는 반면에, 함수형 프로그래밍은 상태값을 지니지 않는 함수값들의 연속으로 생각할 수 있게 해준다. — 위키백과

  • 상태값을 지니지 않는 함수값들의 연속

객체, 관계 중심

  • 객체지향은 사람의 추상능력, 인식방법에 가까운 개발 방법론.
  • attributes와 behavior로 이루어진 객체를 만드는 것.
  • 프로그램을 독립된 단위인 객체들의 모임으로 보고 각각 객체는 메시지를 주고 받고 데이터를 처리함.

장점

  • Strong Cohesion and Weak Coupling (강한 응집력, 약한 커플링)
    • 클래스에 하나에 문제 해결을 위한 데이터를 모아 놓은 데이터형을 사용함으로써 응집력을 강화한다.
    • 클래스간에 독립적으로 디자인함으로써 결합력을 약하게 한다.
  • Reusable: 잘 만들어진 객체는 재사용이 가능하다.
  • 유지보수 용이성: Weak coupling 은 프로그램을 독립적으로 볼 수 있기 때문.
  • 절차지향 패러다임 대비 대형 프로젝트에 적합.

단점

  • 설계하기가 쉽지 않다. 언제나 그렇지만 잘 짜는게 어렵다.
  • 처리 속도가 느리다

용어들

  • attribute = data = member variable = state = field
  • behavior = operation = member function = method
  • class = concept = type
  • object = instance = variable

OOP 특징

  • 추상화 (Abstraction) — class, object, instance
  • 상속 (Inheritance)
  • 캡슐화 (Encapsulation)
  • 다형성 (Polymorphism)

Abstraction

  • Define and execute abstract actions
  • 표현 대상의 특징에 대한 서술
  • procedural abstraction : 함수 (function)
  • data abstraction : 구조체, 배열, 포인터
  • Object, Instance, 실체 : instance of class,
  • Object 는 클래스의 Instance 이다. 클래스가 실제로 만들어 진 것.

Inheritance

  • Inherit members from parent class
  • 하나의 클래스가 가지고 있던 특징들을 그대로 다른 클래스가 물려 받는 것.
  • 재사용, 유연성 증가
  • Overriding : 부모 클래스의 메서드와 같은 메서드를 재정의 하는 것, 같은 이름의 메서드가 여러 클래스에서 다른 기능을 하는 것.

Encapsulation

  • Hide the internals of a class
  • Access Control : public, internal, private …
  • 데이터와 데이터를 다루는 방법을 묶는 것
  • 내부의 구현은 감추고 모듈 내에서 응집도를 높이며 외부로 부터의 노출을 줄여 모듈간의 결합도를 떨어뜨리는 개념(Weak - Couping)
  • Strong Cohesion and Weak Coupling (강한 응집력, 약한 결합력)

Polymorphism

  • Access a class through its parent interface
  • 한 요소에 여러 개념을 넣어 놓는 것.
  • 상속의 계층을 따라서 각각의 클래스에 한가지 이름을 줄 수 있다. 같은 명령을 다른 오브젝트에 줄 수 있다.
  • Message passing 객체지향 관점에서 프로그램은 Object 에 message 를 보내는 것으로 실행
  • a.method() : a 에 method() 라는 메시지를 보낸다.
  • Overriding : 같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것 (상속)
  • Overloading : 같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것
  • method overloading
  • operator overloading
  • 객체 관계를 조직적으로 나타낼 수 있다

SOLID 원칙

SRP : 단일 책임 원칙 (Single Responsibility Principle)

  • 객체는 하나의 책임만을 맡아야 한다
  • DB 정규화와 비슷함
  • 목적 : 변화에 대한 유연성 확보
  • 낮은 결합도, 높은 응집도 추구

OCP : 개발-폐쇄 원칙 (Open Closed Principle)

  • 모듈은 확장에는 열려있어야 하고 변경에는 닫혀 있어야함.
  • 확장하기 쉬워야 하고, 변경하기 에는 좀 거시기 해야 함.

LSP : 리스코프 치환 원칙 (Liscov Substitution Principle)

  • 자식 클래스는 언제나 자신의 부모 클래스를 대체 할 수 있다는 원칙
  • 즉 인터페이스만 알면 구현체를 몰라도 사용 가능해야 함.
  • 다형성

ISP : 인터페이스 분리 원칙 (Interface Segregation Principle)

  • 클라이언트에서 사용하지 않는 메서드는 사용해선 안된다. 그러므로 인터페이스를 다시 작게 나누어 만든다.
  • 하나의 일반적인 인터페이스 보다는 구체적인 여러개의 인터페이스가 나음
  • 파생 클래스 입장에서 사용할 때 100% 구현할 수 있는 인터페이스만 사용해야 한다.
  • 두 개 이상의 인터페이스가 필요한 경우 다중 인터페이스 상속으로 구현하는 것이 좋다.

DIP : 의존성 역전 원칙 (Dependency Inversion Principle)

  • 첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
  • 둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.

참고

<iframe src="//www.slideshare.net/slideshow/embed_code/key/toEneNnejuErwG" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment