[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'
๋ ํผ๋ฐ์ค
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช 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