[TS] ํ์ ์คํฌ๋ฆฝํธ ํด๋์ค(class) ๋ฌธ๋ฒ, ์ถ์ ํด๋์ค์ ๋ฉ์๋
ํด๋์ค ์ ์
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฑ์ ๋ด๋ถ์์ ํ๋กํผํฐ๋ฅผ ์ ์ธํ๊ณ ์ด๊ธฐํํ๋ค. ํด๋์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณค ํด๋์ค ๋ฐ๋์ ํ๋กํผํฐ๋ฅผ ๋ฐ๋ก ์ ์ธํ ํ์๊ฐ ์๋ค. ๋ฐ๋ฉด ํ์ ์คํฌ๋ฆฝํธ์์ ๋จผ์ ํด๋์ค ๋ฐ๋์ ํ๋กํผํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํ๊ณ ํ์ ์ ์ง์ ํด์ผ ํ๋ค. ํด๋์ค ๋ฐ๋์ ํ๋กํผํฐ๋ฅผ ์ ์ธํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
class User {
name: string; // ํ๋กํผํฐ ์ ์ธ ๋ฐ ํ์
์ง์
constructor(name: string) {
this.name = name; // ํ๋กํผํฐ ์ด๊ธฐํ
}
}
const user = new User('John');
console.log(user); // { name: 'John' }
ํ์
์คํฌ๋ฆฝํธ์์ public, protected, private ์ ๊ทผ ์ ํ์๋ฅผ ๋ณ๋๋ก ์ ๊ณตํ๋๋ฐ, ์์ฑ์ ํ๋ผ๋ฏธํฐ์ ์ ๊ทผ ์ ํ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌต์ ์ผ๋ก ํด๋์ค ํ๋กํผํฐ๋ฅผ ์ ์ธํ๊ณ ์ด๊ธฐํ๊ฐ ์งํ๋๋ค. ์ฆ, ์์ฑ์ ํ๋ผ๋ฏธํฐ์ ์ ๊ทผ ์ ํ์๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค ๋ฐ๋์ ํ๋กํผํฐ๋ฅผ ์ ์ธํ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. ์ผ์ผ์ด ํ๋กํผํฐ๋ฅผ ์ ์ธํ๊ณ ์์ฑ์ ๋ด์ ์ด๊ธฐํ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ๋ผ์ ์ฝ๋๊ฐ ๋์ฑ ๊ฐ๊ฒฐํด์ง๋ค.
class User {
constructor(public name: string) {}
}
const user = new User('John');
console.log(user); // { name: 'John' }
์ ๊ทผ ์ ํ์ Access Modifier
์๋ฐ์คํฌ๋ฆฝํธ์์ ํด๋์ค์ ํ๋กํผํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก public์ผ๋ก ์ ์ธ๋๋ค. ํ์
์คํฌ๋ฆฝํธ ์ญ์ ๋์ผํ์ง๋ง ์ด๋ฅผ ๋ ๋ช
์์ ์ผ๋ก ํํํ ์ ์๋ public ์ ๊ทผ ์ ํ์๋ฅผ ์ ๊ณตํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ํ๋กํผํฐ ํน์ ๋ฉ์๋ ์ด๋ฆ ์์ # ๊ธฐํธ๋ฅผ ๋ถ์ด๋ฉด ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ private ๋ฉค๋ฒ๋ก ์ ์ธ๋๋ค. ํ์
์คํฌ๋ฆฝํธ์์ private ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผ ์ ํ์ ๋ ๋ช
์์ ์ผ๋ก ํํํ ์ ์๋ค.
| ์ ๊ทผ ๊ฐ๋ฅํ ๊ณณ | public | protected | private |
| ํด๋์ค ๋ด๋ถ | O | O | O |
| ์์ ํด๋์ค ๋ด๋ถ | O | O | X |
| ํด๋์ค ์ธ์คํด์ค | O | X | X |
๐ก ํ๋กํ ํ์ ์ ์ ์ฅ๋ ๋ฉ์๋๋ ํด๋์ค ๋ด๋ถ๋ก ์ทจ๊ธํ๋ค
public
public ์ ๊ทผ ์ ํ์๋ ํด๋์ค ๋ด๋ถ, ์์ ํด๋์ค ๋ด๋ถ, ์ธ์คํด์ค์์ ์์ ๋กญ๊ฒ ์ ๊ทผํ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ์๋ฏธํ๋ค. ์๋ฌด๋ฐ ํค์๋๋ฅผ ๋ถ์ด์ง ์์์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก public ๋ฉค๋ฒ๋ก ์ทจ๊ธ๋๋ค.
class User {
constructor(public name: string) {}
public printName() {
console.log(this.name); // ํด๋์ค ๋ด๋ถ์์ public ํ๋กํผํฐ ์ ๊ทผ
}
}
const user = new User('John'); // { name: 'John' }
user.name; // 'John'
user.printName(); // 'John'
protected
protected ์ ๊ทผ ์ ํ์๋ ํด๋น ํด๋์ค์ ์์ ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ์๋ฏธํ๋ค. ์๋ ์์์์ name ํ๋กํผํฐ์ sayHello() ๋ฉ์๋๋ protected ๋ฉค๋ฒ์ด๋ฏ๋ก ์ธ์คํด์ค์์ ์ง์ ์ ๊ทผํ ์ ์๋ค.
class User {
constructor(protected name: string) {}
protected sayHello() {
console.log(`${this.name}, Hello`);
}
}
class PaidUser extends User {
public printName() {
console.log(this.name); // ์์ ํด๋์ค ๋ด๋ถ์์ protected ํ๋กํผํฐ ์ ๊ทผ
}
public callSayHello() {
this.sayHello(); // ์์ ํด๋์ค ๋ด๋ถ์์ protected ๋ฉ์๋ ์ ๊ทผ
}
}
const paidUser = new PaidUser('John'); // { name: 'John' }
paidUser.name; // Error! (์ธ์คํด์ค์์ ์ ๊ทผ ๋ถ๊ฐ)
paidUser.sayHello(); // Error! (์ธ์คํด์ค์์ ์ ๊ทผ ๋ถ๊ฐ)
paidUser.printName(); // 'John'
paidUser.callSayHello(); // 'John, Hello'
ํํธ paidUser.printName() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. printName() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์์๋ฐ์ ์์ ํด๋์ค์ธ PaidUser ๋ด๋ถ์์ name ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ด๋ค.
callSayHello() ๋ฉ์๋ ์ญ์ ์์ ํด๋์ค ๋ด๋ถ์์ ๋ถ๋ชจ ํด๋์ค์ protected ๋ฉ์๋์ธ sayHello()๋ฅผ ํธ์ถํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๐ก ์์๋ฐ๊ณ ์๋ ํด๋์ค์ constructor ์ธ์๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๊ฐ๋ค๋ฉด constructor๋ฅผ ์๋ตํ ์ ์๋ค. ์๋ต ์ ์๋ฌต์ ์ผ๋ก constructor(...args) { super(...args) }๋ฅผ ํธ์ถํ๋ค.
private
private ์ ๊ทผ ์ ํ์๋ ํด๋น ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ์๋ฏธํ๋ค. ์ด๋ฆ์์ ์ ์ ์๋ฏ ์ ๊ทผ ๋ฒ์๊ฐ ๊ฐ์ฅ ์ ํ์ ์ด๋ค. ์๋ ์ฝ๋์์ name ํ๋กํผํฐ๋ paidUser ์ธ์คํด์ค์ ์ ์ฅ๋์ง๋ง User ํด๋์ค์์ private์ผ๋ก ์ ์ธ๋ ๋ฉค๋ฒ์ด๊ธฐ ๋๋ฌธ์ PaidUser ์์ ํด๋์ค ๋ด๋ถ์์ ์ง์ ์ ๊ทผํ ์ ์๋ค.
class User {
constructor(private name: string) {}
public get getName() {
return this.name; // ํด๋์ค ๋ด๋ถ์์ private ํ๋กํผํฐ ์ ๊ทผ
}
}
class PaidUser extends User {
public printName() {
console.log(this.name); // Error! ์์ ํด๋์ค ๋ด๋ถ์์ private ํ๋กํผํฐ ์ ๊ทผ ๋ถ๊ฐ
}
}
const paidUser = new PaidUser('John');
paidUser.name; // Error! (์ธ์คํด์ค์์ ์ ๊ทผ ๋ถ๊ฐ)
paidUser.printName(); // Error! (์์ ํด๋์ค์์ ์ ๊ทผ ๋ถ๊ฐ)
paidUser.getName; // 'John'
readonly ํค์๋
์๋ฐ์คํฌ๋ฆฝํธ์์ ํด๋์ค์ ํน์ ํ๋กํผํฐ๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ๋ ๊ธฐ๋ฅ์ ๋ฐ๋ก ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ Setter ์์ด Getter๋ง ์ ์ธํ๋ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ๋ค.
class User {
constructor(name) {
this._name = name;
}
get name() {
return this._name;
}
}
const user = new User('John');
console.log(user.name); // 'John'
user.name = 'Bill'; // Cannot set property name of #<User> which has only a getter
ํ์
์คํฌ๋ฆฝํธ์์ ์ ๊ฐ์ ๋ฒ๊ฑฐ๋ก์ด ์ฝ๋์์ด readonly ํค์๋๋ฅผ ์ด์ฉํด์ ํน์ ํ๋กํผํฐ๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ ์ ์๋ค. readonly๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ ์ด๊ธฐ ์ ์ธ ์ ๋๋ ์์ฑ์ ๋ด๋ถ์์๋ง ๊ฐ์ ํ ๋นํ ์ ์๊ณ , ์ดํ๋ถํด ์ค์ง ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํด์ง๋ค. ์์ ํน์ ๋ณ๊ฒฝํ๋ฉด ์ ๋๋ ๊ฐ์ ์ ์ํ ๋ ์ ์ฉํ๋ค.
class User {
public readonly name: string;
constructor(name: string) {
this.name = name;
}
}
const user = new User('John');
console.log(user); // 'John'
user.name = 'Bill'; // Error! ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ด๋ฏ๋ก 'name'์ ํ ๋นํ ์ ์์ต๋๋ค.ts(2540)
implement ํค์๋
implements ํค์๋๋ ์ธํฐํ์ด์ค์ ์ ์ํ ๋ชจ๋ ํ๋กํผํฐ์ ๋ฉ์๋๊ฐ ํด๋์ค์์ ๋ฐ๋์ ๊ตฌํ๋๋๋ก ๊ฐ์ ํ ๋ ์ฌ์ฉํ๋ค. ์ฆ, ์ธํฐํ์ด์ค๊ฐ ์ค์ ๋ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ๋ชจ๋ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํด์ผ ํ๋ค. ๋ง์ฝ ์ธํฐํ์ด์ค์ ์ ์ํ ํ๋กํผํฐ๋ ๋ฉ์๋๊ฐ ํด๋์ค์ ๊ตฌํ๋์ด ์์ง ์๋ค๋ฉด ์ปดํ์ผ ์์ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
interface UserClass {
name: string;
age: number;
printName(): void;
}
// Error! age, printName ์์ฑ์ด ์์ต๋๋ค.ts(2420)
class User implements UserClass {
name: string;
constructor(name: string) {
this.name = name;
}
}
UserClass์ ์๋ ๋ชจ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด๋๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. ์๋ ์ฝ๋์์ ํด๋์ค ๋ฐ๋ ๋์ ์์ฑ์ ํจ์ ํ๋ผ๋ฏธํฐ์ ์ ๊ทผ ์ ํ์๋ฅผ ์ฌ์ฉํด์ ํ๋กํผํฐ๋ฅผ ์ ์ธํ๊ณ ํ์
์ ์ง์ ํ๋ค.
class User implements UserClass {
constructor(
public name: string,
public age: number,
) {}
printName() {
console.log(this.name);
}
}
const user = new User('John', 30);
console.log(user); // { name: 'John', age: 30 }
abstract ํค์๋
abstract ํค์๋๋ ์ถ์ ํด๋์ค์ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
์ถ์ ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค๊ฐ ์์๋ฐ์ ์ ์๋ ๊ธฐ๋ณธ ํด๋์ค๋ก(์์๋ง์ ์ํด ์ฌ์ฉ), ํด๋์ค์ ๊ณตํต ๊ธฐ๋ฅ์ด๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ ํ
ํ๋ฆฟ ์ญํ ์ ์ํํ๋ค. ์ผ๋ฐ ํด๋์ค์ ๋ฌ๋ฆฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์์๋ฐ๋ ํด๋์ค์์ ์ด๋ฃจ์ด์ง๋ค. ๊ณตํต๋ ํ๋กํผํฐ์ ๋ฉ์๋์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ ์ ์ interface์ ์ ์ฌํ์ง๋ง, ์ถ์ ํด๋์ค๋ ์ธ๋ถ์ฌํญ์ด ๊ตฌํ๋ ์ผ๋ฐ ๋ฉ์๋์ ๋ฉค๋ฒ ๋ณ์(์ธ์คํด์ค์ ์ํ๋ ๋ณ์)๋ฅผ ๊ฐ์ง ์ ์๋ ์ ์ด ๋ค๋ฅด๋ค.
๐ก interface์ ์ ์ํ ๋ชจ๋ ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋๋ค.
์ถ์ ๋ฉ์๋๋ ์ ์ธ๋ง ๋์ด ์๊ณ ์ค์ ๊ตฌํ์ ํฌํจํ์ง ์๋ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๊ตฌํ ๋ด์ฉ ์์ด ์ด๋ฆ, ํ๋ผ๋ฏธํฐ ํ์ , ๋ฐํ ํ์ ๋ง ์ ์ธ๋ ๋ฉ์๋๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ์ถ์ ๋ฉ์๋๋ ์ถ์ ํด๋์ค ๋ด์ ์ ์ธํ๊ณ , ์์๋ฐ๋ ํด๋์ค์์ ๋ฐ๋์ ๊ตฌํ๋ผ์ผ ํ๋ค.
abstract class UserClass {
name: string; // ๋ฉค๋ฒ ๋ณ์
age: number; // ๋ฉค๋ฒ ๋ณ์
constructor(name: string, age: number) {
this.name = name; // ๋ฉค๋ฒ ๋ณ์ ์ด๊ธฐํ
this.age = age; // ๋ฉค๋ฒ ๋ณ์ ์ด๊ธฐํ
}
// ์ธ๋ถ์ฌํญ์ด ๊ตฌํ๋ ์ผ๋ฐ ๋ฉ์๋
printName() {
console.log(this.name);
}
// ์ธ๋ถ์ฌํญ์ด ๊ตฌํ๋์ง ์์ ์ถ์ ๋ฉ์๋
abstract printAge(): void;
}
class User extends UserClass {
// ์ถ์ ํด๋์ค๋ฅผ ์์ ๋ฐ์ ํด๋์ค๋ ๋ฐ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค
printAge() {
console.log(this.age);
}
}
const abUser = new UserClass('John', 30); // Error! ์ถ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.ts(2511)
const user = new User('John', 30);
console.log(user); // { name: 'John', age: 30 }
user.printName(); // 'John'
๋ ํผ๋ฐ์ค
TypeScript - Class | PoiemaWeb
ES6์์ ์๋กญ๊ฒ ๋์ ๋ ํด๋์ค๋ ๊ธฐ์กด ํ๋กํ ํ์ ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ์ธ์ด๋ณด๋ค ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์ ์ต์ํ ๊ฐ๋ฐ์๊ฐ ๋ณด๋ค ๋น ๋ฅด๊ฒ ํ์ตํ ์ ์๋ ๋จ์๋ช ๋ฃํ ์๋ก์ด ๋ฌธ๋ฒ์ ์ ์ํ๊ณ ์๋ค. ํ์ง๋ง
poiemaweb.com
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[JS] Bitwise ๋นํธ ์ฐ์ฐ์ ํบ์๋ณด๊ธฐ (feat. ๋นํธ๋ง์คํฌ)
[JS] Bitwise ๋นํธ ์ฐ์ฐ์ ํบ์๋ณด๊ธฐ (feat. ๋นํธ๋ง์คํฌ)
2024.05.29 -
[JS] ์ ๋์ฝ๋์ ์ ๋์ฝ๋ ํ๋กํผํฐ
[JS] ์ ๋์ฝ๋์ ์ ๋์ฝ๋ ํ๋กํผํฐ
2024.05.29 -
[DevTools] ์น์์ VSCode ์ฌ์ฉํ๊ธฐ - github.dev / github1s
[DevTools] ์น์์ VSCode ์ฌ์ฉํ๊ธฐ - github.dev / github1s
2024.05.29 -
[AWS] VSCode์์ AWS EC2 ์๊ฒฉ ์ฐ๊ฒฐ / EC2 ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ํด๊ฒฐ
[AWS] VSCode์์ AWS EC2 ์๊ฒฉ ์ฐ๊ฒฐ / EC2 ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ํด๊ฒฐ
2024.05.29