반응형

C : 구조체를 네임스페이스처럼 사용하기

알게된 배경

리눅스 시스템에서 네트워크 프로그래밍을 공부할 때 참조한 책이 하필 C로 설명이 되어 있는 책이었다. 덕분에 C++과 달리 요즘에는 자료를 찾기 힘들기 때문에 필요한 정보를 처리하기 위해서 직접 함수를 만들어야 하는 경우가 많았다.

 함수가 많아지면 발생되는 문제는 역시 작명문제이다. 그러나 C는 네임스페이스나 클래스 기능이 제공되지 않기 때문에 구조체(struct)와 포인터의 조합으로 비슷하게 흉내내서 구현할 수 있다.

 그러나 타이핑 해야할 양이 급증하게 되므로 가능하면, C로 코딩해야 하는 상황을 최대한 벗어나길 바란다.


간략한 원리

구조체가 전역으로 선언이 되어 있어야 하며, 함수들은 포인터로 연결되어 있어야 한다. 그리고 이렇게 선언된 구조체는 외부 참조가 가능하도록 선언을 해야 네임스페이스 혹은 클래스처럼 사용할 수 있다.


구현 예시

예시로 문자열의 뒤쪽의 단어가 일치하는지 검사하는 함수를 구조체내의 함수로 구현한다. 확장자가 포함된 파일이름의 확장자 검사하는 용도로 사용될 수 있다.

헤더파일)

// ns_util.h
#pragma once

typedef enum{ false, true } bool;

struct ns_util_tools
{
    bool (*isHasBackword(const char* str, const char* backword);
};
// 아래의 struct가 존재하니 이 헤더파일을 인클루드 하면 사용할 수 있음
extern const struct ns_util_tools ns_util;

C파일)

// ns_util.c
#include <string.h>
#include "ns_util.h"
bool ns_util__isHasBackword(const char* str, const char* backword)
{
    int str_len, backword_len;
    int i;
    str_len = strlen(str);
    backword_len = strlen(str);
    for(i=0; i<backword_len; ++i)
    {
        if(str[str_len -i] != backword[backword_len -i])
            return false;
    }
    return true;
}
// 실제로 네임스페이스 처럼 사용될 구조체
const struct ns_util_tools ns_util = {
    .isHasBackword = ns_util__isHasBackword
};


다른파일에서 호출)

// main.c
#include <stdio.h>
#include "ns_util.h"

int main(int argc, char* argv[])
{
    char* str = "main.exe";
    if(ns_util.isHasBackword(str, ".exe"))
        printf("%s is exe file!!", str);
    else
        printf("%s is What is?", str);

    return 0;
}



 이로써 C로써도 충분히 객체지향으로 코딩이 가능하다는 것을 알 수 있다. 그렇지만, C로 프로젝트 진행하는 것은 가능하면 피하고 싶다.

반응형
반응형

C++ : 네임스페이스

정리하게 된 배경

 네임스페이스는 C와 C++의 표준함수의 가장 큰 차이점을 보이는 기능중 하나이다. 때문에 명확히 알고 활용을 해야 하기 때문에 정리한다.

 기초이지만, 중요한 개념이기도 하다. 또한, 학교나 학원 그리고 혼자 공부하는 사람입장에서는 예제에서 많이 적용하기 않기 때문에 의외로 활용을 못하는 초보 프로그래머를 많이 볼 수 있다.


개념

 프로그램이 커지고 복잡해지면서, 작명의 한계(?)로 인해서 발생되는 문제를 해결하기 위한 개념으로 등장을 했다. 이후 자바스크립트(JavaScript)나 파이썬(Python) 같은 스크립트계열 언어에서는 모듈이라는 이름으로 발전한다.

 C++에서는 네임스페이스(namespace)를 통해서 같은 이름의 클래스(class)명이나 함수(function)명을 선언 및 정의가 가능해졌다. 때문에 이로 인해 프로그래머들은 작명의 스트레스가 줄게 되었다.


사용방법

 네임스페이스는 클래스를 선언하는 방식과 비슷하게 namespace 키워드 바로 뒤에 선언하고자 하는 네임스페이스 명을 붙여서 선언을 하고 나서 중괄호 안에서 선언 및 정의를 하면 된다.

// A.h
namespace hg
{
    class A
    {
        // ...
        void func();
    }
}

네임스페이스의 내부에 선언 및 정의된 것들(함수, 변수, 클래스 등)을 호출하여 사용할 경우에는 앞에서 선언한 네임스페이스 이름 뒤에 "::" 붙여서 선언할 수 있다.


// A.cpp
// 클래스의 함수정의
#include "A.h"

void hg::A::func()
{
    // ...
}
// main.cpp
// 클래스의 함수호출
#include "A.h"

int main(int argc, char* argv[])
{
    hg::A a;
    a.func();
    return 0;
}

 사용할때 마다 네임스페이스 이름을 매번 적는 것은 상당한 노동과 타이핑양이 많기 때문에 기본적으로 네임스페이스 이름을 사용중인 상태를 나타내는 using 키워드를 사용하면 된다.


// A.cpp
// 클래스의 함수정의
#include "A.h"
using namespace hg;

void A::func()
{
    // ...
}
// main.cpp
// 클래스의 함수호출
#include "A.h"
using namespace hg;

int main(int argc, char* argv[])
{
    A a;
    a.func();
    return 0;
}

네임스페이스의 내부에 선언 및 정의된 것들(함수, 변수, 클래스 등)을 호출하여 사용할 경우에는 앞에서 선언한 네임스페이스 이름 뒤에 "::" 붙여서 선언할 수 있다.

 여기서 using namespace hg;의 유효범위는 해당 키워드가 사용된 파일내에서는 유효하다. 즉, 다른 cpp(혹은 cc) 파일에서는 다시 using 키워드를 사용해서 네임스페이스 사용중임을 알려야 한다.


주의 할점

 개념이 잡힌 사람에게는 당연한 말이 겠지만, using 키워드를 이용한 네임스페이스 선언을 할 경우 헤더 파일에서는 사용하지 않는 것이 정석이다. 따라서 네임스페이스는 정의는 보통 헤더 파일에서 된다. 그리고 using 키워드의 경우 헤더의 클래싀 정의 할 경우에 사용된다. 여러 네임스페이스에서 정의된 것들은 같이 써야 될 경우 가능하면, using은 사용하지 않는 것이 좋다.

 헤더파일에서 using을 쓰면 안되는 이유는 논리적으로 헤더파일은 cpp파일에서 include 될때마다 포함되는데, 이는 include 하는 cpp 마다 강제로 using 키워드를 사용한것처럼 되어버리기 때문에 사실상 네임스페이스가 없는 것처럼 되어 버린다.


추가사항

 헤더파일을 include 할 경우 C와 C++의 몇 가지 차이점이 있는데, C의 stdio.h의 경우 C++에서는 cstdio로 include하게 된다. 이 뿐만 아니라 기존의 C 표준 헤더 파일들 앞에 'c'를 붙어 있는 것을 알 수 있다.

 이 두 헤더 파일간의 차이는 바로 네임스페이스의 존재의 차이가 있다. C에서는 네임스페이스 키워드가 없지만, C++에서는 네임스페이스가 있어서 표준함수 네임스페이스인 std내에 표준함수들이 정의 되어 있다.(물론 C에는 네임스페이스가 없어도 있는 것처럼 사용할 수 있다.)

반응형
반응형

C : 문자열 숫자 변환

작성계기

이전부터 정리를 하려 했으나 게으름으로 이제야 정리를 하게 되었다. 문자열을 숫자로 바꿔야 하는 경우는 굉장히 많기 때문에 유용하다. 한편으로는 간단하게 직접 똑같은 기능을 하는 함수를 간단히 만들 수 있다(본인은 atoi()를 늦게 알게 되어서 필요할때 직접 구현을 하였었다.


atoi()

헤더 파일: stdlib.h

선언 구조: int atoi(const char* str);

리턴: 정상적으로 작동될 경우 정수를 반환하고, 실패할 경우 아무것도 반환하지 않는다.

부가 설명: 함수 이름은 a는 문자열, i는 int의 첫 글자를 따서 문자열을 정수로 바꾼다는 의미로 지어진 이름이다. 따라서 atoi() 역이 되는 함수는 itoa()가 되어야 한다.


직접 구현해보기

atoi()와 같은 기능을 하는 함수를 간단히(?) 다음과 같이 구현할 수 있다.


// 한문자를 정수 숫자로 반환하는 함수
#include <string.h>

int char2int(const char ch)
{
    char index[10] = "0123456789";
    int t;
    for(t=0; t<10; ++t)
    {
        if(index[t] == ch)
            return t;
    }
    return -1;
}

// 10의 제곱수를 반환하는 함수
int pow10(const int n)
{
    int tmp;
    int num = 1;
    for(tmp = n; tmp>0; --tmp)
        num *= 10;
    return num;
}

// atoi()와 같은 역할을 하는 함수
int str2int(const char* str)
{
    int strLen = strlen(str);
    int op = 1;          // 부호
    int n = strLen;    // 자리수
    int num = 0;       // 결과값
    int t = 0;
    for(t=0; t<strlen; ++t)
    {
        int tmp = 0;
        if(0== t && '-' == str[0])
        {
            op = -1;
            --n;
            continue;
        }
        if(-1 == tmp)
            return;
        num += tmp*pow10(n);
    }
    return num*op;
}

조금 차이지만 여전히 C++보다 C가 더 불편하니 가능하면, 표준함수에서 제공하는 것을 소중히 여기도록 하자.

반응형
반응형

TypeScript 기초: 기본 타입(Basic Type)

타입스크립트(TS: TypeScript)에서는 기본적으로 제공하는 타입이 존재 한다. 하지만, 항상 염두를 해야 하는 것이 최종적으로 빌드 되었을때는 자바스크립트(JS: JavaScript)가 됨을 잊지 말아야 한다.

* 이 글 작성할 당시의 TypeScript는 2.0 이 발표된지 얼마 안된 시점이다. 즉, JS 와 TS 가 2016년 으로터 많은 시간이 지났다면 맞지 않는 글이다. 대신 과거에 이러했구나 정도로 보면 될 것 같다.

 

기본 타입

JS에서 제공되는 기본 타입과 같은 타입

 

1. undefined

2. null

3. number

4. string

5. boolean

 

undefined 와 null은 JS에서 내부적으로 구분이 되기 때문에 역시 타입으로 정의가 가능하다. 주의해야 할 점은 이러한 기본타입은 변수 선언시 초기값이 주어질 경우 굳이 타입을 정의 하지 않아도 된다.

 

확장된 타입

TS에서 등장한 타입이다. 다만, 지금도 업데이트가 꾸준히 되고 있는 언어이기 때문에 필요에 따라서 새로운 타입이 추가될 가능성이 없는 건 아니다.

 

1. Tuple

2. enum

3. any

4. never

 

Tuple

JS에서는 기본적으로 제공되는 타입이 아니다. 대신 Array를 이용해서 간접적으로 구현을 타입스크립트에서는 이를 타입으로 만들어서 정형화를 시켜주는 것이다. 사용방법은 다음과 같다.

예시)

var foo: [string, number];
foo = [5, "hello"]    // error
foo = ["hello", 5]    // no error 

 

여기서 타입스크립트의 역할은 해당 변수의 튜플의 순서에 대한 문법검사를 해준다는 것을 알 수 있다. 이 문법은 자바스크립트에서는 에러가 나지 않는다는 점을 기억하자.

 

enum

컴파일러형 언어(C, C++, JAVA, C# 등)에 있는 enum과 동일한 역할을 한다. 선언된 키워드는 따로 정의 하지 않는다면, 선언된 순서대로 0부터 1씩 커진다. 만약 첫 번째 선언된 키워드에 숫자를 정의 하면, 이후 키워드는 강제로 선언된 키워드의 숫자에서 부터 1씩 커진다. 사용방법은 다음과 같다.

예시)

enum NUM{ one = 1, two, three };
var flag = NUM.two
switch(flag)
{
    // ...
    case NUM.two:    // execute this line
    // ...
    break;
    // ...
}

 

enum으로 호출된 값들은 실제 number형을 갖고 있다. 그리고 자바스크립트로 이러한 형태를 구현을 해주는 것을 타입스크립트의 컴파일러가 코드를 작성을 해준다. 어떻게 코드가 작성되는지 확인하고 싶다면, 타입스크립트 공식 홈페이지의 PlayGround에서 임으로 작성하여 확인을 해봐도 된다.

 

any

JS에서는 변수를 선언할때 모든 값을 참조하게 할 수 있다. 타입스크립트에서는 자바스크립트에서 내부적으로 갖고 있는 타입을 명시 해주면서 타입검사를 할 수 있다. 하자만, 웹 개발 환경의 경우 종종 어떤 타입이 오는지 알지 못하는 상태에서 개발을 해야 하는 경우가 있다. 이러한 유연성을 위해서 기존의 자바스크립트처럼 모든 타입을 받을 수 타입이다. 사용방법은 타입을 선언을 변수뒤에 ": any"를 작성하면 된다.

예시)

var foo: any;
foo = 5;
foo = "five";    // No Error

 

이러한 타입으로 자바스크립트와 타입스크립트를 비교하자면, 자바스크립트는 암묵적으로 any타입으로 선언이 되어 있고, 타입스크립트는 참조되는 값에 타입으로 자동선언이 되기 때문에 any타입을 명시 해줘야 자바스크립트와 똑같이 사용할 수 있다.

 

never

함수의 반환형에서 선언시 사용되는 타입이다. 최근(2016년 버전 2.0 업데이트)에서 논의 되어 추가 되었다. 비동기 방식으로 네트워크 작업이 많은 웹 개발환경에서는 콜백함수를 많이 활용한다. 또한 네트워크는 컴퓨터 또는 디바이스 바깥과 입출력을 하기 때문에 예외(에러) 처리가 필요로 하게 되는데, 타입스크립트에서 이렇게 반환할 수 없는 함수에서 사용하기 위한 서브타입으로 도입하였다.

예시1)

function error(msg: string): never
{
    throw new Error(msg);
}

function fail()
{
    error("fail");
}

 

예시2)

function infinLoop(): never
{
    while(true){}
}

 

 그렇다면, 타입스크립트에 이미 있는 void 타입과 겹치게 되는데, 이러한 void 타입은 엄밀하게 따지면, 자바스크립트에서는 undefined를 반환을 하지만 never타입은 이 조차 반환 하지 않는다(할 수 없는 상황이다).

자세한 설명은 아래의 영문 블로그에서 확인을 할 수 있다.

블로그(영문) The never Type  링크

만약 지금 이해가 안된다 하더라도 걱정하지 말자. 해당 타입은 특별한 경우에만 사용하기 때문에 예시에 나온 경우에만 적용하면 된다.

 

참고자료

타입스크립트 공식 홈페이지의 핸드북(Basic Type)

 

 

반응형
반응형

TypeScript 기초 : 타입의 정의와 의미

TypeScript는 JavaScript와 관계가 C와 C++의 관계와 비슷한다. 즉, TypeScript에서 JavaScript 문법을 사용한다고 해서 빌드가 안되는 것이 아니다. 오히려 TypeScript는 ECMAScript(ES)의 표준에 맞춰서 제작이 되고 있다.


타입정의 하는 방법

JS(JavaScript)에서 변수와 객체선언은 var를 사용해서 선언 혹은 정의를 할 수 있었다. 이 var는 기본적인으로는 5가지 타입(Primitive Data Type)을 갖고 있다(겉보기에는 타입이 없는 것 같지만, 내부적으로 타입을 갖고 있어야 한다. 이러한 타입은 사실 JS에서 자세히 다뤄야 한다).


1. Data Type (number, string, Object)

2. Dynamic type (undefined, number, string, Boolean, Array, Object)

3. Primitive Data (string, number, boolean, null, undefined)

4. Complex Data (function, Object)


이러한 내부적으로 갖고 있는 타입간 충돌이 일어날 경우 브라우저에서는 타입에러(Type Errer) 혹은 미정의에러(Undefined Error)메시지를 콘솔에서 확인할 수 있다.

 간단한 예로 숫자가 들어 있는 변수에 특정 object의 키를 읽으려고 하는 경우에는 의도대로 동작이 안될 것이다.


TS(TypeScript)에서는 이러한 실수를 줄여주기 위해서 변수를 지정을 할때 타입을 명시(혹은 정의)할 수 있다. var로 변수 혹은 객체를 선언을 할때에는 뒤에 ":"를 두고 뒤에 타입이름을 명시하면 된다.

예시)

var foo : number;
foo = 2;
foo = "foo"   // error


하지만, 위의 3번째 줄이 에러라고 해서 빌드한 결과가 에러는 아니다. 위의 세줄을 JS로 변환하면 다음과 같다.

예시)

var foo;
foo = 2;
foo = "foo";


JS에서는 엄밀하게는 "="의 역할이 참조를 의미하기 때문에 foo의 2가 "foo"라는 문자열(string)으로 참조가 바뀌게 된다. 이 경우가 간단한 예제에서는 문제가 없어 보인다. 하지만, 숫자(number)나 객체(object)를 인자로 받아서 계산을 하는 함수가 있다면, 원하는 결과와 다른 결과를 얻게 된다(그리고 그 결과 야근같은 추가 근무가 될 것이다).

 때문에 TS에서 에러로 표시된 것은 가능하면 해결하는 습관을 갖는 것이 장기적으로 생각했을 때 큰 이득이 된다.


타입정의가 가능한 것들

타입정의가 가능한 것들은 JS에서 내부적으로 정의 된 타입보다 자세한 정의가 가능하다. 일단 앞서 언급했던 JS에서 갖는 5가지 타입이 정의 가능하며, TS 2.0 이후에는 null도 독립적인 타입처럼 정의하고 구분을 한다.

타입정의가 가능한 것들

1. JS에서 내부적으로 갖는 5가지 타입

2. TS에서 정의 되어 있는 class 이름

3. TS에서 정의 되어 있는 interface 이름

4. TS에서 정의 되어 있는 enum 이름

5. any 타입(JS의 기본 var 와 같이 모든 타입을 받음)

6. null 타입

7. 콜백함수(Function)와 화살표 함수


타입정의가 가능한 곳(위치)

변수 혹은 객체를 표기할 수 있는 곳은 거의 다 타입정의를 할 수 있다. 다만, 메서의 반환(리턴)값의 경우 메서드의 뒤에 표기를 한다. 이는 메서드의 첫줄로 타입을 확인할 수 있어 가독성의 이점을 준다. 단, 정의를 안한상태에서 리턴값이 있을 경우에는 에러가 아니다.

예시)

function func1(foo: number): number
{ return foo +1; }
function func2(foo: number)  // no error
{ return foo +1; }


한 변수 혹은 객체에 여러 타입을 정의 하기

하나의 변수에 여러개의 타입을 정의한 것도 가능하다. 방법은 or연산과 같은 "|"을 통해서 정의가 가능하다. 메서드의 입력 인자에서 사용하는 경우 메서드 내부에서 타입을 구분해주는 코드가 있어야 에러 메시지가 뜨지 않는다.

예시)

function func1(foo: number | string)
{
    if("string" === typeof(foo))
    foo = Number(foo);
    return foo + 1;
}


마찬가지로 반환(리턴)값의 타입을 정의 할때도 여러개의 타입을 정의 할 수 있다. 이 경우 여러개로 정의 된 타입중에 하나를 반환하면 된다.

예시)

function func2(foo: number): number | string
{
    if(0 < foo){
        return foo;
    }else{
        return "negative number";
    }
}


타입 정의의 의미

정리하면서, 타입스크립트의 탄생배경은 대규모 프로젝트시에 어려움을 줄이기 위해 탄생된 만큼 소규모 웹 앱을 제작할때에는 오히려 타이핑을 더 해야 하는 등의 불편함을 초래 할 수 있지만, 반대로 규모가 커질 수록 개발자의 실수와 가독성을 높여주는 효과가 있다. 그중 핵심적인 기능이 타입정의라 할 수 있다. 타입정의가 되므로 IDE의 인텔리전트(코드 자동완성 및 추천기능) 기능을 이용도 쉬워지며, 능숙하지 못한 개발자의 실수를 줄여주는 효과가 있다. 사실 개발에서 시간을 많이 할애하는것은 타이핑보다는 디버그라는 점을 생각할때 큰 이점이라 할 수 있다.


참조

자바스크립트 타입에 대한 내용

w3schools.com


반응형
반응형

Mac OS X 패키지 관리자 Homebrew

윈도우 운영체제를 제외한 유닉스계열 운영체제의 특징은 터미널에서 커맨드 라인으로 패키지를 관리하는 툴이 존재한다. 데비안 리눅스의 경우 apt-get을 사용하는데, Mac OS X 에서도 이와 같이 homebrew라는 패키지 관리자가 있다.


설치방법

설치방법은 터미널 창을 열고 아래의 명령어를 입력하면된다. 일일히 입력하기 귀찮은 사람은 복사하여 붙여넣어서 실행을 하면된다. 복사하기 힘들다면, 공식 웹페이지에도 똑같이 커맨드라인을 복사할 수 있으니 공식홈페이지에서 커맨드라인을 복사해도 된다.


/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
 


공식 웹페이지(한글 ): Homebrew


간단한 사용방법

이름은 홈브로(Homebrew)이지만, 명령어는 brew만 입력하여 사용한다. 커맨드라인류 프로로그램들이 그렇듯이 먼저 간단하게 brew라고 입력하여 엔터를 누르면 사용방법과 옵션에 대해서 간단하게 설명을 확인할 수 있다. 자세한 사용법을 알고 싶다면, 역시 공식 웹페이지에서 문서(Document) 항목을 찾아보면 된다.


패키지 검색(search)

tomcat을 설치하고 싶은 경우 다음과 같이 입력을 하면 된다.

brew search tomcat

search 뒤에 있는 텍스트 이름이 들어있는 패키지를 검색하여 보여준다. 만약 search뒤에 아무것도 입력하지 않는다면, 수많은 패키지가 검색되는 것을 확인할 수 있다. 또한 자신이 과거에 설치했던 패키지라면 뒤에 체크가 되어 있는 것을 확인할 수 있다.


패키지 설치(install)

앞에서 검색한 톰캣8.0(tomcat8.0)을 설치하고 싶은 경우 다음과 같이 install 뒤에 정확하게 패키지 명을 입력해야 한다.

brew install tomcat@8.0

설치를 시작하기 전에 해당 패키지을 올린 사람이 작성한 안내문 만큼의 안내(?)를 받으며 설치를 할 수 있다.


설치된 패키지 확인(list)

현재 자신의 Mac에 Homebrew로 설치된 패키지를 확인할 때 사용된다.

brew list


반응형

'잡소리' 카테고리의 다른 글

URI, URL 의미  (0) 2020.11.10
코드 뷰 : 문법 하이라이트(syntax highlight)  (0) 2018.02.19
구형 PC 서버 부팅시 키보드나 마우스 인식 경고  (0) 2017.04.27
Mac OS X: 악성 앱 메모  (0) 2017.03.08
성격유형 검사  (0) 2017.01.02
반응형

Mac OS X: 악성 앱 메모

만약 악성프로그램이 아닐 경우 댓글이나 의견을 주시기 바랍니다. 해당 글은 지속적으로 수정합니다.


Mac Keeper(맥 키퍼)

 애플(Apple)사에서 만든것처럼 보이지만, 실제로는 전혀 상관없는 기업에서 만들었다. 무엇보다 가장 거슬리는 문제는 삭제가 쉽지 않다. 삭제를 해도 브라우저에서 지속적으로 뜨며, 완전히 삭제하기 위해서는 여기저기 숨겨놓은 파일둘을 삭제해야 한다.


Adobe Flash Player Updeate(어도비 플레시 플레이어 업데이트)

 실제 Adobe에서 지원하지 않는 것으로 생각된다. 국내 웹 환경보다는 주로 미국 웹에서 Adobe Flash player 업데이트를 요구하는 광고가 상단에 생기는데, 업데이트를 하면 하라는 업데이트는 안되고 위의 맥키퍼를 포함한 알수없는 애드웨어가 마구 설치된다.


MPlayerX(엠 플레이어 엑스)

 구글에 "OS X 동영상 플레이어"등의 키워드를 쳐보면 상위 동영상 플레이어 블로그 등에서 소개하는 앱중 하나이다. 과거에는 많이 사용되었는지 모르지만, 현재는 작동이 안되며, 엄한곳에서 다운로드를 받을 경우 알수 없는 삭제가 어려운 프로그램이 설치되는 경험을 할 수 있다. 다행히 앱 자체 삭제는 어렵지 않다. 심지어 악성코드의 통로로 사용되 있다는 기사도 찾아 볼 수 있다. 아마도 개발자가 요즘에 일을 안하는가 보다.



반응형
반응형

TypeScript: 2.1이상 타입 재정의 적용 방법

개요

초기 TypeScript에서 JQuery나 UnderScore 같은 널리 사용되는 라이브러리를 사용할 경우 TSD에서 제공하는 nodejs 모듈로 다운로드 받아서 사용했었다. 하지만, TypeScript의 버전이 2.1을 넘어가게 되면서 재정의 파일을 받는 방법이 달라지게 되었다.


 현재 최신 타입스크립트를 사용하는 경우 TSD를 통해서 재정의 파일을 다운로드 받을 수 없게 되었다.


2.1버전 이상에서 재정의 파일 파일을 설치하는 방법

tsd의 기능이 현재는 npm에 완전히 넘어가게 되었다. 즉, npm의 명령어를 사용해서 재정의 파일을 설치하게 되었습니다. JQuery를 예를 들면 다음과 같다.


npm install --save @types/jquery


위의 명령어를 실행하면, node_modules 폴더가 생성되며, 그 안에 jquery 재정의 파일이 생성된것을 확인할 수 있다.

또한 npm을 사용하기 때문에 npm에서 제공하는 옵션을 사용할 수 있다. 예를 들어 -g를 사용할 경우 글로벌로 모듈처럼 설치되기 때문에 매번 새로 프로젝트를 새로 시작할때마다 설치할 필요가 없어진다.


npm install -g --save @types/jquery


주의할 점

 이처럼 재정의 기능은 인텔리전트(자동 추천기능)와 타입검사를 지원하기 위한 것이지 실질적인 라이브러리가 아님을 항상 인지해야 한다. 그렇지 않는다면, 라이브러리가 없어서 실행 안되는 결과물을 확인할 수 있다.


참고자료

https://www.npmjs.com/package/@types/node

https://www.npmjs.com/package/@types/jquery

반응형
반응형

표준 레퍼런스

각종 스크립트형 프로그래밍 언어가 계속 나와도 굳건히 자리를 지키고 있는 프로그래밍 언어중 하나가 C/C++ 가 될 것이다(실질적으로는 C++)


 아쉽게도 한글은 번역이 안되어 있는 등 많은 부분이 부족하다. 심지어 C++14도 전부 업데이트가 안되어 있다.


반응형
반응형

C# : 프로퍼티(property)

프로그래밍 언어에서 클래스가 등장한 이후, 코딩을 하다보면 항상 반복적으로 작성되는 메서드(C/C++ 계열에서는 함수)를 간편하게 작성하기 위한 문법을 제공한다. 그중 프로퍼티는 set/get에 대해서 간단하게 정의를 해주는 문법이다.


프로퍼티 문법 예시

class Property
{
    int tmp;

    public int tmp
    {
        get { return tmp; }
        set { tmp = value; }
    }
    // ...
}

Property ppy = new Property();
ppy.tmp = 5;        // 쓰기
int a = ppy.tmp;   // 읽기

예시에서 사용된 set의 value 는 C# 언어상 제공되는 예약어다. 또한 읽기만 가능한 멤버 변수로 만들 수도 있다.


예시의 컴파일러 결과

class Property
{
    int tmp;

    public void setTmp(int value)
    {
        this.tmp = value;
    }

    public int getTmp()
    {
        return this.tmp;
    }
    // ...
}

Property ppy = new Property();
ppy.setTmp(5);    // 쓰기
int a = ppy.getTmp()    // 읽기

위의 추가 예제처럼 실제로는 C/C++에서 흔히 볼 수 있는 형태로 변환이 된다. 즉, 프로퍼티는 코딩수를 줄이고, 직관적으로 알 수 있게 해주는 도와주는 형태의 문법이다.



(5.0 부터 지원되는) 프로퍼티 간략화

이전 버전방식이 유효한 상태에서 어차피 value값이 정해져 있는 경우에는 아예 키워드 get, set 만으로도 유효하다.

예시)

class Property
{
    int tmp;

    public int tmp
    {
        get;
        set;
    }
    // ...
}




반응형

+ Recent posts