Programming/Java Script

[JS] JS와 OOP[객체지향 프로그래밍]

감귤밭호지차 2023. 3. 15. 11:16

 

🔖 JS는 객체지향 프로그래밍 언어인가? 

JS가 태어난 1955년에는 HTML페이지를 동적으로 만드는 것이 목적이었던 언어였기 때문에 시작은 '인터프리터 언어' 였습니다. 

이후 2009년 구글은 JS의 V8엔진을 출시하고 획기적으로 발전했으며, ES6과 Node.js의 등장으로 JS는 단순 '인터프리터 언어' 가 아닌 '객체지향 언어'에 도달했다고 보는 시각이 많아졌다고 합니다. 

* 물론 JS을 객체 지향으로 작성 가능했었음. 

 

# 컴파일언어

고급 언어(프로그래밍 코드) → compile → 저급 언어(기계어)

> 인터프리팅 방식보다 빠름. 

 

# 인터프리터언어

JS 엔진 내부에서 실행 중 컴파일이 필요한 경우에 내부에서 컴파일 

 

🔹JavaScript, 인터프리터 언어일까?

 

 

 

🔖 객체지향의 주요 특징 4 가지 

# 캡슐화 ( Encapsulation ) 

공통된 부분을 은닉해버림으로써 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것.

느슨한 결합(Loose Coupuling)에 유리 = 언제든지 구현을 수정할 수 있음. *결합도는 약할 수록 좋음 

 

>> 은닉화(private 키워드)

- JAVA/TypeScript에서 클래스 내부에서만 쓰이는 속성/메서드 구분을 위해 [key] 앞에 ' private ' 키워드 사용 

   * 순수 JS에서는 이 기능을 지원해주는 브라우저가 적어서 잘 사용되지 않음. 

- JS에서 은닉화를 위해 보통은 클로저 모듈 패턴  을 사용 . 

# 클로저 모듈 패턴 : 함수 안에서 객레를 return 
function makeFunc () {
	let value = 0; 
    return {
    	increase: function(){
        	value++;
        },
        decrease: function(){
        	value--;
        },
        multiply: function(){
        	value = value*value;
        },
        currValue: function(){
			return value;
        }
    }
};

let result_1 = makeFunc()
result_1.increase();  //1
result_1.increase();  //2
result_1.multiply();  //4
result_1.currValue(); //4

let result_2 = makeFunc()
result_2.increase();  //1
result_2.increase();  //2
result_2.decrease();  //1
result_2.currValue(); //1​

 

 

- 클래스 인스턴스 형태로 만들 때에는 ES2019부터 # (해쉬)키워드 사용. 

class ClassHide {
	#privateField
    // 이 안에서만 접근 가능 
}

class Class_Method_Hide {
	#privateMethod(){
    	return 'hellow world';
    }
    //이 안에서만 접근 가능
}

 

 

  : MDN_Private class fields

 

 

 

 

# 상속 ( Inheritance )

 말 그대로 부모의 속성을 자녀가 상속받아서 사용할 수 있음 + 자녀만의 메서드/속성을 추가로 구현할 수 있음.

 

# 추상화 ( Abstraction )

 실제 노출되는 부분은 단순하게 만들기 : 인터페이스 ( 메서드와 속성만 정의한 부분 )

- JAVA/TypeScript에서는 interface 기능 구현되어있으나, JS에는 존재하지 않음. 

- API 는 인터페이스 사용의 대표적인 예. 

 

 

# 다형성 ( Polymorphism )

 포유류 ⊃ 인간, 새, 고양이, 강아지 

  비슷한 애들을 한 군데로 몰아서 묶는 느낌. 

 

 

 

 

🔖 OOP의 장점 

- [캡슐화] 코드가 복잡하지 않고 재사용성을 높여줌

- [추상화] 단순화된 사용으로 변화(오류)에 대한 영향을 최소화

- [상속] 불필요한 코드를 줄여 재사용성 높여줌 

- [다형성] 동일한 메서드에 대해 무분별한 조건문의 남발을 감소시키고 객체 특성에 맞게 작성 가능 

* 코드의 공통성을 줄이고 공유성을 늘리는 것