IP(Internet Protocol) 란 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을

식별할 수 있도록 각각의 장비에게 부여되는 고유 주소이다.

1. IPv4, IPv6

IP주소는 IPv4, IPv6 2가지 종류가 있으며,

일반적으로 IP 주소라 하면 IPv4 주소를 말한다.

 

IPv4는 IP version 4의 약자로 전 세계적으로 사용된 첫 번째 인터넷 프로토콜이다.

주소는 32비트 방식으로, 8비트씩 4자리로 되어 있으며 각 자리는 온점으로 구분한다.

ex) 115.68.24.88

IPv4는 0 ~ 2^32 (약 42억 9천)개의 주소를 가질 수 있는데, 

전 세계적으로 인터넷 사용자 수가 급증하면서 IPv4 주소가 고갈될 위기에 처해있다.

이러한 고갈 문제를 해결하기 위해 등장한 주소가 바로 IPv6이다.

 

IPv6는 IP version 6의 약자로,

IPv4의 주소체계를 128비트 크기로 확장한 차세대 인터넷 프로토콜 주소이다.

16비트씩 8자리로 각 자리는 콜론으로 구분한다.

ex) 2001:0DB8:1000:0000:0000:0000:1111:2222

네트워크 속도, 보안적인 부분뿐만 아니라 여러 면에서 뛰어나지만

기존의 주소체계를 변경하는데 비용이 많이 들어서 아직 완전히 상용화가 되지 않았다.

2. 고정 IP, 유동 IP

IP는 나누는 방식에 따라 고정 IP, 유동 IP공인 IP, 사설 IP로 나눌 수 있다.

 

고정 IP는 말 그대로 변하지 않고 컴퓨터에 고정적으로 부여된 IP이다.

한번 부여되면 IP 반납을 하기 전까지는 다른 장비에 부여할 수 없는 고유의 IP로

보안성이 우수하기 때문에 보안이 필요한 업체나 기관에서 사용한다.

 

유동 IP 역시 말그대로 변하는 IP이다.

인터넷 사용자 모두에게 고정 IP를 부여해 주기는 힘들기 때문에,

일정한 주기 또는 사용자들이 인터넷에 접속하는 매 순간마다 사용하고 있지 않은 IP 주소를 임시로 발급해 주는 IP이다.

대부분의 사용자는 유동 IP를 사용한다.

3. 공인 IP, 사설 IP

IP 주소는 임의로 우리가 부여하는 것이 아니라 전 세계적으로 ICANN이라는 기관이

국가별로 사용할 IP 대역을 관리하고, 우리나라는 한국인터넷진흥원(KISA)에서 국내 IP 주소들을 관리하고 있다.

 

이것을 ISP(Internet Service Provider의 약자로 KT, LG, SKT와 같이 인터넷을 제공하는 통신업체)가 부여받고,

우리는 위 회사에 가입을 통해 IP를 제공받아 인터넷을 사용하게 되는 것이다.

이렇게 발급받은 IP를 공인 IP라고 한다.

 

공유기를 사용한 인터넷 접속 환경일 경우 공유기까지는 공인 IP 할당을 하지만,

공유기에 연결되어 있는 가정이나 회사의 각 네트워크 기기에는 사설 IP를 할당한다.

사설 IP는 어떤 네트워크 안에서 내부적으로 사용되는 고유한 주소이다.

 

 

즉, 공인 IP는 전 세계에서 유일하지만, 사설 IP는 하나의 네트워크 안에서 유일하다.

공인 IP는 외부, 내부 상관없이 해당 IP에 접속할 수 있으나, 사설 IP는 내부에서만 접근이 가능하다.

 

'Network > basic network' 카테고리의 다른 글

Port란 무엇인가  (0) 2020.01.01
SSH란 무엇인가  (0) 2019.12.30
Domain, DNS란 무엇인가  (0) 2019.12.29

1. 값이 없는 vs 선언되지 않은

값이 없는 변수의 값은 undefined이며, typeof의 결과는 "undefined"이다.

 

undefined와 undeclared는 전혀 다른 개념이다.

 

undefined는 접근 가능한 스코프에 변수가 선언되었으나 현재 아무런 값도 할당되지 않은 상태를 가리키는 반면,

undeclared는 접근 가능한 스코프에 변수 자체가 선언조차 되지 않은 상태를 가리킨다.

let a;

console.log(a); // undefined
console.log(b); // ReferenceError: b is not defined

 

문제는 선언되지 않는 변수에 typeof를 해도 오류 처리를 하지 않는다.

선언되었지만 값을 할당하지 않은 변수도, 선언되지 않은 변수도 모두 typeof의 결과값은 undefined이다.

let a;

typeof a; // "undefined"
typeof b; // "undefined"

 

2. 선언되지 않는 변수

선언되지 않은 변수를 처리하는 typeof의 방식은

여러 스크립트 파일의 변수들이 전역 네임 스페이스를 공유할 때 유용하다.

[func.js]
function sum(a, b) {
  return a + b;
}

function product(a, b) {
  return a * b;
}

export { sum, product }
[app.js]
import {product, sum} from 'func';

console.log(product(1,2)); // 2
console.log(sum(1,2)); // 3

// 이 경우 DEBUG라는 변수가 없으므로 에러 발생!
if (DEBUG) {
  console.log("디버깅을 시작합니다.");
}

// 이렇게 해야 안전하게 존재 여부를 체크할 수 있다.
if (typeof DEBUG !== "undefined") {
  console.log("디버깅을 시작합니다.");
}

 

typeof 없이 전역 변수를 체크하는 다른 방법은

전역 변수가 모두 전역 객체(브라우저는 window)의 프로퍼티라는 점을 이용하는 것이다.

 

선언되지 않은 변수 때와는 달리 어떤 객체의 프로퍼티를 접근할 때는 

그 프로퍼티가 존재하지 않아도 ReferenceError가 나지 않는다.

// DEBUG가 없으면 에러가 남
if (DEBUG) {
  console.log("디버깅을 시작합니다.");
}

// DEBUG가 없어도 에러가 나지 않음
if (window.DEBUG) {
  console.log("디버깅을 시작합니다.");
 }

 

하지만 다중 자바스크립트 환경에서는 전역 객체가 window가 아닐 수 있으므로 

window 객체를 통한 전역 변수 참조는 가급적 삼가는 것이 좋다.

 

typeof는 전역변수를 사용하지 않을 때도 유용하다.

(function() {
  function test(a, b) {
    return a + b;
  }
  
  function doSomething() {
    const func = 
      (typeof test !== "undefined") ?
      test :
      function(a, b) { return a - b; };
      
    console.log(func(1,2));
  }
  
  doSomething();
})();

test는 전역 변수가 아니지만 8~10번째 줄에서 typeof로 존재 여부를 확인하고 있다.

위 코드에서는 전역변수와 같이 체크 용도로 사용할 만한 객체가 없기 때문에 typeof가 꽤 요긴하다.

 

또는 다음과 같이 명시적으로 나타낼 수도 있다.

(function() {
  function test(a, b) {
    return a + b;
  }
  
  function doSomething() {
    const func = test ||
      function(a, b) { return a - b; };
      
    console.log(func(1,2));
  }
  
  doSomething();
})();

 

https://github.com/getify/You-Dont-Know-JS

 

getify/You-Dont-Know-JS

A book series on JavaScript. @YDKJS on twitter. Contribute to getify/You-Dont-Know-JS development by creating an account on GitHub.

github.com

'Javascript' 카테고리의 다른 글

자바스크립트 문자열  (0) 2019.12.29
자바스크립트 배열  (0) 2019.12.29
자바스크립트 내장 타입  (0) 2019.12.14

자바스크립트에서 타입이란, 자바스크립트 엔진과 개발자 모두에게

어떤 값을 다른 값과 분별할 수 있는 고유한 내부 특성의 집합이다.

 

자바스크립트에는 다음 7가지 내장 타입이 있다.

  • null

  • undefined

  • boolean

  • number

  • string

  • object

  • symbol

1. 원시 타입과 참조 타입

자바스크립트에서는 원시 타입(primitive type) 참조 타입(reference type)이라는 두 가지 자료형을 제공한다.

object를 제외한 나머지 타입들은 모두 원시 타입이다.

원시 타입 데이터는 변수에 할당될 때 메모리 상에 고정된 크기로 저장되고 해당 변수가 원시 데이터 값을 보관한다.

let x = 100; // 원시 타입 데이터를 선언
let y = x; // 값을 새 변수에 복사
x = 99; // x의 값을 변경, y의 값은 변경되지 않음
console.log(y); // 100 

 

object는 참조 타입이다.

array나 function 같은 것은 object에 속한다.

 

참조 타입 데이터는 크기가 정해져 있지 않고 변수에 할당될 때 값이 직접 해당 변수에 저장될 수 없으며,

변수에는 데이터에 대한 참조만 저장된다. 참조는 참조 타입 데이터의 주소이지 해당 데이터의 값이 아니다.

let x = { count: 100 };  // 참조 타입 데이터를 선언
let y = x;  // 참조를 새 변수에 복사
x.count = 99;  // 참조 타입 데이터를 변경, y는 동일한 참조를 담고 있음
console.log(y.count);  // 99

 

2. 내장 타입

값 타입은 typeof 연산자로 알 수 있다.

typeof undefined  // "undefined"
typeof true  // "boolean"
typeof 42  // "number"
typeof "42"  // "string"
typeof { apple : 30 }  // "object"
typeof Symbol()  // "symbol"

 

단 null에 대한 typeof 연산 결과는 조금 다르다.

타입이 null이 아니라 object로 나온다.

typeof null  // "object"

 

따라서 타입으로 null 값을 정확히 확인하려면

다음과 같이 falsy값을 확인하는 조건이 하나 더 필요하다.

const a = null;
(!a && typeof a === "object");  // true

 

typeof는 이 외에도 "function"이라는 타입을 반환한다.

typeof function foo(){}  // "function"

 

위 결과를 보면 function이 마치 또 다른 내장 타입같지만,

위에서 언급했듯 function은 object의 하위 타입이다.

 

함수는 객체이기 때문에 함수에 프로퍼티를 둘 수 있다.

함수에 선언된 인자 개수는 함수 객체의 length 프로퍼티로 알 수 있다.

function foo(a, b){}
foo.length; // 2

 

배열 역시 object의 하위 타입이다.

typeof [1,2,3] // "object"

 

3. 값은 타입을 가진다

값에는 타입이 있지만, 변수에는 따로 타입이 없다.

변수는 언제라도, 어떤 형태의 값이라도 가질 수 있다.

 

자바스크립트는 '타입 강제'를 하지 않기 때문에, 변숫값이 처음에 할당된 값과 동일한 타입일 필요가 없다.

숫자를 넣었다가 나중에 문자열을 넣어도 상관없다.

 

변수에 typeof 연산자를 대어 보는 건 실제로 "이 변수에 들어있는 값의 타입은 무엇이니?"라고 묻는 것이다.

let a = 42;
typeof a; // number

a = true;
typeof a; // boolean

 

 

https://github.com/getify/You-Dont-Know-JS

 

getify/You-Dont-Know-JS

A book series on JavaScript. @YDKJS on twitter. Contribute to getify/You-Dont-Know-JS development by creating an account on GitHub.

github.com

 

'Javascript' 카테고리의 다른 글

자바스크립트 문자열  (0) 2019.12.29
자바스크립트 배열  (0) 2019.12.29
선언되지 않은 변수  (0) 2019.12.14

+ Recent posts