[TIL] Immersive 05_2021.04.09 (OOP)

나라리야·2021년 4월 9일
1

TIL_Immersive course

목록 보기
5/9

오늘은 수업에서도 중요한내용이니만큼 한번더 개념에대해 짚고 넘어갈 수 있는 블로깅시간을 마련해주었어!
블로깅의 주제는 다음과 같아!
OOP(Object Oriented Programming)가 무엇인지?
JavaScript에서 Prototype은 무엇이고 왜 사용해야 하는지?
아직 100%이해하진 못했지만 오늘 수업을 한 내용으로 정리를 해보려고해!

OOP(Object Oriented Programming)가 무엇인지?

말그대로 객체 지향 프로그래밍이라는 단어로 불리고 있는데, 쉽게 말하자면 예전에 사용하던 절차적언어의 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나서 여러개의 독립된 단위 즉 '객체'들의 모임으로 사용하고자 하는 것이다!라는 건데 생각해보면 이전에 사용했던 프로그래밍 스타일은 불필요한 코딩문장이나 중첩된 내용들이 있었는데 사용하다보니까 너무 지저분하고 보기에도안좋고 실용성이 부족했던거지?? 그래서 귀차니스트들의 집합인 뛰어난 프로그래머들이 간단하고, 보기쉽고, 수정도 용이하게끔 만든게 아닐까?? 계속 발전된 프로그래밍 언어나 스타일을 보면 개인적으로 느끼는 거지만 간단하고 편하고 최대한 타이핑을 적게할 수 있게 만들려고 노력하는거 같아

'객체 지향 프로그래밍 언어'는 '절차적 언어'보다 유지보수성(Maintainalbility) 과 재사용성(Reusability)이 좋습니다.

그래서 이 객체 지향 프로그래밍이라는 패러다임이 등장한 후 변수와 함수를 차례대로 넣어서 1-2-3-4번식으로 순차적으로 작동하는것을 넘어서 데이터와 기능이 별개로 취급되지 않고, 한번에 묶어서 처리할 수 있게 되었어 그리고 또 여기서 JavaScript는 엄밀히 말하면 객체지향언어는 아니지만, 객체지향 패턴으로 작성할 수 있게 되었지 (현대의 프로그래밍 언어들은 대부분 객체지향의 특징을 가지고 있다)

OOP를 이해하는데 있어서 중요한게 있는데
OOP는 프로그램을 설계하는데 있어서 구조적인 틀이나 기본적 설계 바탕이되는 것이라고 생각해
여기서 중요하게 알아야 할게 있지!

클래스(Class)와 인스턴스(Instance)

클래스는 일종의 원형(original form), like a 붕어빵기계틀, 또는 자동차구조틀 같은거라고 생각하면돼 (청사진:blueprint) 아직 내용물이 없는 속은 텅텅 비어있는 상태인거지
클래스를 만들었다면 이제 뭔가 만들어내야하지 않겠어?? 이런 클래스들로 만들어진 객체(object)를 인스턴스(Instance)라고 부르게 돼. 하지만 모두 똑같은 특성이나 성질을 가진 객체가 되지는 않아)
왜냐구??
아직 텅텅빈 껍데기일뿐 세부사항이나 내용물이 없잖아? 그렇다면 이건 언제 어떻게 넣어줄 수 있을까?? 그래서 필요한게 바로 생성자!라는거야 이 생성자(constructor)를 통해 세부사항을 넣어 줄 수 있는 거지 마치 함수에 인자를 넣어주듯 말이야

아래 그림을 볼까?

Car라는 클래스 틀로 차를 찍어낼건데! 차가 가지고있는 고유의 속성이 있겠지?
색상, 가격, 최고속도, 브랜드 등등 말이야~
그리고 이 차가 가만히 있는건 아니지! 시동을걸고, 움직이고, 멈추고, 여러가지를 할 수 있겠지?? 이렇게 여러가지 기능하는 걸 메소드라고 불러! 이런것들을 생성자(constructor)를 통해서 세부사항을 넣을 수 있는거야 (내가 이해한게 맞나..🙄ㅋㅋㅋ)

OOP의 특징

Encapsulation (캡슐화)

혹시 캡슐알약 먹어본적있어? 캡슐알약을 물과 함께 삼키면 사실 아무맛이 없지만, 실제로 캡슐알약을 열어보면 하얀가루같은것들이 내용물에 있는데 엄청 쓰다구... 이런 쓴 내용물들을 캡슐화해서 사람들이 약을 쉽게 먹을 수 있도록 해주는거야.

한마디로 캡슐화란
속성과 메소드를 클래스 하나로 묶어, 외부로부터 은닉시키고 메소드를 통한 접근을 가능하게 해주는 것

캡슐화를 하는 목적은?
가장 중요한 목적은 정보 은닉이라고 볼 수 있어. [구현은 숨기고 동작은 노출] 이렇게 말하니깐 뭔가 대단하거 같지만 만약에 유저 정보를 가지고있는 어떠한 객체에서 유저의 정보가 private가 아닌 public으로 설정되어있다면 누구든 접근해서 내 정보를 빼가거나 변경할 수 있겠지?? 이렇게 보호된 변수들은 getter나 setter등의 메서드를 통해서만 간접적으로 접근 가능하도록 할 수 있어 (자바언어의 경우 )
여기서 중요한게 캡슐화와 정보은닉은 동일한 개념은 아니야, 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에 정보은닉을 할 수 있다는 특징ㅇ르 가지는 거지. 사용자에 입장에서 전화기를 조작하거나 리모콘을 조작할 때 public으로 정의된 속성만 알면되지 굳이 private한 내부회로를 알 필요가 없는것처럼 말이야

캡슐화의 장점은 ?
느슨한 결합이 가능해 = 언제든 구현을 수정할 수 있음
말그대로 메소드 사용 코드의 흐름을 바꾸지 않으면서 객체 내 메소드의 구현만 수정하는 거지

Inheritance (상속)

상속이란 단어 많이 들어봐서 알지? 뭔가 물려받는다는거잖아??
단어 뜻처럼 상속은 부모클래스의 특징을 자식 클래스가 물려받는것이라고 보면 돼
그러니깐 자세하게 풀어서 설명하면 기본 클래스(base class)의 특징을 파생클래스 (derive class)가 상속받는다 라는 뜻이야

한마디로 상속이란
새로운 하위 클래스가 기존의 상위 클래스의 자료와 연산을 이용할 수 있게 하는 기능!

솔직히 이 특징은.. 불필요하고 비효율적인 방법을 줄이기위해서 만들어진 특징같아. 왜냐면 앞서 만들어진 클래스의 속성을 그대로가지고 추가된 속성이 있는 그 다음 클래스를 만들 때 다시 속성과 메소드를 재구현한다면 굉장히 귀찮고 일이 많아지겠지?? 그래서 부모클래스의 속성을 자식클래스가 상속받을 수 있게 한거고 자식클래스에는 부모클래스의 속성을 담으면서 추가적인 속성/메소드를 추가하여 새로운 클래스를 만들 수 있겠지??

Abstraction (추상화)

그런거 있잖아 우리는 스마트폰 노트북 등의 기계를 매우 단순한 구조로 전원버튼을 키고 타자를 누르고 입력하고 이런 단순한 인터페이스를 통해서 사용할 수 있잖아? 하지만 기계안이나 내부를 들여다보면 매우 복잡하고 사용자가 알기 힘든 내용들로 가득 차 있어. 하지만 추상화를 통해 현재 우리가 사용하는것 처럼 인터페이스가 단순해지고 오히려 너무 많은 기능이 없기 때문에 사용자의 움직임을 예측하기가 편리해졌다고 볼 수 있지

한마디로 추상화란?
불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것!

캡슐화랑 조금 헷갈릴 수 있는데 캡슐화는 코드와 데이터의 은닉 이라면 추상화는 클래스를 사용하는 사람(유저)가 필요하지 않는 메소드를 노출 시키지 않고 , 기능 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있지. 클래스 정의할 때 메소드랑 속성만 정의한 것을 인터페이스라고 부르는데 이게 추상화의 본질이라고 보면 돼!

Polymorphism (다형성)

Polymorphism이라는 단어의 poly는 "많은", 그리고 morph는 "형태"라는 뜻이야.
그러니깐 다양한 형태를 가질 수 있다는 말이겠지?

동물의 울음소리가 다른 것처럼 '소리를 내다' 라는 동일한 기능을 해도 각기 다른 방식으로 구현이 될 수 있다는 거겠지?

그래서 동일한 메소드에 대해 if/else 같은 조건문 대신에 객체의 특성에 맞게 달리 작성하는것이 가능해 졌고 이 다형 개념을 통해서 프로그램 안의 객체간의 관계를 좀 더 조직적으로 나타낼 수 있어
(같은 이름의 메소드가 여러클래스에서 다른 기능을 하는 것, 같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것 )

여기까지 OOP의 특징에 대해 알아봤는데.. 좀 더 공부해서 자세하게 쓸 수 있었으면 좋겠다.
현재로는 이게 나의 한계..😓

JavaScript에서 Prototype은 무엇이고 왜 사용해야 하는지?

JS객체 (prototype 기반의 언어)

자바스크립트는 Prototype 기반의 객체지향 언어야
class 기반의 객체지향 언어는 class를 정의하고 이를 통해 객체를 생성할 수 있지.
근데 prototype 기반의 객체지향 언어는 class 정의 없이도 객체를 생성할 수 있어
자바스크립트는 class가 없어도 클로저를 통해 캡슐화가 가능하고 prototype을 통해 상속이 가능했다구
(ES6부터는 class 키워드가 추가 되었지만 ..거 같이 편하게좀 씁시다~ 라고생각해서 추가된거겠지? ㅋㅋ) 하지만 문법이 추가가 된 것 뿐이지 자바스크립트가 클래스 기반으로 바뀐건 아니야! 오해금물!

prototype
자바스크립트의 모든 객체는 부모를 가지고 있고 또 연결되어있지, 이로인해 객체지향 프로그래밍의 상속 개념과 같이 부모의 속성과 메소드를 물려받아 사용할 수 있고, 또 자바스크립트의 거의 모든 객체가 Object의 인스턴스인데 일반적인 객체는 object.prototype에서 속성과 메소드를 상속받으면서 그 일부가 숨겨질 수도 있는거지

으 너무 어렵당...ㅎㅎ😥
이 이상으로 뇌에 집어넣기 힘드네..
일단 prototype에 대해서는 여기까지 정리!! 유튭이랑 자료를 좀더 읽어봐야겠어 😱
오늘 블로깅은 여기까지!

profile
Code의 美를 추구하는 개발자 🪞

0개의 댓글