[JS]OOP: Object Oriented Programming, 소프트웨어의 목적
오늘 마이크로 서비스의 비동기 통신방법인 메시지 서비스에 대해 공부했다. 서비스 간 결합을 loosely 하게 가져가면서 의존성을 낮출 수 있고 혁신의 가능성을 높여주기 때문에 굳이 메시지 서비스 단계를 아키텍처에 추가하는 것이라 보았다. 뭐 서비스 간 그렇게 한다는 이유는 이해했다. 그런데 이 의존성을 낮추는 행동은 소프트웨어 전반에 해당하는 궁극적 목표라고 들었다.
프런트엔드 개발자는 UI를 설계할 때, 컴포넌트화를 목표로 한다.
백엔드 개발자는 객체 지향 프로그래밍에서는 의존성 주입을 목표로 한다.
마이크로 서비스는 비동기 통신을 이용해 서비스 간 독립성을 부여한다.
OOP는 객체지향 프로그래밍이다. 정말 많이 들은 개념이지만, 잘 모르기에 이번 기회에 정리해보고자 한다.
먼저 보자
class Unit {
constructor(name, health, type){
this.name = name;
this.health = health;
this.type = type;
}
sayhello(){
return `hi, my name is ${this.name} and i'm ${this.type}`
}
}
const marine = new Unit("marine", 40, "terran") //Object 생성
console.log(marine.name) //property 접근
console.log(marine.sayhello()) //Method 호출
Unit이란 이름의 class를 선언한다.
그 안에 함수를 쓰는 방법과 동일하게 constructor를 쓰고 변수를 입력받는다.
각 변수들은 앞으로 생성될 Unit 클래스의 객체에 대한 속성(property)라고 할 수 있겠다.
클래스는 임의의 함수도 지정할 수 있다. 클래스 내의 함수를 메소드라 한다. Math.abs() 이런 것들도 다 클래스였던 것이다 ㄷㄷ;
이렇게 프로그래밍하면 property 접근, Method 호출이 너무너무 쉽다.
좀더 생각해보자
class Unit {
constructor(name, health){
this.name = name;
this.health = health;
}
sayhello(){
return `hi, my name is ${this.name} and i'm ${this.type}`
}
}
class Zerg extends Unit{
constructor(name, health){
super(name, health);
this.type = "Zerg";
}
getAttacked(){
return `got attacked ${this.health-5}`
}
}
const marine = new Unit("marine", 40)
const hydralisk = new Zerg("hydralisk", 60)
console.log(marine.name)
console.log(hydralisk.type)
console.log(hydralisk.getAttacked())
이것은 OOP에서 가장 중요한 상속의 개념이다.
extends를 통해 부모 클래스를 상속받고, super 메서드를 통해 부모 속성들을 상속받는 모습이 보인다.
가장 기본적인 예제를 통해 느낌만 알아보았고, 사실 가장 중요한 것은 OOP를 통해 무엇을 달성하고자 하냐는 것이다!
이렇게 데이터를 다루면 marine과 hydralisk와 같은 객체들을 더욱 쉽게 만들어낼 수 있고, 속성 간 복잡한 로직도 처리할 수 있다.
결국 데이터를 모듈화시켜 다루기 쉽게 만드는 것이 목표다. 마이크로 서비스도 목표는 같다. 의존성을 줄여가는 과정이 모든 소프트웨어에서 중요하다니 새삼 너무 신기하다.