Javascript null과 undefined

null -> 아무 값도 갖고 있지 않다는 뜻. 일반적으로 예상 가능한 상황에서 값의 부재를 표현
undefined -> 보다 더 시스템적인 관점. 예기치 못한 상황에 발생한 오류성 값 / 부재를 나타내기 위함.

null == undefined;  // true
null === undefined; // false

null 과 undefined에 . 연산자나 [] 연산자를 사용하지 않도록 예외처리 해야.
Typeerror 발생

Function 유효범위

C의 block scope와 달리 javascript는 함수 유효범위를 갖는다.

function test(o) {
    var i = 0;
    if (typeof o == "object") {
        var j = 0;
        for(var k=0; k < 10; ++k) {
            console.log(k);
        }
        console.log(k);
    }
    console.log(j);
}

i, j, k 의 유효범위는 모두 같다.

var scope = "global";
function f() {
    console.log(scope); // undefined 출력
    var scope = "local";
    console.log(scope); // local 출력
}

Property로서의 변수

var 사용하면 unconfigurable한 프로퍼티
없으면 configurable

var truevar = 1;  // 삭제불가능 전역변수
fakevar = 2;      // 삭제가능 전역변수
this.fakevar = 3; // 삭제가능 전역변수
delete truevar       // false-> 삭제불가능
delete fakevar
delete this.fakevar2

'웹 프로그래밍 > Javascript' 카테고리의 다른 글

Javascript Function  (0) 2020.06.24
Javascript Array  (0) 2020.06.23
JavaScript Property  (0) 2020.06.21
JavaScript Object 생성  (0) 2020.06.19
Javascript 세미콜론  (0) 2020.05.30

JavaScript Array

Javascript의 배열

  • 정렬된 값의 집합
  • 타입이 고정되어 있지 않음
  • 배열이 밀집도가 높지 않음
    • 원소의 index가 연속적이지 않아도 됨
    • 원소 사이에 빈자리가 있어도 됨
  • Array.prototype의 프로퍼티를 상속받음.

배열 생성

  1. 배열 리터럴
  2. Array 생성자

배열 리터럴

        var empty = [];
        var primes = [2,3,5,7,11];
        var misc = [ 1.1, true, "a" ];

          // 임의의 표현식도 사용 가능 
        var base = 1024;
        var table = [base, base+1, base+2, base+3]; 

          var count = [1,,3]; // 가운데 값은 undefined
          var undefs = [,,];  // 원소는 2개 (마지막원소에 , 가능)

Array 생성자

        var a = new Array();
        var aa = new Array(10); // length
        var aaa = new Array(5,4,3,2,1, "testing, testing"); // 인자값이 배열의 원소
        console.log(aaa)

Output :

다양한 Index

        // 다양한 인덱스
        a[-1.23] = true;
        a["1000"] = 0;
        a[1.000] = 7;
        console.log(a)

Output :

희소배열

배열에 속한 원소의 위치가 연속적이지 않은 배열
원소가 undefined가 아니라 아예 없는 것

        arr = new Array(5); // 원소는 없지만 a.length의 값은 5
        arr2 = []           // length값이 0인 빈 배열
        arr3[1000] = 1;     // 하나의 원소 할당, 길이는 1000

배열의 길이

배열의 length Property : 배열의 원소 개수, 배열의 가장 큰 인덱스+1

length 값 변경 :

a = [1,2,3,4,5];
a.length = 3; // 결과가 1,2,3이 된다.
a.length = 0; // 결과 []
a.length = 5; // new Array(5)와 같은 결과

length Property 읽기전용으로 만들기 :

a = [1,2,3];
Object.defineProperty(a, "length", {writeable: false});
a.length = 0; // 값 바꿔도 배열은 변하지 않음

배열 원소 추가 제거

        a = [];
        a[0] = "zero";
        a.push("one");
        a.push("two", "three");
        console.log(a.length);
        delete a[1];
        console.log(1 in a); // false -> 지워졌다.
        console.log(a.length);

Output :

배열 순회하기

        var o = new Array(7,5,3,2);
        var keys = Object.keys(o);
        var values = [];
        for(var i = 0; i < keys.length; i++) {
            var key = keys[i];
            values[i] = o[key];
        }
        console.log(o);
        console.log(keys);
        console.log(values);

          for(var i = 0, len = keys.length; i < len; ++i) {
            // 성능향상 위해 length를 한번만 불러오기
        }

Output :

루프 돌릴 때 고려해야 할 점

  • 원소가 null / undefined 일 때 어떻게 처리할 지
  • 상속받은 Property 등의 고유 Property 가 아닌 값들을 어떻게 처리할 지

for in loop에서 원소 반환 순서

  • 정해져있지 않음.
  • 순서가 중요한 알고리즘에서는 for문을 통해 명시적으로 사용할 것을 권장

다차원 배열

        var table = new Array(10);
        for(var i = 0; i < table.length; ++i) {
            table[i] = new Array(10);
        }

        for(var i = 0; i < table.length; ++i) {
            for(var j = 0; j < table[i].length; ++j) {
                table[i][j] = i*j;
            }
        }
        console.log(table[5][7]);

Output :

배열 메서드

join()

* 배열의 모든 원소를 문자열로 변환, 변환한 문자를 이어붙인 결과를 return
* seperator를 지정하지않으면 , 가 기본 separator
* String.split() -> join의 반대. 문자열을 배열로
        var a = [1, 2, 3];
        console.log(a.join());
        console.log(a.join(' '));
        console.log(a.join(''));

Output :

reverse()

  • 배열의 원소 순서를 반대로 뒤집어 반환.
  • 배열안에서 직접 수행되어 배열 정렬순서 변환됨.
        var b = [1,2,3];
        b.reverse();
        console.log(b);

Output :

sort()

  • 정렬
  • undefined는 배열의 끝부분으로
  • 정렬 조건도 바꿀 수 있음
        var c = [1,2,3,4];
        c.sort();
        console.log(c);
        c.sort(function(a,b) {
            return b - a;
        })
        console.log(c);

Output :

concat()

  • concat의 전달인자를 추가한 배열 반환
        var d = [1,2,3];
        console.log(d.concat(4,5));
        console.log(d.concat([4,5]));
        console.log(d.concat([4,5], [6,7]));
        console.log(d.concat([4, [5,6]]));

Output :

slice()

  • subarray 반환
    • -1은 마지막 원소
    • 음수는 뒤에서부터 세는 것
        var e = [1,2,3,4,5];
        console.log(e.slice(0,3));
        console.log(e.slice(3));
        console.log(e.slice(1,-1));
        console.log(e.slice(-3,-2));

Output :

splice()

  • 잘라낸 후 값 return, 실제 배열 도 수정된다.
  • 값을 추가할 때도 사용 가능
  • 첫 두 인자 -> 삭제할 원소 지정 (a, b) -> a부터 시작해서 b개 삭제
  • 세번째 인자부터 추가할 값

push(), pop(), unshift(), shift()

  • push(), pop() -> 맨 뒤에서 원소 추가제거
  • unshift(), shift() -> 맨 앞에서 원소 추가 제거

'웹 프로그래밍 > Javascript' 카테고리의 다른 글

Javascript Function  (0) 2020.06.24
Javascript Scope, 변수  (0) 2020.06.23
JavaScript Property  (0) 2020.06.21
JavaScript Object 생성  (0) 2020.06.19
Javascript 세미콜론  (0) 2020.05.30

JavaScript Property

Property의 값을 가져오려면

  • . 연산자 : 연산자 우측에 Property 이름 "식별자"
  • [] 연산자 : 연산자 우측에 Property이름의 "문자열 표현식"

Property 값 생성

        var temp = {}
        console.log(temp);

        temp.newProperty = "a";
        temp["new Property"] = "b";

        console.log(temp);

output:

연관 배열로서의 객체

temp.newProperty : 식별자가 와야 함 -> 코딩할 때 fix됨.
temp.["new Property"] : 표현식을 인자로 받음 -> 프로그램 실행중 입력받은 것 사용 가능

        function addName(nameList, name, studentNumber) {
            nameList["name"] = studentNumber
        }
        // 이런 코드가 동작 한다는 뜻!

상속

객체에서 Property를 찾을 때, 고유 Property안에 찾고자 하는 Property가 없으면,
상속받은 Prototype 객체에서 해당 Property를 찾는다.

        function inherit(p) {
            if (p == null) throw TypeError();
            if (Object.create) // ECMAScript 5 이상에 정의되어 있음
                return Object.create(p);
        }

        var o = {};
        o.x = 1;
        var p = inherit(o); // 객체 o와 Object.prototype를 상속받는 객체
        p.y = 2;
        var q = inherit(p); // 객체 p와 o, Object.prototype을 상속받는 객체.
        q.z = 3;
        var s = q.toString(); // q 는 Object.prototype을 상속받았기 때문에 toString 사용가능

        var result = q.x + q.y; // 값은 3 
        console.log(result);

Output :

상속받은 Prototype Property를 바꾸고 싶을 때

상속받은 Property 가 read only 라면 수정 불가.
그렇지 않다면 두 가지 경우의 수

  • 고유 Property로 재정의 된다. // 기본
  • Prototype Property 의 값이 재설정된다. // setter method가 정의되어있을 경우

Property 접근 에러

존재하지 않는 Property에 접근하는 경우

  • 에러 발생하지 않음. -> undefined return

존재하지 않는 객체의 Property에 접근하는 경우

  • 에러 발생
        var temp2 = o.a;
        console.log(temp2) // undefined
        var length = o.a.length; // undefined에서 Property를 찾으려 해서 error

Output :

에러 방지

        var len = temp2 && temp2.a && temp2.length

객체 o에 Property p를 설정할 수 없는 경우

  • p가 o의 고유 Property이고 readonly일 경우
    • 읽기전용 Property p 에는 값 설정할 수 없다.
  • p가 상속된 Property 이고 readonly일 경우
    • 동일한 이름의 고유 Property로 감출 수 없음.
  • p가 고유 Property도, 상속받은 Property도 아닌데 extensible 속성이 false일 경우.

프로퍼티 삭제하기

delete 연산자. Property의 값이 아니라 Property 자체를 지움

delete book.author;
delete book["main title"];
  • delete 연산자는
    • 고유 프로퍼티만 지울 수 있다.
    • 삭제에 성공, 프로퍼티가 존재하지 않아 영향을 미치지 못한 경우, return true를 한다.
o = {x:1}
delete o.x; // 삭제 성공 return true
delete o.x; // 존재하지 않아 return true
delete o.toString; // 고유프로퍼티가 아니라 아무일도 안일어나고 true
delete 1; // 말도 안 되지만 return true
* configurable 속성이 false 인 프로퍼티는 지우지 않는다.

아래는 nonreconfigurable

        delete Object.prototype; // 지울 수 없음
        var x = 1;
        delete this.x; // 지울 수 없음
        function f() {}
        delete this.f; // 지울 수 없음

프로퍼티 검사

주어진 이름의 프로퍼티가 있는지 검사할 필요가 있을 때

  • in 연산자
  • hasOwnProperty()
  • propertyIsEnumerable() : 추가적으로 enumerable 속성까지 true여야
  • 단순히 Property에 접근
        var oo = {x : 1};
        console.log("x" in oo);
        console.log("y" in oo);
        console.log("toString" in oo);

        console.log(oo.hasOwnProperty("x"));
        console.log(oo.hasOwnProperty("y"));
        console.log(oo.hasOwnProperty("toString"));

        var ooo = inherit({y : 2});
        ooo.x = 1;
        console.log(ooo.propertyIsEnumerable("x")); // 고유 프로퍼티 열거 가능 -> true
        console.log(ooo.propertyIsEnumerable("y")); // 상속받은 프로퍼티 -> false
        console.log(ooo.propertyIsEnumerable("toString")); // 내장프로퍼티, 열거불가능 -> false

Output:

!== 와 === 연산자

  • undefined 와 null 을 구분할 수 있음.

프로퍼티 열거하기

for / in loop

        var o = {x:1, y:2, z:3};
        for(p in o) {
            console.log(p, o[p]);
        }

Output :

상속받은 Property 생략, method 생략

        for(p in o) {
            if(!o.hasOwnProperty(p))
                continue;
        }

        for(p in o) {
            if(typeof o[p] === "function")
                continue;
        }

프로퍼티 Getter / Setter

ECMAScript 5 에서는 Property의 값을 getter / setter method로 대체할 수 있음.
단순히 값을 값는 "Data Property" 와 다른 "Accessor Property" 라고 한다.

  • 프로그램이 객체의 Accessor Property에 접근하면 getter method의 반환 값이 Property 접근 표현식의 값이 됨.
  • 프로그램이 객체의 Accessor Property의 값을 바꾸려고 하면 getter method가 실행된다. = 오른쪽의 값이 method의 인자로 전달된다.

getter / setter 존재 유무로 읽기전용, 쓰기전용 결정.
특이한 것 : setter 만 있으면 쓰기전용. read 하려고 하면 있음에도 undefined return

Accessor Property의 정의

        var oo = {
            // Data Property
            data_prop: value,
            get accessor_prop() { /* 함수 몸체 */},
            set accessor_prop(value) { /* 함수 몸체 */ }
        }

Example : 2차원 좌표와 극좌표를 가지는 Property

        var p = {
            x: 1.0,
            y: 1.0,
            get r() {
                return Math.sqrt(this.x*this.x + this.y*this.y);
            },
            set r(newValue) {
                console.log("in setter : ", newValue);
                var oldValue = Math.sqrt(this.x*this.x + this.y*this.y);
                var ratio = newValue / oldValue;
                this.x *= ratio;
                this.y *= ratio;
                console.log("now x : ", this.x);
                console.log("now y : ", this.y);
            },

            get theta() {
                return Math.atan2(this.y, this.x);
            }
        }

        var q = inherit(p);
        q.x = 1; q.y = 1;
        console.log(q.r);
        console.log(q.theta);
        q.r = 777
        console.log(q.r);
        console.log(q.theta);

Output

Example : 일련번호 생성

        var serialnum = {
            $n: 0, // 프로퍼티 이름의 $는 private 프로퍼티라는 힌트

            get next() {return this.$n++;},
            set next(n) {
                if(n>=this.$n) this.$n++;
                else throw "serial number can only be set to a larger value";
            }
        }

Property 속성

이름, 값, 그리고 속성

  • value
    • 데이터 프로퍼티의 값도 속성으로 본다.
  • writeable
    • 값 변경 가능 여부
  • enumerable
    • 열거가능 여부
  • configurable
    • 3가지 속성 변경 가능한지.

Property의 3가지 속성 값을 질의하고 설정할 수 있도록 하는 ECMAScript 5 API

라이브러리 만들 때 중요

  1. 프로토타입 객체에 method 추가 , 추가된 method를 내장 method처럼 열거할 수 없게 만들기 위해
  2. 변경, 삭제 불가한 프로퍼티를 정의, 객체를 고정(lock down) 시키기 위해

접근자 Property의 속성 표현 위해 Property descriptor라는 객체 사용.

데이터 Property의 Property descriptor

  • value, writeable, enumerable, configurable 등의 Property를 가짐

접근자 Property의 Property descriptor

  • get, set, enumerable, configurable

객체의 특정 Property에 대한 Property descriptor객체
-> Object.getOwnPropertyDescriptor() 를 통해 얻을 수 있음.

        console.log(Object.getOwnPropertyDescriptor({x:1}, "x"));

          // 없는 Property거나 상속받은 Property 는 undefined
        console.log(Object.getOwnPropertyDescriptor({}, "x"));
        console.log(Object.getOwnPropertyDescriptor({}, "toString"));

Output

getOwnPropertyDescriptor 는 고유 프로퍼티만 검사 가능.
상속된 프로퍼티를 검사하고 싶으면 프로토타입 chain을 명시적으로 순회해야함.

프로퍼티의 속성 설정, 임의의 속성으로 새 프로퍼티를 만들기 위해

Object.defineProperty()

        console.log(o);
        Object.defineProperty(o, "x", {value : 1,
                                        writeable: true,
                                        enumerable: false,
                                        configurable: true})
        console.log(Object.getOwnPropertyDescriptor(o, "x"));

Output

동시에 여러개

        var p = Objet.defineProperties({}, {
            x: {value:1, writeable: true, enumerable:true, configurable: true},
            y: {value:1, writeable: true, enumerable:true, configurable: true},
            r: {get: function() {
                return Math.sqrt(this.x*this.x + this.y*this.y);
            },
            writeable: true,
            configurable: true}
        })

객체 속성

모든 객체는 prototype, class, extensible 속성을 가지고 있음.

Extensible 속성

객체에 새 프로퍼티를 추가할 수 있는지 여부
목적 : 잠겨있는 객체의 상태를 고정, 외부에서 변경하는 것을 막는 것.

객체 직렬화

  • JSON.stringify()
  • JSON.parse()

'웹 프로그래밍 > Javascript' 카테고리의 다른 글

Javascript Function  (0) 2020.06.24
Javascript Scope, 변수  (0) 2020.06.23
Javascript Array  (0) 2020.06.23
JavaScript Object 생성  (0) 2020.06.19
Javascript 세미콜론  (0) 2020.05.30

JavaScript Object 생성

  1. 객체 리터럴
  2. new 키워드
  3. Prototype
  4. Object.create()

1. 객체 리터럴

중괄호 안에 이름과 값을 :으로 구분한 순서쌍을 쉼표로 연결한 List

        var empty = {};
        var point = {x:0, y:0};
        var point2 = {x: point.x, y:point.y + 1}
        var book = {
            "main title" : "Javascript", // 공백도 가능
            "for" : "all audiences"
        }


        console.log("empty : ", empty);
        console.log("point : ", point);
        console.log("point2 : ", point2);

2. new 키워드

        var o = {};
        var o2 = new Object(); 
        // o 와 o2는 같다.

        var a = new Array();
        var d = new Date();
        var r = new RegExp("js") // 패턴매칭을 위한 RegExp 객체

3. prototype

Javascript 의 모든 객체는 또 다른 Javascript의 객체와 연관되어 있음.
이 두 번째 객체 : Prototype
객체는 Prototype으로부터 Property를 상속받는다.

  • 객체 리터럴로 생성된 모든 객체는 Prototype 객체가 같다.
    • Object.prototype으로 접근 가능
  • new Array()는 Array.prototype을 객체의 프로토 타입으로 사용하는 식
  • Object prototype : 프로토타입이 없음.
    • 다른 객체들은 보통 prototype이 다 있음.
    • Array.prototype은 Object.prototype을 상속받음.
    • 위와 같은 걸 Prototype chain이라고 한다 .

4. Object.create()

create()

  • 첫 번째 인자 : 프로토타입 객체
  • 두 번째 인자 : 새 객체의 프로퍼티 정보 생략가능
        var o1 = Object.create({x:1, y:2});
        console.log(o1);
        var o2 = Object.create(null);
        console.log(o2);
        var o3 = Object.create(Object.prototype)
        console.log(o3);

o1 :

o2 : -> 어떠한 객체도 상속받지 않는다.

o3 : -> Object객체는 상속받고 싶을 때

inherit 함수 구현

상속 받도록 구현하지 않고 객체 자체를 인자로 넣어 Property를 추가하려 한다면,
기존에 있는 수정되어서는 안되는 Property를 수정하게 되는 실수를 할 수 있다.

Prototype을 이용한 상속으로 원하는 Property를 추가하면서도 그 실수를 방지하기 위해 inherit function을 구현해 사용한다.

        function inherit(p) {
            if (p == null) throw TypeError();
            if (Object.create) // ECMAScript 5 이상에 정의되어 있음
                return Object.create(p);

            // Object.create 가 정의되어있지 않으면
            var t = typeof p;

            if (t !== "object" && t !== "function") {
                throw TypeError();
            }

            function f() {};

            f.prototype = p;
            return new f();
        }

'웹 프로그래밍 > Javascript' 카테고리의 다른 글

Javascript Function  (0) 2020.06.24
Javascript Scope, 변수  (0) 2020.06.23
Javascript Array  (0) 2020.06.23
JavaScript Property  (0) 2020.06.21
Javascript 세미콜론  (0) 2020.05.30

Javascript는 C언어와 유사한 구조를 가지고 있다. 

C언어는 적절한 곳에 세미콜론( ; ) 를 반드시 써 줘야 하지만 자바스크립트는 쓰지 않아도 동작한다. 

 

하지만 명시적으로 써주지 않았을 때 문제가 발생할 수 있는 경우가 있다. 

 

변수 뒤 괄호가 왔을 때

var y = x + f
(a+b).toString()

여기서 프로그래머가 의도한 동작은 

var y = x + f;
(a+b).toString();

이었지만 

var y = x + f(a+b).toString()

 

으로 동작할 가능성이 있다. 

 

return 뒤에 줄바꿈을 했을 때

return
true

 

이 문장은 인터프리터가 

return; true;

로 해석할 가능성이 있다. 

 

 

결론


세미콜론이 필수는 아니지만 문제가 발생할 수 있는 경우가 있다. 

세미콜론을 붙이는 습관을 들이면 코드 가독성에도 좋고 예상치 못한 버그를 방지할 수 있으므로 사용하자.

'웹 프로그래밍 > Javascript' 카테고리의 다른 글

Javascript Function  (0) 2020.06.24
Javascript Scope, 변수  (0) 2020.06.23
Javascript Array  (0) 2020.06.23
JavaScript Property  (0) 2020.06.21
JavaScript Object 생성  (0) 2020.06.19

삼항연산자 

//삼항연산자로 if문같이 사용. if문은 넣을 수 없음


import React from 'react';

function App() {

	const name = "리엑트";
    return (
        <div>
            name : {name}

                {name === '리엑트' ? (

                    <h1>리엑트입니다</h1>
                ) : (
                    <h2>리엑트가 아닙니다.</h2>
                )}
         </div>
    );
}


export default App;

 

AND사용

import React from 'react';

function App() {
    const name = "react";
    //not bad 
    // return (
    //     <div>
    //         {name === 'react' ? (<h1>Yes</h1>) : (null)};
    //     </div>
    // )

    //good
    //return 값이 false 일 경우, HTML에서 null 값으로 인식하는 것을 이용,
    //but return 값이 false가 아니라 0이면 0그대로 출력한다.
    return (
        <div>
            {name === 'react' && (<h1>Yes</h1>)};
        </div>
    )
}

OR사용

 

//undefined가 return 되면 웹브라우저에선 에러
// JSX내부에서 랜더링하는 단계에선 괜찮음 return 만 안하면 

import React from 'react';

function App() {
    const name = undefined;
    return (name || 'value is undefined');
    //웹 브라우저로 바로 return 하는 행위. undefined일때 에러
    //return name;

    //JSX 내부에서 return하는 행위
    //return <div>{name}</div>
}

export default App;

인라인 스타일링

import React from 'react';

function App() {
    const name = "React";
    const style = {
        //background-color 같이 문자(-) 포함되면 빼고 camelCase로 작성
        backgroundColor: 'black',
        color: 'aqua',
        fontSize: '48px',
        fontWeight: 'bold',
        padding: 16 //단위 생략시 px단위
    }

    return <div style={style}>{name}</div>;
}

export default App;

className (not class)

import React from 'react';
import './App.css'

// in css file
// .react {
//     background-color: aqua;
//     color: black;
//     font-size: 48px;
//     font-weight: bold;
//     padding: 16px;
//   }
function App() {
    const name = "React";
    return <div className= "react">{name}</div>;
}

export default App;

'웹 프로그래밍 > React' 카테고리의 다른 글

React  (0) 2020.05.27

랜더링을 효율적으로 할 수 있게 돕는 JavaScript 라이브러리

 

MVC모델에서 View에서 일부분만 수정해야 하는 경우 기존 방법으로는 규모가 큰 애플리케이션에선 복잡하고 제대로 관리하지 않으면 성능이 떨어질 수 있다.

 

새로운 아이디어로 데이터가 변하면 기존 View를 날려버리고 새로 랜더링 하는 방식 고안.

 

매번 랜더링한다면 CPU점유율 상승, 메모리도 많이 사용. 이 문제를 효율적으로 처리하기 위한 것이 React

'웹 프로그래밍 > React' 카테고리의 다른 글

[React] JSX basic codes  (0) 2020.05.28

자본주의에서 부자가 되려면 돈과 관련된 여러가지 지식을 알고 있어야 합니다. 

15여권의 경제관련 책을 읽고 꼭 알아야 할 것들과 책을 읽고 든 생각에 대한 글입니다.

 

 

부자 아빠 가난한 아빠

 

많은 경제관련 책이 있는데 가장 감명깊게 읽었던 책은 부자 아빠 가난한 아빠 입니다. 

수 많은 좋은 내용이 있지만 가장 핵심적인 내용은 자산과 부채, 수익과 지출에 따른 현금흐름에 대한 것입니다.

 

자산은 가지고 있으면 나에게 현금을 주는 것입니다. 

은행에 넣은 돈, 부동산, 주식등이 있습니다. 

은행은 이자를 통해, 부동산은 월세나 부동산 시세차익, 주식은 배당금과 시세차익으로 현금을 가져다 줍니다.

 

부채는 가지고 있으면 현금을 뺏어가는 것입니다.

대출, 부동산, 자동차 등이 있습니다.

대출은 이자를 통해, 부동산은 소득세와 시세하락을 통해, 자동차는 감가상각과 세금을 통해 현금을 뺏어갑니다.

 

수입은 나에게 들어오는 현금, 지출은 나에게서 나가는 현금입니다.

 

가난한 사람의 현금흐름

가난한 사람의 현금흐름입니다. 

월급 등의 수입이 들어오면 그대로 지출로 나가버리는 구조입니다. 

이대로라면 평생 월급에 의존하는 삶을 살아야 할 것입니다.

 

중산층의 현금흐름

중산층의 현금흐름입니다.

안정적이고 제법 큰 월 수익으로 대출등의 부채를 일으킬 수 있는 능력이 있습니다.

이를 이용해 집, 자동차등을 대출로 구매하여 월 수익으로 일반 지출과 부채로 인한 지출을 하며 삽니다.

가진 것은 많을 지 모르나 역시 평생 월급에 의존해야 하는 것은 같습니다.

 

부자의 현금흐름

부자의 현금흐름 입니다.

가난한 사람과 중산층에서 보이지 않았던 새로운 길이 보입니다. 

바로 자산이 가져다 주는 수입입니다. 

부자는 자산을 가지고 있기 때문에 월급 등의 노동수입 없이 살아갈 수 있습니다. 

 

이 책이 주는 가장 큰 교훈은 바로 자산을 축적해야 한다는 것입니다.

자산을 어떤 방식으로든 구축해서 추가수입을 발생시켜야 합니다. 

 

스위스 은행가가 가르쳐주는 돈의 원리

첫 번째 책을 통해 자산을 축적했다면 다음은 이 자산을 통해 수입을 발생시켜야 할 것입니다. 

같은 1억원이더라도 은행 적금으로 2%를 얻는다면 1년에 200만원의 수입을 가져다 줄 것이고 주식투자를 통해 6% 주가상승을 얻었다면 년에 600만원을 가져다 줄 것입니다. 

 

자산을 가지고 있다면 효율적으로 분배해서 높은 수익률을 얻을 수 있도록 노력해야 할 것입니다.

그러한 방법으로 부동산, 주식, 경매등등 의 방법이 있습니다. 

 

하지만 부동산, 주식등의 이러한 투자는 전제조건이 있습니다. 

내가 투자하는 자산이 적어도 은행이자보다는 가격이 올라야 한다는 것 입니다. 

하지만 위험한 투자를 하면 수익을 올릴 가능성보단 잃을 가능성이 더 큽니다. 

그렇다고 안정적인 곳에 투자를 하자니 수익률이 걱정입니다. 

 

이 책에서는 모든 주식투자는 투기라고 말하고 있습니다. 

사실 주식에 투자하는 것은 이 회사의 비전에 투자한다, 회사의 물건이 곧 많이 팔릴 것이다. 이런 긍정적인 예측으로 할 것입니다.

100% 확신없이 오를 것이라고 믿고 투자하는 것은 도박과 다름이 없습니다. 

물론 이 도박이 나쁜 것은 절대 아닙니다. 이 확률게임을 하지 않으면 결국 은행이자 2%라는 낮은 수익률을 받아야 하기 때문입니다. 

 

부의 추월차선

부의 추월차선에선 가장 빠른 부자의 길을 알려줍니다. 

그 길은 바로 자신이 사업을 일으켜 그 사업에 투자해 사업을 성공시키면 엄청난 수익률로 부자가 될 수 있다고 말합니다. 

 

 

결론


부자가 되기 위해선 반드시 자산을 쌓아 올려야 합니다. 

그리고 자산을 가졌으면 좋은 투자를 통해 합리적인 수익률을 올려야 하죠. 

하지만 투자라는 것은 불확실성을 가지고 있어 불안정합니다. 또한 투자수익만으로 부자가 되는 길은 너무 오래 걸립니다. 

 

자기의 사업에 투자하는 방법이 있습니다. 성공만 한다면 엄청난 수익률을 가져다주고, 투자수익으로 부자가 되는 것보다 시간도 훨씬 덜 걸립니다. 

하지만 사업에 성공하는 사람들은 극히 드뭅니다. 

 

자본주의 사회에서 부자가 되는 게임에 참가하고 싶으신 사람들은 위와 같은 지식은 반드시 갖고 있어야 합니다. 

또 부자가 되는 돈의 관점을 떠나, 인생의 많은 부분이 자산을 쌓는 것과 비슷한 것 같습니다. 

 

인생은 행복을 쌓는 게임 같습니다.

공부를 하거나 운동을 하거나 부모님, 친구들에게 잘하기 이런 것들은 자산이 되어 나에게 행복을 가져다 줄 것입니다. 

술을 마시고 늦잠자고 나쁜 말을 하거나 몸에 해로운 것을 먹는 것은 부채가 되어 나에게 불행을 가져다 주겠죠. 

 

어떤 게임을 하던 꼭 승리하셨으면 좋겠습니다.

 

 

많은 기업에서 채용을 위한 인성검사를 실시하고 있습니다.

검사결과는 면접관님들이 보게 될 자료가 되기도 하고 혹은 인적성시험 과정에서 합불여부를 판단하는 근거가 되기도 합니다. 

 

인성검사만으로 지원자의 정확한 인성을 판단하기는 힘듭니다. 하지만 과학적 근거를 가지고 시행하는 시험이니만큼 채용 전반에 영향을 미칩니다. 

 

영향을 미치는 것을 크게 느꼈던 기업이 있었습니다. SK하이닉스인데요, SK하이닉스는 이력서 제출을 하면 그 때부터 1시간 이내에 약 200개의 인성검사 질문에 답변을 해야 했습니다. 하이닉스 인성검사질문에는 다른 기업(삼성, LG) 에서 볼 수 없었던 적나라한 질문들이 있었습니다. 친한 친구의 수를 적거나 관련된 질문들이 있었습니다. 인싸력 테스트를 통해 조직에서 잘 융화될 수 있는 가를 보기위한 질문이라 생각합니다. 저는 아싸에 가깝기 때문에 아싸스러운 답을 했었습니다. 막상 제출하고 난 뒤에는 아싸스러운 답변때문에 서류탈락될까 걱정했습니다. 하지만 다행히도 합격메일을 받았습니다. 코딩테스트를 통과하고 면접을 보러 갔을 때 인성면접전에 또 서류제출전 했던 인성검사과 유사한 검사인데 문항수만 대폭 증가한 검사를 한번 더 했습니다. 

 

인성검사는 3가지 선택지 사이에서 가장 나에게 해당되는 한가지와 가장 나에게 멀다고 생각하는 한가지를 고르라는 것이었습니다. 인성검사를 하면서 300개 가량의 인성검사질문중 대부분의 문항에는 공통점이 있었습니다. 3가지 선택지가 질문의 뉘앙스만 조금씩 다르지 3가지 가치중에서 선택하라는 것이었습니다.

 

  • 추진력
  • 협업
  • 도덕성

 

인성검사를 실시하면서 가장 중요하게 생각했던 것은 솔직하게 답변하는 것이었습니다. 솔직하지 않고 기업이 좋아할만한 답변을 골라서 하려고 한다면 신뢰성이 떨어지는 결과가 나오기 때문입니다. 제가 중요하게 생각했던 가치는 추친력이었고 아싸스럽기 때문에 협업을 가장 멀다고 선택을 했었습니다.

 

인성검사를 마치고 면접을 보러 들어갔습니다. 인성면접은 20분간 진행되었습니다. 첫 5분간은 분위기가 좋았습니다. 그동안 해왔던 활동등을 묻고 열심히 살았네요라는 칭찬도 들었습니다. 

 

그런데 나머지 15분은 굉장히 힘든 면접이었습니다. 요약하면 협업부분에 대한 검증을 하는 시간이었습니다. 같이 SW개발한 경험에 대해 물으셨을 때 공모전과 연구실에서 함께 개발한 내용을 말씀 드렸는데 각자 개발할 부분을 나눠 따로 개발을 했다고 하니 "혼자 개발하는거 좋아하시죠?" 라는 부정적인 피드백을 받았고 최근에 사귄 친한 친구와 같은 질문으로 인싸력 테스트를 한번 더 했습니다. 물론 아싸인증을 해버렸습니다. 여가시간에 뭐하냐고 물으셨는데 친구만나기나 축구와 같은 같이하는 활동에 대한 답변을 기대하셨겠지만 웨이트트레이닝을 한다고 답변했습니다. 끝나고 나서 보니 정말 조직적응 못할 것 같은 답변만 했었습니다.

 

면접 끝나고 집가는 버스에서 적은 소감..

면접 20분 중 15분을 협업관련해서 질문이 들어온 것은 분명 질문해야할 이유가 있었기 때문입니다. 짧은 시간동안 얼굴만 보고 협업관련 질문만 해야겠다라고 판단하긴 힘들 것 같고 이런 면접이 된 가장 큰 이유는 인성검사에 있었다고 생각합니다. 

 

그러면 인성검사를 어떻게 하면 가장 좋을까요? 기업은 저 3가지 가치중 어떤 것을 가장 중요하게 생각하고 어떤 것을 가장 멀다고 생각할까요? 저는 직무마다 차이는 있겠지만 과감하게 도덕성을 가장 멀다고 하는게 좋다고 생각합니다. 도덕성을 가장 멀다고 체크하는 것이 나는 도덕성이 없는 사람이다라는 것은 아닙니다. 이 선택의 의미는 목표를 수행하기 위해 강한 추진력을 갖고 팀원과 협업하는 것이 더 우선시되는 가치라고 생각한다는 것입니다. 공기업도 아니고 사기업에서는 물론 도덕성도 중요하지만 목표를 이룰 수 있는 그 능력이 중요합니다. 

 

다시 생각해보면 목표를 이루기 위해 가장 중요한 가치중 하나인 협력을 가장 나와 멀다고 체크한 것은 "나는 조직에서 일하기 위한 가장 중요한 능력이 부족하다" 라고 말씀 드리는 것과 같습니다.

 

인성검사에서는 솔직하게 답변하는 것이 가장 중요합니다. 검사결과의 신뢰성이 무엇보다도 중요하기 때문입니다. 저는 하이닉스 인성검사에서 솔직하게 답변하긴 했습니다. 하지만 회사가 중요하게 생각하는 가치가 무엇인지 생각해보지 않았고 그저 마음가는대로만 선택했습니다. 진짜 솔직한 답변은 나의 성격과 성향에 대해 정말 잘 알고 있고 인성검사에서 나올 수 있는 질문들에 대해 가치를 미리 생각해보고 나의 정확한 의견을 결정했을 때 할 수 있습니다. 다시돌아가서 내 성격을 알고 저러한 가치중에서 하나를 선택하라고 한다면 가장 솔직한 답변으로 도덕성을 멀다고 선택했을 것입니다. 

 

내가 내 성격과 성향을 가장 잘 안다고 생각할 수 있지만 사실 잘 모르고 있을 수도 있습니다. MBTI나 DISC진단 같은 검사도구를 활용해 내 성격을 정확히 알고 여러 가치들 중에서 내가 중요하게 생각하는 것이 뭔가를 미리 고민해두면 더 좋은 결과를 얻을 수 있습니다.

 

 

'취업준비' 카테고리의 다른 글

취업준비와 MBTI  (0) 2020.03.30
대학교 입학부터 삼성전자 취업까지 7  (0) 2020.03.28
대학교 입학부터 삼성전자 취업까지 6  (0) 2020.03.28

https://www.16personalities.com/ko/%EB%AC%B4%EB%A3%8C-%EC%84%B1%EA%B2%A9-%EC%9C%A0%ED%98%95-%EA%B2%80%EC%82%AC

 

무료 성격유형검사 | 16Personalities

혹 질문이 마음에 들지 않더라도 정직하게 답변하십시오.

www.16personalities.com

 

면접을 보러 갔을때 면접관님께 보여줘야할 여러요소가 있습니다. 그 중 솔직한 모습이 굉장히 중요한데요, 면접관에게  신뢰감을 주는데 큰 영향을 미치기 때문입니다. 

 

또 요즘 기업 인적성에서는 인성검사를 통해 지원자의 특성과 성격등을 파악합니다. 이 검사과정에서 일관되지 않은 답변을 해 신뢰성이 떨어진다면 인성검사에서 불합격되기도 합니다.

 

MBTI 검사나 그 와 유사한 성격검사는 학창시절에 한번씩 해보셨을 것입니다. 검사를 위한 애매한 질문들에 답하면서 최종적으로 검사자의 성격을 말해주는 결과가 나옵니다.

 

검사를 하면 저의 성격과 유사하게 나왔기 때문에 검사는 신뢰성이 있다고 믿었습니다. 그리고 이 결과로 면접준비에 큰 도움을 받았습니다.

 

제가 면접을 봤던 기업에서는 인성면접 한 두시간 전에 인성검사를 했습니다. 이 결과는 면접관님들께 제공됩니다. 면접관님들은 제가 했던 답변들에 대한 결과로 이루어진 저의 측정된 성격을 먼저 손에 쥐고 이 사람은 어떤 성격을 가졌을 것이다 예상을 하실 것입니다.

 

그런데 만약 예상한 성격과 실제 지원자의 성격이 다르다면 어떻게 생각할까요? 예를 들어 성격 결과는 외향적인 사람으로 나왔는데 면접을 막상 보니 외향적이지 않아 보이는 모습이 보인다면, 혹은 그 반대의 경우라면. 신뢰성이 떨어지는 지원자라고 평가할 것입니다. 또한 이력서와 자기소개서에 적힌 외향적이었던 활동들도 의심받게 되겠죠.

 

이러한 상황을 피하기 위해 가장 중요한 것은 자신의 성격을 잘 아는 것입니다. 좀 더 구체적으로는 본인이 성격검사에서 나온 결과를 미리 알고 있고, 면접관들이 처음에 나를 보고 예상하는 모습을 알고 있다면 더 유리하게 면접을 이끌어나갈 수 있습니다.

 

유리한 결과를 위해 저는 위 링크로 들어가 성격검사를 했습니다. 실제 기업에서 하는 것과 차이는 있겠지만 면접관이 나를 처음봤을 때 어떤 사람이겠구나 예상하는 정도는 충분히 활용할 수 있습니다.

 

몇몇 사람들은 성격검사를 본인의 성격대로 적는 것이 아닌 기업이 좋아할 만한 인재로 보이기 위해 적절한 답을 선택합니다. 기업은 외향적인 사람을 좋아할 것 같아 내향적인 사람이 나는 사교적이다를 선택하고, 책임감이 있는 사람을 좋아할 것 같아 본인에 성격에 맞는 다른 선택지 대신 책임감이 있다를 선택하는 이런 식입니다.

 

기업마다 인성검사는 평범한 성격 검사와 유사해 보이지만 이러한 거짓 답변을 골라내기위해 아주 정교하게 설계되어 있습니다. 본인의 진짜 성격대신 기업은 이런걸 좋아할 것 같은 것을 기준으로 선택한다면 정교하게 설계된 성격검사에 걸러지지 않는 것은 운이고, 그 운을 통과하더라도 면접장에서 면접관님께 간파당할 것 입니다.

 

기업에 나를 맞추지 말고 한번 아주 솔직하게 검사를 해보십시오. 그리고 그 결과가 본인의 성격과 맞는지 확인하십시오. 만약 내 성격과 일치한다고 생각한다면 그 결과를 받아들이고 면접에 가면 이 결과를 면접관이 가지고 있다고 생각하고 면접을 준비하세요.

 

어떤 성격이든 장점이 있고 단점이 있습니다. 물론 기업이 더 좋아하는 성격이 있고 기피하는 성격이 있습니다. 그런데 성격은 쉽게 바꿀 수 있는 것이 아니고 성격검사에서 요령을 피워 인공의 성격을 만들어 면접관에게 드린다면 면접은 예상치 못한 방향으로 흘러갈 것 입니다.

 

본인의 성격을 면밀히 분석해서 단점은 극복하고 장점을 극대화하는 답변을 준비하세요. 다행히 MBTI 검사는 쉽고 간편하게 할 수 있고 결과에 대해 정말 많은 정보를 인터넷을 통해 얻을 수 있습니다. 여러 정보를 토대로 성격의 단점과 장점을 더욱 쉽게 파악할 수 있습니다.

 

솔직함과 진정성 있는 모습으로 면접관님의 마음을 얻는다면 분명 좋은 면접을 보실 수 있을 것입니다.

 

 

 

 

+ Recent posts