OOP (Object-oriented Programming)

정은경·2020년 3월 17일
0

OOP (Object-Oriented Programming)

  • OOP는 코드를 구성하는 방법에 대한 규칙이자 실행 방법들에 대한 방법일 뿐
  • OOP를 지원하는 언어들
    • 예) Java, C#, JavaScript, TypeScript, Dart, ...
  • OOP를 사람들이 좋아하는 이유는 매우 직관적이고 데이터와 코드를 잘 구성해주기 때문
  • OOP를 사용하여 object를 중심으로 데이터를 다루는 함수는 매우 직관적이고 생각해내기 아주 쉬움
  • 언어에서 코드를 객체지향적으로 만들어 사용할 수 있는 특정 툴을 쓸 수 있다면 OOP를 꼭 사용하지 않아도 됨
  • Class에는 Property(속성), Method, Inheritance가 있음

Why We Need OOP

  • 코드를 더 나은 방법으로 만들어 줌. 더 프로페셔널하고 이해하기 쉬운 방법으로
  • 객체지향프로그래밍의 신비한 점은 데이터를 기반으로 동작하는 함수로 데이터를 캡슐화할 수 있다는 것
  • 다른 종류의 데이터와 함수들을 동일한 하나의 파일에 모두 가지고 있는 것 대신에 객체 지향 프로그래밍을 사용하면 우리의 데이터를 좀 더 구체화하여 구성할 수 있음
  • 그럼으루써 앱의 구조를 훨씬 더 이해하고 작업하기 쉽도록 도와줄 것
  • OOP는 우리가 필요한 구조와 정신적 규칙과 모델을 줌

Class

  • 클래스는 우리의 데이터가 어떻게 생겨야하는지에 대한 청사진과 같음
  • 클래스는 데이터의 구조를 정의할 수 있도록 해줌
  • 클래스는 우리가 캡슐화하고 싶은 것을 캡슐화하도록 도와줌
  • 클래스는 데이터를 정의하고 그 데이터를 기반으로 동작하는 함수를 정의하는 걸 도와줌

Method

  • method는 클래스 안에 있는 함수
  • method의 첫번째 argument는 self가 되어야함
  • method는 항상 그것들의 class를 참조함
  • method의 첫번째 argument로 넘겨주는 것은 클래스 object임

Inheritance (상속)

  • 상속은 객체지향프로그래밍을 더 나은 방향으로 도와주는 것
  • 우리의 코드를 저장하고 다시 사용할 수 있도록 해주기 때문
  • 일부 클래스의 가장 일반적인 property들을 분리시킬 수 있고 그 property들을 공유할 수 있음

OOP (Object-oriented programming )

  • 속성에 데이터를, 메소드에 절차코드를 넣는 '오븍제트' 콘셉트 기반으로하는 프로그래밍 패러다임을 의미
  • 오브젝트의 특징은 연관된 것 끼리 참조한다는 것
  • OOP에서 오브젝트 간의 상호작용하다록 설계하는 컴퓨터 프로그램임
  • 많은 언어들에서 OOP가 사용됨 (C++, Java, Python)

추상화 (abstract)

  • 현실 세계/개념/대상에서 원하는 특징/속성(attribute)를 뽑아내는 과정
    * variable
    • behavior
  • 클래스를 실체화 시키면 인스턴스라고 함
  • 인스턴스를 통해서 클래스의 변수나 함수 같은 속성(attribute)에 접근할 수 있음

class vs. object

  • 클래스는 설계도
  • 객체는 설계도로 구현한 모든 대상을 의미

object vs. instance

  • 클래스 타입으로 선언되었을 때 객체라고 부르고
  • 그 객체가 메모리에 할당 되어 실제 사용될 때 인스턴스라고 부름
  • 객체는 '실체'에 초점!
  • 인스턴스는 '관계'에 초점을 맞춤
  • 객체를 클래스의 인스턴스라고도 부른다
  • 객체와 인스턴스를 엄격하게 나누긴 어려움

OOP특징#1. 상속 (Inheritance)

  • 공통된 특징
  • 상속을 받은 하위 클래스는, 상속된 특성 외의 자신만의 특징을 추상화!

OOP특징#2. 캡슐화 (encapsulation)

  • 응집도는 높아야! / 결합력은 낮아야!
  • 연관이 높은 속성은 클래스 안에 모아둠 (그러면 응집력 업!)

(1) 응집도 (cohesion)

  • 프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지 나타내는 정도
  • 일반적으로 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들을 모여서 구현되어 있음
  • 응집도가 높으면 프로그램을 쉽게 이해할 수 있고 유지보수성이 높아
  • 낮은 응집도의 문제
    * 이해하기 힘듬
    • 따로 재사용하기 힘듦
    • 유지보수하기 어려움
    • 다른 클래스의 변화가 민감 (다른 클래스에 의존적일 수 있음)

(2) 결합도 (coupling)

  • 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지
  • 또한 얼마나 의존적인지 나타내느 정도
  • 요소가 결합도가 낮다는 것은 다른 요소들과 관계를 그다지 맺지 않은 상태를 의미
  • 높은 결합도의 문제
    * 연관된 다른 클래스가 변경되면 같이 변경해야 함
    • 수정하려는 클래스를 이해하기 위해 연관된 다른 클래스를 함께 분석해야 함

OOP특징#3. 다형성(polymorphism)

오버라이딩 (overiding)

  • 부모클래스에서 정의된 메소드를 자식클래스에서 새롭게 정의

오버로딩 (overloading)

  • 같은 클래스 안에 동일 이름의 메소드가 여러개! (단, 인자의 개수/타입이 달라야!, 반환값은 상관없음)
  • 파이썬은 오버로딩이 없음

객체지향의 오해

1) oop는 실세계 real world를 모델링하는 것인다?

추천 도서

  • GoF의 디자인 패턴
  • 그래디 부치의 'UML을 활용한 객체지향 분석 설계'

Reference

profile
#의식의흐름 #순간순간 #생각의스냅샷

0개의 댓글