Tag Archives: 프로그래밍

자바스크립트 완벽 가이드/ 변수

변수 타입

자바스크립트 변수는 자바나 C와 달리 변수 타입이 고정되어 있지 않다. 자바스크립트 변수는 어떠한 데이터 타입의 값이라도 담을 수 있다. 예컨대 자바스크립트에서는 어떤 변수에 숫자 값을 할당한 후 같은 변수에 다시 문자열을 할당해도 아무런 문제가 되지 않는다.

변수 선언

변수 선언에는 var 키워드를 사용한다. var 문으로 선언된 변수는 영구적이다. delete 연산자를 사용해서 그 변수를 제거하려 할 경우 에러가 발생한다.

변수 선언의 반복과 생략

var 구문으로 같은 이름의 변수를 여러 번 선언해도 무방하다. 만일 그 반복된 선언에 변수 초기화 구문이 함께 있을 경우 그저 변수에 값을 할당하는 구문과 동일하게 작동한다.

선언되지 않은 변수의 값을 읽으려 할 경우 에러가 발생한다. 만일 아직 var문으로 선언되지 않은 변수에 값을 할당하려 하면, 자바스크립트가 암묵적으로 그 변수를 선언한다. 단, 암묵적으로 선언된 변수는 항상 전역 변수로 선언된다. 설사 그 변수가 함수 안에서 쓰인다 하더라도 마찬가지다. 따라서 모든 변수 선언에는 항상 var 를 사용하는 것이 좋다.

변수의 유효 범위

전역 변수는 자바스크립트 코드 전체에 걸쳐 정의된다. 반면 어떤 함수 안에서 선언된 지역 변수는 오직 그 함수 몸체 안에서만 정의된다. 함수 내부에서는 지역 변수가 같은 이름의 전역 변수보다 우선적으로 사용된다.

블록 단위의 유효 범위는 없다

함수 안에서 정의된 변수는 그것이 정의된 위치에 관계없이 항상 함수 전체에 걸쳐 유효하다. 그러나 어떤 함수에서건 모든 변수의 선언을 함수의 시작부에 두는 것이 좋은 습관이다.

정의되지 않은 변수 vs 할당되지 않은 변수

선언되지 않은 변수를 읽으려 하면 런타임 에러가 발생한다. 그러나 정의되지 않은 변수에 값을 할당할 때는 에러가 발생하지 않는다. 이 경우에는 암묵적으로 해당 변수가 전역 변수로 선언된다.

선언은 되었으나 아직 값이 할당되지 안은 경우 undefined를 얻게 된다.

기본 타입과 참조 타입

데이터 타입에는 크게 기본 타입과 참조 타입 두 가지 종류가 있다. 숫자, 불리언 값, null, undefined 타입은 기본타입이다. 한편 객체(Object), 배열, 함수는 참조 타입이다.

기본 타입은 고정된 크기의 메모리를 갖는다. 예컨대 숫자 타입은 8바이트, 불리언 값은 1비트 등

반면 참조 타입은 어떤 크기라도 가질 수 있다. 즉 객체는 고정되어 있지 않다. 마찬가지로 배열도 원소 개수에 제한이 없다. 함수도 얼마든지 많은 자바스크립트 코드를 포함할 수 있다.

참조 타입은 크기가 고정되어 있지 않기 때문에 참조 타입의 값은 8바이트 메모리를 가지는 변수에 직접 저장할 수 없다. 대신, 변수에 저장되는 것은 이런 값에 대한 ‘참조’다. 참조는 보통 포인터의 한 종류이거나 메모리 주소이다. 참조는 데이터 값 자체가 아니라 그 값을 찾을 수 있는 위치를 변수에게 알려주는 것이다.

기본 타입과 참조 타입을 구별하는 것은 매우 중요하다. 왜냐하면 이 두 가지는 서로 다르게 작동하기 때문이다. 예컨대 기본 타입과 참조 타입은 아래와 같이 변화한다

var a = 3;
var b = a;
a = 4;
alert(b); // 3이 출력된다. 복사본의 값은 바뀌지 않았다.

var a = [1, 2, 3];
var b = a;
a[0] = 99;
alert(b); // 새로운 참조를 쓰지만 변경된 배열 [99, 2, 3]이 출력된다

가비지 컬렉션

참조 타입은 크기가 고정되어 있지 않다. 참조 타입 중 몇 가지는 경우에 따라선 매우 커질 수도 있다. 문자열, 객체, 배열 등은 크기가 정해져 있지 않다. 따라서 이들을 담기 위한 저장소는 그 크기를 알 수 없는 상태에서 동적으로 할당되어야 한다. 자바스크립트 프로그램에서 문자열이나 배열, 또는 객체 등을 생성할 때마다, 인터프리터는 해당 개체를 저장하기 위한 메모리를 할당해야 한다. 이렇게 동적으로 할당된 메모리는 언젠가 반드시 해제되어 재활용 될 수 있어야 한다. 그렇지 않으면 자바스크립트 인터프리터가 시스템의 모든 가용 메모리를 잡아머어 결국은 시스템이 다운되고 말 것이다.

C나 C++에서 수동으로 메모리를 해제해야 했던 것과 달리 자바스크립트에서는 프로그래머가 수동으로 메모리를 해제하도록 강제하지 않는 대신, 가비지 컬렉션이라 불리는 기술에 의존한다. 자바스크립트 인터프리터는 어떤 객체가 어느 시점부터 프로그램에서 더이상 쓰이지 않는지 알아챌 수 있다. 가비지 컬렉션은 프로그래머에게 보이지 않고 자동적으로 일어난다.

변수와 프로퍼티

자바스크립트의 변수는 근본적으로 객체 프로퍼티와 동일하다.

전역 객체

자바스크립트 인터프리터가 구동되면 자바스크립트 코드를 실행하기 전에 먼저 수행하는 사전 작업들이 있는데 그 중 하나가 바로 전역 객체(global object)를 생성하는 일이다. 이 객체의 프로퍼티들은 자바스크립트 프로그램들의 전역 변수들이다. 여러분이 자바스크립트 전역 변수를 선언하면, 실제로는 전역 객체의 프로퍼티가 정의된다.

최상위 코드, 즉 어떤 함수에도 속하지 않은 코드에서는 자바스크립트의 this 키워드를 사용해서 전역 객체를 참조할 수 있다.

지역 변수: 호출 객체

전역 변수들이 특수한 전역 객체들의 프로퍼티에 해당한다면 지역 변수들은 어떨까? 이들 역시 어떤 객체의 프로퍼티에 해당한다. 이 객체를 일컬어 호출 객체(call object)라고 부른다. 호출 객체는 전역 객체보다 수명이 짧지만 쓰이는 목적은 동일하다. 함수를 실행하는 동안 그 함수의 전달인자와 지역 변수는 이 호출 객체의 속성으로 저장된다. 자바스크립트에서 지역 변수 용도로 전혀 별개의 객체를 사용하는 덕에 지역 변수가 같은 이름의 전역 변수를 덮어쓰는 것을 방지할 수 있는 것이다.

자바스크립트 실행 컨텍스트

자바스크립트 인터프리터가 어떤 함수를 실행할 때마다, 그 함수에 대한 새로운 실행 컨텍스트를 생성한다. 실행 컨텍스트란, 자바스크립트 코드가 실행되고 있는 컨텍스트를 말한다. 이 컨텍스트에서 중요한 부분 중 하나로 변수들이 정의되어 있는 객체를 들 수 있다. 이를테면, 어떤 함수에도 속하지 않은 자바스크립트 코드를 실행하는 컨텍스트에서는 전역 객체를 사용해서 변수를 정의한다. 그리고 모든 자바스크립트 함수는 각기 자신만의 고유한 컨텍스트에서 실행되며, 이 컨텍스트에는 지역 변수가 정의되어 있는 고유한 호출 객체가 있다.

변수의 유효 범위(재해석)

모든 자바스크립트 실행 컨텍스트에는 유효 범위 체인(Scope Chain)이라는 것이 딸려 있다. 이 유효 범위 체인이란 객체들의 나열(또는 체인)이다. 자바스크립트 코드에서 x라는 변수의 값을 찾으려면(이는 ‘변수 이름 판별’ 이라 불리는 과정이다) 제일 먼저 체인의 첫 번째 객체부터 검색을 시작한다. 만일 이 객체에 x라는 이름의 프로퍼티가 있을 경우, 해당 프로퍼티의 값이 쓰이게 된다. 만일 첫 번째 객체에 x라는 이름의 프로퍼티가 없을 경우 다음의 객체로 검색이 계속 된다. 두 번째 객체에도 x라는 이름의 프로퍼티가 없을 경우 그 다음 객체로 검색이 계속 된다. 두 번째 객체에도 x라는 이름의 프로퍼티가 없을 경우 그 다음 객체로 검색을 계속하는, 이러한 작업이 계속된다.

최상위 자바스크립트 코드의 경우(즉, 어떠한 함수 정의에도 포함되지 않은 코드) 이 유효 범위 체인은 ‘전역 객체’ 단 하나의 객체만으로 이루어진다. 이 객체에서 모든 변수를 검색한다. 이 객체에 존재하지 않는 변수의 값은 undefined이다. 그러나 (중첩되지 않은) 함수의 경우, 유효 범위 체인은 두 개의 객체로 이루어진다. 첫 번째는 이 함수의 호출 객체이고, 두 번째는 전역 객체다. 이 함수에서 어떤 변수를 참조할 경우, 호출 객체(지역 유효 범위)를 먼저 확인한 다음, 전역 객체(전역 유효 범위를 확인하게 된다. 중첩된 함수의 경우 세 개 또는 그 이상의 객체가 유효 범위 체인에 존재한다.

자바스크립트 완벽 가이드/ 데이터 타입과 값

숫자

자바스크립트에서 숫자는 가장 기본이 되는 데이터 타입으로 모든 숫자는 실수로 표현된다. IEEE 754 표준에 의해 정의되는 64비트 실수 형식을 사용하여 표현한다.

다른 내용은 생략

상수 의미
Infinity 무한대를 나타내는 특수한 값
NaN 숫자가 아닌 특수한 값
Number.MAX_VALUE 표현 가능한 가장 큰 수
Number.MIN_VALUE 표현 가능한 (0에 가까운) 가장 작은 수
Number.NaN 숫자가 아닌 특수한 값
Number.POSITIVE_INFINITY 양의 무한대를 표현하는 특수한 값
Number.NEGATIVE_INFINITY 음의 무한대를 표현하는 특수한 값

문자열

문자열은 0개 또는 하나 이상의 Unicode 문자들이 작은 따옴표 혹은 큰 따옴표로 둘러싸인 시퀀스다. 쉽게 말해서 “text”, “10” 은 문자열이 된다. 만일 따옴표 없이 숫자만 쓰면 그것은 숫자가 되고, 따옴표 없이 문자만 쓰면 변수 이름이 된다.

큰따옴표로 둘러싸인 문자들은 작은따옴표로 둘러싸인 문자열 내에 포함될 수 있으며 작은따옴표로 둘러싸인 문자들은 큰따옴표로 둘러싸인 문자열 내에 포함될 수 있다. 문자열 리터럴은 한 줄을 넘지 말아야 한다.

역슬래시 문자( \ )는 자바스크립트에서 특별한 목적을 위해 사용된다.

시퀀스 표현하는 문자
\0 널 문자
\b 백스페이스
\t 수평 탭
\n 줄바꿈 문자
\v 수직 탭
\f 폼 피드
\r 캐리지 리턴
\” 큰 따옴표
\’ 작은 따옴표
\ 역슬래시
\xXX 두 개의 16진수 숫자 XX에 의해 지정되는 Latin-1 문자
\uXXXX 네 개의 16진수 숫자 XXXX에 의해 지정되는 Unicode 문자
\XXX 1과 377 사이의 8진수 숫자 XXX에 의해 지정되는 Latin-1 문자
ECMAScript v3에서 지원하지 않는다. 이 이스케이프 시퀀스는 사용하지 말라

문자열 조작

자바스크립트가 지원하는 기본 기능 중 하나는 여러 문자열을 이어붙이는 것이다. 숫자에 + 연산자를 적용하면 숫자들이 더해진다. 그러나 문자열에 적용하면 두 번째 문자열을 첫 번째 문자열에 이어 붙여 두 문자열을 합친다. 예컨대 “hello” + “world” 는 “helloworld”가 된다.

숫자를 문자열로 변환하기

숫자는 필요할 때 문자열로 자동으로 변환된다. 문자열을 이어붙이는 표현식에서 숫자가 사용될 경우 숫자는 먼저 문자열로 변환된다. 예컨대 “100” + “마리” 는 “100마리” 가 된다.

문자열을 숫자로 변환하기

문자열이 숫자 문맥에 사용되면 자동으로 숫자로 변환된다. 예컨대 “21” * “2” 는 42가 된다.

불리언 값

불리언 값은 진리 값을 나타내는 것으로 true, false 두가지 값만 갖는다. 불리언 값은 무언가가 참인지 거짓인지를 말한다.

함수

함수(function)은 자바스크립트 프로그램에 정의되어 있거나 자바스크리븥 구현에 미리 저의되어 있는 실행 가능한 코드다. 함수는 한 번만 정의하면, 자바스크립트 프로그램 내에서 여러 번 실행될 수 있다. 함수는 계산 대상인 값들을 지정하는 전달인자(argument)나 매개변수(parameter)를 넘겨받을 수 있으며 계산 결과를 나타내는 값을 반환할 수도 있다. –할 수도 있다는 말은 없을 수도 있다는 말

자바스크립트의 중요한 특징 중 하나는 함수도 자바스크립트 코드로 조작할 수 있는 형태의 값이라는 점이다. 다른 많은 언어에서 함수가 단지 언어의 문법적인 요소로서 존재하며 함수는 단순히 정의하고 호출할 수 있는 것이지 데이터 타입은 아닌데 반해, 자바스크립트에서 함수가 실제로 값이라는 사실은 이 언어에 큰 유연성을 부여한다. 이것은 함수를 변수나 배열, 객체에 저자할 수 있으며 다른 함수의 전달인자로 넘겨 줄 수 있다는 것을 의미한다.

함수 리터럴

대부분의 경우 자바스크립트 프로그램에서 함수를 정의할 때 함수 정의 문법을 사용하지만, 자바스크립트는 함수를 정의하는 함수 리터럴 문법도 제공한다. 함수 리터럴은 function 키워드, 함수 이름(생략 가능), 괄호로 둘러싸인 함수 전달인자 목록, 마지막으로 중괄호로 구성된다.

예컨대 function square(x) { return x*x; } 의 함수는

var square = function (x) { return x*x; }

으로도 정의할 수 있다. 함수 리터럴은 고급 스크립트를 작성할 때 꽤나 편리하고 유용하게 사용된다.

함수를 정의하는 방법이 하나 더 있는데, 전달인자 목록과 함수 몸체를 문자열 형태로 Function() 생성자에 전달하는 방법이다. 예컨대

var square = new Function("x", "return x*x;");

인데 이것은 그리 유용하지 않고 비효율적으로 작동하므로 사용하지 않는다.

객체

객체(object)는 이름 붙은 값들의 모음이다. 보통 이 이름 붙은 값들을 객체의 프로퍼티(property)라고 부른다. 객체 프로퍼티를 참조하려면 객체 이름을 쓰고 이어서 마침표와 프로퍼티 이름을 적어 주면 된다. 예컨대 image 객체의 width 프로퍼티에 접근하려면 image.width라고 쓰면 된다.

함수가 객체 프로퍼티로 저장될 경우 그 함수를 메서드라고 부른다. 객체 메서드를 호출할 때는 마침표와 ( ) 를 사용한다. 예컨대 document 객체의 write( ) 메서드를 호출하려면 다음과 같이 쓰면 된다. document.write(“this is a test”);

자바스크립트에서 객체는 연관 배열(associative array)의 역할도 수행한다. 즉, 객체는 임의의 문자열에 임의의 값을 연결한다. 객체가 이러한 방시으로 사용될 경우 객체 프로퍼티에 접근할 때는 다른 문법을 사용한다. 이때는 접근하려는 프로퍼티 이름을 나타내는 문자열을 대괄호로 둘러싸면 된다. image[“width”]; 연관배열은 많은 프로그래밍 기법에 사용되는 아주 효과적으로 사용될 수 있는 데이터 타입이다.

객체 생성

객체는 특수한 생성자 함수를 호출하여 생성할 수 있다.

var o = new Object( ); 
var now = new Date( ); 
var pattern = new RegExp("\\sjava\\s", "i");

일단 객체를 생성하고 나면 마음대로 객체를 사용하고 프로퍼티 값을 설정할 수 있다.

객체 리터럴

자바스크립트는 객체 리터럴(객체 초기자) 문법을 제공한다. 객체 리터럴은 콜론으로 구별되는 프로퍼티 이름/ 값 쌍들이 다시 쉼표로 분리된 목록이다.

var point = { x: 2.3, y: -1.2 }

객체 리터럴은 중첩될 수 있다. 예컨대

var rectangle = { upperLeft: { x: 2, y: 3 }, lowerRight: { x: 4, y: 4} };

객체 리터럴 내에서 사용되는 프로퍼티 값이 상수일 필요는 없다.

객체 변환null이 아닌 객체가 불리언 문맥에서 사용되면 true로 변환된다. 객체가 문자열 문맥에서 사용되면 객체의 toString( ) 메서드가 호출되고 이 메서드가 반환하는 문자열이 대신 사용된다. 객체가 숫자 문맥에서 사용되면 자바스크립트는 먼저 객체의 valueOf( ) 메서드를 호출한다. 이 메서드가 기본 데이터 타입에 해당하는 값을 반환하면 그 값을 사용한다.

배열

배열(array)은 객체처럼 데이터 값들의 모음이다. 객체 내에 포함되는 각 데이터 값에는 이름이 있는 반면, 배열의 각 데이터 값에는 인덱스(index)가 있다. 배열은 다른 배열이나 객체, 혹은 함수를 포함한, 어떠한 자바스크립트 데이터 타입의 데이터라도 담을 수 있다.

배열 생성

배열은 Array( ) 생성자 함수로 생성할 수 있다. 일단 배열을 생성하고 나면, 배열의 어떤 인덱스에라도 얼마든지 엘리먼트를 할당할 수 있다.

var a = new Array( );

배열 원소들을 Array( ) 생성자에 넘겨주어 배열을 초기화 할 수도 있다

var a = new Array(1.2, "javascript", true, { x:1, y:2 } );

Array( ) 생성자에 숫자 하나를 넘겨주면 그 숫자는 배열의 크기로 사용된다. 다음의 예는 원소 10개를 포함한 새 배열을 생성한다.

var a = new Array(10);

배열 리터럴

자바스크립트는 배열을 생성하고 초기화하는 리터럴 문법을 제공한다. 배열 리터럴(배열 초기자)은 대괄호로 둘러싸인 쉼표로 구분된 값들의 목록이다. 대괄호 내 값들은 0부터 시작하는 배열 인덱스에 차례대로 할당된다.

var a = [1.2, "javascript", true, { x:1, y:2 } ];

객체 리터럴과 마찬가지로 배열 리터럴도 중첩될 수 있다.

var matrix = [ [1,2,3], [4,5,6], [7,8,9] ];

null

자바스크립트 키워드 null은 아무런 값도 나타내지 않는 특수한 값이다. null은 보통 객체 타입의 특수한 값, 즉 어떠한 객체도 나타내지 않는 값으로 취급된다. null은 다른 모든 값들과 구분되는 고유한 값이다.

undefined

자바스크립트에서 종종 사용되는 또 다른 특수한 값으로 undefined가 있다. undefined는 선언은 되었지만 값이 할당된 적이 없는 변수에 접근하거나, 존재하지 않는 객체 프로퍼티에 접근할 경우 반환되는 값이다. undefined와 null은 동일한 값이 아님을 주의

정규 표현식

정규 표현식(regular expression)은 텍스트 패턴을 기술하는 데 사용할 수 있는 풍부하고도 강력한 문법을 제공한다. 정규 표현식은 패턴 매칭, 검색, 치환 연산을 구현하는데 사용된다. 자바스크립트에서 정규 표현식은 RegExp 객체로 표현되며 RegExp( ) 생성자로 생성할 수 있다.

Error 객체

ECMAScript v3은 에러를 표현하는 몇 가지 클래스들을 정의하고 있다. 자바스크립트 인터프리터는 런타임 에러가 발생하면 이러한 클래스들 중 하나에 해당하는 객체를 던진다(throw)

값에 의한 vs 참조에 의한

데이터 값 조작 방식은 두 가지인데, 이 둘은 근본적으로 서로 다르다. 이 두 방식은 ‘값에 의한(by value)’ 조작과 ‘참조에 의한(by reference)’ 조작이라고 불린다. 값에 의한 조작은 값이 복사되는 것이라 사본을 조작해도 원본에 변화가 없지만, 참조에 의한 조작은 참조를 조작하면 원본도 같이 조작이 된다.

자바스크립트 완벽 가이드/ 어휘구조

문자 집합

자바스크립트 프로그램은 Unicode 문자 집합을 사용하여 작성된다.

대소문자 구분

자바스크립트는 대소문자를 구분하는 언어이다.

공백과 줄나눔

자바스크립트는 프로그램 내 토큰 사이에 존재하는 스페이스나 탭, 줄바꿈 등을 무시한다. 스페이스나 탭, 줄바꿈 문자들은 프로그램 어디에서도 자유롭게 사용할 수 있다. 그러나 줄 나눔 위치에 관해서는 작은 제약 사항이 존재.

선택적인 세미콜론 사용

세미콜론( ; )은 자바스크립트에서 각 문장을 구분하는 역할을 한다. 세미콜론을 생략할 수도 있지만 무조건 다는 것이 좋다.

주석

자바스크립트는 C, C++ 스타일의 주석을 모두 지원한다. ‘//’ (한 줄) 라든가 ‘/* */’ (여러 줄) 모두 지원한다.

리터럴

리터럴(literal)은 프로그램에 직접 나타나는 데이터 값이다. 리터럴은 프로그래밍 언어에서 중요한 부분을 차지한다. 리터럴 없이는 프로그램을 작성할 수 없다.

식별자

자바스크립트에서 식별자는 변수나 함수에 이름을 붙이거나 자바스크립트 코드 내 루프 문에 레이블을 붙이는 데 사용된다. 올바른 식별자가 되기 위한 규칙은 다른 수많은 언어와 동일하다. 첫 번째 문자는 알파벳, 밑줄( _ ), 달러( $ ) 표시여야 하고, 이어지는 문자들은 알파벳, 숫자, 밑줄( _ ), 달러( $ ) 표시어야 한다.

예약어

예약되어 있는 자바스크립트 키워드들 ECMA 확장을 위해 예약되어 있는 단어들 사용하지 말아야 할 기타 식별자들
  • break
  • do
  • if
  • switch
  • typeof
  • case
  • else
  • in
  • this
  • var
  • catch
  • false
  • instanceof
  • throw
  • void
  • continue
  • finally
  • new
  • true
  • while
  • default
  • for
  • null
  • try
  • with
  • delete
  • function
  • return
  • abstract
  • double
  • goto
  • native
  • static
  • boolean
  • enum
  • implements
  • package
  • super
  • byte
  • export
  • import
  • private
  • synchronized
  • char
  • extends
  • int
  • protected
  • throws
  • class
  • final
  • interface
  • public
  • transient
  • const
  • float
  • long
  • short
  • volatile
  • debugger
  • arguments
  • encodeURI
  • Infinity
  • Object
  • String
  • Array
  • Error
  • isFinite
  • parseFloat
  • SyntaxError
  • Boolean
  • escape
  • isNaN
  • parseInt
  • TypeError
  • Date
  • eval
  • Math
  • RangeError
  • undefined
  • decodeURI
  • EvalError
  • NaN
  • ReferenceError
  • unescape
  • decodeURIComponent
  • Function
  • Number
  • regExp
  • URIError

셰이더 프로그래밍 입문

제목 그대로 셰이더 프로그래밍에 대한 기초적인 내용을 다루는 책. 오랜 실무 경험을 쌓은 저자가 학교에서 학생들을 가르치면서 쌓은 강의 경험도 함께 녹여내어 친절하면서도 실용적인 책. 비슷한 시기에 읽은 <유니티로 배우는 게임 수학> 보다 이해하는데 좀 더 좋았음. –물론 그 책은 순수 셰이더는 아니고 3D 개념이 중심이고 셰이더는 막판에 조금 다룬다.

제목에도 쓰여 있지만 '입문' 책이기 때문에 이 책 이후로도 다양한 셰이더 프로그래밍 책을 함께 봐야 좀 더 능숙한 셰이더 프로그래밍을 할 수 있겠지만, 각종 셰이더 프로그래밍에 대한 개념 설명이 무척 잘 되어 있으니 일단 이 책부터 시작하는게 좋다고 생각 됨. 개인적으로는 일단 가볍게 본 수준이라, 한 번 더 읽으면서 좀 더 깊이있게 스터디를 해볼 생각.

쉽게 배우는 알고리즘

프로그래밍을 배우면서 놀랐던 적이 2번 있는데, 한 번은 C#에서 LINQ와 Lambda 식을 섞어 사용하는 것을 봤을 때였고, 다른 한 번은 재귀 알고리즘을 봤을 때였다. 재귀 알고리즘에 대한 놀라움 덕분에 나는 프로그래머는 아니지만 –가끔 오해하는 사람들이 있는데, 나는 'Designer'다– 알고리즘을 좀 배워봐야겠다는 생각을 하게 되었고, <Introduction to Algorithms>의 번역자인 문병로 교수가 직접 쓴 책인데다 '쉽게 배우는'이라는 타이틀이 달려 있어서 다른 책 보다 먼저 읽게 되었음. 

동일 저자의 <쉽게 배우는 유전 알고리즘>이 유전 알고리즘에 대한 기반 지식이 없으면 이해하기 어려워서 읽다가 말았는데, 이 책은 그것보다는 좀 쉬운 편. 알고리즘에 대한 기본적인 개념에서부터, 검색이나 정렬 등 실재하는 여러 문제에 대한 알고리즘과 NP 문제등 알고리즘에 대한 다양한 내용을 잘 다루고 있다. 

물론 교재로 쓰여진 책이니 만큼 한 번 읽었다고 내용을 온전히 이해했다고 보기는 어렵고, 별도로 공부를 해둬야 이해가 잘 될 것 같다. 다만 알고리즘에 대한 책은 많은 관계로 다른 책들도 살펴 본 후에 괜찮은 책을 따로 정리하는게 좋을 듯.

책 내용과는 별개의 것이지만, 결국 알고리즘이라는 것도 결국 생각하는 것과 관련한 것이라 알고리즘에 대한 지식을 배운다고 알고리즘 실력이 는다기 보기는 어렵고, 다양한 문제 상황에서 직접 문제를 해결하고 그것의 더 나은 방법을 찾아보고 해야 알고리즘 실력이 오르는 것 같다. –뭐 사람 하는 일에 아닌 일이 어디있겠느냐만– 

물론 도구를 쓰는 법을 배워야 도구를 사용할 수 있듯 이런 책을 통해 기본 지식은 배워야겠으나, 실력을 높이는 것은 어디까지나 직접해봐야 한다는 것. 다이어트 지식을 아무리 많이 가져도, 다이어트를 하지 않는 이상 살은 빠지지 않는다.

자연언어처리의 응용

자연언어처리를 응용한 분야에 대한 개괄. 

제목의 '응용'이 난이도를 나타날 때 쓰이는 표현으로 생각하고 대단히 어려운 책이 아닐까 싶었는데, 내용상 자연언어처리 이용한 응용 분야의 개념에 가까워서 그렇게 어려운 책은 아니었다. –일본인 저자들의 특성대로 내용이 체계적으로 쓰여져서 그랬을 수도 있음–  책에서도 더 자세한 내용을 알고 싶으면 참고문헌에 달린 논문들 찾아보라고 나옴.

두께도 얇고 지금 내가 하려는 것과는 거리가 조금 있어서 –내가 기대한 내용은 아니었던지라– 그냥 쓱 훑으면서 넘어 갔음.
 

코드 컴플릿

뭐 딱히 설명이 필요 없는 책. 마이크로소프트 공식 지정 학습서인데 무슨 설명이 더 필요할까?

'코드는 작성하는 시간 보다 읽히는 시간이 훨씬 길다'는 대전제하에 코드를 작성하는 법에서부터 테스트, 리팩토링, 개발 관리, 협업 등 프로그래밍 영역 전반에 대해 다루고 있는데, 다루는 범위가 워낙 넓어서 초심자에서부터 고급 프로그래머에 이르기까지 모두에게 도움이 될만하다.

특히 나 같은 초심자라면 더 나은 실력을 갖춘 프로그래머가 되기까지 두고 두고 보면서 배울 수 있는 책이라 생각 됨.

실용주의 프로그래머

뭐 딱히 설명이 필요 없는 책. 프로그래밍을 논하고 있기는 하지만, 비단 프로그래밍을 넘어 어떠한 일을 하든 통용될 수 있는 자세와 방법에 대해 이야기 한다.

요즘 무엇을 하든간에 결국엔 '자기 성장'에 귀결되고, 결국 인생이랑 자기 성장의 과정이라는 생각을 하고 있는데, 이 책을 읽으며 그와 관련하여 많은 생각을 할 수 있어서 좋았다.

뇌를 자극하는 C# 4.0 프로그래밍

C#의 기초부터 시작해서 고급 기능까지를 두루 살피는 책. 단순히 언어의 문법과 사용법만이 이야기하는 것이 아니라 그 개념과 사용 이유에 대해서도 잘 설명하고 있어서 이해가 더욱 잘 된다.

개인적으로는 기초 없이 MSDN만 찾아보고 잘 이해 안 되던 개념들을 책을 통해 잘 이해할 수 있었던 점도 좋았고, 생각 없이 노가다로 구현한 것들에 대한 우아한 해법도 배울 수 있어서 좋았다. –람다 식이나 LINQ 등을 보면서 C#이 꽤나 근사한 언어라는 것을 깨닫게 됨– 부실했던 기초가 조금은 보강이 된 느낌.

후반부의 고급 기능들은 아직 경험해 본 바가 없어서 한 번에 잘 이해는 하지 못했는데, 꽤나 잘 정리된 것 같아서 앞으로 경험을 쌓으며 다시 훑으면 잘 이해할 수 있으리라 생각.