📌 타입
변수 그리고 타입이란? 프로그래밍 언어에서 변수는 데이터를 저장하는 공간이다. 변수에 저장되는 데이터에는 숫자, 문자열, 논리값, 배열, 객체 등이 있다.
잘못된 타입을 사용할 경우에는 오류가 발생할 수 있는데, 이러한 오류는 컴파일 타임이 아니라 실행 시간에 발생한다.
타입을 제대로 이해하면 이러한 오류들을 미리 방지할 수 있다.
타입에 대한 제대로 된 이해가 중요한 이유이다.
타입 안정성이란? 코드가 예상한 타입대로 동작함을 보장하는 것이다.
타입 안정성이 높을수록 코드 품질이 좋아지고, 실행 시간에 발생할 수 있는 오류를 줄일 수 있다.
타입을 제대로 이해하고 활용하면 코드의 안정성이 향상되고, 테스트와 디버깅 시간을 줄일 수 있다.
타입을 명확하게 명시하고 사용하면 코드의 가독성이 높아진다.
이는 곧 다른 개발자들이 이해하기 쉽다는 뜻이며 유지보수가 용이해짐을 의미한다.
📌 기본 타입
1) boolean
function isValidPassword(password: string): boolean {
return password.length >= 8;
}
const password = "q1w2e3r4!";
const valid = isValidPassword(password);
if (valid) {
console.log("유효한 패스워드입니다!");
} else {
console.log("유효하지 않은 패스워드입니다!");
}
2) number
function calculateArea(radius: number): number {
return Math.PI * radius * radius;
}
const radius = 5;
const area = calculateArea(radius);
console.log(`반지름이 ${radius}인 원의 넓이: ${area}`);
3) string
function greet(name: string): string {
return `안녕, ${name}!`;
}
const name = "Spartan";
const greeting = greet(name);
console.log(greeting);
4) 배열
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);
console.log(`점수의 총합: ${sumScore}`);
5) tuple
const person: [string, number, boolean] = ['Spartan', 25, false];
const person2: [string, number, boolean] = [25, 'Spartan', false]; // 오류!
6) enum
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
1) let
let num: number = 5;
console.log(num); // 출력: 5
num = 10;
console.log(num); // 출력: 10
2) const
const num: number = 5;
console.log(num); // 출력: 5
num = 10; // 에러: 'num'은 const로 선언되었으므로 다시 할당될 수 없다.
const nums: number[] = [];
console.log(nums); // 출력: []
nums.push(1); // 할당은 되지 않아도 배열에 데이터를 추가/삭제하는 것은 문제가 되지 않는다.
nums.push(2); // 은근히 헷갈릴 수 있지만 = 연산자 기준으로만 생각하면 매우 쉽다.
console.log(nums); // 출력: [1, 2]
nums = []; // 에러: 'nums'는 const로 선언되었으므로 다시 할당될 수 없다.
3) readonly
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'; // 에러: 'name'은 readonly 속성이므로 다시 할당할 수 없다.
person.age = 25; // 에러: 'age'은 readonly 속성이므로 다시 할당할 수 없다.
📌 any와 unknown, union
1) any
let anything: any;
anything = 5; // 최초에는 숫자를 넣었지만
anything = 'Hello'; // 문자열도 들어가고
anything = { id: 1, name: 'John' }; // JSON도 들어간다.
2) unknown
let unknownValue: unknown = '나는 문자열이지롱!';
console.log(unknownValue); // 나는 문자열이지롱!
let stringValue: string;
stringValue = unknownValue; // 에러 발생! unknownValue가 string임이 보장이 안되기 때문!
stringValue = unknownValue as string;
console.log(stringValue); // 나는 문자열이지롱!
stringValue = unknownValue as string;
코드를 Type Assertion(타입 단언)이라고 한다.let unknownValue: unknown = '나는 문자열이지롱!';
let stringValue: string;
if (typeof unknownValue === 'string') {
stringValue = unknownValue;
console.log('unknownValue는 문자열이네요~');
} else {
console.log('unknownValue는 문자열이 아니었습니다~');
}
3) union
|
연산자를 사용하여 여러 타입을 결합하여 표현한다.type StringOrNumber = string | number; // 원한다면 | boolean 이런식으로 타입 추가가 가능해요!
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'); // 'String value:', Hello
processValue(42); // 'Number value:', 42
📌 enum과 object literal
1) enum
2) object literal
key + value
pair로 구성된 객체를 정의하는 방식이다.3) enum과 object literal