메소드 호출을 이용한 객체 생성 (객체 리터럴 모듈 패턴)

객체.메소드() 과 같이 객채 내에 메소드를 호출하는 방법을 의미합니다.

메소드 호출 방식을 이용할때는 화살표 함수 표현을 사용하지 않습니다.

화설표 함수 표현식의 제한점

  • this 나 super에 대한 바인딩이 없고, methods로 사용될 수 없습니다.
  • new.target 키워드가 없습니다.
  • 일반적으로 스코프를 지정할 때 사용하는 call, apply, bind methods를 이용할 수 없습니다.
  • 생성자(Constructor)로 사용할 수 없습니다.
  • yield를 화살표 함수 내부에서 사용할 수 없습니다.
let counter = {
  privatekey : 0,
  increase: function(){
    this.privatekey+=1;
  },
  decrease: function(){
    this.privatekey-=1;
  },
  getKey: function(){
    return this.privatekey;
  }
}
let count1 = counter;
let count2 = counter;
count1.increase();
console.log(`count1 = ${count1.getKey()}   count2 = ${count2.getKey()}`);
// output : count1 = 1   count2 = 1
console.log(count1 === count2); // output : true

자바스크립트에서 모듈을 구현하는 가장 쉬운 방법은 객체 리터럴을 사용하는 방법입니다.

하나의 객체라는 점에서 싱글톤 패턴이라고도 할 수 있습니다.

객체 리터럴은 간단하지만 모든 속성이 공개되어 있다는 단점이 있습니다. 독립된 모듈은 자체적으로 필요한 내부 변수 및 내부 함수를 갖고 있어야 하므로 클로저를 이용해야 합니다.

클로저를 활용한 모듈 패턴

const closer = (function(){
  /*
    ------------------------------
    *모듈 패턴을 구현할 클로저 코드
    ------------------------------
  */
  // 은닉될 멤버 정의
  let privatekey = 0;
  function increase(){
    return privatekey+=1;
  }
  function getKey(){
    return privatekey;
  }

  // 공개될 멤버(특권 메소드) 정의
  return {
    publicKey: privatekey,
    publicIncrease: function() {
      return increase();
    },
    publicGetKey: function() {
      return getKey();
    },
  }
})();
closer.publicIncrease();
console.log(`closer.key = ${closer.publicGetKey()}`);
// output : closer.key = 1
console.log(closer);
// output
{
  publicKey: 0,
  publicIncrease: [Function: publicIncrease],
  publicDecrease: [Function: publicDecrease],
  publicGetKey: [Function: publicGetKey]
}

모듈 패턴의 반환값은 함수가 아닌 객체입니다. 익명 함수가 자동으로 실행되고 반환된 객체를 closer 변수에 할당합니다. 따라서 closer.publicIncrease() 처럼 메소드를 호출할 수 있습니다.

자동 호출되는 점을 제외하고 클로저와 유사합니다.

클로저(싱글톤 패턴 X)

function makeCounter(){
  let value : 0;
~~~~  ~~r~~eturn{
    increase: function(){
      this.value++;
    },
    getValue: function(){
      return this.value;
    }
  }
}

const makeCount1 = makeCounter();
const makeCount2 = makeCounter();
makeCount1.increase();
console.log(`makeCount1 = ${makeCount1.getValue()}   makeCount2 = ${makeCount2.getValue()}`)
// output : makeCount1 = 1   makeCount2 = 0

클로저는 인스턴스를 여러개 만들어 낼 수 있는 구조라는 점에서 싱글톤 패턴과 차이가 있습니다.

싱글톤 패턴

const singleton = (function(){
  let instance;
  let privatekey = 0;
  function increase(){
    return privatekey+=1;
  }
  function getKey(){
    return privatekey;
  }
  function init(){
    return {
      publicKey: privatekey,
      publicIncrease: function() {
        return increase();
      },
      publicGetKey: function() {
        return getKey();
      },
    }
  }

  return function(){

        // 싱글톤 패턴은 아래 조건문에서 처음 인스턴스가 선언되면
        // 다시 인스턴스를 만들지 않고 기존의 인스턴스를 리턴합니다.
    if(!instance){
      instance = init();
    }
    return instance;
  }
})()

const singleton1 = singleton();
const singleton2 = singleton();
singleton1.publicIncrease();
console.log(`singleton1 = ${singleton1.publicGetKey()}    singleton2 = ${singleton2.publicGetKey()}`)
// output : singleton1 = 1    singleton2 = 1
console.log(singleton1 === singleton2) // output : true

싱글톤(Singleton)이란?

 

    싱글톤 패턴의 예를 보여주는     클래스 다이어 그램

싱글톤 패턴은 인스턴스가 오직 1개만 생성 되야 하는 경우에 사용되는 패턴입니다.

싱글턴 패턴을 따르는 클래스는 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴합니다.

싱글톤 패턴의 특징

  • 객체 자체에는 접근이 불가능해야 합니다.
  • 객체에 대한 접근자(비공개 멤버: 클로저)를 사용해 실제 객체를 제어할 수 있습니다.
  • 객체는 단 하나만 생성해야 하며, 해당 객체를 공유합니다.

생성자 함수 방식

익명함수(Anonymous function)란?
함수명 대신 변수명에 함수 코드를 저장하는 구현 방식 , 이름이 없는 함수

const anonymousFunction = function ( 매개변수 ){
    실행문;
};
function closure(){
  const count = 0;
  // 익명함수( 클로저 ) 반환
  return function() {
    return count+=1;
  }
}

하나의 인스턴스를 선언하지 않고 여러개의 인스턴스를 생성하려면 익명함수를 사용하지 않고 생성자 함수방식으로 만들면 됩니다.

const constructorFunction  = function() {
  let privateKey = 0;
  function increase(){
    return privateKey+=1;
  }
  function getKey(){
    return privateKey;
  }

  return {
    publicKey : privateKey,
    publicIncrease: function() {
      return increase();
    },
    publicGetKey: function() {
      return getKey();
    },
  }
}
let obj1 = constructorFunction();
let obj2 = constructorFunction();
console.log(obj1 === obj2) // output : false

함수를 정의하여 함수를 호출하면 여러개의 인스턴스를 생성할 수 있습니다.. 클로저 인스턴스와 유사하지만, 한가지 차이점은 내부의 익명함수에서 반환값이 함수가 아니라 객체를 반환한다는 점입니다.

모듈 패턴과 네임 스페이스 패턴을 활용한 코드

var app = app || {};
app.module = (function() {

    let privateKey = 0;
    function privateMethod() {
        return privateKey+=1;
    }

    return {
        publicKey: privateKey,
        publicMethod: function() {
            return privateMethod();
        }
    }
})();

console.log(app.module.publicMethod()); // 0
console.log(app.module.publicMethod()); // 1

문제 출처 사이트 : https://www.acmicpc.net/problem/2884

문제


상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.

상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.

이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.

바로 "45분 일찍 알람 설정하기"이다.

이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.

현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

입력


첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다.

입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.

출력


첫째 줄에 상근이가 창영이의 방법을 사용할 때, 설정해야 하는 알람 시간을 출력한다. (입력과 같은 형태로 출력하면 된다.)

작성코드


import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int hour = sc.nextInt();
        int minute = sc.nextInt();

        sc.close();

        secondNum = secondNum - 45;

        if(minute < 0) {
            minute = 60 + minute;
            hour --;
        }
        if(hour < 0) {
            hour = 23;
        }
        System.out.println(hour + " " + minute);

    }
}

문제 풀이 과정


ex ) 입력 받은 값 0 15

  1. 입력받은 분(minute) 에 45를 뺍니다. ( 15 - 45 = -30 )
  2. 현재 분(minute-45) 값이 음수 일 경우 60 에서 현재의 값을 더합니다. ( 60 + (-30) )
  3. 입력 받은 시(hour)에서 -1을 합니다.
  4. 현재 시(hour-1) 값이 음수 일 경우 hour 는 23의 값을 할당 받습니다.

'Java > 백준 알고리즘' 카테고리의 다른 글

[BAEKJOON] 14681 사분면 고르기  (0) 2021.10.03
[BAEKJOON] 2588 곱셈  (0) 2021.10.02

문제 출처 사이트 : https://www.acmicpc.net/problem/14681

문제


흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 1부터 4까지 번호를 갖는다. "Quadrant n"은 "제n사분면"이라는 뜻이다.

예를 들어, 좌표가 (12, 5)인 점 A는 x좌표와 y좌표가 모두 양수이므로 제1사분면에 속한다. 점 B는 x좌표가 음수이고 y좌표가 양수이므로 제2사분면에 속한다.

점의 좌표를 입력받아 그 점이 어느 사분면에 속하는지 알아내는 프로그램을 작성하시오. 단, x좌표와 y좌표는 모두 양수나 음수라고 가정한다.

입력


첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)

출력


점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.

작성코드


import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int firstNum = sc.nextInt();
        int secondNum = sc.nextInt();
        
        sc.close();

        int firstNumCheck = Integer.signum(firstNum);
        int secondNumCheck = Integer.signum(secondNum);

        if(firstNumCheck == 1 && secondNumCheck == 1) System.out.println("1");
        if(firstNumCheck == -1 && secondNumCheck == 1) System.out.println("2");
        if(firstNumCheck == -1 && secondNumCheck == -1) System.out.println("3");
        if(firstNumCheck == 1 && secondNumCheck == -1) System.out.println("4");

    }
}

문제 풀이 과정


양수인지 음수인지에 대해 체크 하기 위한 방법 중 가장 쉬운것은 0 과 비교 하는 것이 가장 편리합니다.

그런데 Java 언어 측에서 양수와 음수를 체크 해주는 Method가 혹시 있을까 해서 찾아봤습니다. Math.signum() , Intger.signum()을 확인 할 수 있었고, 이를 활용해서 문제를 풀었습니다.

Math.signum() 은 float 과 double 값에만 작동합니다.
Return : 인수의 부호 함수를 반환합니다. 인수가 0이면 0, 인수가 0보다 크면 1.0, 인수가 0보다 작으면 -1.0입니다.

Intger.signum() 은 int 형식에서 작동합니다.
Return : 지정된 값이 음수이면 반환 값은 -1, 지정된 값이 0이면 0, 지정된 값이 양수이면 1입니다.

참고사이트


 

https://stackoverflow.com/questions/19766051/java-check-if-input-is-a-positive-integer-negative-integer-natural-number-an

 

Java - Check if input is a positive integer, negative integer, natural number and so on.

Is there any in-built method in Java where you can find the user input's type whether it is positive, or negative and so on? The code below doesn't work. I am trying to find a way to input any in-b...

stackoverflow.com

https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#signum(int) 

 

Integer (Java Platform SE 7 )

Returns the value obtained by rotating the two's complement binary representation of the specified int value left by the specified number of bits. (Bits shifted out of the left hand, or high-order, side reenter on the right, or low-order.) Note that left r

docs.oracle.com

https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#signum%28double%29

'Java > 백준 알고리즘' 카테고리의 다른 글

[BAEKJOON] 2884 알람 시계  (0) 2021.10.03
[BAEKJOON] 2588 곱셈  (0) 2021.10.02

문제 출처 사이트 : https://www.acmicpc.net/problem/2588

문제


(세자리 수) X (세자리 수)는 다음과 같은 과정을 통하여 이루어진다.

(1) 과 (2)위치에 들어갈 세 자리 자연수가 주어질 때, (3), (4), (5), (6) 위치에 들어갈 값을 구하는 프로그램을 작성하시오.

입력


첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.

출력


첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

작성코드


import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int firstNum = sc.nextInt();
        String secondNum = sc.next();
        
        sc.close();

        for(int i = secondNum .length()-1; i >= 0; i--) {
            int num = Character.getNumericValue(secondNum .charAt(i));
            System.out.println(firstNum  * num);            
        }

        System.out.println(firstNum  * Integer.parseInt(secondNum));
    }
}

문제 풀이 과정


문제는 (세자리 수) X (세자리 수) 이지만, 그 이상의 숫자를 받았을 경우에도 돌아갈 수 있는 프로그램을 작성했습니다.

  1. 두번째 숫자는 String 객체로 데이터를 입력 받습니다.
  2. 입력받은 데이터를 charAt으로 저장된 문자열 중 한글자씩 char 타입으로 변환합니다.
  3. char 타입은 ASCII Code 기반이기 때문에 int 형식으로 캐스팅 할 경우 0 = 48 부터 시작 합니다. 그래서 캐스팅 할때 '0' 또는 48을 뺴주는 형태로 캐스팅을 하는데 이를 보다 편리하게 Character.getNumericValue() 메소드를 이용하여 캐스팅 해줍니다.
  4. 이 과정을 for 문을 통해 String의 마지막 인덱스 값부터 0까지 반복합니다.

'Java > 백준 알고리즘' 카테고리의 다른 글

[BAEKJOON] 2884 알람 시계  (0) 2021.10.03
[BAEKJOON] 14681 사분면 고르기  (0) 2021.10.03

🌐 문제

let videoList = [
      [
          ['id',1],
          ['title','first video'],
          ['description','This is first video'],
          ['view',24],
      ],
      [
          ['id',2],
          ['title','second video'],
          ['description','This is second video'],
          ['view',17],
      ],
      [
          ['id',3],
          ['title','third video'],
          ['description','This is third video'],
          ['view',15],
      ],
];

비디오의 데이터를 보관하기위해 배열에 데이터를 집어 넣었습니다. 하지만 데이터들을 좀더 효용성 있게 관리 하고 싶습니다.

[
    {
        id: 1,
        title: 'first video',
        description: 'This is first video',
        view: 24
    },
    {
        id: 2,
        title: 'second video',
        description: 'This is second video',
        view: 17
    },
    {
        id: 3,
        title: 'third video',
        description: 'This is third video',
        view: 15
    },
];

이때 배열안에 배열로 정리를 하기보다 객체를 집어 넣어 key와 property로 관리 하는 것이 더 효용성이 있습니다. 

🌟작성 코드

function convertArrayToObject(arr){
    let newArr = [];
    for(const prop of arr){        
        let newObj = {};
        prop.forEach(element => {
           newObj[element[0]] = element[1]
        });
        newArr.push(newObj);
    }
    return newArr;
}

코드 해석

입력받은 배열을 for ...of 문을 통해 prop에 배열안에 있는 배열의 데이터를 가져옵니다. 

for (const prop of arr){
	let newObj = {};
	console.log(prop);
}
/* output
[
  [ 'id', 1 ],
  [ 'title', 'first video' ],
  [ 'description', 'This is first video' ],
  [ 'view', 24 ]
]
...
*/

prop를 forEach문을 통해 배열의 각 요소를 가져옵니다.

for(const prop of arr){
	let newObj = {};
	prop.forEach(element => {
    	console.log(element);
        console.log('-------');
    }
}
/* output
[ 'id', 1 ]
------
[ 'title', 'first video' ]
------
[ 'description', 'This is first video' ]
------
[ 'view', 24 ]
------
...
*/

element에 담겨 있는 배열의 인덱스 값으로 하여금 newObj 에 객체를 추가합니다.

for(const prop of arr){
	let newObj = {};
	prop.forEach(element => {
    	newObj[element[0]] = element[1]
        // newObj['id'] = '1';
        // ...
        // newObj['view'] = 24;
    }
}

element가 prop 데이터 만큼 순회를 했을 경우 forEach를 종료하고 newArr에 추가한 newObj를 push 합니다.

let newArr = [];
for(const prop of arr){        
	let newObj = {};
	prop.forEach(element => {
		newObj[element[0]] = element[1]
	});
	newArr.push(newObj);
      	console.log(newObj);
      /* output
        {
          id: 1,
          title: 'first video',
          description: 'This is first video',
          view: 24
        }
    */
}

이 작업을 prop가 arr의 Symbol.iterator 속성이 있는 컬렉션 요소 갯수 만큼 반복합니다.

🗒️순서도

 

데이터 접근성 비교

첫번째 영상의 타이틀의 데이터를 가지고 오고 싶습니다.( 'first video' )

배열안에 배열일 경우

console.log(videoList[0][1][1]) // output: 'first video'

배열안에 객체일 경우

console.log(videoList[0].title) // output: 'first video'

배열안에 배열일 경우 현재 가지고 있는 데이터의 정보를 모르면 어느 부분에 접근하는지 자세히 알기 어렵습니다. 하지만 배열안에 객체일 경우는 내가 무엇을 가져오고자 하는지 직관적으로 알수 있습니다. 

 

* 틀린 부분이 있으면 언제든 피드백 부탁드립니다.

'JavaScript > JS' 카테고리의 다른 글

객체 리터럴 모듈 패턴 , 클로저 패턴, 싱글톤 패턴  (0) 2021.10.05

NVM

Node Version Manager의 줄임말입니다.
말 그대로 Node의 Version 들을 관리 해주는 도구입니다.

여러 Node.js 를 설치 하고 달리 사용 해야 할 경우 쉽게 전환해주는 shell script입니다.

NVM 은 POSIX-compliant shell (sh, bash, ksh, zsh, dash)에서 작동합니다.

  • Linux / Unix
  • macOS
  • Windows WSL

NVM은 왜 사용 할까요?

개발환경에 따라 Node.js 버전을 달리 사용 해야 할 경우에 용이하게 버전을 바꿔서 사용할 수 있게 도와줍니다. 예시로 아래와 추가 적인 상황이 있을 수 있습니다.

  • 협업을 할때, 또는 다양한 프로젝트를 동시에 진행해야 할 때
  • 다양한 라이브러리 / 프레임워크 / 개발툴의 버전 호환 문제때문에
  • LTS(Long Time Support) 버전이 달라 졌을 경우
  • 최신 버전을 사용해야 할 경우
  • 과거 사용 했던 버전을 사용해야 할 경우

NVM 설치하기

최신버전을 다운 받기 원하면 NVM Repository(공식 문서) 참고 해주시길 바랍니다.

NVM 공식문서에서 제공한 install & update 를 도와 주는 script 문을 작성합니다.

curl 사용 할 경우

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

wget 사용 할 경우

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

위 2개 중 하나의 명령어를 입력 할 경우 2가지의 변화가 생깁니다.

  1. 현재 사용자의 홈 디렉토리에 .nvm 디렉토리가 생성됩니다.
chaser@DESKTOP-Q89E2CK:~$ pwd
/home/chaser
chaser@DESKTOP-Q89E2CK:~$ ls -a | grep .nvm
.nvm
  1. 쉘 설정 파일에 nvm 명령어 스크립트가 추가됩니다.
  • 쉘의 종류에 따라 파일들이 다릅니다.(~/.bash_profile, ~/.zshrc, ~/.profile, or ~/.bashrc)
chaser@DESKTOP-Q89E2CK:~$ tail -n 3 .bashrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

.nvm 디렉토리

chaser@DESKTOP-Q89E2CK:~$ ls -la .nvm
total 300
drwxr-xr-x 8 chaser chaser   4096 Sep  1 13:37 .
drwxr-xr-x 9 chaser chaser   4096 Sep  1 21:45 ..
drwxr-xr-x 3 chaser chaser   4096 Sep  1 13:37 .cache
-rw-r--r-- 1 chaser chaser    140 Sep  1 13:36 .dockerignore
-rw-r--r-- 1 chaser chaser    523 Sep  1 13:36 .editorconfig
drwxr-xr-x 8 chaser chaser   4096 Sep  1 13:36 .git
-rw-r--r-- 1 chaser chaser      9 Sep  1 13:36 .gitattributes
drwxr-xr-x 3 chaser chaser   4096 Sep  1 13:36 .github
-rw-r--r-- 1 chaser chaser    253 Sep  1 13:36 .gitignore
-rw-r--r-- 1 chaser chaser     51 Sep  1 13:36 .mailmap
-rw-r--r-- 1 chaser chaser     19 Sep  1 13:36 .npmrc
-rw-r--r-- 1 chaser chaser   2713 Sep  1 13:36 .travis.yml
-rw-r--r-- 1 chaser chaser   5424 Sep  1 13:36 CODE_OF_CONDUCT.md
-rw-r--r-- 1 chaser chaser   1057 Sep  1 13:36 CONTRIBUTING.md
-rw-r--r-- 1 chaser chaser   3723 Sep  1 13:36 Dockerfile
-rw-r--r-- 1 chaser chaser   1113 Sep  1 13:36 LICENSE.md
-rw-r--r-- 1 chaser chaser   5361 Sep  1 13:36 Makefile
-rw-r--r-- 1 chaser chaser  39200 Sep  1 13:36 README.md
-rw-r--r-- 1 chaser chaser    882 Sep  1 13:36 ROADMAP.md
drwxr-xr-x 3 chaser chaser   4096 Sep  1 13:37 alias
-rw-r--r-- 1 chaser chaser   2201 Sep  1 13:36 bash_completion
-rwxr-xr-x 1 chaser chaser  14926 Sep  1 13:36 install.sh
-rwxr-xr-x 1 chaser chaser    344 Sep  1 13:36 nvm-exec
-rw-r--r-- 1 chaser chaser 134284 Sep  1 13:36 nvm.sh
-rw-r--r-- 1 chaser chaser   2228 Sep  1 13:36 package.json
-rwxr-xr-x 1 chaser chaser   1235 Sep  1 13:36 rename_test.sh
drwxr-xr-x 9 chaser chaser   4096 Sep  1 13:36 test
-rwxr-xr-x 1 chaser chaser   2364 Sep  1 13:36 update_test_mocks.sh
drwxr-xr-x 3 chaser chaser   4096 Sep  1 13:37 versions

공식문서에서 제공한 script 문을 작성 할 경우 nvm github(공식문서)에 있는 파일 들을 .nvm 디렉토리에 설치를 도와주고 따로 환경변수를 변경 하지 않아도 환경변수 값을 작성해줍니다.

NVM 명령어

자세한 명령어 확인하기

$ nvm --help

이는 NVM 공식문서(usage) 부분에서 확인 할 수 있습니다.

NVM Version 확인하기

$ nvm --version

Node 설치하기

# 최신버전 설치하기
$ nvm install node
# 특정 버전 설치하기
$ nvm install {version}         # ex1) nvm istall v13  ex2) nvm istall 14.17.6
# LTS 버전 설치하기
$ nvm istall --lts

node를 설치 할 경우 다음과 같은 경로에 설치가 됩니다.

chaser@DESKTOP-Q89E2CK:~/.nvm/versions/node$ pwd
/home/chaser/.nvm/versions/node
chaser@DESKTOP-Q89E2CK:~/.nvm/versions/node$ ls
v14.17.6

NVM 에서 지원 하는 node 버전은 다음 명령어로 확인이 가능합니다.

$ nvm ls-remote

2021-09-02 기준 node.js 사이트 최신 버전은 16.8.0 버전이며 nvm 에서 제공하는 최신 버전 또한 16.8.0 버전입니다.

Node 설치한 목록 확인하기

chaser@DESKTOP-Q89E2CK:~/.nvm/versions/node$ nvm ls
->     v14.17.6
         system

지금 현재 nvm을 통해서 다운로드 받은 node 는 v14.17.6 버전입니다. 그런데 system 이란 글자가 있습니다. 이는 다음과 같이 확인할 수 있습니다.

chaser@DESKTOP-Q89E2CK:~/.nvm/versions/node$ nvm run system --version
Running node system (npm v6.14.4)
v10.19.0

Node 버전 선택하기

$ nvm use {version}
chaser@DESKTOP-Q89E2CK:~/.nvm/versions/node$ nvm ls
->     v14.17.6
         system
default -> lts/* (-> v14.17.6)

use 명령어를 사용 할 경우 새로운 쉘을 실행 하거나 다시 띄우게 되면 node의 버전이 default 버전으로 돌아가게 됩니다.

이를 방지하기 위해서 기본적으로 제공할 버전을 다음과 같이 변경 합니다.

$ nvm alias default {version}

# 설치되어 있는 가장 최신버전의 node를 defalut로 사용하기
$ nvm alias default node

현재 사용중인 버전 확인하기

$ nvm current

node.js 설치 경로 확인하기

$ which node

필요 없는 node 버전 삭제하기

$ nvm uninstall {version}

'Node.js' 카테고리의 다른 글

[Node] NVM-windows 설치하기  (0) 2021.09.01
[Node] Windows에서 Node.js 설치하기  (0) 2021.09.01

불리언 (boolean)

boolean은 true와 false 밖에 존재 하지 않습니다. C 같은 일부 언어에서는 boolean 대신 숫자를 사용합니다.
0 은 false 이고, 다른 숫자는 모두 true 입니다. 자바스크립트에서도 비슷한 방식을 사용합니다.

모든 값을 참 같은 값(truthy), 거짓 같은 값(falsy) 으로 나눌 수 있습니다.

boolean을 작성 할때 문자열로 작성해서는 안됩니다. boolean 리터널은 다음과 같이 작성 해야합니다.

let heating = true;
let cooling = false;

심볼(symbol)

심볼(symbol)은 유일한 토큰을 나타내기 위해 ES6에서 도입한 새 데이터 타입입니다.

심볼은 다른 어떤 심볼과도 일치하지 않는 고유의 값입니다. 이런 면에서는 심볼은 객체와 유사합니다.

심볼은 Symbol() 생성자로 만듭니다. 원한다면 생성자에 간단한 설명을 추가할 수 있습니다.

const RED = Symbol("The color of a sunset!");
const ORANGE = Symbol("The color of a sunset!");
RED === ORANGE // false: 심볼은 모두 서로 다릅니다.

다른 식별자와 혼동해서는 안 되는 고유 식별자가 필요하다면 심볼을 사용하면 됩니다.

  • 객체지향 프로그래밍 처럼 심볼을 만들 때 new 키워드는 사용 할 수 없습니다.
  • 대문자로 시작하는 식별자는 new와 함께 쓴다는 불문율의 예외임을 새로 기억해야합니다.

null 과 undefined

null 과 undefined는 자바스크립트의 특별한 타입입니다.

null 이 가질수 있는 값은 null 하나 뿐이며, undefined가 가질 수 있는 값도 undefined 하나 뿐입니다.

두개의 의미는 모두 존재 하지 않는것 을 의미합니다. 이 두개의 타입은 같은 의미이지만 서로 다른 데이터 타입입니다.

null 은 프로그래머에게 허용된 데이터 타입이며 undefined는 자바스크립트 자체에서 사용한다는 부분이 중요합니다. 강제적인 규칙은 아니지만, undefined 값을 사용 할때는 꼭 필요할 때만 사용하도록 주의해야합니다.

사용 할때는 아직 값이 주어지지 않은 변수의 동작을 고의로 흉내 내야 할때만 사용하도록 주의합니다.

변수값을 아직 모르거나 적용할수 없는 경우 null 이 더 좋은 선택이 될수 있습니다.

let nullTmp = null;
let undefinedTmp_1;
let undefieedTmp_2 = undefined;

참고한 사이트는 다음과 같습니다. NVM-windows 수동 설치하기

NVM은 windows 에서 설치를 할 수 없습니다. NVM 에서는 windows 사용자 들을 위해 대안을 다음과 같이 작성했습니다.

이중 nvm-windows를 설치하겠습니다. nvm-windows는 MIT 라이센스의 오픈 소스로 Go 로 작성되어있습니다. 

nvm-windows README.md 파일을 확인해보면 Download the lastest installer를 눌러 다운로드 경로에 갑니다.

https://github.com/coreybutler/nvm-windows/releases 에서 nvm-setup 말고 noinstall 로 하여 설치를 진행 했습니다. setup은 설치프로그램으로 설치를 하기에 따로 포스팅 하지 않았습니다.

nvm-noinstall.zip을 다운로드 받고 아래의 경로를 생성 한 후 압축을 풉니다.

C:\Users\{userName}\AppData\Roaming\nvm

설치를 하고 압축을 풀면 다음과 같이 나옵니다.

설치하기 앞서 2개의 새로운 환경 변수와 1개의 환경변수를 수정해야 합니다.

  • NVM_HOME
  • NVM_SYMLINK
  • Path

NVM_HOME은 아무런 값이 없기 때문에 변수 값을 다음과 같이 작성 합니다.

C:\Users\{userName}\AppData\Roaming\nvm

NVM_SYMLINK의 변수값은 nvm 에서 직접 생성 및 관리를 해야 하기 때문에 C:\Program Files\nodejs 가 존재 해서는 안됩니다.

아무런 값이 안나오는 것이 정상입니다. nvm-windows를 설치 하기 전 nodejs 디렉토리가 있을 경우 삭제 후 설치 해야합니다.

Path 의 시스템 변수에 생성한 NVM_HOME 과 NVM_SYMLINK를 추가합니다.

설정을 모두 완료한 이후 재부팅 혹은 새로운 커멘드라인창을 열어 설치가 되었는지 확인합니다.

2-2. nvm-windows를 이용하여 node.js 설치하기

nvm install {version}

리눅스나 Mac에서 NVM 을 이용하여 lts 버전을 다운로드 받을때 처럼 입력 할 경우 다음과 같이 에러가 발생합니다.

C:\Users\Byul>nvm install --lts
--lts.0.0
Node.js v--lts.0.0 is only available in 32-bit.

따로 설치할 버전을 찾아서 install 해주겠다는 명령어를 입력해야 정상적으로 다운로드가 됩니다.

버전 확인은 다음 사이트에서 확인이 가능합니다.

아래의 코드처럼 버전을 직접 선택하여 설치를 진행 합니다.

C:\Users\Byul>nvm install 14.17.6
Downloading node.js version 14.17.6 (64-bit)...
Complete
Creating C:\Users\Byul\AppData\Roaming\temp

Downloading npm version 6.14.15... Complete
Installing npm v6.14.15...

Installation complete. If you want to use this version, type

nvm use 14.17.6

설치가 된 버전은 기존 nvm과 동일하게 확인을 할 수 있습니다.

C:\Users\Byul>nvm list

    14.17.6

설치한 Node 버전을 사용하기 위해 use 옵션을 사용해서 설정합니다.

C:\Users\Byul>nvm use 14.17.6
Now using node v14.17.6 (64-bit)

정상적으로 설정이 되었는지 다음처럼 확인 합니다.

C:\Users\Byul>node -v
v14.17.6

C:\Users\Byul>npm -v
6.14.15

node 와 npm의 버전까지 모두 확인이 되면 정상적으로 nvm과 node 설치가 된 것입니다.

'Node.js' 카테고리의 다른 글

[Node] NVM(Node Version Manager) 이란 ?  (0) 2021.09.02
[Node] Windows에서 Node.js 설치하기  (0) 2021.09.01

+ Recent posts