typescript

    숫자 세 자리마다 콤마 찍기

    let value = 12523401.515; let str = value.toLocaleString(); // '12,523,401.515' Number 타입의 내장 함수인 toLocaleString 함수를 통해 세 자리마다 콤마를 찍는 표기방식을 적용한 string 값을 얻을 수 있다. let value = 12523401.515.toFixed(2); // '12523401.52' let str = value.toLocaleString(); // '12523401.52' 문제는 toFixed 함수(소수점 표시 제한)를 거친 뒤 toLocaleString 함수를 실행하면 세 자리마다 콤마를 찍지 않는다. 왜냐하면 toFixed로 인해 value의 타입이 string으로 바뀌었고, string의 내장 함..

    순환 참조

    순환 참조

    옛날에 C++ 공부할 때 경험했던 순환 참조는 위와 같이 두 개의 헤더 파일이 서로를 include 했을 때 발생하는 문제였다. 이런 경우에는 주로 헤더파일 include 없이 참조하려는 클래스를 전방 선언하는 방법으로 해결했다. 최근에 타입스크립트에서도 비슷한 문제를 겪게 되었다. A-Script.ts import { B } from "B-Script"; export class A {} class Main { nodeA: A; constructor() { this.nodeA = new B(); } } B-Script.ts import { A } from "A-Script"; export class B extends A {} 이러한 구조에서 컴파일을 하니 코코스 크리에이터 에디터에서 아래와 같은 에러가 ..

    아주 심플한 가중치 랜덤 뽑기

    아주 심플한 가중치 랜덤 뽑기

    어떤 상자를 열면 A, B, C, D, E 다섯 개의 아이템 중 하나가 나온다. 그리고 이 다섯 개의 아이템이 나올 확률이 각각 다르다면 대부분은 이것을 테이블화시킬 것이다. 하지만 이런식으로 테이블을 만들면 문제가 생긴다. 한 아이템의 확률을 조정하거나, 아이템을 삭제하거나, 새 아이템을 추가하게 된다면 모든 아이템의 확률 총합이 100%가 되지 않게 되면서, 그때마다 나머지 아이템들의 확률도 같이 조정해야 한다. 그래서 가중치라는 게 필요하다. 각 아이템의 가중치를 그 아이템의 부피라고 생각할 수 있다. 그림처럼 일렬로 붙인 다음에 Random pivot 포인터가 왼쪽 끝에서부터 오른쪽 끝까지 왔다 갔다 한다고 가정해보자. 어느 순간에 포인터를 스탑 시키고, 포인터가 어디 위에서 멈췄는지 확인하는 것..

    함수 리스트 (Delegate)

    유니티에서 옵저버패턴과 delegate를 사용했었던 경험이 몇 번 있었는데, 타입스크립트와 코코스 크리에이터를 사용하는 프로젝트에서도 비슷하게 사용하고 싶은 상황이 생겼다. export class Manager { static delegate1: { [key: string]: any } = {}; // functions 컬렉션 static delegate2: Array = []; // functions 배열 } delegate는 이런 식으로 Dictionary 형태 또는 List 형태로 생성할 수 있다. 아무래도 타입스크립트는 함수와 변수를 다루는 데 있어서 차이가 없다시피 하고 any 타입으로 함수를 지칭할 수 있기 때문에 사용하기 더 간편하다. start() { Manager.delegate1['ju..

    Array 함수 #6. 기타

    Array 함수 #6. 기타

    1. toString let input = [1,2,3,4]; let output = input.toString(); // output = '1,2,3,4' 일반적으로 toString은 숫자 하나와 같은 객체 하나를 문자열로 변환할 때도 쓸 수 있지만 배열에 사용했을 때는 배열의 원소들을 연결해서 하나의 문자열로 반환한다. 만약 number 타입이 아닌 string 타입의 배열 ['1', '2', '3', '4']를 만들려면 let input = [1,2,3,4]; let output = input.map(String); // output = ['1','2','3','4'] map 함수를 써서 변환하려는 타입을 전달하면 된다. 2. join let input = [1,2,3,4]; let output =..

    Array 함수 #5. sort

    Array 함수 #5. sort

    1. sort let input = ['a','b','A','ddd','C','a7']; let output = input.sort(); // input = output = ['A','C','a','a7','b','ddd] sort 함수는 정렬한 후의 결과 배열을 리턴하며, 원본 배열도 같이 수정된다. 매개변수를 생략할 경우 ASCII 문자 표 기준 오름차순으로 정렬된다. let input = [8,3,5,0,11,6]; let output = input.sort(); // input = output = [0,11,3,5,6,8] 위의 배열을 정렬하면 예상과 다르게 11이 3 보다 앞서있다. 그 이유는 내부적으로 배열의 원소들을 string으로 형변환하고, 이후에 첫 번째 문자를 기준으로 정렬한다. 11..

    Array 함수 #4. reduce vs.forEach

    1. reduce reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T; reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; reduce 함수는 배열을 순회하면서 콜백 함수를 반복 실행하고, 모든 반복의 결과를 하나의 값으로 줄..

    Array 함수 #3. 배열에 원소 추가,삭제

    Array 함수 #3. 배열에 원소 추가,삭제

    1. slice 특정 배열을 start 인덱스부터 end 인덱스까지 잘라서 새로운 배열에 넣어 리턴하는 함수다. 함수의 반환 값은 잘라낸 원소들로 이뤄진 새 배열이다. 함수 자체는 두 개의 파라미터를 받는 간단한 형태인데 두 파라미터를 어떻게 넣는지에 따라 아주 다양하게 결과가 나오기 때문에 주의가 필요하다. start와 end 주의점 배열의 인덱스를 벗어나는 수를 입력해도 에러가 발생하지는 않음 양수인 경우, 배열의 앞에서부터 인덱스를 의미함 음수인 경우, 배열의 뒤에서부터 세는 인덱스를 의미함 양수이면서 그 절대값이 배열의 길이 이상인 경우, 배열의 길이와 같은 인덱스를 의미함 음수이면서 그 절대값이 배열의 길이 이상인 경우, 0을 의미함 start가 undefined인 경우, 0을 의미함 end를 ..