๋ฌธ์์ด s์ ๋ํ๋๋ ๋ฌธ์๋ฅผ ํฐ๊ฒ๋ถํฐ ์์ ์์ผ๋ก ์ ๋ ฌํด ์๋ก์ด ๋ฌธ์์ด์ ๋ฆฌํดํ๋ ํจ์, solution์ ์์ฑํด์ฃผ์ธ์.
s๋ ์๋ฌธ ๋์๋ฌธ์๋ก๋ง ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๋๋ฌธ์๋ ์๋ฌธ์๋ณด๋ค ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
์ ํ์ฌํญ
์
์ถ๋ ฅ ์
s = "Zbcdefg" return = "gfedcbZ"
๋์ ํ์ด
function solution(s) {
return s.split("").sort().reverse().join("");
}
๋ฐฐ์ด ๋ฉ์๋์ธ sort() ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด split("") ๋ก ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ ๊ฑฐ๊พธ๋ก ๋ฐ๊ฟ์ค ๋ค, ๋ค์ join("")์ ํตํด ๋ฌธ์์ด๋ก ๋ณต๊ท

์ฆ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ฅํฉ
์ ์ ํ์
์์คํ
์ ๊ฐ์ง๊ณ ์๋ ์ธ์ด
ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ธฐ ์ (์ปดํ์ผ ํ์)์ ๋ชจ๋ ๋ณ์์ ํํ์์ ํ์
์ ํ์ธํ๊ณ ๊ณ ์ ํ๋ ๋ฐฉ์, ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ๋ง์ ์ค๋ฅ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐ๊ฒฌ
์ ์ ์์คํ ์ด ์ข์ ์ด์
๊ฑฐ์ ๋๋ถ๋ถ์ js์ ๋จ์ ์ ๋งค์ฐ ์์ ๋กญ๊ณ ๋ชจ๋ ๊ฑธ ์์ ํ ์ ์๋ค! ์์ ์ค๊ฒ ๋๋๋ฐ
์ด ๋ฌธ์ ์ ์ ์ ์ ํ์
์์คํ
์ผ๋ก ๋ณด์ํ ํ๋ฅญํ ์ธ์ด๊ฐ ts
ts๋ js์ ๋๊ฐ์ด ๋์ํ๋ ํ์ฅํฉ ๊ทธ ์ด์ ๊ทธ ์ดํ๋ ์๋
๋ธ๋ผ์ฐ์ ์์ ๋์ํ๊ธฐ ์ํด ts๋ js๋ก 100% ์ปดํ์ผ ๋จ
์ฐ๋ฆฌ๊ฐ ์์ผ๋ก ๋ง์ด ์ฌ์ฉํ๊ฒ ๋ ํ์
1. number(์ซ์)
2. string(๋ฌธ์์ด)
3. Boolean(๋ถ๋ฆฌ์ธ)
4. Object : Array(๋ฐฐ์ด), Function(ํจ์)
5. Void
6. undefined
7. any
8. null
์ด๋ฐ ์์ํ์
๋ค์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ built-in type๋ค์
์ฐ๋ฆฐ Custom Type๋ค์ด ํ์ํจ
type alias(ํ์ ๋ณ์นญ) ๊ณผ interface ๋ฅผ ์ฌ์ฉํ ์ ์์ด์
์ธํฐํ์ด์ค๋ ๊ฐ์ฒด ํํ๋ก๋ง ์ ์ธ ๊ฐ๋ฅ (์ค๋ณต ์ ์ธ ๊ฐ๋ฅ)
ํ์
์ถ๋ก
TypeScript๋ ์ฝ๋์์ ํ์
์ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ง ์์๋, ์ฝ๋์ ๋ฌธ๋งฅ์ ํตํด ํ์
์ ์๋์ผ๋ก ์ถ๋ก ํ ์ ์์. ํ์
์ถ๋ก ์ TypeScript์ ์ค์ํ ๊ธฐ๋ฅ ์ค ํ๋๋ก, ๊ฐ๋ฐ์๊ฐ ํ์
์ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ง ์์๋ ํ์
์์ ์ฑ์ ์ ์งํ ์ ์๊ฒ ๋์์ค
์ด์ฒ๋ผ ํ์ ์ถ๋ก ์ ์์กดํ๊ฒ ๋๋ฉด ํ์ ์คํฌ๋ฆฝํธ์ ํน์ง์ธ ์์ ํ ์ฝ๋ ์์ฑ์์ ๋ฉ์ด์ง ์ ์๋ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ฒ์ ํ์ ์ ์์ฑํ ๋, ๊ผผ๊ผผํ ํ์ ์ด๋ ธํ ์ด์ ์ ํด์ฃผ๋ ๊ฒ์ด ์ข์
ํ์
์ด๋
ธํ
์ด์
์ฐ๋ฆฌ๊ฐ ํ์
์คํฌ๋ฆฝํธ์๊ฒ ์ฐ๋ฆฌ๊ฐ ์ฐ๊ณ ์๋ ํ์
์ด ๋ฌด์์ธ์ง๋ฅผ ์๋ฆฌ๊ธฐ ์ํด์ ํ์
์ด๋
ธํ
์ด์
์ด๋ผ๋ ๊ฒ์ ํด์ค์ผ ํจ
๋ฐฉ๋ฒ์ ๋งค์ฐ ์ฌ์. ์ฐ๋ฆฌ๊ฐ ํ์ ์ ์ฐ๋ ค๊ณ ํ๋ ๊ณณ ์์๋ค๊ฐ :์ ๋ถ์ด๊ณ ํ์ ์ ์ค๋ช ํด์ฃผ๋ฉด ๋จ ex) : number
๊ตฌ์กฐ์ ํ์
ts์ ํ์
์์คํ
์ ๊ตฌ์กฐ์ ํ์
์์คํ
์. ๊ตฌ์กฐ์ ํ์
์์คํ
์์๋ ๊ฐ์ ํํ์ ๊ตฌ์กฐ์ ๋ฐ๋ผ ํ์
์ด ๊ฒฐ์ . ์ฆ, ํ์
์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์ ์ธ๋์๋์ง๊ฐ ์๋๋ผ, ์ด๋ค ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋์ง๊ฐ ์ค์
์ ๋ค๋ฆญ
ํ์
์ ๋ง์น ํด๋์ค๋ ํจ์ ๋ฑ์์ ํ๋ผ๋ฏธํฐ์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฒ
๊ทธ๋ผ ์ด๋จ ๋ ์ฐ์?
๋ง ๊ทธ๋๋ก Type์ ๋ณ์ํ ํด์ ์ฃผ์
ํ ํ์
์ ๊ฐ์ง๊ณ ๋ง๋ค์ด ์ค์ผ ํ ๋
@types ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํ์
์ ๋ณด๋ฅผ ์ ๊ณต
.d.js ํ์ผ๋ค์ด ๋ง์ด ์์.d.ts ํ์ผ์ TypeScript ํ์
์ ์ ํ์ผ
์ฆ, JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํ์
์ ๋ณด ์ ๊ณต
.d.ts ํ์ผ๋ก TypeScript ์ปดํ์ผ๋ฌ๋ ๋ค์์ ์ ์ ์์
.d.ts ํ์ผ๋ก ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์
์ถ๋ก ๋ ๊ฐ๋ฅ
์ฐ์ Node.js๋ฅผ ์์ฑ
npm init -y
tsconfig.json ์์ฑ
tsc --init
tsconfig.json์์ ์๋ ์ต์
์ฃผ์ ํด์
"allowJs": true "checkJs": true
์ปค์คํ js ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ
/**
* @param {number} a
* @param {number} b
* @returns {number}
*/
export function add(a, b) { // export๋ฅผ ๋ฃ์ง ์์ผ๋ฉด import ํ ์ ์๋ ๊ฒ ์์์ฃ ?
return a + b;
}
๋ณ์๋?
๋ณ์, ๊ทธ๋ฆฌ๊ณ ํ์
๋ณ์์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ ์ฌ๋ฌ๊ฐ์ง ํ์ ์ด ์์
ํ์ ์ ์ดํดํ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๊ฐ๋ ์ฑ / ์์ ์ฑ ํฅ์
์๋ชป๋ ํ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ
์ฌ๋ฐ๋ฅด๊ฒ ํ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ
์ฐธ(true) ํน์ ๊ฑฐ์ง(false) ๊ฐ์ ๋ํ๋
์กฐ๊ฑด๋ฌธ, ๋น๊ต ์ฐ์ฐ ๋ฑ์์ ์ฃผ๋ก ์ฌ์ฉ๋จ
์ฌ์ฉ ์์
function inValidPassword(password: string): boolean {
return password.length >= 8;
}
const password = "q1w2e3r4";
const valid = isValidPassword(password);
if (valid) {
console.log("์ ํจ");
} else {
console.log("์ ํจ X");
}
TypeScript์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ซ์๋ฅผ ๋ํ๋
๋ชจ๋ ์์น ์ฐ์ฐ์ ์ฌ์ฉ๋๋ ๊ฐ์ number ํ์
์ผ๋ก ๋ช
์
์ฌ์ฉ ์์
function calculateArea(radius: number): number {
return Math.PI * radius * radius;
}
const radius = 5;
const area = calculateArea(radius);
console.log(`๋ฐ์ง๋ฆ์ด ${radius}์ธ ์์ ๋์ด: ${area}`)'
Math.PI x radius x radius์ ๊ฐ์ด ๋ฌด๋ฆฌ์์ ์ ์๋ฅผ ๊ณฑํ ๊ฐ๋ number๋ก ์ทจ๊ธ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ calculateArea ํจ์์ ๋ฆฌํด ํ์ ๋ number
์์ ๋ฐ์ดํ('), ํฐ ๋ฐ์ดํ("), ๋ฐฑํฑ(`)์ ์ฌ์ฉํด ๋ฌธ์์ด ํํ ๊ฐ๋ฅ
ํ
์คํธ๋ฅผ ์กฐ์ํ๊ฑฐ๋ ์ถ๋ ฅํ ๋ ์ฌ์ฉ
function greet(name: string): string {
return `์๋
, ${name}!`;
}
const name = "Spartan";
const greeting = greet(name);
console.log(greeting);
๊ธฐ๋ณธ ํ์ ์ []๊ฐ ๋ถ์ ํํ
์ฌ์ฉ ์์
function calculateSum(numbers: number[]): number {
let sum: number = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
return sum;
}
const testScores: number[] = [90, 85, 78, 92, 88];
const sumScore = calculateSum(testScores);
์๋ก ๋ค๋ฅธํ์ ์ ์์๋ฅผ ์์์ ๋ง๊ฒ ๊ฐ์ง ์ ์๋ ํน์ํ ํํ์ ๋ฐฐ์ด
์ฌ์ฉ ์์
const person: [string, number, boolean] = ["Spartan", 25, false];
const person2: [string, number, boolean] = [25, "Spartan", false]; // ์ค๋ฅ!
์ ์๋ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์์ ์์์ ๋ง์ถ๋ ๊ฒ์ด ํ์
์ด๊ฑฐํ ๋ฐ์ดํฐ ํ์
์ด๋ผ ๋ถ๋ฆ
enum ์์ ์๋ ๊ฐ ์์๋ ๊ฐ์ด ์ค์ ๋ผ ์์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ซ์ 0์ผ๋ก ์์ํจ
enum ์์ ์๋ ์์์๋ number, string ํ์
์ ๊ฐ๋ง ํ ๋น O
์ฌ์ฉ ์์
enum UserRole {
ADMIN = "ADMIN",
EDITOR = "EDITOR",
USER = "USER",
}
enum UserLevel {
NOT_OPERATOR, // 0
OPERATOR // 1
}
function checkPermission(userRole: UserRole, userLevel: UserLevel): void {
if (userLevel === UserLevel.NOT_OPERATOR) {
console.log('๋น์ ์ ์ผ๋ฐ ์ฌ์ฉ์ ๋ ๋ฒจ์ด์์');
} else {
console.log('๋น์ ์ ์ด์์ ๋ ๋ฒจ์ด๊ตฐ์');
}
if (userRole === UserRole.ADMIN) {
console.log("๋น์ ์ ์ด๋๋ฏผ์ด๊ตฐ์");
} else if (userRole === UserRole.EDITOR) {
console.log("๋น์ ์ ์๋ํฐ์์");
} else {
console.log("๋น์ ์ ์ฌ์ฉ์๊ตฐ์");
}
}
const userRole: UserRole = UserRole.EDITOR;
const userLevel: UserLevel = UserLevel.NOT_OPERATOR;
checkPermission(userRole, userLevel);
const์ readonly๋ ๋ถ๋ณ์ฑ์ ๋ณด์ฅ
TypeScript ์์ ๋ฑ์ฅํ ํค์๋์ด๋ฉฐ, ๊ฐ์ฒด์ ์์ฑ์ ๋ถ๋ณ์ผ๋ก ๋ง๋ค ๋ ์ฌ์ฉ๋๋ ํค์๋
์ฆ, ํด๋์ค์ ์์ฑ์ด๋ ์ธํฐํ์ด์ค์ ์์ฑ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋จ
์ฌ์ฉ ์์
class Person {
readonly name: string;
readonly age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
const person = new Person('Spartan', 30);
console.log(person.name); // ์ถ๋ ฅ: 'Spartan'
console.log(person.age); // ์ถ๋ ฅ: 30
person.name = 'Jane'; // ์ฌํ ๋น ๋ถ๊ฐ๋ฅ์ด๊ธฐ์ ์ค๋ฅ ๋ธ
person.age = 25; // ์์ ๊ฐ์
readonly๋ฅผ const๋ก ์นํํ๋ฉด ํด๋์ค์ ์์ฑ์ const ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๋ฌ๋ฅผ ๋ฐํํจ
์ด์ฉ ์ ์์ด ๊ฐ๋ณ์ ์ธ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด any๋ฅผ ์ฐ๊ธฐ ๋ณด๋จ unknown์ ์ฌ์ฉ, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ณ ์ ์ธ ํ์ ์ ์ผ์ผ์ด ์ ์ํ ์ ์๋ค๋ฉด union ์ฌ์ฉ์ด ์ ์ผ ๋์
๋ชจ๋ ํ์
์ ์ํผํ์
์ด๋ค ํ์
์ ๊ฐ์ด๋ ์ ์ฅํ ์ ์์
JavaScript์ Object ํ์
๊ณผ ๊ฐ์ ์ต์์ ํ์
์ฌ์ฉ ์์
let anything: any;
anything = 5; // ์ซ์๋ ๊ฐ๋ฅ
anything = "hello"; // ๋ฌธ์์ด๋ ๊ฐ๋ฅ
anything = {id:1, name: 'john'}; // JSON๋ ๊ฐ๋ฅ
any ํ์
๊ณผ ๋น์ทํ์ง๋ง ๋ ์์ ํ ๋ฐฉ์์ผ๋ก ๋์
์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ํ์
์ ๊ฐ ์ ์ฅ ๊ฐ๋ฅ
ํ์ง๋ง, ๊ทธ ๊ฐ์ ๋ค๋ฅธ ํ์
์ ๋ณ์์ ํ ๋นํ๋ ค๋ฉด ๋ช
์์ ์ผ๋ก ํ์
์ ํ์ธํด์ผ ํจ
let unknownValue: unknown = '๋๋ ๋ฌธ์์ด';
console.log(unknownValue); // ๋๋ ๋ฌธ์์ด
let stringValue: string;
stringValue = unknownValue; // ์๋ฌ ๋ฐ์, string์์ด ๋ณด์ฅ์ด ์ ๋๊ธฐ ๋๋ฌธ
stringValue = unknownValue as string;
console.log(stringValue); // ๋๋ ๋ฌธ์์ด
stringValue = unknownValue as string;์ ๊ฐ์ ์ฝ๋๋ฅผ
Type Assertion(ํ์
๋จ์ธ)์ด๋ผ๊ณ ํจ
unknown ํ์ ์ ๋ณ์๋ฅผ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉํ๋ ค๋ฉด ํ์ ๋จ์ธ์ ํตํด ํ์ ๋ณด์ฅ์ ํ์ฌ ์ฌ์ฉํ ์ ์์
let unknownValue: unknown = '๋๋ ๋ฌธ์์ด์ด์ง๋กฑ!';
let stringValue: string;
if (typeof unknownValue === 'string') {
stringValue = unknownValue;
console.log('unknownValue๋ ๋ฌธ์์ด์ด๋ค์~');
} else {
console.log('unknownValue๋ ๋ฌธ์์ด์ด ์๋์์ต๋๋ค~');
}
typeof ํค์๋๋ฅผ ์ฌ์ฉํด ํ์
์ฒดํฌ๋ฅผ ๋ฏธ๋ฆฌํ ํ unknown ํ์
์ ๋ณ์๋ฅผ string ํ์
์ ๋ณ์์ ํ ๋นํ ์ ์์
unknown์ ํ๊ณ = ์ฌํ ๋น์ด ์ผ์ด๋์ง ์์ผ๋ฉด ํ์ ์์ ์ฑ ๋ณด์ฅ X
๋ฐ๋ฉด union์ ์ฌ๋ฌ ํ์ ์ค ํ๋๋ฅผ ๊ฐ์ง ์ ์๋ ๋ณ์๋ฅผ ์ ์ธํ ๋ ์ฌ์ฉํ๋ฉฐ | ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ ํ์ ์ ๊ฒฐํฉํ์ฌ ํํ
type StringOrNumber = string | number; // ๋ค์ ๋ค๋ฅธ ํ์
์ถ๊ฐ ๊ฐ๋ฅ
function processValue(value: StringOrNumber) {
if (typeof value === 'string') {
// value๋ ์ฌ๊ธฐ์ string ํ์
์ผ๋ก ๊ฐ์ฃผ
console.log('String value:', value);
} else if (typeof value === 'number') {
// value๋ ์ฌ๊ธฐ์ number ํ์
์ผ๋ก ๊ฐ์ฃผ
console.log('Number value:', value);
}
}
processValue('Hello');
processValue(42);