[TIL] Js 객체 지향 프로그래밍

Jade·2022년 9월 21일
1

Today I learn

목록 보기
20/77
post-thumbnail

객체 지향 프로그래밍 발전 과정

순차적 프로그래밍 => 절차 지향 프로그래밍 => (구조체) => 객체 지향 프로그래밍


순차적 프로그래밍은 말 그대로 순서대로 작동하는 프로그래밍이다. 반복적인 동작이 필요할 때는 goto문을 이용해 특정 위치로 강제하는 방법을 사용했는데, 이 방법은 코드가 커질수록 흐름을 제어하기 힘들었다.

절차 지향 프로그래밍은 강제로 위치를 이동하는 게 아니라, 반복하는 코드를 따로 만들어두고 해당하는 함수를 호출하여 사용한다. 하지만 절차 지향 방식은 코드가 커질수록 사용해야 하는 전역 변수들이 많아졌고, 변수명들을 관리하는 데 어려움이 있었다.

객체 지향 프로그래밍은 의미 있는 단위들로 데이터를 구조화시키는 방법이다. (그래서 현실 세계를 기반으로 프로그래밍 모델들을 만들 때도 유용하다.) 작은 프로그램들이 독립적으로 돌아가는 형태인데, 절차 지향 프로그래밍과 달리 데이터와 기능을 한 곳에 묶어서 처리한다.

객체 지향 프로그래밍 : 하나의 청사진을 만들고, 청사진을 바탕으로 한 객체를 만드는 프로그래밍 패턴.

객체 지향 프로그래밍이라는 패러다임이 등장하면서 단순히 별개 변수와 함수로 순차적 작동하는 것을 넘어, 데이터 접근과 처리과정에 대한 모형을 만들어 내는 방식이 고안됨.

참고

객체지향이 무조건 좋은 방법이라기 보다는 하나의 프로그래밍 방법론 중 하나이고, 각 방법론의 장담점을 알고 상황에 맞는 방법론을 선택하면 됨. (ex: 메모리 관리가 중요할 때는 메모리를 적게 쓰는 절차지향, 사람들과의 협업이 필요할 때는 코드 이해가 쉬운 객체지향 사용)




java script 객체 지향 프로그래밍 관련 용어

아래 용어들은 js에서만 사용. 다른 객체 지향 프로그램에서 생성자 함수 정도만 보편적 개념임.

  • 클래스 : 어떤 모델을 만들기 위해 청사진을 만든 것
  • 인스턴스 : 청사진을 바탕으로 만든 객체. (인스턴스 객체)
function Phone(color){
};//클래스 

let Flip = new Phone('Yellow');
let iphonepro = new Phone ('steel');
let Fold = new Phone ('black');
//클래스로 만든 함수를 실행할 때 new 키워드를 사용.
//이는 새로운 인스턴스를 만드는 방법임. 
//즉시 생성자 함수가 실행되며, 변수에 클래스의 설계를 가진 새로운 객체, 인스턴스가 할당됨.
//각각의 인스턴스는 클래스의 고유한 속성과 매서드를 갖게 된다.
//ES6에서는 class라는 키워드 이용해 정의 한다.
class Phone{
	constructor(brand, name, color){
			this.brand = brand;
			this.name = name;
			this.color = color;
		}//생성자 함수는 return 값을 만들지 않음. 
		sendtextmessage(){
		}
		call(){
		}
	}//refuel(){}, drive(){}와 같이 작성된 부분이 매서드. 

//ES5에서는 프로토타입(prototype 키워드를 이용해야 매서드 정의할 수 있었음)

function Phone(brand, name, color){//생략}
	Car.prototype.sendtextmessage = function(){}
	Car.prototype.call = function(){}
  • constructor : 인스턴스 객체를 생성하고 초기화 할 때 실행하는 생성자 함수
    => 생성자 함수는 클래스 내에서 하나만 있을 수 있다.
    => 생성자 함수를 작성하지 않으면 기본생성자가 제공되며, 기본 클래스일 경우 기본 생성자는 비어있으며, 파생 클래스일 경우 기본 생성자는 부모 생성자를 부른다.
  • 속성 : 인스턴스 객체가 가지는 고유의 속성 (ex: 인스턴스로 핸드폰을 만들 때, 핸드폰의 이름, 생성일, 성능 등)
  • 매서드 : 객체에 딸린 함수 (ex: 핸드폰 끄기, 켜기, 핸드폰으로 전화 걸기)
  • prototype : 모델의 청사진을 만들 때 쓰는 원형 객체 (ES5에서 사용)
  • this : 함수가 실행될 때마다 해당 스코프마다 생성되는 고유한 실행.




객체 지향 언어

  • 절차 지향 언어 : C, 포트란
  • 객체 지향 언어 : Java, C++, C#
  • Js는 객체 지향으로 작성 가능.




객체 지향 프로그래밍 주요 개념

  • Encapsulation(캡슐화)

    • 데이터와 기능을 하나의 단위로 묶는 것.

    • 은닉(hiding) : 디테일한 구현, 데이터는 숨기고, 객체 외부에서 필요한 동작(매서드)만 노출시킴.

      ⇒ 객체 내 매서드 구현만 수정하고, 노출된 매서드를 사용하는 코드 흐름은 바뀌지 않게 만들 수 있음.

      (절차적 코드는 데이터 형태가 바뀔 때 코드 흐름에 큰 영향을 미치게 되어 유지 보수 어려움)

    • 느슨한 결합(Loose Coupling): 코드 실행 순서에 따라 절차적으로 코드 작성하는 게 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것 의미.

      ⇒ 느슨한 결합은 언제든  구현을 수정할 수 있다는 장점이 있다.

      “캡슐화는 코드가 복잡하지 않게 만들고, 재사용성 높임”


  • Inheritance (상속)
    • 부모 클래스 특징을 자식 클래스가 물려 받는 것. or ‘기본 클래스의 특징을 파생 클래스가 상속 받는 것.’

      ex: 사람이라는 클래스의 속성을 학생이라는 클래스를 작성 할 때 상속 받을 수 있다. 학생은 추가적으로 학습 내용, 공부하다와 같은 속성과 매서드를 추가할 수 있다.

      “상속은 불필요한 코드 줄여 재사용성 높임”

  • Abstraction (추상화)
    • 내부 구현은 복잡하지만, 실제로 노출되는 부분은 단순하게 만든다는 개념.

    • 너무 많은 기능들이 노출되지 않은 덕분에 예기치 못한 사용상의 변화가 일어나지 않도록 만들 수 있음.

    • 인터페이스 : 클래스 정의 시, 매서드와 속성만 정의한 것. 추상화를 통해 인터페이스가 단순해질 수 있다.

      “추상화는 코드 복잡하지 않게 하고, 단순화된 사용으로 변화에 대한 영향 최소화”


  • Polymorphism (다형성)
    • 똑같은 매서드라고 하더라도 객체에 따라 다양한 형태를 가질 수 있다.

      ex: 부모 클래스에서 만들어진 render라는 이름을 가진 매서드가 모양을 그리고 화면에 뿌리는 역할을 할 때, 상속 받은 자식 요소들에서 render가 작동하는 방식이 조금씩 다를 수 있다.

      “다형성으로 인해 동일 매서드에 대해 if/else if와 같은 조건문 대신 객체 특성에 맞게 달리 작성하는 것 가능해짐”

profile
키보드로 그려내는 일

0개의 댓글