노드는 대부분 이벤트기반으로하는 비동기 방식으로 처리합니다. (callback method를 사용합니다.)

노드에는 이벤트를 보내고 받을수 있는 EventEmitter라는것이 있습니다.



EventEmitter   //부모 클래스


   상속!!(EventEmitter)   (     자식클래스객체 ---상속--> EventEmitter )


객체------------- //자식 클래스

  EventListener 객체   -   on() 리스너 등록, emit() 이벤트 전달

 -------------

  

노드 객체(자식객체)는 EventEmitter를 상속받을 수 있으며,  상속받은 후에는  EventEmitter 객체의 on()과 emit() 메소드를 사용할 수 있습니다.


또한 once()메소드도있습니다.



Method 명 

 설명

 on(event, listener)  

 지정한 이벤트의 리스너를 추가합니다.

 once(event, listener) 

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

 removeListener(event, listener)

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


 

계산기 객체를 Event기능 추가한 모듈로 만들어보기


calc.js


var util = require('util');
var EventEmitter = require('events').EventEmitter;

var Calc = function(){
var self = this;
this.on('stop', function(){
console.log('Calc에 stop event 전달됨.');
});
};

util.inherits(Calc, EventEmitter);

Calc.prototype.add = function(a, b){
return a+b;
}

module.exports = Calc;
module.exports.title = 'calculator';


EventEmitter는 events모듈안에 정의되어이씁니다.

따라서 require()메소드를 호출하여 evnets모듈을 불러들인후,

그안에 속성으로 들어있는 EventEmitter 객체를 참조합니다.


Calc객체는 계산기 객체로서 function 키워드를 사용해 프로토타입객체로만듭니다.

 프로토타입 객체 안에서는 this키워드를 이용해 자기자신을 가리킬수있으며,

 그 객체 안에 정의된 속성에 접근할 수 있습니다.

 

그런다음 Calc 객체가 이벤트 처리를 할 수 있도록 EventEmitter를 상속하도록 만듭니다.


util모듈의 inherits()메소드를 사용하면 쉽게 상속을 구현할수있습니다.

Calc 객체는 EventEmiiter 객체를 상속받게 되었습니다.


main.js


var Calc = require('./calc');
var calc = new Calc();
calc.emit('stop');
console.log(Calc.title + ' 에 stop 이벤트 전달');

 



 프로토타입 객체를 정의하고 new연산을 통해 인스턴스객체들을 만들 수 있습니다.


function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.walk = function(spd){
console.log(spd+" 속도로 뛰는중");
}
//Person 객체 2개 생성
var person01 = new Person('진쓰',21);
var person02 = new Person('잠와',22);
console.log(person01.name+ ' 객체의 walk(10) 호출');
person01.walk(10);




Person 프로토타입 객체를 만들려면 Person 함수를 정의해야합니다.

자바스크립트에서는 함수도 객체입니다. 함수도 객체의 역할을 할 수 있습니다.



new연산자로 호출되는 함수는 객체를만들기위한 함수로 분류되며, 이러한 함수를 생성자라합니다.



그리고 walk 메소드 할당할때

Person.walk = funcion() {..} 같은 형태가 아니라

Person.prototype.walk = function()... 같은 형태로 만듭니다.



Person이 데이터를 담기위해 만들어진게 아니라다른 인스턴스 객체를!

만들기위한 원형틀(마치 자바의 class같은)로 만들어졌기 떄문입니다.



그리고 메모리를 효율적으로 관리할수있다고도합니다.

함수뿐만 아니라 데이터를 추가할때도 prototype을 쓰면됩니다.


prototype 속성은, 객체를 생성할때 자동으로 생성됩니다.


뭐 prototype을 안써도 가능은합니다만 좀더 메모리관리에 효율적입니다.



//배열 생성
var Users = [{name:'진쓰',age:20},{name:'잠와',age:22}];

console.log('배열요소수:%d', Users.length);

for(var i=0; i< Users.length; i++){
console.log('배열 요소 #'+i+': %s', Users[i].name);
}







var Person = {

//객체를 생성할때 속성과 함수를 아래와 같이 넣을수있습니다.
age1 : 21,
add1: function(a,b){
return a+b;
}
}; //객체 생성.


//객체를생성하고나서도, 속성값들을 넣을 수 있습니다.

Person['age'] = 20; //Person 객체에 age 속성 추가및할당
Person['name'] = '진쓰';
Person.phone = '0107777'; //Person 객체에 phone 속성 추가및할당(이런식으로도 가능)


//함수도 추가할 수 있습니다.

Person.add = function(a, b){
return a+b;
};


//함수를 변수에 할당할수있습니다.

var myMin = function(a,b){
return a-b;
}


객체의 속성에 할당합니다.

Person['min'] = myMin;



console.log("나이 : %d", Person.age1);
console.log("나이 : %d", Person.age);
console.log("이름 : %s", Person.name);
console.log("전화 : %s", Person.['phone']);
console.log("더하기 : %d", Person.add(10,20));
console.log("더하기 : %d", Person.add1(10,20));
console.log("빼기 : %d", Person.min(10,5));








자료형 설명



  Boolean [기본자료형]

 true와 false의 두가지 값을 가지는 자료형

 Number [기본자료형]

 64비트 형식의 IEEE 754 값이며 정수나 부동소수값을 가지는 자료형.

    

 참고: NaN(숫자가아님.), Number.MAX_VALUE => +무한대 

 Number.MIN_VALUE - 무한대

 String [기본자료형] 

 문자열 값을 가지는 자료형

 undefined 

 값을 할당하지않는 변수의값

 null 

 존재하지않는 값을 가리키는 값

 Object 

 객체를 값으로 가지는 자료형

 객체는 속성들을 담고있는 가방(Collection)으로 볼수있으며,

 대표적객체로 Array, Date 등이 있음.


    

자바스크립트는 변수상자 크기를 명확히 알수없어서, typeof 연산자 제공합니다.


자바스크립트 변수선언은 var로 선언가능. 

자동으로 Number나 String 판단.



var age = 20;
console.log("나이 : %d", age);
var name ="걸스데이";
console.log("이름: %s", name);




이전강의

  ->  Node js 사용자 모듈 (Module) 사용하기



- 외장모듈 사용

다른사람이 만든 모듈을 사용할때는 외장모듈을 사용해야합니다.

다른사람이 올린 패키지를 다운받기 위해서는 npm 패키지를 사용하여 다운받을 수 있습니다.


npmNode Package Manager 약자로 노드 패키지를 사용하고 설치및 삭제등을 지원하는

프로그램입니다. 


nconf 라는 외장모듈을 다운로드받는 절차를 살펴보겠습니다.


명령프롬프트 입력

> npm init

> npm install nconf --save


이제 package.json 파일을 열어보고 dependenceis 속성이 추가된것을 볼 수 있습니다.


또한, 외장모듈은 node_modules 라는 폴더에 저장되는것을 확인할 수 있습니다.




만약 다른 PC에서 외장모듈을 다시 설치해야할 경우 package.json 파일만 다른PC로 옮긴후 다음과 같이

> npm install


명령만 치게되면, package.json에 정의된 외장모듈들을 설치하여 node_modules 폴더에 채우게 됩니다.




- 간단한 내장 모듈 사용하기


노드를 설치했을떄 기본적으로 들어있는 내장모듈을 살펴보겠습니다.

내장모듈은 자주사용하는 기본기능을 노드에 포함시켜 제공하는 것입니다.

외장모듈은 npm으로 설치해야하지만 내장모듈은 바로 사용할 수 있습니다.


hostname() 

 운영체제의 호스트이름을 알려줍니다.

 totalmem()

  시스템 전체 메모리 용량을 알려줍니다.

 freemem()

 시스템에서 사용가능한 메모리 용량을 알려줍다.

 cpus()

 CPU 정보를 알려줍니다.

 networkInterfaces() 

 네트워크 인터페이스 정보를 담은 배열 객체를 반환합니다.




os모듈을 사용하는 코드예제입니다.

var os = require('os');

console.log("시스템 hostname :%s", os.hostname());

console.log("시스템 메모리 :%d", os.freemem(), os.totalmem());

console.log("시스템의 CPU 정보 \b")

console.log("os.cpus());

console.log("시스템의 네트워크 인터페이스 정보\n");

console.dir(os.networkInterfaces());






파일 path를 다루는 path 모듈

  join() 

 여러개의 이름들을 모두 합쳐 하나의 파일 path로 만들어줍니다. 파일 패스를 완성할 때 구분자 등을 알아서 조정합니다.

 dirname() 

 파일path 에서 디렉터리 이름을 반환합니다.

 basename()

 파일path 에서 파일의 확장자를 제외한 이름을 반환합니다.

 extname()

 파일path 에서 파일의 확장자를 반환합니다. 



path 모듈 사용 예제입니다.


var path = require('path');


//디렉터리 이름 합치기

var dirs = ["user", "jinss", "docs"];

var docDir = dirs.join(path.sep)

console.log("문서 디렉토리 %s", docDir);


//디렉터리 이름과 파일 이름 합치기

var curPath = path.join('/user/mike', 'text.exe');

console.log("파일 path: %s", curPath);




[다음강의]

    ->    node js 외장, 내장 모듈 사용하기


 


 노드 (Node.js)에서 모듈 사용하기


main.js

    var module1 = require('module1');

    module1.func();


module1.js

    exports.func = 함수정의부분



 메인파일 코드중에 독립적인 기능은 별도파일로 분리할 수 있으며,  메인 파일에서 전체적인 실행순서나 흐름을 제어합니다.

  이렇게 분리된 파일을 노드에서는 모듈이라고 합니다.


 모듈이란 별도의 파일로 분리된 독립기능의모음이라서, 모듈을 만들어 놓으면 다른파일에서 모듈을 불러와 사용할 수 있습니다.



모듈만들어 내보내기.

exports v.s module.exports

모듈을 만들어서 다른파일에서 사용하기위해서는 exports혹은 module.exports를 사용합니다.


- exports에는 속성을 추가할 수 있어 여러개의 변수나 함수를 각각의 속성으로 추가할 수 있습니다.


- module.exports하나의 변수나 함수 또는 객체를 직접 할당합니다.




더하기함수 모듈 만들어 사용


calc.js 

exports.add = function (a,b){

   return a+b;

}


main.js

var cal = require('./calc');

console.log("모듈분리후 calc.js의 add 메소드 사용: %d ", calc.add(10,20));


[결과화면]







node.js 의 전역객체


node.js 콘솔에 로그뿌리기


console 객체는 전역 객체입니다. 코드의 어느부분에서나 사용할 수 있습니다.


console 

 콘솔창에 결과를 보여주는 객체

 process 

 프로세스의 실행에 대한 정보를 다루는 객체

 exports 

 모듈을 다루는 객체


    

 node.js의 console.log를 c언어의 printf 처럼 사용하기.


 console.log ('숫자 보여주기 :%d', 10);

 console.log ('문자열 보여주기 :%s', '소녀시대');

 console.log ('JSON객체 보여주기 :%j', {name: '소녀시대'});





console객체의 주요 메소드

 dir(object) 

 자바스크립트 객체의 속성들을 출력

 time(id)

 실행시간을 측정하기 위한 시작시간을 기록한다.

 timeEnd(id) 

 실행시간을 측정하기 위한 끝 시간을 기록한다.


   

 

 console.dir() 메소드를 이용한 객체안에 들어있는 속성확인.


    var Person = {name:"소녀시대", age:20}

    console.dir(Person); 





 console.time('id')를 이용한 시간측정 예제

    

   var result = 0;


    console.time('duration');


    for(var i = 1; i<=1000; i++){

      result += i;

    }


    console.timeEnd('duration');

    console.log('1부터 1000까지 더한 결과물 %d', result);




node.js의 전역변수

  __fiilname

 현재 실행한 파일의 이름

  __dirname 

 현재실행한 파일의 path(경로)


        

  console.log('현재실행한 파일이름 %s", __filename);

  console.log('현재실행한 파일 path %s', __dirname);



강화학습 개요에 앞서 머신러닝에 대해 살펴보도록 하겠습니다.

머신러닝은 지도학습, 비지도학습, 강화학습 3가지로 나뉩니다.


지도학습은, 컴퓨터가 풀어낸 결과와 정답을 비교해가며 학습하는 방식입니다.

비지도학습은, 정답이 존재하지않고, 비슷한 것끼리 묶어주는 식의 학습이 비지도학습입니다.


강화학습은, 정답이 주어진것은 아니짐,ㄴ 또한 주어진 데티어테 대해 학습하는 것도 아닙니다. 강화학습은 보상을 통해 학습합니다.




순차적으로 행동을 결정해야하는 문제가 있다고 합시다.

이때 사용하는 방법은 MDP입니다. (Markov Decision Process).

MDP 는 순차적 행동 결정문제를 수학적으로 정의해서 에이전트(행동의 주체, 문제를 풀어나가는 주체)가 순차적 행동 결정 문제에

접근할 수 있게 합니다.



순차적 행동 결정문제의 구성요소


1. 상태

현재 에이전트가 처한 정보라고 생각하면됩니다. 그리고 에이전트가 현재 움직이는 속도와 같은 동적인 요소 또한 상태라고 표현할 수 있습니다.


2. 행동

에이전트가 어떠한 상태에서 취할수있는 행동이로서 "상", "하", "좌", "우" 와 같은것을 말합니다.

처음에는 어떤 행동이 좋은 행동인지에 대한 정보가 전혀없습니다.


3. 보상

보상이라는 정보를 통해 에이전트는 자신이 했던 행동들을 평가할 수 있고 이로인해 어떤 행동이 좋은 행동인지 알 수 있습니다.


4. 정책

순차적 행동 결정문제에서 구해야할 답이 바로 정책입니다. 모든 상태에 대해 에이전트가 어떤 행동을 해야하는지 정해놓은 것이 정책입니다.

순차적 행동 결정문제를 풀었다고한다면 제일 좋은 정책을 에이전트가 얻었다는 것입니다.



node.js 설치및 예제코드 작성해보는 시간을 가지겠습니다.



먼저 node.js 설치를 위해 다음의 공식 싸이트에 접속합니다.

https://nodejs.org/ko/download/



저는 아래그림처럼 window installer (.msi) 64-bit를 다운받고 실행하였습니다.



Next를 누릅니다.


Next를 누르시구요


설치가 진행됩니다.~!




설치가 끝났습니다.







예제코드 작성전에 Edit 프로그램을 또 다운받습니다. 

비쥬얼스튜디오코드  https://code.visualstudio.com/ 

해당 홈페이지의  download for window 를 클릭하여 받으신후 설치하시면 되겠습니다.



바탕화면에 꿩폴더를 만들고 그안에 app.js 파일을 생성합니다.


그리고 비쥬얼스튜디오 코드로 열어서 다음과 같이 작성합니다.



그 이후 꿩폴더에서 shift를 누른채 오른쪽 마우스를 클릭하시면, "여기서 명령창 열기"가 있습니다. 클릭해서 cmd 창을 뛰웁니다.



그다음 다음과 같이 명령을 칩니다.

> node app.js



화면과 같이 Hello node.js! 가 출력되면 성공적으로 node.js를 설치에 성공하신겁니다.

본격적으로 node.js 프로그래밍될 준비가 끝난겁니다.!


+ Recent posts