기초문법
node.js 로 웹 서버를 구축하기 위해서는 javascript 문법을 먼저 이해해야만 합니다. 이번장에서는 javascript 의 가장 기본적인 형태인 변수의 선언과 흐름제어문인 조건문과 반복문에 대해 알아보도록 하겠습니다. 세 가지 문법 구조에 익숙해 지면 node.js 를 보다 쉽게 다룰 수 있게 됩니다.
이 강좌는 javascript 과정이 아니기 때문에 가장 기본적인 사용법만 알아보도록 하겠습니다.
가. 변수의 선언 및 사용
변수는 타입에 대한 구분없이 앞에 var 로 선언하고 사용합니다. 변수의 타입은 실행시에 스크립트 해석기인 엔진이 결정하지만 V8엔진의 경우 실행시가 아닌 JIT compiler가 기계어로 컴파일하기 직전에 컴파일러에 의해서 결정됩니다.
아래는 javascript를 사용하기 위한 몇 가지 규칙입니다
//1. 변수는 앞에 타입에 대한 구분없이 var 로 선언한다
//2. 문장의 끝은 항상 ; (세미콜론)으로 끝낸다
var name;
//3. = 을 사용해서 변수에 값을 입력하는데 문자열 입력시에는 앞뒤로 '(외따옴표) 또는 "(쌍따옴표)를 붙혀준다
name = '홍길동';
//4. 문자나 숫자 및 타입에 관계없이 변수는 var 로 선언한다
var num1;
num1 = 21;
//5. 변수의 선언과 동시에 값을 입력할 수 있다
var num2 = 3;
//6. 두 개의 변수를 더해서 다른 변수에 입력할 수 있다
var sum = num1 + num2;
//7. 숫자와 문자를 더할 경우 결과값은 문자가 된다. 아래 연산결과로 sum2 에는 "홍길동21"이 sum3에는 "이순신3"이 입력된다
var sum2 = name + num1;
var sum3 = '이순신' + 3;
* 주석은 // 또는 /* */ 둘 다 사용할 수 있습니다.
나. 함수의 선언 및 사용
함수는 function 함수이름(파라미터) { 실행코드 } 형태로 선언하며, 함수이름을 괄호와 함께 호출하면 실행됩니다. 실행코드에 return 예약어가 없으면 결과값 리턴이 없이 함수가 실행 후에 그대로 종료됩니다.
// 1. 세개의 파라미터를 더한 후 결과값을 리턴하는 함수를 선언
function sum(param1, param2, param3){
return param1 + param2 + param3;
}
// 2. 함수 실행 후 결과값을 result 에 대입
var result = sum(1,2,3);
// 3. result 에 담긴 결과값을 출력
console.log('result='+result);
// 4. 결과값이 없는 함수의 선언
function print(param1){
console.log('param1='+param1);
}
// 5. 함수호출 : return 이 없는 함수는 로직을 자체적으로 처리하기 때문에 결과값 대입 불필요
print('출력내용');
다. 조건문
javascript 에는 조건문으로 if 와 switch 가 있는데 이 강좌에서는 if 만 사용하도록 하겠습니다.
조건문의 구조는 타 언어와 유사합니다.
var a = 10;
if (a > 11) {
console.log('a가 11보다 큽니다');
} else if(a == 11) {
console.log('a가 11과 같습니다');
} else {
console.log('a가 11보다 작습니다');
}
* console은 node.js 에서 콘솔화면에 로그를 사용하기 위한 내장객체이고, 멤버변수인 log('내용')로 로그를 출력할 수 있습니다.
라. 반복문
반복문에는 for 와 while, do ~ while 이 있습니다. 이 강좌에서는 while 문만 사용하겠습니다.
// 0부터 9까지 출력하는 while문
var i=0;
while(i < 10) {
console.log("for : i의 값은="+i);
i=i+1;
}
마. 클래스
javascript 는 프로토타입기반의 함수형 언어이기 때문에 특별하게 객체지향을 위한 class는 없습니다. 하지만 함수형 언어들의 특징은 함수자체를 하나의 객체로 취급하기 때문에 단일함수 또는 파일 자체를 하나의 class처럼 사용할 수 있습니다.
그럼 먼저 javascript 에서 함수를 사용해 객체화하는 방법을 알아보겠습니다. test_class.js 파일을 하나 만들고 아래 코드를 입력합니다.
- test_class.js
//class의 선언 - 낙타표기법으로 첫번째 글자를 대문자로 함수를 하나 선언한다.
function Clazz(msg){
// 변수를 객체의 멤버로 사용하기 위해 this 예약어를 사용해서 정의한다.
this.name = 'I am Class';
this.message = msg;
// this를 사용하지 않은 변수
message2 = "find me!";
// 멤버함수 선언
this.print = function(){
console.log(message2);
};
}
// 객체를 생성
var myClazz = new Clazz('good to see u!');
console.log(myClazz.message);
// this를 사용하지 않은 message2 변수는 외부에서 참조할 수 없다.
console.log(myClazz.message2);
// this로 선언된 함수를 통해 사용할 수 있다.
myClazz.print();
node test_class 명령어로 위의 코드를 실행하면 함수 내부에 this 로 정의되지 않은 변수는 undefined 로 찾을 수 없다고 나타납니다.
이렇게 함수를 new 연산자를 이용해 초기화함으로써 마치 객체처럼 사용할 수 있게 됩니다.
이제 위의 코드에 prototype 예약어를 이용해서 Clazz 외부에서 함수를 추가해 보겠습니다.
classPrototype.js 파일을 하나 만들고 아래 코드를 입력합니다. this 로 선언되지 않은 변수는 prototy[e으로 추가한 함수에서는 참조할 수 없는것을 확인할 수 있습니다.
- test_prototype.js
function Clazz(msg){
this.name = 'I am Class';
this.message = msg;
message2 = "find me!";
}
//Clazz 객체의 prototype 을 가져와서 message값을 리턴하는 함수를 하나 추가한다.
Clazz.prototype.getMessage = function(){
return this.message;
}
Clazz.prototype.getMessage2 = function(){
return this.message2;
}
// 객체를 생성
var myClazz = new Clazz('good to see u!');
console.log(myClazz.getMessage());
// 내부에 선언된 함수와는 다르게 prototype으로 선언한 함수는 값을 사용할 수 없다.
console.log(myClazz.getMessage2());
이제 node.js 에서 객체를 사용하는 방법을 알아보겠습니다. node.js에서는 require 를 사용해서 파일 전체를 객체로 불러올 수 있습니다. 파일 내부의 멤버들은 exports로 정의할 수도 있고, javascript에서처럼 this나 prototype으로 선언하고 module.exports 명령어로 한번에 처리할 수도 있습니다. 먼저 NodeClass.js 파일을 하나 만들고 아래와 같이 입력합니다.
- NodeClass.js
function Clazz(){
this.name = 'Hello there!';
this.message;
}
// message 변수에 값을 입력하는 함수
Clazz.prototype.setMessage = function(msg){
this.message = msg;
}
// message 변수의 값을 가져오는 함수
Clazz.prototype.getMessage = function(){
return this.message;
}
// exports 명령어를 사용함으로써 다른파일에서 require 예약어를 이용해 Clazz 객체를 사용할 수 있게된다.
// exports 명령어의 위치는 파일의 어떤곳에 위치해도 동일하게 동작한다.
module.exports = Clazz;
이제 NodeClass 파일을 호출해서 사용할 use_class.js 파일을 생성하고 아래와 같이 입력합니다.
- use_class.js
// NodeClass 를 선언한다. 여기서 NodeClass 는 변수명이 아니라 class명 이므로 첫글자를 대문자로 한다.
var NodeClass = require('./NodeClass');
// new 연산자를 사용해서 NodeClass 클래스를 nodeClass 변수로 초기화한다.
var nodeClass = new NodeClass();
// setMessage 함수로 값을 입력한다.
nodeClass.setMessage('Good to See u!');
// 입력된 값을 출력한다.
console.log(nodeClass.getMessage());
node use_class 명령어로 실행하면 아래와 같이 입력한 메시지가 출력되는 것을 확인할 수 있습니다.
바. 기초문법을 마치면서
기초문법으로 변수를 선언하고 값을 입력하는 방법과, if 문으로 특정 조건내에서 로직을 수행하는 방법 그리고 while 문으로 로직을 반복수행하는 방법을 알아보았습니다.
위의 세가지와 클래스 사용법만 정확하게 숙지 하신다면 node.js를 사용하는 데 있어서 문법적으로 크게 어려움은 없으리라 생각됩니다.