class Employee {
fullName: string;
age: number;
jobTitle: string;
hourlyRate: number;
workingHoursPerWeek: number;
constructor(fullName: string, age: number, jobTItle: string, hourlyRate: number, workingHoursPerWeek: number){
this.fullName = fullName;
this.age = age;
this.jobTitle = jobTItle;
this.hourlyRate = hourlyRate;
this.workingHoursPerWeek = workingHoursPerWeek;
}
printEmployeeInfo = (): void => {
console.log(`${this.fullName}의 직업은 ${this.jobTitle} 이고 일주일의 수업은 ${this.hourlyRate*this.workingHoursPerWeek} 달러 이다.`)
}
}
let employee3 = new Employee('Cine', 20, 'developer', 40, 35);
employee3.fullName = 'Jeto';
employee3.printEmployeeInfo();
위의 코드에서 보면 employee3 객체를 생성할때 fullName을 'Cine' 로 할당해주었지만 아래의 employee3.fullName = 'Jeto'; 를 통해 쉽게 재할당 할 수 있습니다.
하지만 우리가 프로그래밍을 할때 외부로부터 데이터를 보호하기위해 이런 방식으로 객체의 프로퍼티로 바로 접근하여 그 값을 바꾸는 경우를 피하고 싶은 경우가 있을 것입니다.
객체지향 프로그래밍에서는 Access Modifiers라는 접근제한자가 있습니다.
클래스속 멤버 변수와 메소드에 적용될 수 있는 키워드로 클래스 외부로부터의 접근을 제한하여 코드의 안전성을 향상 시킬수 있다는 장점이 있습니다.
대부분의 언어도 마찬가지지만 타입스크립트에서는 대표적으로 3가지의 접근제한자가 있습니다.
Public, Private, Protected입니다.
이중에서도 Public과 Private이 가장 많이 사용됩니다.
Public은 Class의 밖에서 어디서든 접근이 가능하다는 뜻이고 private는 클래스 내에서만 접근이 가능하고 외부에서는 접근이 불가능합니다.
마지막으로 Protected는 클래스 내부에서만 접근이 가능하지만 상속받은 경우 자식클래스에서 접근이 가능합니다.
class Employee {
private fullName: string;
age: number;
jobTitle: string;
hourlyRate: number;
workingHoursPerWeek: number;
constructor(fullName: string, age: number, jobTItle: string, hourlyRate: number, workingHoursPerWeek: number){
this.fullName = fullName;
this.age = age;
this.jobTitle = jobTItle;
this.hourlyRate = hourlyRate;
this.workingHoursPerWeek = workingHoursPerWeek;
}
public printEmployeeInfo = (): void => {
console.log(`${this.fullName}의 직업은 ${this.jobTitle} 이고 일주일의 수업은 ${this.hourlyRate*this.workingHoursPerWeek} 달러 이다.`)
}
}
let employee3 = new Employee('Cine', 20, 'developer', 40, 35);
// employee3.fullName = 'Jeto'; // error
// console.log(employee3.fullName); // error
employee3.printEmployeeInfo();
메서드 앞에 public 키워드를 이용해서 직접 명시해도 되지만 타입스크립트에서는 자바, C#과는 다르게 명시하지 않았을경우 Default로 public 키워드로 인식하게 됩니다.
fullName이라는 프로퍼티에는 private라는 접근제한자가 붙어 클래스 외부에서는 접근하지 못하도록 만들었습니다.
그렇기 때문에 그렇기 떄문에 employee3.fullName = 'Jeto';에는
Property 'fullName' is private and only accessible within class 'Employee'.
라는 에러메세지와 함께 에러가 발생합니다.
해석하면 말그대로 fullName 프로퍼티는 private이고 Employee 클래스에서만 접근이 가능하다는 의미네요!
이렇게 재할당을 하는것도 불가능 하지만 읽을 수 조차 없이 정말 Employee 클래스 내에서만 접근이 가능합니다.
하지만 이렇게 private로 정의된 프로퍼티나 메서드를 사용하기 위해서는 객체지향프로그래밍에서는 Getter와 Setter라는 것을 제공하고 있습니다.
클래스 내에서 get과 set 키워드를 사용하여 Getter와 Setter를 선언할수 있습니다.
class Employee {
private _fullName: string;
age: number;
jobTitle: string;
hourlyRate: number;
workingHoursPerWeek: number;
constructor(fullName: string, age: number, jobTItle: string, hourlyRate: number, workingHoursPerWeek: number){
this._fullName = fullName;
this.age = age;
this.jobTitle = jobTItle;
this.hourlyRate = hourlyRate;
this.workingHoursPerWeek = workingHoursPerWeek;
}
get fullName () {
return this._fullName;
}
set fullName (value: string) {
this._fullName = value;
}
public printEmployeeInfo = (): void => {
console.log(`${this._fullName}의 직업은 ${this.jobTitle} 이고 일주일의 수업은 ${this.hourlyRate*this.workingHoursPerWeek} 달러 이다.`)
}
}
let employee3 = new Employee('Cine', 20, 'developer', 40, 35);
employee3.fullName = 'Jeto';
console.log(employee3.fullName);
employee3.printEmployeeInfo();
private 멤버인 fullName 프로퍼티 앞에 언더스코어( _ )를 넣어 비공개 멤버임을 나타내 주겠습니다.
이렇게 비공개 멤버앞에 _ 를 붙이는 것은 많은 언어에서 컨벤션으로 사용되고 있습니다.
get키워드에서 프로퍼티의 이름 fullName을 작성해주고 비공개 멤버인 _fullName을 return해줍니다.
set키워드에서는 파라미터로 값을 하나 받아주고 그 값을 _fullName에 대입하여 재할당 해줍니다.
여기서 보면 get과 set 뒤에 나타나는 것은 함수, 메서드의 형태를 나타내는데요.
getter와 setter또한 메서드이지만 일반적인 메서드나 함수와 다른점은 클래스내에 상태를 나타내는 public 변수처럼 클래스 외부에서 private 변수는 setter와 getter를 통해 접근이 가능해집니다.
class Employee {
constructor(
private _fullName: string,
private _age: number,
private _jobTItle: string,
private _hourlyRate: number,
public workingHoursPerWeek: number){
}
get fullName () {
return this._fullName;
}
set fullName (value: string) {
this._fullName = value;
}
public printEmployeeInfo = (): void => {
console.log(`${this._fullName}의 직업은 ${this._jobTItle} 이고 일주일의 수업은 ${this._hourlyRate*this.workingHoursPerWeek} 달러 이다.`)
}
}
let employee3 = new Employee('Cine', 20, 'developer', 40, 35);
employee3.fullName = 'Jeto';
console.log(employee3.fullName);
employee3.printEmployeeInfo();
이처럼 객체가 생성될 때, 생성자의 매개변수로 전달된 값은, 객체의 프로퍼티 값으로 자동으로 그 값이 초기화 되고 할당이 됩니다.
'TS 관련 > TypeScript' 카테고리의 다른 글
[TypeScript] 제네릭(Generics) (0) | 2022.07.22 |
---|---|
[TypeScript] Intersection Type(인터섹션 타입) (0) | 2022.07.21 |
[TypeScript] 생성자(Constructor) (0) | 2022.07.19 |
[TypeScript] Class와 객체(OOP 프로그래밍) (0) | 2022.07.18 |
[TypeScript] 옵셔널(optional) ?, 선택적 매개변수 (0) | 2022.07.17 |