현실세계의 사물들을 객체라고 보고 그 객체로부터 개발하고자 하는 앱에 필요한 특징들을 가져와 프로그래밍 하는 것이다. 클래스의 사용이 추상화의 예로 볼 수 있다.
객체의 세부 내용을 외부에 은폐하여 객체간 결합도가 낮다. 외부객체의 직접 개입이 불가능하여 유지보수와 소프트웨어 확장에 용이하다.
하나의 객체가 작업을 할 때 속성(변수)에 따라 여러가지 형태를 가질 수 있는 능력을 말한다.
정의된 상위 클래스의 모든 속성과 메소드를 하위 클래스가 물려받는 것을 말한다. 하위 클래스에서 다시 재정의할 필요 없이 사용할 수 있다. 재사용성을 증대시킨다.
클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.
확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.
// 순수하지 않습니다 (반환값 없이 부가 효과를 이용하고 있습니다)
function addTaco(array) {
array.push("taco");
}
// 순수하지 않습니다 (인자 대신 공유 변수를 이용하고 있습니다)
function addTaco() {
return [...globalArray, "taco"];
}
// 순수합니다
function addTaco(array) {
return [...array, "taco"];
}
javaScript에서 모든 원시 자료형(string, boolean)은 불변하다. 객체나 배열 등은 불변하진 않지만, 마치 그런 것처럼 다룰 수 있다.
객체나 배열이 만들어진 후에 수정하지 않아야 하며, 이런 불변 데이터는 스레드로부터 안전하고 오류에 대해 국소적이다.
const array = [1,2,3]
array.push(4) // 가변성
const array = [1,2,3]
const newArray = [...array, 4]//불변성
명령형 패턴: 구현 방법이나 과정을 중시한다.(외부효과도 일어나고 있다.)
let array = [1,2,3]
for(let i = 0; i < array.length; i++){
array[i] *= 2
}
선언형 패턴: 일련의 선언으로 구성된다.(외부효과도 없다.)
let array = [1,2,3]
let newArray = array.map(num=> num*2)
여러 인자를 받는 함수에 일부 인자만 넣어서 나머지 인자를 받는 다른 함수를 만들어낼 수 있는 방법
커링은 함수 하나가 n개의 인자를 받는 과정을 n개의 함수로 각각의 인자를 받도록 하는 것이다. 부분적으로 적용된 함수를 체인으로 계속 생성해 결과적으로 값을 처리하도록 하는 것이 그 본질이다.
function greet(greeting){
return function(name){
console.log(greeting + , ", " + name);
}
}
const calcWith2 = (op)=>(num)=>op(2,num)
const add = (num1, num2) => num1+num2
const multiply = (num1, num2) => num1 * num2
const add2 = calcWith2(add)
const multiply2 = calcWith2(multiply)
add2(3)// 5
//add2(3)은 다음과 같이 함수의 선언으로 이루어저 있다.
calcWith2(add)
(add)=>(3)=>add(2,3)
(add)=>(3)=>(2,3)=> 2+3
5
multiply2(3)// 6
//multiply2(3)은 다음과 같이 함수의 선언으로 이루어저 있다.
calcWith2(multiply)
(multiply)=>(3)=>multiply(2,3)
(multiply)=>(3)=>(2,3)=> 2*3
6