새로운 시작 다시 시작.. 기수이동을 했다. 지난 섹션에서 부족했던 내용을 보충하고 공부 방식을 바꾸어야겠다. 많이 조급했고 조급한만큼 오히려 마음만 급하고 마음이 힘들었다. 아무리 모르는게 많아도, 할것이 너무 많아도 여유를 가지고 꼼꼼하게 찾아보고 생각해보는 시간을 가져야겠다. 상담을 신청했고 상담해주신 분의 말씀해주신 것을 토대로 결심을 적어보았다.
초기의 프로그래밍 언어는 일반적으로 절차적 언어라고 부름 (C, 포트란 등)
절차적 언어는 순차적인 명령의 조합
"클래스"라고 부르는 데이터 모델의 청사진을 사용해 코드 작성
현대의 언어들은 대부분 객체 지향의 특징을 갖고 있음 (대표적으로 Java, C++, C#등)
JavaScript: 객체 지향으로 작성 가능
객체 지향 프로그래밍이라는 패러다임이 등장하면서, 단순히 별개의 변수와 함수로 순차적으로 작동하는 것을 넘어, 데이터의 접근과, 데이터의 처리 과정에 대한 모형을 만들어 내는 방식을 고안해냈다. 따라서, 데이터와 기능이 별개로 취급되지 않고, 한번에 묶어서 처리할 수 있게 되었다. 이러한 객체 지향의 특징은 빠르게 현대 언어에 적용이 되었다. 자바스크립트는 엄밀히 말해 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있다.
OOP는 프로그램 설계 철학이다.
OOP의 모든 것은 "객체"로 그룹화 된다.
OOP의 4가지 주요 개념을 통해 재사용성을 얻을 수 있다.
클래스와 인스턴스
클래스는 일종의 원형으로 객체를 생성하기 위한 아이디어나 청사진이다.
인스턴스는 클래스의 사례이다.
클래스는 객체를 만들기 위한 생성자 함수를 포함한다. (constructor)
객체 지향 프로그래밍의 컨셉
객체 지향 프로그래밍은 크게 네가지 기본적인 컨셉이 있다.
데이터와 기능을 하나의 단위로 묶는 것
은닉: 구현은 숨기고, 동작은 노출시킴
느슨한 결합에 유리: 언제든 구현을 수정할 수 있음
느슨한 결합은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다. 마우스 구동을 위한 코드 작성을 예로 들자면 스위치가 눌리고, 전기 신호가 생겨서, 전선을 타고 흐르고.. 와 같은 전 과정을 이곳 저곳에 나누어 작성하는 것이 아니라, 마우스의 상태를 속성으로 정하고 클릭, 이동을 메소드로 정해서 코드만 보고도 인스턴스 객체의 기능을 상상할 수 있게 작성하는 것이 느슨한 결합을 추구하는 코드 작성법이다.
추상화는 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념이다. 예를 들어 전화라는 객체가 있다면, 그 안에는 스피커와 마이크가 존재하고, 서킷 보드 등이 존재하는 등 내부 구현이 되어 있겠지만 실제로 우리가 사용할 때에는, 이러한 존재에 대해서는 생각하지 않고 단순히 수화기를 들고 버튼을 눌러서 해결하는 것으로 인터페이스를 단순화할 수 있다.
추상화는 캡슐화와 비교해서 종종 헷갈려하는 개념 중 하나인데 캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면, 추상화는 클래스를 사용하는 사람이 필요하지 않은 메소드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있다. 클래스 정의 시, 메소드와 속성만 정의한 것을 인터페이스라고 부른다. 이것이 추상화의 본질이다.
상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것이다. 예를 들어, 사람이라는 클래스가 있다고 가정해본다면 사람은 기본적으로 이름과 성별, 나이와 같은 속성, 그리고 먹다, 자다 등과 같은 메소드가 있다고 볼 수 있다. 추가적으로 학생이라는 클래스를 작성한다고 했을때 이 때 앞서 사람 클래스의 속성과 메소드를 재구현한다면 비효율적일 것이다. 학생의 본질은 결국 사람이므로, 상속을 이용하여 학생 클래스는 사람 클래스를 상속받을 수 있다. 학생은 추가적으로 학습 내용, 공부하다와 같은 속성/메소드를 추가할 뿐이다.
Polymorphism이라는 단어의 poly는 "많은", 그리고 morph는 "형태"라는 뜻을 가지고 있다. 즉 "다양한 형태"를 가질 수 있다는 말이다. "말하다"라는 동작의 본질은 "입으로 소리를 내다"를 의미하지만 각기 다른 동물들이 "말할 때" 제각각의 소리를 내는 것처럼, 객체 역시 똑같은 메소드라 하더라도, 다른 방식으로 구현될 수 있다. HTML 엘리먼트를 예로 들어 설명해면 앞서 DOM을 배울 때 Textarea(TextBox), Select, 그리고 Checkbox 등 HTML에서는 이와 같이 모든 요소를 전부 Element라고 부른다.
엘리먼트를 직접 구현한다고 생각해본다면 모든 엘리먼트들은 전부 객체이므로, 내부적으로 모양을 그리고 화면에 뿌리는 메소드가 존재할 것이다. 이 메소드가 render라는 이름을 갖고 있다고 가정해보자. 이 경우에는, TextBox, Select, Checkbox의 공통의 부모인 HTML Element라는 클래스에 render라는 메소드를 만들고 상속을 받게 만들 수 있다. 그런데 다형성의 핵심은 이 같은 이름의 render 라는 메소드가 조금씩 다르게 작동한다는 데 있다. TextBox는 가로로 긴 네모 상자와 커서가 있는 형태일 것이고, Select 박스는 눌렀을 때 선택지가 나오도록 화면에 그려야 할 것이다. 이처럼 같은 이름을 가진 메소드라도 조금씩 다르게 작동한다. 이것이 바로 다형성이다. 만일 언어 자체에서 다형성을 제공하지 않는다면, 기본(부모) 클래스에 종류별로 분기를 시켜서 하나하나 다르게 만들어야 할 것이다. 또는 각각의 자식 클래스의 별도의 각기 다른 render 함수를 만들 수도 있겠지만, 엘리먼트라는 클래스의 본질상 "화면에 뿌린다"(render)는 개념은 부모가 갖고 있는 것이 합리적이다.
잘 안 풀리더라도 스스로 문제를 꼭 해결해보자.
깃헙 잔디 키우기 해볼 것 !