본문 바로가기

Language24

[Javascript] 자바스크립트에서 메모리 누수의 4가지 형태 이전 글에서 Closure를 다루면서 메모리 누수에 대해 언급한 바가 있습니다. 이 글에서는 자바스크립트에서 발생하는 4가지 형태의 메모리 누수를 살펴보고, 이러한 코드를 어떻게 제거할 수 있는지 알아보도록 하겠습니다. 자바스크립트에서 메모리 누수가 발생하는 경우는 크게 4가지로 아래와 같습니다. 우발적으로 생성된 전역 변수 잊혀진 타이머 또는 콜백 함수 DOM 외부에서 참조 특정한 경우의 Closure 각각 경우에 대해 살펴보기에 앞서, 자바스크립트에서 메모리를 어떻게 관리하는지 알아두는 것이 좋습니다. 자바스크립트는 자바와 마찬가지로 Garbage Collected 언어입니다. 즉, 개발자가 메모리 관리에 있어 신경을 덜 쓰더라도, GC(Garbage Collector)가 주기적으로 할당된 메모리를 .. 2020. 10. 21.
[Javascript] Closure 1) 클로저란? 함수가 선언된 렉시컬 스코프를 기억해서, 함수가 스코프 밖에서 실행되어도 해당 스코프에 접근할 수 있도록 해주는 것을 클로저라고 말합니다. 함수 안에 함수가 있는 형태로 외부(outer) 함수가 실행 후 종료되어도 내부(inner) 함수에서 outer 함수의 지역변수를 참조할 수 있는 것이 특징입니다. 더 정확히 말하자면 outer 함수는 종료된다고 할 지라도 inner 함수가 실행되는 상태이면 outer 함수는 닫히지 못합니다. 클로저는 일반적으로 아래와 같은 조건을 충족합니다. 내부 함수는 익명 함수로, 외부 함수의 return 값으로 사용 반환된 내부 함수는 외부 함수의 실행컨텍스트에서 실행됨 내부 함수에서 사용되는 변수는 외부 함수의 변수 스코프에 있어야 함 코드를 예로 들어 자세.. 2020. 10. 21.
[Javascript] 실행 컨텍스트 1) 실행 컨텍스트(Execution Context)란? ECMAScript 스펙은 실행 컨텍스트를 실행 가능한 코드를 형상화하고 구분하는 추상적인 개념이라고 정의합니다. 즉, 실행 가능한 코드가 실행되기 위해 필요한 환경이라고 할 수 있는데, 추상적인 개념이다 보니 확 와 닿지는 않습니다. 좀 더 단순하게 말하자면, 자바스크립트는 내부적으로 하나의 콜 스택을 가지는데, 이 콜 스택 내에 쌓이는 함수에 대한 정보를 실행 컨텍스트라고 합니다. 여기서 쌓이는 함수, 즉 실행 가능한 코드는 전역 코드 : 전역 영역에 존재하는 코드 => 전역 실행 컨텍스트 Eval 코드 : eval함수로 실행되는 코드 함수 코드 : 함수 내에 존재하는 코드 => 함수 실행 컨텍스트 를 말합니다. 그러나 eval 코드는 사용을 .. 2020. 10. 21.
[Javascript] Scope 앞선 글에서 함수 레벨 스코프, 블록 레벨 스코프라는 단어가 사용되었는데, 이 글에서는 여기서 말하는 스코프란 무엇인지에 대해 다루어보도록 하겠습니다. (1) 스코프란? 스코프란 유효 범위를 의미하는 단어로, 변수 및 매개변수의 접근성과 생존기간을 말합니다. 스코프는 자바스크립트뿐만 아니라 대부분의 프로그래밍 언어의 주요 개념이므로, 개념을 잘 이해하고 있어야 합니다. (2) 전역 스코프 전역 스코프는 자바스크립트에서 가장 바깥 범위(함수 내부에 포함되지 않은), 즉 window 객체(Node.js에서는 global 객체)에 포함된 객체가 가지는 스코프를 의미합니다. 스크립트 내 어느 곳에서든 참조됩니다. 지난 글에서 다루었듯 전역 스코프를 만드는 일은 최대한 지양해야 합니다. ([requireJS] 전.. 2020. 10. 21.
[ES6+] var vs let vs const prerequisite javascript scope javascript closure javascript hoisting Javascript에서 변수를 선언할 때 var를 사용하는 것은 익숙한 일이지만, let이나 const는 조금 낯설게 느껴집니다. 두 키워드가 ES6에서 새롭게 추가되었기 때문이라고 생각되는데, 이 글에서는 세 가지 키워드가 어떻게 다른지, 언제 어떤 키워드를 사용해야 하는지 알아보도록 하겠습니다. (1) var var는 아래와 같은 특징을 가지고 있습니다. 함수 레벨 스코프 변수의 유효 범위가 블록({}) 단위가 아닌 함수 단위입니다. 전역 함수 외부에서 변수를 생성하게 되면 이는 전부 전역 변수로 관리됩니다. [함수 레벨 스코프] var i, x, y; for (i = 0; i .. 2020. 10. 21.
[requireJS] 전역 변수 오염을 어떻게 방지할까? prerequisite Javascript Object Javascript Scope 일반적으로 전역 변수가 오염되는 것을 막기 위해 네임스페이스 패턴을 많이 이용합니다. $.namespace("listgrid1.eventhandler"); listgrid1.eventhandler = { bindButtonEvent : function(){ ...생략 } } 위 코드에서 보이는 namespace plugin의 구현부는 다음과 같습니다. $.namespace = function() { var a = arguments, o = null, i, j, d; for (i = 0; i < a.length; i = i + 1) { d = a[i].split("."); o = window; for (j = 0; j <.. 2020. 10. 21.
[ES6+] Map vs Object 이 글에서는 ES6에서 새롭게 도입된 Map에 대해서 알아보고, 이것이 Object Literal과는 무슨 차이가 있는지 살펴보도록 하겠습니다. (1) Map? Map은 대부분 개발자에게 익숙한 단어일 것입니다. ECMA Script 2015(ES6)에서 도입된 Map 역시 우리가 익히 알고 있는, Key와 Value의 쌍으로 이루어진 Collection입니다. 기본 구문은 아래와 같습니다. var map = new Map([Iterable]); map.set("keyString", "valueString"); map.get("keyString"); //result : valueString map.set({}, "객체를 키로 하는 경우의 value") map.get({}) //result : 객체를 키로.. 2020. 10. 21.
Static 사용을 피해야 하는 이유 Java에는 static이라는 키워드가 존재하며, 이는 static으로 지시된 특정한 멤버가 해당 클래스의 인스턴스가 아니라 클래스 자체에 속해 있음을 나타냅니다. 즉, 클래스의 모든 인스턴스에서 공유되는 단 하나의 static member의 인스턴스가 생성되도록 명령하는 키워드입니다. 위 그림과 같이 모든 인스턴스들은 static 필드 혹은 메서드를 공유하게 됩니다. static에 대한 자세한 내용은 A Guide to the Static Keyword in Java를 참고하시고, 이 글에서는 어째서 많은 사람들이 static이 나쁘다고 말하는지 알아보도록 하겠습니다. 언뜻 보기에 static은 사용하기에도 편하고 효율적인 것처럼 보입니다. 예를 들어 어떤 클래스 내의 메서드를 매우 빈번하게 호출해야 .. 2020. 10. 20.
Lambda, 무엇이 단점일까? 무언가의 단점을 보완하여 새롭게 나타난 기술이라고 해서 기존의 모든 기능을 보완하고 대체할 수 있는 것은 아닙니다. 람다 역시 기존의 모든 코드를 대체하고자 등장한 것이 아니기 때문에, 람다를 쓰는 것보다 기존의 코드 방식을 사용하는 것이 더 나은 경우도 많습니다. 따라서 이 글에서는 람다의 단점에 대해 살펴보도록 하겠습니다. (1) 가독성 대부분 람다의 장점에서 빠지지 않는 것이 간결성과 가독성입니다. 그러나 아이러니하게도 단점에서 역시 가독성이 빠지지 않습니다. 람다를 알고 있는 사람이라면 가독성이 장점이 되겠지만, 람다에 대해 잘 모르는 사람에게는 가독성이 나쁜 코드가 되는 것입니다. 예를 들어 1부터 10까지 출력하는 아래와 같은 코드가 있습니다. for(int i=0; i System.out.p.. 2020. 10. 20.
Lambda 무엇이 좋을까? 자바 8에서 도입된 람다 표현식은 등장한 지 꽤 오랜 시간이 지났음에도 여전히 낯설고, 많은 개발자들이 왜 사용해야 하는지 제대로 알지 못하는 기능입니다. 이 글에서는 람다의 장점이 무엇인지 알아보며, 왜 람다를 사용해야 하는지 살펴보겠습니다. (1) 더 쉽고 간략한 iteration 일반적으로 컬렉션을 조회하는 다음과 같은 코드가 있다고 가정해 보겠습니다. List numList = Arrays.asList(1,2,3,4,5,6,7,8,9); for(int n : numList){ System.out.println(n); } 컬렉션을 사용할 때 람다를 사용한다면 아래와 같이 아주 간단하게 표현이 가능합니다. numList.forEach(System.out::println); 간단하고 코드가 훨씬 짧아지.. 2020. 10. 20.