본문 바로가기
프로그래밍

(191116) 객체지향 프로그래밍(OOP) - (1)

by 양털의매력 2019. 11. 14.

프로그래밍 언어의 3가지 종류

- Machine Languages : 기계어, 0과 1로 조합된 native한 컴퓨터의 언어 → 코딩하기 매우 어려움!!

 

- Assembly Languages: 어셈블리어, 기초적이고 제한적인 명령어들이 있음, CPU 계열에 따라 정해져있음

→ 컴퓨터에서 처리하기전에 기계어로 변환되어야함

 

- High-Level Languages (Low-Level 과 비교해서) : 어셈블리어로 특정 언어를 만든 것이 우리가 흔히 사용하는 프로그래밍 언어

→ C는 어셈블리어와 매우 가까운 언어로 볼 수 있음

 

high-level 언어(컴파일언어) (컴파일러) 어셈블리어 (어셈블러) 기계어

 

high로 갈수록 flex, portable 하고 low로 갈수록 실행속도가 빠르고 코드가 압축적이고, 특정 machine에 종속적

 

High-Level 언어의 2가지 종류

- Procedural languages (절차지향적 언어)

프로그램안에 함수든, attribute 등 한번에 묶여져 있음

특징 : sequential set of linear commands, focus on 'structure'

 

대표적인 언어 : C, COBOL, Fortran ...

 

 

- Object-Oriented languages (OOP, 객체지향적 언어)

모든 것이 객체로 이루어져 있음, class 사용 (blueprints) → object 생성 

특징 : 객체안에 property와 method

 

대표적인 언어 : java, C++, python, php, javascript, ruby ....

 

자바스크립트 → 초기에는 아니였지만 객체지향적으로

 

Class 와 objects

class : blueprints, 즉 prototype (객체를 만들기 위한 청사진!!), 객체를 만들기 위한 'constructor'를 가지고 있음

              → attributes or properties / methods 를 class에 정의

 

object : instance of a class

 

OOP의 기본적인 4가지 concepts

1. Encapsulation (캡슐화)

property나 method를 class안에 캡슐화

// encapsulation 하기 전

 let baseSalary = 30000;
 let overtime = 10;
 let rate = 20;

 function getWage(baseSalary, overtime, ratr) {
   return baseSalary * (overtime * rate)
 }
 
// encapsulation 화

 let employee = {
   baseSalary : 30000,
   overtime : 10,
   rate : 20,
   getWage : function () {
     return this.baseSalary * (this.overtime * this.rate)
   }
 };
  
 emoloyee.getWage();
 

예를들어 많은 employee가 있을 때 캡슐화를 하지 않으면 baseSalary나 이런 것들을 일일히 전부 사람마다 할당해줘야하지만 캡슐화를 통해 그러지 않아도 됨

 

또한 해당 객체 내의 함수에 의해서만 데이터에 접근이 가능하기 때문에 정보 은닉이 가능

-> 정보 은닉을 통하여 데이터의 보호, 데이터의 높은 응집도와 낮은 결합도를 유지할 수 있다 -> 설계 변경에 유연하게 대처 가능

 

2. Inheritance (상속)

상위개념, 즉 부모(base class)의 특징을 하위개념, 즉 자식(derive class)이 물려받음

// 상속의 예

 class Convertible {
   // Key(private)
   // speed : 155
   // weight : 1600kg
   // engine : ~
 }

 class Roadster extends Convertible {
   // speed : 165
   // weight : 1500kg
 }
 

roadster는 convertible의 속성 등을 그대로 상속을 받지만 예를들어 speed나 무게 등이 바뀔 수 있다.

 

상속을 통하여 

- 코드의 재사용을 증대 시킬 수 있다. 같은 기능을 또 구현하지 않아도 됨

- 상속 받은 개체에 추가적인 기능을 구현함으로써 폭넓게 사용할 수 있다.

 

 

3. Abstraction (추상화)

어떤 구체적인 개체들의 공통적인 특징(속성과 기능)을 파악해서 class에 구현하고 각 개체별(instance)로 구체화시켜 나가는 것

구체적인 개념에만 의존하여 만들 경우에는 새로운 개체마다 계속하여 추가하여야 하지만 추상화를 하면 그럴 필요가 없고

설계를 유연하게 변경할 수 있다.

 

 

 

4. Polymorphism (다형성)

약간 다른 방법으로 일을 하는 함수를 동일한 이름으로 호출하는 것

 

예를들어 모든 HTML의 모든 tag는 HTMLElement를 부모로 가지고 있고, tag들은 render가 되어야 하므로 render()함수가 필요하다. 그러면 이 render 함수를 각 tag에 일일히 정의해주는 것이 아니라 (상속의 개념과 엮어서) HTMLElement에서 render를 정의해주면 각 tag에서 상속을 받고 각 자 자기만의 방식으로 tag를 render한다.

 

 

(2) 편과 (3)편으로 이어집니다.

댓글