1. 객체를 만드는 두가지 방법

1) 객체 리터럴을 이용한 방법

객체 리터럴은 {...}을 사용해서 객체를 생성합니다. 
var obj = {
    name: "kim",
    getName: function () {
        console.log(this.name);
    }
};

console.log(obj.name);
obj.getName();


2) 생성자 함수를 이용하는 방법

1) 관례상 함수 이름의 첫글자는 대문자로 시작합니다.
2) 함수 호출 시 "new" 연산자를 붙여서 실행합니다.
function Person(name) {
    this.name = name;
    this.showName = function () {
        console.log(`My name is ${this.name}`);
    };
}

var person = new Person("Son");
person.showName();

 

2-1) 함수 앞에 new를 붙일 경우

new Person("name")을 사용해서 함수를 실행하면 아래와 같은 알고리즘이 동작합니다.
1) 빈 객체를 생성하고 this가 빈 객체를 가리키게 합니다.
2) 함수를 실행합니다. 
3) this를 반환합니다.
function Person(name) {
// 빈 객체가 생성되고 this에 저장합니다.
// this = {};

// 함수가 실행됩니다. 
// this는 객체({})기 때문에 this.name = name 구문은 객체에 name 값을 넣는 것과 같습니다.
    this.name = name;
    this.showName = function () {
        console.log(`My name is ${this.name}`);
    };
    
// return this;
}

var person = new Person("Son");
person.showName();

생성자 함수를 사용하는 이유는 객체를 재사용하기 위함입니다. 리터럴 객체를 만드는 방법보다 수고를 덜 수 있지요.

var person01 = new Person("kim");
var person02 = new Person("park");
var person03 = new Person("lee");

2-2) 생성자 함수의 return문

생성자 함수에서 명시적으로 return문을 사용할 경우 다음과 같은 값을 반환합니다.

return문이 없을 경우

this를 반환한다.

return 값이 객체일 경우

해당 객체를 반환한다.

return 값이 기본 변수일 경우

기본 변수 반환을 무시하고 this를 반환한다. 

참조

https://ko.javascript.info/constructor-new

1. Prototype이란?

자바스크립트의 모든 객체는 부모 객체와 연결되어 있습니다. 최상위 객체는 Object 객체이며, 해당 객체의 모든 메소드를 상속받습니다. 이 때 부모 객체를 가리켜 Prototype 객체라고 합니다.

 2. Prototype을 사용하는 이유

1) 생성자 함수로 생성된 객체에 공통 변수와 메소드를 공유할 수 있습니다.
2) 상속을 구현할 수 있습니다.

3. __proto__

__proto__ 는 prototype 객체를 가리키는 프로퍼티입니다. 모든 객체가 이 프로퍼티를 가지고 있습니다.

prototype 객체는 다음과 같은 데이터를 저장하고 있습니다.

1) constructor
   생성자 함수에 대한 데이터를 저장하는 객체입니다.
2) 공통 메소드와 공통 변수
    해당 프로토타입으로 생성된 객체들은 공통 메소드와 공통 변수에 접근할 수 있습니다.
3) __proto__
   상위 프로토타입을 가리킵니다 (prototype link)
    function Person(n) {
        this.name = n;
    }

    Person.prototype.getName = function () {
        return `My name is ${this.name}`;
    };

    var person = new Person("kim");


    console.log(person);
    console.log(person.getName());
Person 객체를 선언하고, 생성자 함수 호출 시 this.name을 매개변수 n으로 초기화합니다.
그리고 Person.prototype에 getName 공통 메소드를 선언했습니다. 공통 메소드를 선언하면 Person 생성자 함수로 생성된 객체들은 모두 getName 메소드에 접근할 수 있습니다. 

person 변수에 Person 생성자 함수를 호출하면 새로운 Person객체가 생성됩니다.  
console.log의 출력 결과는 다음과 같습니다.

Person 생성자 함수를 통해 생성한 객체의 정보입니다. name과 __proto__가 저장되어 있는 것을 알 수 있습니다. 
그리고 __proto__에는 공통 메소드인 getName()과 constructor 그리고 __proto__가 저장되어있습니다.
__proto__는 모든 객체의 상위 객체인 Object 프로퍼티를 가리킵니다.

4. prototype chain

객체의 프로퍼티에 접근하려면 객체.프로퍼티이름으로 접근할 수 있습니다. 그런데 해당 프로퍼티가 없으면 부모 객체의 프로퍼티를 참조합니다. 부모의 프로퍼티를 참조한다는 것은 객체의 __proto__를 참조해서 해당 프로퍼티가 있는지 확인하고 없으면 상위 __proto__를 참조합니다. 이것을 prototype chain이라고 합니다. 

prototype chain의 종점은 Object.prototype 입니다. 만약 여기에도 찾고자하는 프로퍼티가 없다면 오류를 발생시킵니다.

 

5. 객체 상속

자바스크립트에서 상속을 구현하려면 prototype 객체를 이용해야 합니다.

    function Person(n) {
        this.name = n;
    }

    Person.prototype.getName = function () {
        return `My name is ${this.name}`;
    };

    function Student(n, i) {
        this.name = n;
        this.id = i;
    }

    Student.prototype = new Person(); //Person 객체 상속
    Student.prototype.constructor = Student; // 생성자 함수는 Student함수를 가리킨다.
    Student.prototype.getInfo = function () {
        return `${this.getName()} and My id is ${this.id}`;
    };

    var student = new Student("lee", "st1111");
    var student2 = new Student("park", "st1112");

    console.log(student);
    console.log(student.getInfo());
    console.log(student2.getInfo());

 

Student에 Person을 상속하려면 Student.prototype에 Person 생성자 함수를 통해 객체를 상속 받습니다.
그리고 생성자 함수를 다시 지정해주어야 합니다.

 

클로저란?

함수 내부에 선언된 변수는 함수 종료 시, 모두 반환되지만, 외부에서 그 값을 계속 참조할 경우 반환하지 않습니다.
클로저는 이러한 특성을 이용해서 사용되는 데, 함수 내부의 변수를 참조하는 함수를 리턴하는 형식으로 사용됩니다.
    function func() {
        var num = 1;

        return function () {
            return ++num;
        };
    }
    
    var closure = func();
    
    closure(); // 2
    closure(); // 3
    closure(); // 4

func()함수는 num 변수를 선언하고 num 변수를 증가시키는 함수를 반환하는데, func()함수가 종료되어도 num 변수는 사라지지 않고 클로저 함수에서 사용됩니다. 이러한 동작이 가능한 이유는 함수는 1급 객체이고, 실행 컨텍스트라는 특수한 환경을 지니고 있기 때문입니다. 

1급 객체란?

1) 함수를 변수에 저장할 수 있다.
2) 함수를 인자로 전달할 수 있다.
3) 함수를 반환할 수 있다.

실행 컨텍스트란?

2020/12/05 - [IT/javascript] - [javascript] 실행 컨텍스트(Execution Context)

 

클로저를 이용한 캡슐화

    function Person(){
        var name = "";
        
        this.getName = function(){
            return name;
        };
        
        this.setName = function(n){
            name = n;
        };
    }
    
    var person = new Person();
    
    person.setName("kim");
    console.log(person.getName());
생성자 함수 Person은 getName()과 setName() 메소드를 갖는 인스턴스를 생성합니다. 이 메소드들은 자신이 생성되었을 때의 생성자 함수 Person의 스코프에 속한 name 변수를 기억하는 클로저입니다. 생성자 함수 Person의 변수 name은  this에 바인딩된 프로퍼티가 아닌 지역변수입니다. name 변수가 this에 바인딩된 변수라면 외부에서 접근 가능한 변수가 되지만, 지역변수로 선언되었으므로 외부에서 접근할 수 없고, getName(), setName() 메소드를 통해서 접근이 가능합니다. 이러한 클로저의 특징을 이용해 private 변수를 흉내낼 수 있습니다. 

 

자주 발생하는 실수

    
    for (var index = 0; index < 10; index++) {
        setTimeout(function () {
            console.log(index);
        }, 100);
    }
    
0.1초 마다 0에서 9까지 출력할 것으로 예상하겠지만 결과는 그렇지 않습니다. 이유는 setTimeout 내부에 생성된 클로저는 index 값을 받은 시점의 값이 출력되는 것이 아니라 index 변수 자체를 공유하고있기 때문입니다.  

 

let 변수

    for (let index = 0; index < 10; index++) {
        setTimeout(function () {
            console.log(index);
        }, 100);
    }
let은 블록 스코프이기 때문에, 반복문의 각 단계가 같은 index를 공유하지 않습니다.

참조 :
https://victorydntmd.tistory.com/44?category=704012
https://poiemaweb.com/js-closure

 

1. IP 주소란?

2020/12/10 - [IT/Network] - [Network] IP 주소

2. IP 클래스란

IP 주소 클래스는 A~E 클래스로 구성되고, 각 클래스 별로 IP할당 범위가 다릅니다.  

클래스 A는 대규모 네트워크 환경에 쓰이며, 클래스 B는 중규모 네트워크 환경, 클래스 C는 소규모 네트워크 환경에 사용됩니다. 나머지 D는 멀티캐스트용 E는 연구/개발용으로 사용됩니다.

출처 : http://www.ktword.co.kr/abbr_view.php?m_temp1=2461

클래스 별로 첫 번째 옥텟의 범위가 정해져 있습니다. 

A클래스 0000 0000 ~ 0111 1111 (0 ~ 127)
B클래스 1000 0000 ~ 1011 1111 (128 ~ 191)
C클래스 1100 0000 ~ 1101 1111 (192 ~ 223)
D클래스 1110 0000 ~ 1110 1111 (224 ~ 239)
E클래스  1111 0000 ~ 1111 0111 (240 ~ 255)

A 클래스에서 E 클래스로 이동할 수록 앞에서 1비트 씩 채워지는 것을 알 수 있습니다. 
그에 따라서 시작 값이 0, 128, 192, 240, 256으로 정해지는 규칙이 있음을 알 수 있습니다.  

클래스 별로 네트워크 영역과 호스트 영역의 범위가 다릅니다.

A 클래스 네트워크 영역 : 8비트, 호스트 영역 : 24비트
B 클래스 네트워크 영역 : 16비트, 호스트 영역 : 16비트
C 클래스 네트워크 영역 : 24비트, 호스트 영역 : 8비트

네트워크 영역은 호스트 영역을 포함하는 개념이고, 호스트 영역은 실제 할당 받는 고유한 IP를 의미합니다.

3. A 클래스

대규모 네트워크이므로 한 개의 네트워크 영역 당 가장 많은 IP주소를 할당할 수 있습니다.

첫번째 네트워크 영역의 범위는 0~127 이고, 호스트 영역은 24비트입니다.

1개의 네트워크 영역 당 16,777,216개의 호스트 IP를 할당할 수 있습니다. ( 24비트 = 16,777,216 )
그리고 할당 가능한 총 IP의 개수는 2,147,483,648개 입니다. (128 * 16,777,216)

만약 22.0.48.2 라는 IP주소가 존재할 경우 기본적으로 네트워크 영역은 22고 호스트 IP는 0.48.2입니다.
그리고 네트워크 영역이 22로 시작되는 IP를 16,777,216 - 2개 할당할 수 있습니다.
2개를 제외한 이유는 IP 주소는 처음인 22.0.0.0과 마지막 22.255.255.255를 사용하지 않기 때문입니다. 
모든 주소의 시작은 네트워크 주소로 사용되고 마지막은 브로드캐스트 주소로 사용됩니다.


4. B 클래스

중규모 네트워크이고 네트워크 영역의 범위는 16비트입니다.
첫번째 옥텟의 범위는 128 ~ 191이고 
두번째 옥텟은 8비트(256) 이므로 둘을 곱해서 네트워크 영역의 수를 구하면
(64 * 256)16,384개 입니다.

호스트 영역은 16비트이고 표현 가능한 호스트 IP는 65,536개 이므로 B클래스의 총 IP 개수는 1,073,741,824 입니다.
(16384 * 65536)

130.130.130.1 라는 IP가 존재할 경우 네트워크 영역은 130.130이고, 호스트 IP는 130.1이 됩니다.
그리고 130.130 네트워크 영역의 할당 가능한 IP의 수는 65,536 - 2개 입니다.


5. C 클래스

소규모 네트워크이고, 네트워크 영역의 범위는 24비트입니다.
첫번째 옥텟의 범위는 192 ~ 223이므로  네트워크 영역의 수는 2,097,152개 입니다. (32 * 256 * 256) 

호스트 영역은 8비트이고 표현 가능한 호스트 IP는 256개 이므로 C 클래스의 총 IP 개수는 536,870,912 개 입니다. (256 * 2,097,152)

221.3.0.1 이라는 IP가 존재할 경우 네트워크 영역은 221.3.0이고, 호스트 IP는 1이 됩니다.
그리고 221.3.0 네트워크 영역의 할당 가능한 IP 수는 256 - 2개 입니다. 


6. IP 클래스의 비효율성

IPv4는 IP클래스 단위로 IP를 나누어 사용자에게 할당하는 방법을 사용했습니다. 하지만 이 방식은 비 효율적이었습니다.
예를 들어서 클래스 B 영역의 사용 권한을 어느 회사에게 부여했을 경우 이 회사에서 할당 가능한 IP 수는 65,536개 입니다. 이 중 10000개만 사용할 경우 나머지 50000여개는 사용하지 않지만 점유하고 있는 상태가 됩니다. 이러한 문제를 해결하기 위해 고안된 것이 서브넷 마스크(subnet mask)입니다. 
서브넷 마스크를 사용하면 IP 할당 범위를 더 작은 단위로 나눌 수 있습니다.

2020/12/09 - [IT/Network] - [Network] 서브넷 마스크(Subnet Mask)
 

[Network] 서브넷 마스크(Subnet Mask)

1. IP 클래스의 비효율성 IPv4는 IP클래스 단위로 IP를 나누어 사용자에게 할당하는 방법을 사용했습니다. 하지만 이 방식은 비 효율적이었습니다. 예를 들어서 클래스 B 영역의 사용 권한을 어느

bamdule.tistory.com

 

'IT > Network' 카테고리의 다른 글

[Network] IP 주소  (0) 2020.12.10
[Network] 서브넷 마스크(Subnet Mask)  (6) 2020.12.09
[Network] 공인 IP, 사설 IP, 고정IP, 유동 IP 란?  (1) 2020.12.07

1. IP 주소란?

단말 간 통신을 하기 위해 사용되는 고유한 주소를 IP 주소 (IP Address)라고 부르며, 각 단말은 고유한 IP 주소를 가집니다.
IP 주소를 사용하는 이유는 인터넷을 이용해 물리적으로 떨어진 단말 들 사이에서 데이터를 정확하게 송수신하기 위해 사용합니다.

인터넷을 사용하기 위해서는 특정 기관에서 관리하는 공인 IP를 사용해야 합니다.
공인 IP는 국제 인터넷 주소 관리기구, ICANN에서 관리하고 있으며 대륙 별로 ISP(Internet Service Provider)에게 IP 주소 할당 권한을 위임합니다.  (우리나라의 ISP는 KT, SK텔레콤, LG유플러스 등이있습니다.)

즉 인터넷 사용자는 ISP(Internet Service Provider)에서 공인 IP를 임대 받아야 인터넷에 연결을 할 수 있습니다.

 

2. IP 주소의 구조

cmd 창을 열고 ipconfig 명령어를 치면 다음과 같은 IP 정보가 출력됩니다.

192.168.0.41이 내 컴퓨터의 주소입니다. 10진수 4자리로 구성되어 있지만 우리가 편하게 보기 위해 10진수로 표시되었을 뿐이지 사실 IP주소는 32자리 2진수로 표현되어있습니다.
11000000.10101000.0.101001
192 168 0 41
11000000 10101000 0 101001
IP 주소는 32자리 2진수로 표현하고, IP 주소의 범위는 0 ~ 2^32(약 42억 9천개)입니다.
IP 주소는 '.' 으로 구분되며 각각 옥텟이라고 부릅니다.  

'IT > Network' 카테고리의 다른 글

[Network] IP 클래스  (0) 2020.12.10
[Network] 서브넷 마스크(Subnet Mask)  (6) 2020.12.09
[Network] 공인 IP, 사설 IP, 고정IP, 유동 IP 란?  (1) 2020.12.07

1. IP 클래스의 비효율성

IPv4는 IP클래스 단위로 IP를 나누어 사용자에게 할당하는 방법을 사용했습니다. 하지만 이 방식은 비 효율적이었습니다.
예를 들어서 클래스 B 영역의 사용 권한을 어느 회사에게 부여했을 경우 이 회사에서 할당 가능한 IP 수는 65,536개 입니다. 이 중 10000개만 사용할 경우 나머지 50000여개는 사용하지 않지만 점유하고 있는 상태가 됩니다. 이러한 문제를 해결하기 위해 고안된 것이 서브넷 마스크(subnet mask)입니다.
서브넷 마스크를 사용하면 IP 할당 범위를 더 작은 단위로 나눌 수 있습니다.


2. 서브넷 마스크의 표현

서브넷 마스크는 IP주소와 같은 32비트 2진수로 표현합니다.
ex) 255.255.255.0 그리고 IP와 똑같이 2진수로 표현이 가능합니다.

여기서 주의할 점은 서브넷 마스크는 연속된 1과 연속된 0으로 구성되어있다는 것입니다.
즉, 11111111.11111111.11110011.00000000 이란 값은 가질 수 없고, 11111111.11111111.11111100.00000000의 형태만 가질 수 있습니다.

서브넷 마스크를 2진수나 10진수로 표현할 수 있지만 더욱 간소화해서 표현할 수 있습니다.
비트를 이용한 방법인데, IP 주소가 192.168.0.1/24 라면 뒤에 /24는 서브넷 마스크입니다.
이는 32비트 중 앞에서부터 차례대로 1의 개수가 24개라는 의미입니다. 나머지는 0으로 채워주면 됩니다. 
11111111.11111111.11111111.00000000 


3. 서브넷 마스크의 목적과 사용 방법

하나의 IP주소는 네트워크 영역과 호스트 영역으로 나누어집니다. 그리고 IP 주소를 네트워크 영역과 호스트 영역으로 나눌 때 사용하는 것이 서브넷 마스크입니다. 

서브넷 마스크는 IP주소와 AND 연산하여 새로운 네트워크 영역과 호스트 영역을 만들 수 있습니다. 그리고 서브넷 마스크의 값이 높아질 수록 더 작은 단위의 호스트 영역이 만들어 집니다.


4. 서브넷 마스크 사용 예제

1) 예제 1

IP 주소 : 192.168.20.1
서브넷 마스크 : 255.255.255.192

AND
11000000 10101000 00010100 00000001 (192.168.20.1)
11111111 11111111 11111111 11000000 (255.255.255.192)
-----------------------------------------------
11000000 10101000 00010100 00000000 (192.168.20) 네트워크 주소

서브넷 마스크로 IP주소를 나누면 192.168.20.0 ~ 192.168.20.63 영역을 할당 받을 수 있습니다. 여기서 주의할 점은 모든 네트워크 영역의 첫번째는 네트워크 주소로 사용되고 마지막은 브로드캐스트 주소로 사용됩니다. 이것은 모든 네트워크에서 동일하게 적용 되는 것이므로 주의해야 합니다. 192.168.20.0은 네트워크 주소, 192.168.20.63은 브로드캐스트 주소이고 실제 사용 가능한 주소는 192.168.20.1 ~ 192.168.20.62 입니다.

네트워크 주소는 서브넷 마스크와 IP주소를 AND연산해서 구할 수 있지만 브로드 캐스트 주소를 알려면 다음과 같이 연산해야합니다.

-
255.255.255.255
255.255.255.192 서브넷 마스크
------------------
0.0.0.63            (Wildcard Mask)

+
192.168.20.0      (네트워크 주소)
0.0.0.63            
------------------
192.168.20.63     (브로드캐스트 주소)

Wildcard Mask는 브로드 캐스트 값을 구하기 위한 값입니다.

2) 예제 2

IP 주소 : 192.168.20.200
서브넷 마스크 : 255.255.255.192

11000000 10101000 00010100 11001000 (192.168.20.200)
11111111 11111111 11111111 11000000 (255.255.255.192)
-----------------------------------------------
11000000 10101000 00010100 11000000 (192.168.20.192)

네트워크 주소 : 192.168.20.192
브로드캐스트 주소 : 192.168.20.255
호스트 주소 범위 : 192.168.20.193 ~ 192.168.20.254

브로드 캐스트 주소 값이 맞나 검증해보세요!

3) 예제 3

IP 주소 : 50.43.2.240
서브넷 마스크 : 255.255.128.0

00110010 00101011 00000010 11110000 (50.43.2.240)
11111111 11111111 10000000 00000000 (255.255.128.0)
-----------------------------------------------
00110010 00101011 00000000 00000000 (50.43.0.0)

네트워크 주소 : 50.43.0.0
브로드 캐스트 주소 : 50.43.127.255
호스트 주소 범위 : 50.43.0.1 ~ 50.43.127.254

-
255.255.255.255
255.255.128.0
---------------------
0.0.127.255 (Wildcard Mask)

+
50.43.0.0
0.0.127.255
--------------------
50.43.127.255 (브로드캐스트 주소)

4) 예제 4

IP 주소 : 50.43.2.240
서브넷 마스크 : 255.255.224.0

00110010 00101011 00000010 11110000 (50.43.2.240)
11111111 11111111 11111110 00000000 (255.255.224.0)
-----------------------------------------------
00110010 00101011 00000010 00000000 (50.43.2.0)

네트워크 주소 : 50.43.2.0
브로드 캐스트 주소 : 50.43.3.255
호스트 주소 범위 : 50.43.2.1 ~ 50.43.3.254

-
255.255.255.255
255.255.224.0
--------------------
0.0.1.255 (Wildcard Mask)

+
0.0.1.255
50.43.2.0 네트워크 주소
--------------------
50.43.3.255 브로드캐스트 주소


 

5. 기본 서브넷 마스크

사실 IP 클래스의 네트워크 범위는 모두 기본 서브넷 마스크에 의해서 나누어 집니다. 여기서 더 작은 단위로 나누기 위해 직접 서브넷 마스크를 만드는 것이지요.

출처 : http://egloos.zum.com/Yupp2/v/1916132

'IT > Network' 카테고리의 다른 글

[Network] IP 클래스  (0) 2020.12.10
[Network] IP 주소  (0) 2020.12.10
[Network] 공인 IP, 사설 IP, 고정IP, 유동 IP 란?  (1) 2020.12.07

1. IP 주소란?

2020/12/10 - [IT/Network] - [Network] IP 주소

 

2. 공인 IP와 사설 IP란?

1). 공인 IP (Public IP)

말 그대로 외부에 공개되어 있는 IP입니다.
전 세계에서 유일하며, ISP(인터넷 서비스 공급자)를 통해 제공 받습니다. ICANN 기관에서 국가 별로 사용할 IP 대역을 관리하고 있으며 KT, SKB, LG 등에서 IP를 사용자에게 제공합니다.  외부에 공개되어 있기 때문에 인터넷에 연결된 다른 컴퓨터에서 접근이 가능하며, 해킹의 위험이 있기 떄문에 보안 프로그램을 설치해야 합니다. 

 

2).  사설 IP (Private IP)

로컬 IP, 가상 IP라고도 불리며, 외부에서 접근할 수 없는 IP를 의미합니다. 
일반 가정이나 회사 내부에서 사용할 목적으로 할당된 IP주소이며, 공인 IP가 할당된 라우터나 공유기를 통해 로컬 네트워크에 연결된 기기에 사설 IP가 할당됩니다.  사설 IP를 사용하면 IPv4주소의 부족을 어느정도 해결할 수 있으며, 외부에서 직접 접근할 수 없어서 보안이 용이합니다.
사설 IP 대역
A 클래스 : 10.0.0.0 ~ 10.255.255.255
B 클래스 : 172.16.0.0 ~ 172.31.255.255
C 클래스 : 192.168.0.0 ~ 192.168.255.255

출처 : http://www.codns.com/b/B05-104

 

4. 유동 IP와 고정 IP

1) 유동 IP

유동 IP는 기기에 고정적으로 IP를 부여하지 않고 IP 갱신주기가 되었을 때 기기를 껐다가 키면 ISP(인터넷 서비스 공급자)에서 남아 있는 IP를 골라 기기에 IP를 할당해주는 것을 의미합니다.
유동 IP를 사용하는 이유는 ISP에서 더 많은 사용자 들에게 인터넷 서비스를 제공하기 위함입니다.
ISP에서 제공해 줄 수 있는 IP는 유한합니다. 그런데 인터넷을 사용하는 기기가 꺼져있는데도 IP를 할당받고 있으면, IP가 부족할 경우 IP를 필요로하는 사용자에게 제공해줄 수 없습니다. 그래서 기기가 켜져있을 땐 IP를 유지해주지만 종료하면 IP를 수거해 다른 사용자에게 재 할당해 줍니다.

 

2) 고정 IP

고정 IP는 변경되지 않는 공인 IP를 의미합니다. IP를 한번 부여받으면 IP를 반납하기 전까지 해당 IP를 할당 받습니다.
인터넷 사이트를 운영할 때, 고정 IP를 사용하며, 이때 고정 IP를 사용하지 않으면, 외부에 알려진 IP가 자칫 다른 사이트에서 사용될 수 있습니다. 

참조

http://baobab.pe.kr/study/359216
http://www.codns.com/b/B05-104

'IT > Network' 카테고리의 다른 글

[Network] IP 클래스  (0) 2020.12.10
[Network] IP 주소  (0) 2020.12.10
[Network] 서브넷 마스크(Subnet Mask)  (6) 2020.12.09

1. this

javascript의 this는 다른 언어의 this와 동작하는 방식이 조금 다릅니다.
javascript에서 대부분의 경우 this는 함수를 호출하는 방법에 따라 결정됩니다.

즉, 함수를 호출 할 때 마다 this가 가리키는 값이 다를 수 있습니다. 

 

2. 전역에서 this를 호출 했을 경우

console.log(this); // window
전역에서의 this는 기본적으로 window 객체를 가리킵니다. 

 

3. 함수 안에서 this를 호출 했을 경우

function doSomething(){
    return this; 
}

console.log(doSomething()); // window
console.log(window.doSomething()); // window
this를 결정하는 건 대부분 함수가 호출될 때, 이루어집니다. (bind 함수와 arrow 함수 제외 )
그리고 함수를 호출한 객체가 무엇이냐에 따라 this가 결정됩니다.

 

4.  메소드에서 this를 호출 했을 경우

function doSomething(){
    return this; 
}

var obj = {
    doSomething : doSomething
};

console.log(doSomething()); // window
console.log(obj.doSomething()); // obj
this를 결정하는 것은 함수를 호출한 객체가 무엇이냐에 따라 달라진다고 했었습니다. 따라서
doSomething 함수를 obj의 메소드로 등록하고 obj.doSomething()을 호출 했기 때문에 this는 obj가 됩니다.
(전역에서 선언되었을 경우 함수라 부르고, 객체에 속한 함수를 메소드라고 부릅니다.)
하지만 여기서 주의해야 할 점이 있습니다. 

 

var a = 10;
var obj = {
    a : 20,
    doSomething : function (){

        function func(){
            console.log(this.a); // 10
        }
    
        func();
    
        console.log(this.a); //20
    }
};

obj.doSomething();
doSomething 메소드 안에서 선언된 func 함수지만 호출해보면 console.log(this.a)에 10이 찍힙니다. 
이유는 obj 객체와 func 함수는 아무런 관련이 없는 함수이기 때문입니다.
위에서 설명했다시피 함수에서의 this는 기본적으로 window입니다.

그래서 메소드 내 함수에서 this를 가리키려면 self 변수에 객체의 this를 저장해서 접근합니다. 
var a = 10;
var obj = {
    a : 20,
    doSomething : function (){
        var self = this; // obj this를 저장한다.

        function func(){
            console.log(self.a); // 20
        }
    
        func();
    
        console.log(this.a); //20
    }
};

obj.doSomething();

 

5. 생성자에서 this를 호출 했을 경우

var age = 10;

function Person(){
    console.log(this.age);
}

var p = new Person(); 

Person();


/*

출력
--------
undefined
10

*/
Person함수는 window객체에 속한 함수입니다. 그래서 그냥 호출하면 this.age는 전역 변수의 age 값을 가리키게 됩니다.
하지만 Person 함수를 new 키워드를 통해 생성하면 새로운 객체가 만들어지면서 this는 window가 아닌 생성한 객체를 가리키게 되고, 함수의 내용은 생성자가 됩니다. 

그래서 생성자 호출 시 새로 생성한 객체에는 age 값이 없기 때문에 undefined가 출력됩니다.

 

6. bind 메서드

ECMAScript 5에서 Function.prototype.bind를 새롭게 도입했습니다.
bind 메서드란 함수 내의 this를 영구적으로 지정하는 메서드입니다.
var a = 10;
function func(){
    console.log(this.a);
}

func(); // 10

//func함수의 this를 obj 객체로 바인딩한다.
var obj = { a : 20 };
var new_func = func.bind(obj);

new_func(); // 20


var obj2 = { a : 30 };
var new_func2 = new_func.bind(obj2); // obj로 바인딩 된 함수를 다시 obj2로 바인딩한다.

//이미 바인딩 된 함수의 this는 변하지 않는다.
new_func2(); // 20  

 

7. 에로우 함수

에로우 함수에서 this는 자신을 감싼 lexical context입니다. 전역에서는 window를 가리킵니다.
에로우 함수 또한 한번 this를 지정하면 변하지 않습니다.
var func = (() => {
    console.log(this);
});
func(); // window


//obj의 func 메소드로 대입
var obj = {func: func};
obj.func(); // window


//obj 객체로 this를 바인딩
var new_func = func.bind(obj);
new_func(); // window

 


참조

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this

+ Recent posts