Things take time

[NodeJS] 3일차 - 프로토타입 본문

카테고리 없음

[NodeJS] 3일차 - 프로토타입

겸손할 겸 2017. 12. 11. 22:06

[프로토타입]


- 자바스크립트의 클래스, new연산자를 통해 새로운 객체를 만들어 냄

- 함수 형태로 만들게 되면 자동 생성자가 부여됨 => 클래스 처럼 사용이 가능함

// this 명령어를 통해 name, age라는 속성을 바로 생성(선언)및 대입할 수 있음
function Person(name, age){
    this.name = name;
    this.age = age;
}

// 프로토타입 => 이미 생성된 함수 객체에 외부에서 선언할 수 있으며 함수의 형태로 만듬
Person.prototype.walk = function(speed){
    return speed + "km로 이동";
}

var person01 = new Person("Nodejs", "100");
console.log(person01.age + " / " + person01.name + " : " + person01.walk(100));

calc3.js

- inherits를 통해 Calc라는 프로토타입은 EventEmitter를 상속받아 on을 사용할 수 있음

var util = require('util'); // events모듈내에 EventEmitter 객체를 가져옴 var EventEmitter = require('events').EventEmitter; var Calc = function(){ // this = 이 Calc 함수를 호출한 객체 var self = this; this.on('stop', function(){ console.log('cacl에 stop이벤트 발생'); }); }; util.inherits(Calc, EventEmitter); Calc.prototype.add = function(a,b){ return a+b; } module.exports = Calc; module.exports.title = 'calculator';

ch04_02.js

var Calc = require('./calc3.js');

// Calc는 프로토타입이므로 new를 통해 생성
var calc = new Calc();
calc.emit('stop');


console.log(Calc.title + '에 STOP이벤트 전달');
console.log(calc.add(1,2));



[파일 읽기]


- fs 모듈을 받아와 동기, 비동기 식으로 선택 사용 가능

var fs = require('fs');
// 동기식 -> data가 읽어진 다음 다음 줄 호출
var data = fs.readFileSync('./package.json', 'utf8');
console.log("readFileSync 동기식 : " + data);

// 비동기식
fs.readFile('./package.json', 'utf8', function(err, data){
    console.log(data);
});
console.log('readFile 비동기 함수 실행');



[파일쓰기]


- writeFileSync도 있음

var fs = require('fs');

// 파일이 없으면 생성하게 됨, 그러나 이어 쓰는 것은 아님
fs.writeFile('./output.txt', 'Hello World', function(err){
   if(err){
       console.log('에러 발생 : ' + err);
   } else{
       console.log('파일 생성 혹은 기존 쓰기 완료');
   }
});


[파일 이어 쓰기]

// fd : file descriptor, 파일에 접근할 수 있게하는 핸들러
var fs = require('fs');

fs.open('./output.txt', 'a+', function(err, fd){
    if(err){
        throw err;
    }
    
    var buf = new Buffer("안녕!\n");
    fs.write(fd, buf, 0, buf.length, null, function(err, written, buffer){
        if(err){
            throw err;
        }
        console.log (err, written, buffer);
        
        fs.close(fd, function(){
            console.log('파일 열고 기존 데이터에 이어 붙이기 완료');
        });
    });
});


[파일 읽고 쓰는 방법 1 - 버퍼]

var output = '안녕 1!';
var buffer1 = new Buffer(10);
// buffer1에 output만큼을 쓰고 그 길이를 return
var len = buffer1.write(output, 'utf8');
console.log('첫 번째 버퍼의 문자열 : %s', buffer1.toString());
console.log('첫 번재 버퍼의 문자열 길이 : %d', buffer1.length);
console.log(len);

var buffer2 = new Buffer('안녕 2!', 'utf8');
console.log('두 번재 버퍼의 문자열 : %s', buffer2.toString());
console.log('두 번재 버퍼의 문자열 길이 : %d', buffer2.length);

// 버퍼타입 확인 방법
console.log('버퍼1 타입 : %s', Buffer.isBuffer(buffer1));

// 버퍼에 있는 문자열 데이터의 길이 구하기
console.log('버퍼1의 데이터 길이 : ' + Buffer.byteLength(output));

console.log(buffer1.toString('utf8', 0, Buffer.byteLength(output)));
console.log(buffer2.toString('utf8'));

// 버퍼에 있는 문자열 복사(전체 복사 및 대체)
buffer1.copy(buffer2, 0, 0, len);
console.log('복사 결과 : %s', buffer2.toString('utf8'));
// 두개의 버퍼 붙이기
var buffer3 = Buffer.concat([buffer1, buffer2]);
console.log('붙인 결과 : %s', buffer3.toString('utf8'));



[파일 읽고 쓰는 방법 2 - 스트림]


- 스트림은 버퍼보다 작은 단위, 네트워크나 타 기종간의 통신 방법으로 사용

- 스트림, 버퍼는 사용자가 익숙한 방법으로 사용

var fs = require('fs');

var infile = fs.createReadStream('./output.txt', {flags: 'r'});
var outfile = fs.createWriteStream('./output2.txt', {flags: 'w'});

infile.on('data', function(data){
    console.log('읽은 데이터', data); // 데이터
    console.log('읽은 데이터' + data); // 문자열
    outfile.write(data);
});

infile.on('end', function(){
    console.log('파일 읽기 종료');
    
    outfile.end(function(){
        console.log('파일 쓰기 종료');
    });
});


[http 서버 오픈]

var fs = require('fs');
var http = require('http');
var server = http.createServer(function(req, res){
    var instream = fs.createReadStream('./output.txt');
    instream.pipe(res);
});
server.listen(7001, '127.0.0.1');


위는 서버가 켜진 상태, ctrl + c는 끄는 것

127.0.0.1은 로컬호스트를 의미하고, 7001은 포트번호이므로