const member = {
name: "이마크",
age: 25,
position: "leader",
work() {
console.log("singing");
},
};
class Member {
//필드
name: string = ""; // 초깃값 설정
age: number = 0;
position: string = ";
}
** tsconfig.json 에서 "noImplicitAny" : false 추가로 암시적 any 타입 허용 가능
필드의 초깃값 설정이 가능 -> 생성자에서도 초기화 가능
const member = {
name: "이마크",
age: 25,
position: "leader",
work() {
console.log("singing");
},
};
class Member {
//필드
name: string;
age: number;
position: string;
// 생성자
constructor(name: string, age: number, position: string) {
this.name = name;
this.age = age;
this.position = position;
}
//메서드
work() {
console.log("singing");
}
}
const memberB = new Member("황런쥔", 24, "리드보컬");
console.log(memberB);
- 타입 스크립트의 class는 하나의 타입으로도 활용 가능 (구조적 타입 시스템)
const memberC: Member = {
name: "",
age: 0,
position: "",
work() {},
};
- 확장
class Nct extends Member {
//필드
rookiesNumber: number;
//생성자
constructor(
name: string,
age: number,
position: string,
rookiesNumber: number
) {
super(name, age, position); // 반드시 호출 해야됨
this.rookiesNumber = rookiesNumber;
}
}
** 상속시 반드시 슈퍼클래스의 생성자를 호출(위치는 최상단)
접근 제어자(access modifier)
: 클래스를 만들때 특정 필드/메서드에 접근할수 있는 범위를 설정하는 문법
- public : 아무제약 ❌, 자유롭게 인스턴스의 프로퍼티에 접근 가능 (기본적으로 public으로 설정 됨)
class Member {
//필드
pubilc name: string;
age: number;
position: string;
// 생성자
constructor(name: string, age: number, position: string) {
this.name = name;
this.age = age;
this.position = position;
}
//메서드
work() {
console.log("singing");
}
}
const member = new Member("이해찬",24,"메인보컬");
member.name = "이제노";
member.age = 24
member.position = "사모예드"
- private : 클래스 외부에서는 점표기법으로 접근 ❌, 읽을수 ❌, 메서드 안에서만 접근 가능 ⭕️ (파생 클래스도 접근 불가)
class Member {
//필드
private name: string;
//메서드
work() {
console.log(`${this.name} singing`); // 클래스 내부에서만 접근 가능
}
}
member.name = "이제노"; // ❌ 접근 않됨
// 파생 클래스
class Nct extends Member {
// 메서드
func() {
this.name; // ❌ 접근 않됨
}
}
- protected : 외부에서는 접근 ❌, 파생클래스까지는 허용 ⭕️
class Member {
//필드
private name: string;
protected age: number;
public position: string;
}
class Nct extends Member {
// 메서드
func() {
this.age;
}
}
** 생성자에 접근제어자를 달면 자동으로 필드를 만듦(+ 필드값 초기화) -> 필드정의는 생략 (중복 됨으로)
class Member {
//필드
// 생성자
constructor(
private name: string,
protected age: number,
public position: string
) {
// 자동으로 값 초기화
}
}
const member = new Member("이해찬", 24, "메인보컬");
member.position = "곰돌이";
console.log(member);
인터페이스와 클래스
: 클래스 + implements + 인터페이스 -> 이 클래스의 객체는 모두 해당 인터페이스 타입을 만족해야 함
인터페이스는 무조건 pubilc 필드만 정의, 인터페이스는 해당클래스의 설계도 역할
interface CharacterInterface {
name: string;
moveSpeed: number;
move(): void;
}
class Character implements CharacterInterface {
// 생성자에서 접근제어자 정의 -> 필드, 생성자 this 생략 가능
constructor(
public name: string,
public moveSpeed: number,
private extra: string // private가 필요시 따로 추가
) {}
move(): void {
console.log(`${this.moveSpeed} 속도로 이동!`);
}
}