Predicting Clinical Outcomes in Colorectal Cancer Using Machine Learning

Paper Information.

  • YEAR : 2018
  • AUTHOR : Julian GRUNDNER 외 6명
  • JOURNAL : Studies in Health Technology and Informatics


Abstract

  유전자 마커 및 각종 환자들의 특징을 사용하면 임상 의사 결정 능력을 향상시키고 예후 정확도를 높일 수 있습니다. 본 연구에서는 정상, 생존, 화학 항암 요법, 재발을 비롯한 임상 관련 결과에 대해 대량의 대장암 환자 데이터셋을 기반으로 랜덤 포레스트, 선형 모델, 신경망과 같은 기계 학습 방법들을 사용하여 예측 모델을 훈련시킵니다. 가장 성공적인 예측 모델은 재발과 radio-chemotherapy response에서 였고, 정확도는 각각 0.71과 0.70이였습니다. 생존 및 정상에 관한 가장 좋은 예측 모델은 C-Index 점수로 각각 0.86과 0.76이었습니다. 


Method / Result

  데이터는 Erlangen 대학 병원에서 종양 절제술을 받은 564명의 대장암 환자들을 대상으로 하였습니다. 환자들 중 254명은 직장암 환자이고 나머지는 대장암 환자입니다. 나이는 24세에서 97세 사이로 평균 나이는 67세였습니다.

  모든 모델은 동일한 프로세스가 적용되었습니다. 1. 데이터 준비부터 각 에측 모델에 대해 가장 유용한 특징을 선별하였습니다. 2. 특징 선택 후 생존 결과는 일반 선형 모델, coxph, rfsrc 방법을 사용하여 예측하였습니다. 3. non-survival model 혹은 고전 분류 모형은 k-NN, 신경망, 의사 결정 나무, 랜덤 포레스트, DNN을 사용하여 훈련되었습니다. 최상의 모델은 아래에 설명된 성능 측정에 따라 추출되었습니다. 4. 오버 피팅을 방지하기 위해 모델 구축 프로세스 이전에 별도로 분리된 테스트 데이터를 사용하여 모델을 평가했습니다. 5. 특징 추출을 위해 임상 전문가의 의견을 통해 예측에 영향을 줄 수 있는 특징 그룹을 선별하였습니다. 6. 유전자 발현 데이터를 사용하여 모든 예측 모델을 생성하고 이러한 단계를 반복하여 추가 특징 그룹을 계속적으로 추가했습니다. 


1. ML Model Performance all Stages

  일반적인 선형 모델은 테스트 데이터에서 C-Index 점수가 0.76, 0.87인 DFS와 생존율을 예측하는 데 가장 좋은 성능을 보였습니다. DFS 모델은 특징으로 Gene, Localization, Epidemiology, Cancer Type, Tumor Stage을 사용하였고, Survival 모델은 Gene과 Localization을 사용하였습니다. RCT-TR 모델을 가장 잘 예측한 모델은 Gene을 이용한 의사 결정 트리로 Specificity는 0.85, Accuracy는 0.70의 정확도를 달성했습니다. 재발 결과는 일반 선형 모델에서 Gene, Localization, Epidemiology, Cancer Type, Tumor Stage의 특징을 사용하여 0.71의 정확도로 예측할 수 있었습니다. 


2. ML Model Performance Cancer Stage II and III

  대장암 2기와 3기 환자는 임상의가 가장 많이 개입할 수 있는 환자군입니다. 본 연구에서는 Gene, Localization 특징을 기반으로 DFS SII를 coxph 를 통해 예측했습니다. 모델의 C-Index는 1회 훈련 했을 때 0.83이였습니다. Gene, Localization, Epidemiology, Cancer Type 특징을 사용하는 일반 선형 기법은 Youden Index가 0.7인 Relapse SII를 예측했습니다. 

  



Application of Support Vector Machine in cancer diagnosis



Paper Information.

  • YEAR : 2010
  • AUTHOR : Hui Wang 외 1명
  • JOURNAL : Medical Oncology / SCIE


Abstract

  본 연구에서는 암 진단을 위해 SVM 모델을 사용한 종양 마커 검출의 임상적 적용과 관련된 내용을 기술합니다. 대장암, 위암, 폐암에 대한 종양 표지 검사(TM) 결과 데이터를 수집하였습니다. 해당 데이터를 사용하여 최상의 커널 기능을 가진 SVM 모델을 만들고 교차 검증을 통해 검증하였습니다. SVM의 매개변수를 최적화하기 위해 그리드 탐색 및 교차 검증 방법을 사용하였습니다. 분류를 위해 병합 진단 테스트, 로지스틱 회귀 분석, 의사 결정 트리와 같은 분류기를 사용했습니다. 성능 평가를 위해 Sensitivity, Specialty, Youden Index[각주:1], Accuracy 지표를 사용하였습니다. Leave-one-out CV(LOOCV) 방법을 사용하여 테스트를 진행했습니다. 결과적으로 4개의 분류기의 정확도는 75.8, 76.6, 83.1, 96.0% 였고, 위암으로 분류된 4개의 분류기의 정확도는 45.7, 64.5, 63.7, 91.7% 였습니다. 폐암의 경우 71.9, 68.6, 75.2, 97.5%였습니다. 3개의 암 데이터에서 SVM이 모두 좋은 성능을 나타냈습니다. 


Method / Result

  중국 상하이에 위치한 'Rengi Hospital'에서 데이터를 확보하였습니다. 데이터는 2005년 1월부터 6월까지의 종양 표지 검사 데이터를 활용하였습니다. Fig. 1과 같이 대장암 데이터는 총 159명, 위암은 567명, 폐암은 214명의 데이터를 활용하여 진행하였습니다. SVM 모델은 LIBSVM 소프트웨어를 활용하여 제작했습니다. 모든 실험에서 3가지 종류의 커널 함수(선형, RBF, 시그모이드)를 사용하였습니다. 이후, 5-fold Cross Validation을 통해 테스트를 진행했습니다. 

  분석은 SPSS 16.0 Version을 사용하여 진행하였고, Kolmogorov-Sminov(K-S) 방법으로 종양 마커의 농도 분포를 테스트했습니다. 로지스틱 회귀 분석은 SPSS를 기반으로 테스트 되었습니다.

< Fig. 1. Distribution of Samples >



  3종류의 SVM 커널 함수의 성능을 비교하였습니다. 커널 기능을 가진 SVM은 6개의 데이터 세트로 테스트 되었고, 데이터 세트에서 RBF 커널 기반의 SVM 모델이 가장 성능이 높게 측정되었습니다. 
 

< Fig. 2. The Accuracy Comparison of SVM with Different Kernel function in six datasets >


  의사 결정 나무, 로지스틱 회귀 분석과 같은 분류기의 성능은 Fig. 3에 제시되어 있습니다. 모든 데이터 세트에서 SVM이 우수한 성능을 나타냈습니다.

< Fig. 3. Comparison of Classification Performance of the Classifiers >


Summary

  1. 암 진단을 위해 SVM 모델을 사용하였고, 데이터는 대장암, 위암, 폐암 환자 데이터를 사용하였습니다.

  2. SVM 모델에서 선형, RBF, 시그모이드 커널을 사용하였고, RBF 커널이 가장 좋은 성능을 나타냈습니다.

  3. 기존의 전형적인 분류 모델들과 비교하여 SVM이 가장 우수한 성능을 나타냈습니다. 


  1. Youden Index : ROC 커브의 각 점에서 기울기가 1인 직선을 그렸을 때 y절편이 가장 큰 값 [본문으로]


Machine learning applications in cancer prognosis and prediction




Paper Information.

  • YEAR : 2014
  • AUTHOR : Konstantina Kourou 외 4명
  • JOURNAL : Computational and Sturctural Biotechnology


Abstract

  암 연구에서 암 유형의 조기 진단 및 환자의 예후 파악은 환자들의 임상 관리를 용이하게 할 수 있다는 점에서 필요성이 증대되고 있습니다. 암 환자를 고위험, 저위험군으로 분류하기 위해 ANN, BN, SVM, DT와 같은 다양한 머신러닝 방법을 사용하였습니다. 머신러닝의 사용이 암 진행도에 대한 이해를 향상시키는 것은 분명하지만 분명한 검증이 필요합니다. 따라서 본 연구에서는 암 진행률을 예측하기 위해 사용되는 다양한 머신러닝 접근법에 대해 분석하였습니다. 


ML and Cancer Prediction / Prognosis

  과거에는 의사가 사용하는 정보만이 암 예측을 위한 중요한 요소로 인식되었습니다. 가족력, 나이, 식이, 체중 등은 암 발병 예측에 중요한 역할을 하지만 이러한 유형은 거시적인 정보들은 보다 크리티컬하고 구체적인 결정을 내리기에는 부족합니다. 따라서 엄청난 양의 데이터를 기반으로 머신러닝 기법을 적용하여 암 예후, 예측에 연관되는 많은 요소들을 찾는 것이 중요해졌습니다.


Prediction of Cancer Susceptibility

  최근 5년 간의 Scopus와 PubMed 검색을 통해 최근 머신러닝 기법이 암 예측/예후에 어떻게 적용되는지 찾아보았습니다. 아래의 Fig. 1은 다양한 결과들 중 하나의 카테고리로서 '다양한 암 유형에서의 감수성 예측을 위한 머신러닝 기법'과 관련된 문헌들입니다. 첫번째 문헌은 유방암 환자의 위험도를 평가하기 위해 ANN 기법을 활용했습니다. ANN은 종양의 양성, 음성 여부를 판단하기 위해 사용되었습니다. 그 과정에서 성능 평가를 위해 10-fold cross validation을 사용했습니다. 해당 모델의 AUC는 0.965으로 우수한 성능을 보였습니다.

< Fig. 1. Publications relevant to ML methods used for cancer susceptibility prediction >


Prediction of Cancer Recurrence

  머신러닝 기반의 암 재발 예측과 관련된 문헌들을 조사하였습니다. 관련 문헌 중 하나로 구경 편평 세포암(OSCC)의 재발 예측을 연구하는 연구가 제안되었습니다. 해당 연구에서는 이기종 데이터 소스(임상, 영상 및 유전체)를 활용하였습니다. 데이터의 특징 추출을 위해 CFS와 Wrapper 방법을 사용하였습니다. 특징 추출 이후 가장 중요한 특징들은 종양 확장 여부, 림프절 수, 유전자로는 SOD2, TCAM, OXCT2 였습니다. 이후 분류를 위해 BN, ANN, SVM, DT, RF 알고리즘을 사용하였고, BN이 가장 우수한 성능을 보였습니다.

< Fig. 2. Publications relevant to ML methods used for cancer recurrence prediction >


Prediction of Cancer Survival 

  유방암 진단을 받은 여성의 생존율을 평가하기 위한 예측 모델이 개발되었지만 파라미터의 변화에 따라 결과가 크게 달라짐을 확인하였습니다. 가장 유익한 특징들로는 종양 크기, 노드 수 및 나이가 있었습니다. ANN, SVM, SSL의 3가지 머신러닝 모델을 적용했을 때 SSL 알고리즘이 가장 높은 성능을 나타냈습니다.   


Summary

  본 연구는 암 예후/예측에서 머신러닝 기법이 어떤식으로 적용되는지, 어떠한 알고리즘들이 사용되는지를 메타 분석한 논문이라고 할 수 있습니다.

  1. 해당 논문에서는 크게 3가지 카테고리로 최근 논문의 동향을 분석하였습니다. (암 감수성, 재발 가능성, 생존율 예측)

  2. 암 예측/예후와 관련된 최근 연구 동향을 개괄적으로 설명하였고, 최근 제안된 대부분의 연구들은 지도학습 기반의 머신러닝 방법과 질병 결과를 예측하기 위한 분류 알고리즘을 사용하였습니다.

  3. 또한, 특징 선택 방법에 따라 정확도가 달라지는 것을 다양한 논문들을 통해 확인할 수 있었습니다.



Deep learning based tissue analysis predicts outcome in colorectal cancer



Paper Information.

  • YEAR : 2018
  • AUTHOR : Dmitrii BychKov 외 9명
  • JOURNAL : Nature (Scientific Reports) / SCI


Abstract

  이미지 기반의 머신러닝 & 딥러닝은 최근 의학 이미지 분류 분야에서  전문가 수준의 정확도를 보여주었습니다. 본 연구에서는 CNN과 반복적인 아키텍쳐의 결합으로 종양 조직 샘플 이미지의 대장암 결과를 예측합니다. 이를 통해 알려진, 알려지지 않은 예후 정보를 추출할 수 있습니다. 
 
  본 연구에서는 대장암 환자 420명의 종양 조직(TMA) 샘플 데이터를 사용하였습니다. 결과적으로, 작은 조직 영역 만을 사용하는 딥러닝 학습 기반 예측이 저위험군, 고위험군에 대해 TMA지점과 전체 이미지 분류에서 사람이 수행한 결과보다 더 우수하다는 것을 나타내었습니다. 이는 최신 딥러닝 기법이 경험이 풍부한 인간보다 직∙결장암의 조직으로부터 더 많은 예후 정보를 추출할 수 있음을 시사하고 있습니다. 결과 예측은 효과적인 치료법을 제시하기 위한 보조 요법의 선택과 같은 임상 의사 결정을 돕는데 결정적으로 사용될 수 있습니다.


Method / Results

  본 연구에서는 직∙결장암 샘플의 디지털화 된 현미경 이미지의 자동 분석을 위해 대장암 환자 420명에 대한 H&E로 염색된 TMA 이미지 데이터를 사용하였습니다. TMA의 RGB 이미지를 1mm 크기의 타일로 분류한 것을 입력으로 사용하였고, CNN을 통해 고차원의 특징 벡터를 추출하였습니다. 여기에서 CNN은 ImageNet 데이터셋에 의해 사전 교육된 VGG-1634을 사용하였습니다. 이후, LSTM 알고리즘을 반복적으로 사용하여 통해 향후 5년 동안의 생존률을 예측하였습니다. LSTM 모델의 성능은 기존의 머신 러닝 분류기인 SVM, 로지스틱 회귀분석, 나이브 베이지안 알고리즘과 비교하였습니다. (*LSTM을 반복적으로 사용한 이유는 임의의 수의 이미지 타일을 처리할 수 있으며, 특정 이미지 타일을 처리할 수 있기 때문입니다.)

< Fig. 1. Overview of the Image Analysis Model >


환자들은 LSTM 모델, histologic grade, Visual Risk Score와 같은 큰 카테고리 안에서 저위험군고위험군으로 분류되었습니다. 

  • Histological Grade (Clinical) : 285 / 135

  • Visual Risk Score (Pathologic) : 185 / 191

  • New one (CNN + LSTM) : 210 / 210


< Fig. 2. Clinicopathological Variables >


 본 연구에서 제안하는 모델의 정확도와 기존 임상 예측자의 시각적 평가 결과를 비교하기 위해 Kaplan-Meier 방법을 사용하여 생존 곡선을 계산하였습니다. 결과적으로 LSTM 모델이 histologic grade와 Visual Risk Score 보다 더 좋은 정확도를 나타내는 것을 확인할 수 있었습니다. 

 

< Fig. 3. Comparison of the Survival Ratio >


 또한, 다른 이미지 해상도에서의 분류 성능을 비교하기 위해 SVM, Logistic, Navie Bayes, LSTM 네 가지 알고리즘을 사용하였습니다. 이미지 해상도는 높음, 중간, 낮음과 같이 분류되었습니다. 본 연구에서 개발한 CNN + LSTM 모델은 고해상도 이미지에서 최상의 성능을 제공하는 것을 확인할 수 있었습니다.

< Fig. 4. Predictive Performance of Four Classifiers on images of TMA image resolutions >


Summary

  본 연구는 아래와 같은 순서로 다음과 같은 결과를 나타내었습니다.

  1. 420명의 대장암 환자의 TMA 이미지를 CNN으로 훈련하기 위해 작은 타일 형태로 변환하였습니다.

  2. 변환된 이미지는 CNN의 VGG-1634 모델을 통해 훈련되었으며, 이를 통해 특징 벡터를 추출합니다.

  3. Kaplan - Meier 방법을 통해 CNN + LSTM 모델, Histological Grade, Visual Risk Score의 생존 곡선을 계산하여 비교하였습니다. 
    >> CNN + LSTM 모델이 가장 높은 정확도를 나타내었습니다.

  4. 해상도별 CNN + LSTM, SVM, Logistic, Naive Bayes의 4가지 머신 러닝 알고리즘을 통해 성능 평가를 진행합니다.
    >> CNN + LSTM은 고해상도 이미지에서 높은 성능을 나타내었습니다.


Assign()

assign() 은 변수를 생성하는 함수입니다. 

assign('변수명', 변수)


Example 1

assign('x',10)

x

[1] 10


Example 2

assign('x',10)
assign('y',c(1,2))
assign('z',NA)

c(x,y,z)
[1] 10  1  2 NA


Example 3

for(i in seq(10)){
assign(paste0(i,'day'),seq(i))
}

노드에서 Event란?

노드에서는 대부분의 이벤트를 비동기 방식으로 처리합니다. 또한, 비동기 방식으로 이벤트를 전달합니다. 이벤트는 한쪽에서 다른 쪽으로 알림 메시지를 보내는 것과 비슷합니다. 노드에는 이런 이벤트를 보내고 받을 수 있도록 EventEmitter라는 것이 만들어져 있습니다.  노드의 객체는 EventEmitter를 상속받을 수 있으며, 상속받은 후에는 EventEmitter 객체의 on()과 emit() 메소드를 사용할 수 있습니다. on() 메소드는 이벤트가 전달될 객체에 이벤트 리스너를 설정하는 역할을 하는데 이 리스너 함수는 객체로 전달된 이벤트를 받아 처리할 수 있습니다.

 메소드 이름 

 설명 

 on(event, listener) 

 지정한 이벤트의 리스너를 추가

 once(event, listener) 

 지정한 이벤트의 리스너를 추가하지만 한 번 실행한 후에는 자동으로 리스너 제거

 removeListener(event, listener) 

 지정한 이벤트에 대한 리스너를 제거합니다. 


시스템 이벤트 생성 예제 코드

process 객체는 노드에서 언제든지 사용할 수 있는 객체인데 이미 내부적으로 EventEmitter를 상속받도록 만들어져 있어 on()과 emit() 메소드를 바로 사용할 수 있습니다. process() 객체의 on() 메소드를 호출하면서 이벤트 이름을 exit로 지정하면 내부적으로 프로세스가 끝날 때를 알 수 있습니다. 그 아래 코드에서는 setTimeout() 메소드를 호출하여 2초 후 프로그램을 끝냅니다. 
process.on('exit', function(){
console.log('exit 이벤트 실행');
});

setTimeout(function(){
console.log('2초 후 시스템 종료');
process.exit()
}, 2000);
2초 후 시스템 종료
exit 이벤트 실행


사용자 정의 이벤트 생성 예제 코드

tick 이벤트를 직접 만들고 2초 후에 setTimeout() 메소드를 사용해 process.emit() 메소드를 호출하면서 tick 이벤트를 process 객체로 전달했습니다. process.on() 메소드를 호출하여 이벤트를 등록하면 이 메소드를 호출하면서 파라미터로 전달한 tick 이벤트가 발생했을 때 그 다음에 나오는 콜백 함수가 실행됩니다. 

process.on('tick', function(count){
console.log('tick 이벤트 발생 : %s', count);
});

setTimeout(function(){
console.log('2초 후에 tick 이벤트 실행');

process.emit('tick', '777');
}, 2000);

2초 후에 tick 이벤트 실행

tick 이벤트 발생 : 777

콘솔 창에 출력되는 문자열을 통해 tick 이벤트를 받았는지 확인할 수 있습니다.


References

  • Do it! Node.js 프로그래밍


주소 문자열과 요청 파라미터 다루기

웹 사이트에 접속하기 위한 사이트 주소 정보는 노드에서 URL 객체로 만들 수 있습니다.

https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js

NAVER 검색창에 'node.js'를 검색했을 때의 주소 정보입니다. 이렇게 만들어진 주소 문자열은 단순 문자열이므로 서버에서 이 정보를 받아 처리할 때에는 어디까지가 사이트 주소인지, 어떤 내용이 요청 파라미터인지 구별해야 합니다. 이 구별을 위해서 ? 기호를 기준으로 앞에 있는 문자열과 뒤에 있는 문자열을 분리하는 경우가 많습니다. 이 작업을 쉽게 할 수 있도록 노드에 만들어 둔 것이 URL 모듈입니다.

url 모듈을 이용하여 주소 문자열을 객체로 만들면 문자열 안에 있던 각각의 정보를 나누어 그 객체의 속성으로 보관합니다. 요청 프로토콜이 http인지 아니면 https인지를 구별하거나 요청 파라미터를 확인하고 싶다면 url 객체가 가지고 있는 속성 값을 확인하면 됩니다. 위의 주소는 아래와 같이 구분될 수 있습니다.

protocol : 'https'
host : 'search.naver.com/search.naver'
query : 'where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js'



주소 문자열을 URL 객체로 변환하기

url 모듈에서 문자열을 객체로 만들거나 객체를 문자열로 만들기 위해 사용하는 주요 메소드는 다음과 같습니다. 

  • parse() : 주소 문자열을 파싱하여 URL 객체를 만들어 줍니다.
  • format() : URL 객체를 주소 문자열로 변환합니다.


URL 모듈을 사용하는 예제 코드

var url = require('url');

// 주소 문자열을 URL 객체로 만들기
var curURL = url.parse('https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js');

// URL 객체를 주소 문자열로 만들기
var curStr = url.format(curURL);

console.log('주소 문자열 : %s', curStr)
console.dir(curURL);
주소 문자열 : https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js
Url {
  protocol: 'https:',
  slashes: true,
  auth: null,
  host: 'search.naver.com',
  port: null,
  hostname: 'search.naver.com',
  hash: null,
  search: '?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js',
  query: 'where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js',
  pathname: '/search.naver',
  path: '/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js',
  href: 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js' }



요청 파라미터 확인하기

URL 객체의 속성을 보면 주소 문자열의 여러 가지 정보가 포함되어 있습니다. 그중에서도 query 속성은 요청 파라미터 정보를 가지고 있는데 이 정보를 잘 살펴보면 여러 개의 요청 파라미터가 모두 들어 있습니다. 웹 서버에서는 클라이언트에서 요청한 요청 파라미터를 받아 처리할 때가 많으므로 이 query 속성에 들어 있는 문자열을 다시 각각의 요청 파라미터로 분리해야 합니다.

요청 파라미터는 &로 구분되는데 querystring 모듈을 활용하면 요청 파라미터를 쉽게 분리할 수 있습니다.


요청 파라미터 구분 예제 코드

var url = require('url');

// 주소 문자열을 URL 객체로 만들기
var curURL = url.parse('https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js');

// URL 객체를 주소 문자열로 만들기
var curStr = url.format(curURL);

// 요청 파라미터 구분하기
var querystring = require('querystring');
var param = querystring.parse(curURL.query);

console.log('요청 파라미터 중 query 값 : %s', param.query);
console.log('원본 요청 파라미터 : %s', querystring.stringify(param));
요청 파라미터 중 query 값 : node.js
원본 요청 파라미터 : where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=node.js

먼저 querystring 모듈을 사용하기 위해 require() 메소드를 사용했습니다. 불러온 모듈은 querystring 변수에 할당하고 그 객체의 parse() 메소드를 호출합니다. parse() 메소드는 요청 파라미터 문자열을 파싱하여 객체로 만들어 줍니다. 이 객체에는 각각의 요청 파라미터들이 속성으로 추가되어 있어 속성값을 참조하면 각각의 요청 파라미터를 사용할 수 있습니다. stringify() 메소드는 객체 안에 들어 있는 요청 파라미터를 다시 하나의 문자열로 바꿀 때 사용합니다.


References

  • Do it! Node.js 프로그래밍



프로토타입 오브젝트 생성하기   

클래스를 만들고 그 클래스에서 새로운 인스턴스 객체를 여러 개 만들어 내듯 자바스크립트에서도 객체의 원형을 정의한 후 그 원형에서 새로운 인스턴스 객체를 만들어 낼 수 있습니다.

Person 프로토타입 객체는 데이터를 넣어 두려는 목적 보다는 하나의 틀로 사용하기 위해 만듭니다. 붕어빵 틀에서 실제 붕어빵을 만들어 내듯이 실제 사람을 여러 명 찍어 내기 위한 틀을 프로토타입으로 만든다고 생각하면 이해하기 쉽습니다. 해당 Person 프로토타입에는 사람의 이름을 담는 name 속성과 나이를 담는 age 속성이 들어갈 수 있습니다. 그리고 walk 함수를 넣어서 걸어가는 동작을 수행할 수도 있습니다.


Person Prototype 코드 예제

function Person(name, age){
this.name = name;
this.age = age;
}

Person.prototype.walk = function(speed){
console.log(speed + 'km 속도로 걸어갑니다.');
}

var person1 = new Person('소녀시대', 20);
var person2 = new Person('걸스데이', 22);

console.log(person1.name + '객체의 walk(10)을 호출합니다.')

person1.walk(10)

> 소녀시대 객체의 walk(10)을 호출합니다. > 10km의 속도로 걸어갑니다.


walk() 함수를 속성으로 추가한 것이 아닌 Person.prototype.walk = function(){...} 형태로 만든 이유는 Person 객체가 실제 데이터를 담기 위해 만들어진 것이 아니라 다른 인스턴스 객체를 만들기 위한 원형 틀로 만들어졌기 때문입니다. Person 객체 안에 있는 Prototype 속성에 데이터나 함수를 속성으로 추가하면 실제 인스턴스 객체를 만들 때 메모리를 효율적으로 관리할 수 있습니다.

Person 객체 안에 있는 Prototype 속성도 객체로 만든 것인데, Person 함수가 만들어질 때 자동으로 만들어집니다. 이 Prototype 객체는 Person 객체 자신을 가리키도록 되어 있어 다음의 두 코드는 같은 결과를 보여줍니다.

Person.walk = function(speed){
console.log(speed + 'km 속도로 걸어갑니다.');
}

Person.prototype.walk = function(speed){
console.log(speed + 'km 속도로 걸어갑니다.');
}

위의 두 가지 코드 모두 Person이라는 틀로 만들어 낸 인스턴스 객체에서 walk 함수를 호출할 수 있습니다. 하지만, Prototype 속성으로 추가하면 인스턴스 객체를 만들 때 메모리를 효율적으로 관리할 수 있다는 점이 서로 다릅니다.


References

  • Do it! Node.js 프로그래밍


콜백 함수란?

함수를 파라미터로 만들어 전달하는 경우는 대부분 비동기 프로그래밍 방식으로 코드를 만들 때입니다. 예를 들어 더하기 함수를 실행한 후 결과 값이 반환될 때까지 기다리지 않고 그 다음 코드를 실행하려면 비동기 방식으로 코드를 만들어야 합니다. 즉, 더하기 함수를 실행하는 데 시간이 걸릴 수 있기 때문에 그다음 코드를 바로 실행합니다. 그리고 나서 연산이 끝났을 때 파라미터로 전달한 함수가 실행될 수 있다면 그 시점에 결과를 처리할 수 있으므로 효율적인 프로그램을 만들 수 있습니다. 이때 파라미터로 전달되는 함수를 콜백 함수(Callback Function)이라고 합니다. 콜백 함수는 함수가 실행되는 중간에 호출되어 상태 정보를 전달하거나 결과 값을 처리하는 데 사용됩니다.


콜백 함수 예시 코드

function add(a, b, callback){
var result = a + b;
callback(result);
}

add(10, 10, function(result){
console.log('파라미터로 전달된 콜백 함수 호출');
console.log('더하기 (10, 10)의 결과 : %d', result);
});

더하기 함수를 정의할 때는 더 이상 값을 반환하지 않도록 return 키워드를 사용하는 코드 부분을 삭제합니다. 그 대신 더하기 연산을 한 결과 값은 파라미터로 전달된 콜백 함수를 호출하면서 그 콜백 함수로 전달합니다. 콜백 함수는 미리 변수에 할당해 두었다가 add() 함수를 호출할 때 파라미터로 전달할 수도 있지만, add() 함수를 호출할 때 익명 함수로 만들어서 파라미터로 바로 전달할 수도 있습니다. 콜백 함수는 더하기 연산을 하는 코드 아래에서 호출되는데 이때 콘솔에 메시지를 출력합니다.


함수 안에서 값을 반환할 때 새로운 함수를 만들어 반환하는 방법 예시 코드

function multiply(a, b, callback){
var result = a*b;
callback(result);

var history = function(){
return a + '*' + b + '=' + result
}

return history
}

var multi_history = multiply(10, 10, function(result){
console.log(result);
});

console.log('결과 값으로 받은 함수 실행 결과 : ' + multi_history());

> 100

> 결과 값으로 받은 함수 실행 결과 : 10*10=100


References 

  • Do it! Node.js 프로그래밍


배열에 값 추가 및 삭제

배열에는 다음과 같은 메소드가 포함되어 있어 그 요소 값을 확인하거나 추가 또는 삭제할 수 있습니다.

 속성 / 메소드 이름

설명 

 push(object)

 배열의 끝에 요소를 추가 

 pop() 

 배열의 끝에 있는 요소를 삭제 

 unshift() 

 배열의 앞에 요소를 추가 

 shift() 

 배열의 앞에 있는 요소를 삭제 

 splice(index, removeCount, [Object] 

 여러 개의 객체를 요소로 추가하거나 삭제

 slice(index, copyCount) 

 여러 개의 요소를 잘라내어 새로운 배열 객체로 만듦


배열 값 추가/삭제 코드 예제

var Users = [{name : '소녀시대', age : 20}, {name : '걸스데이', age : 22}];

Users.push({name : '티아라', age : 23}); # Users의 끝에 해당 요소 추가
Users.pop(); # Users 끝 요소 제거
Users.unshift({name : '티아라', age : 23}); # Users의 맨 앞에 해당 요소 추가
Users.shift(); # Users의 맨 앞 요소 제거

Users.splice(1, 0, {name : '애프터스쿨', age : 25}); # splice로 요소를 인덱스 1에 추가
Users.slice(1, 3); # slice로 여러 개의 요소 제거


+ Recent posts