하루일지 - 2

LONGNEW·2022년 2월 2일
0

일지

목록 보기
2/34

신문



호이스팅

일단 칼럼 보면서 쓰다 보니 너무 길어졌다.
기록은 기록이니까 그냥 써두려 한다.

"I strongly recommend that you have exactly one var statement per scope, and that it be at the top. If you force yourself to do this, you will never have hoisting-related confusion."
칼럼 작성자의 말.
scope당 var에 해당하는 변수는 1개만 둬라. 이렇게 하면 hoisting 문제가 매우 줄어들 것이다.

var foo = 1;
function bar() {
	if (!foo) {
		var foo = 10;
	}
	alert(foo);
}
bar();
var a = 1;
function b() {
	a = 10;
	return;
	function a() {}
}
b();
alert(a);

위의 두 코드에 대해 한 번 생각해보고 alert로 어떤 값이 나올지 생각해보자.
정답 : JavaScript Scoping and Hoisting

당연히 해당 글의 오답처럼 생각했다. 우선적으로 scope(범위)에 대한 설명이 있었다.

C언어에서는 block-level scope를 사용한다고 한다. 새로운 if문에 들어갈 때 새로운 변수를 선언할 수 있는 것이다.
그러나 JS에서는 function-level scope를 사용한다. 함수에 한해서만 scope가 변한다고 볼 수 있다.
만약, block-level처럼 사용하고 싶다면 if문 내부를 함수로 만들어서 사용할 수 있다.

if (x) {
		(function () {
			var x = 2;
			// some other code
		}());
	}

과 같이 말이다.


인제야 Hoisting이다.
함수, 변수 선언은 컴파일러가 제일 먼저 실행한다. 라고 이해를 했는데 containing scope의 가장 위라고 했으니 코드의 제일 위에 존재한다고 생각했다.
아.. 실제로 var, let, const와 같은 선언은 제일위에서 실행된다.
여기서 주의할 점 : 선언이 먼저 실행될 뿐, assignment(값을 저장)가 되는 것은 아니다.
함수의 경우에는 body까지 같이 온다.

이를 보고 난 후 위의 문제를 다시 보았다.
1번에 대한 생각 : bar 내부에서 var foo;가 먼저 실행된다. 값을 가지고 있지 않으니 if문을 접근하게 되고 alert로 10이 출력된다.
2번에 대한 생각 : b 내부에서 function a가 선언되며 새로운 scope에 a가 생긴다. 결국 일시적인 a였고 var a는 건드리지 않았다. 그래서 1을 출력한다.

Name Resolution Order(이름이 결정되는 순서)

  • Language-defined: All scopes are, by default, given the names this and arguments.
  • Formal parameters: Functions can have named formal parameters, which are scoped to the body of that function.
  • Function declarations: These are of the form function foo() {}.
  • Variable declarations: These take the form var foo;.
    만약 해당 이름이 이미 존재하면 override가 불가능하다. 이 말이 assignment가 불가능하다는 의미는 아니다. 그저 선언이 사라진다는 의미일 뿐이다.


DB

타입별 차지하는 메모리
MySQL TEXT memory allocation
Docs MySQL

BLOB이나 TEXT는 다른 데이터들과는 다른 곳에 저장된다고 한다. 다른 챕터 보라 카는데 귀찮아서 안 봄.
INT : 4바이트
TEXT : L + 2바이트 (L은 문자열의 실제 길이에 따른 바이트, 길이가 문자의 개수가 맞음.)
문자열을 저장하는 경우 지정하는 숫자는 최대 길이에 대한 것임. 실제로 이 보다 작다면 해당 빈 공간은 사용하지 않음. 차지 하지 않는다는 의미임.

왜 foreign key로 테이블을 분리하는가?
Why should I use foreign keys in database?

"The core use case is maintaining referential integrity."
이거의 주요한 이유는 참조 무결성을 유지하기 위함이다.
참조를 위할 뿐 아니라 "cascade"를 통해 틀정 record가 삭제되면 연결된 이놈들을 다 삭제할 수도 있다.
index를 통해서 performance가 더 좋아질 수 있다.
분리가 목적이 아닌 무결성을 위함이였다.



알고리즘

쉬운 문제 하나 풀기(파이썬과 C++)
BOJ 1806 부분합에 대한 글

0개의 댓글