favicon

Jayden { do: smite }

230116(월)

🎄 성장일지 3.1

행복한 이기주의자(웨인 다이어)의 내용에 자극받아 시작하는 소박한 성장기록

살아있는 꽃과 죽은 꽃은 어떻게 구별하는가?<br/> 성장하고 있는 것이 살아 있는 것이다.<br/> 생명의 유일한 증거는 성장이다!

🌳 키워드 (1.0)<br/> 최대한 간단하게 정리, 추후에 보면서 스스로 설명<br/> 🍉 경험 위주로 (2.0)<br/> 단순 정보를 전달하기보다 무엇을 배웠고 어떻게 해결했는지 짧고 간단하게 작성<br/> ❄️ 정해진 템플릿에 맞춰서 (3.0)<br/> 키워드, 경험 모두 좋다. 다만 매일 작성하기로 마음 먹은만큼 핵심만 간결하게 정리할 수 있게 템플릿을 작성 (3.1) 230102부터 시작되는 학습에 관한 내용 추가

🔑 오늘의 키워드

객체지향 프로그래밍(Object-Oriented Programming; OOP)

  • 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법

객체지향 프로그래밍 그림

클래스

  • (자바스크립트)객체를 생성하기 위한 템플릿이자 방법 중 하나.
  • 객체를 만들어 내기 위한 설계도 혹은 틀
  • 클래스는 변수(프로퍼티)와 이를 다루는 메서드로 구성되어있다.
  • 자바스크립트에서의 클래스는 프로토타입을 통해 구성된 생성자 함수이다.

객체 인스턴스

  • 객체: 소프트웨어 세계에 구현할 대상. 값을 저장하는 변수와 작업을 수행할 메소드를 서로 연관된 것들끼리 묶어서 만든 것
  • 인스턴스: 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체, 즉 객체를 소프트웨어에 실체화하면 그것을 인스턴스라고 한다. 실체화된 인스턴스는 메모리에 할당된다.

인스턴스는 어떤 원본(추상적인 개념)으로부터 생선된 복사본을 의미할 때도 사용한다. ex) 실행 프로세스는 프로그램의 인스턴스다.

객체지향 프로그래밍의 특징

장점

  • 클래스 단위로 모듈화하여 개발하기 때문에 업무 분담이 편리하므로 대규모 소프트웨어 개발에 적합하다.
  • 클래스 단위로 수정이 가능하여 유지 보수가 편리하다.
  • 재사용 및 상속을 통한 확장성이 뛰어나다.

단점

  • 처리속도가 상대적으로 느리다. => ❓
  • 객체의 수가 많아짐에 따라 용량이 커질 수 있다.
  • 설계시 많은 시간과 노력이 필요하다.

객체 지향과 절차 지향은 반대 관계인가?<br/> => 아니다. 그저 객체 지향은 객체에 초점을 두고, 절차 지향은 순차적인 코드 실행에 초점을 두는 관점의 차이가 있을 뿐이다.<br/> 즉, 절차 지향 프로그래밍도 객체를 다루고 객체 지향 프로그래밍도 절차를 따진다.

추상화

  • 객체에서 공통된 속상과 행위를 추출하는 것
  • 공통의 속성과 행위를 찾아서 타입을 정의하는 과정
  • 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 과정

ex) 자동차라는 추상화 집합을 만들어두고 자동차들이 가진 공통적인 특징들을 만들어서 활용한다.

캡슐화

  • 데이터 구조와 데이터를 다루는 방법들을 결합시켜서 묶는 것(연관된 변수와 함수를 하나로 묶음)
  • 결합도: 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존하는가
  • 응집도: 클래스나 모듈 내의 요소들이 얼마나 밀접하게 관련되어 있는가
  • 즉, 올바른 캡슐화를 통해 결합도는 낮추고 응집도는 높이도록 해야한다.

특히 캡슐화를 통해 정보은닉(외부에서 알 필요가 없는 정보는 접근하지 못하도록 제한)을 통해 낮은 결합도를 갖는다.<br/> ex) 스마트폰 충전은 하더라도 내부에서 어떻게 충전되는지 알 필요는 없다.

상속

  • 클래스의 속성(변수)과 행위(메서드)를 하위 클래스에 물려주어 하위 클래스가 상위 클래스의 속성과 행위를 이용할 수 있게 하는 기능
  • 장점: 재사용으로 인한 코드가 줄어든다. 범용적인 사용이 가능. 자료와 메서드의 자유로운 사용 및 추가가 가능.
  • 단점: 상위 클래스의 변경이 어렵다. 불필요한 클래스가 증가할 수 있다. 상속이 잘못 사용될 수도 있다.

다형성

  • 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것
  • 하나의 클래스 내부에 같은 이름의 행위를 여러개 정의하거나(오버로딩) 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용(오버라이딩)
    • 오버로딩: 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는것
    • 오버라이딩: 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것

SOLID(객체 지향 설계 원칙 5가지)

1. 단일 책임 원칙(Single Responsibility Principle; SRP)

  • 하나의 클래스는 하나의 책임만 가져야 한다.
  • 지켜지지 않을 시, 한 책임의 변경에 의해 책임과 관련된 다른 코드에 영향이 갈 수도 있다.

2. 개방-폐쇄 원칙(Open/Closed Principle; OCP)

  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.

3. 리스코프 치환 원칙(Liskov Substitution Principle; LSP)

  • 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

4. 인터페이스 분리 원칙(Interface Segregation Principle; ISP)

  • 클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야 한다.

인터페이스는 표준, 약속, 규칙으로서 오직 추상 메서드와 상수만을 멤버로 가질 수 있다.<br/> > 참고로 자바스크립트에서는 인터페이스를 제공하지 않는다.

5. 의존관계 역전 원칙(Dependency Inversion Principle; DIP)

  • 추상화에 의존해야지, 구체화에 의존하면 안된다.(구체화가 추상화보다 먼저가 되는 역전이 일어나서는 안된다.)
  • 고수준 모듈(클래스)이 저수준 모듈(클래스)에 의존하면 안된다.
    • 저수준 클래스: 더 작은 클래스

참고 자료

객체지향 프로그램이란<br/> 의존관계 역전 원칙

📝 요약 및 하루 간단 회고

객체지향 프로그래밍!!! 솔직히 예전에 혼자 공부했을 땐 class도 싫고 객체지향이 도대체 뭔지도 몰랐다. 뭔가 알고리즘 풀 때의 방법이랑 다른 느낌..? 아마도 알고리즘 문제를 풀 때는 절차지향쪽으로 머리를 굴리다보니, 자연스레 객체지향이 낯설게 느껴졌던 게 아닐까 싶다. 헌데 지금은 실제의 무언가를 코드로 구현하라고 했을 때, 객체지향이 아니면 어떻게 구현해야할까 라는 생각이 들 정도로 객체지향의 소중함을 알게 되었다... 일단 무엇보다 하나의 객체에 집중해서 그 객체가 갖는 특성(프로퍼티)과 그걸 이용한 어떤 동작(메서드)를 표현할 수 있는 게 엄청나게 유용하다. 물론 객체지향적으로 코드를 설계하는 건 아직은 쉽지 않다. 각각의 객체끼리 어떻게 상속하는 게 올바른 방법인지, 그리고 각 객체를 함께 사용할 때 상속으로 해야하는지 조합으로 해야하는지... 조금은 헷갈리지만 확실히 연습하면서 계속 늘고 있는 기분이 든다. 그냥 무작정 코드를 치는 게 아니라, 정말 어떻게 하는 게 각각의 클래스 혹은 모듈의 역할과 책임을 분리하면서 좋은 코드를 작성할 수 있는지 고민하면서 작성하자!

undefined

Copyright 2023. all rights reserved by Jayden