Lsiron
Type Script 의 public 과 private 본문
TypeScript에서 public과 private 키워드는 클래스 멤버의 접근 제어자를 나타내며, 접근 제어자는 클래스 내부와 외부에서 해당 멤버에 접근할 수 있는지를 결정한다.
public 이란?
클래스의 멤버가 어디서나 접근 가능함을 나타낸다. 기본적으로 모든 클래스 멤버는 public이다.
즉, 클래스 외부에서 접근 가능한 멤버를 정의할 때 사용한다.
쉽게 말해서 속성에 public이 붙으면 클래스의 모든 자식들이 속성을 자유롭게 사용가능하다는 것이다.
즉, public은 있으나 없으나 똑같다.
이 말은 우리가 JavaScript에서 클래스를 짤 때 속성을 사용하던 것과 똑같다는 것.
참고로 public 키워드를 생략해도 속성에 강제로 부여가 된다.
class Lsiron {
public name: string;
constructor(x:string) {
this.name = x
}
public iron() { // prototype 함수에도 키워드 적용 가능
}
}
let siron = new Lsiron('iron')
console.log(siron) // Lsiron {name: 'iron'} 출력
siron.name = 'ron' // 이렇게 자유롭게 public으로 지정한 name 속성 값을 자식들이 사용(수정) 할 수 있다.
위 예시처럼 자식들이 사용(수정)이 가능하다.
이제부터 instance들 (새로 만들 Object들) 에 속성을 부여하고 싶으면 private이 아닌 이상, 무조건 public 키워드를 써 주어야한다.
당연히 위에서 만든 public iron(){} 처럼 prototype 함수에도 public 키워드를 사용 가능하다.
참고로 public 키워드를 사용하면 this.~ 를 생략이 가능하다.
class Lsiron {
constructor(public name:string) {
}
}
let siron = new Lsiron('Lee');
console.log(siron) // Lsiron {name: 'Lee'} 출력
즉, constuctor 파라미터에 직접 public으로 넣어주면 constructor 위 아래로 this를 넣어서 작성 해 주던 속성을 생략(축약) 가능 한 것이다.
public 사용 시기
- 외부에서 접근이 필요한 멤버: 외부 코드나 다른 클래스에서 접근해야 하는 속성이나 메서드에 사용한다.
- 인터페이스 구현: 클래스가 인터페이스를 구현할 때, 인터페이스의 모든 멤버는 기본적으로 public이어야 한다.
private 이란?
클래스의 멤버가 클래스 내부에서만 접근 가능함을 나타낸다. 외부에서 직접 접근할 수 없다.
즉, 클래스 내부에서만 접근 가능한 멤버를 정의하여 캡슐화를 실현하고, 클래스의 내부 상태를 보호할 때 사용한다.
쉽게 말해서 속성에 private이 붙으면 클래스의 모든 자식들이 속성을 자유롭게 사용할 수 없고, 이 말은 public과는 다르게 자식들이 사용(수정)할 수 없도록 제약을 걸어준다.
class Lsiron {
public name: string;
private familyName : string = 'Lee';
constructor(x:string) {
this.name = this.familyName + x // constructor에 쓰고 싶으면 무조건 this를 붙일 것
}
private iron() { // prototype 함수에도 키워드 적용 가능
}
}
let siron = new Lsiron('iron')
console.log(siron) // Lsiron {name: 'Leeiron', familyName: 'Lee'} 출력
siron.familyName = 'Kim' // 에러 발생!! 자식들이 속성을 사용(수정) 할 수 없다!
위 예시처럼 자식들이 사용(수정)이 불가능하다.
private 키워드가 붙은 속성은 무조건 class 안에서만 수정, 이용이 가능하다.
즉, 외부에서 변경 할 수 없도록 class 내부에서 보호하고자 하는 속성에 붙이면 된다.
( 보통 위의 familyName 처럼 외부에서 수정할 수 없도록 하고싶은 속성에 사용된다. )
당연히 위에서 만든 public iron(){} 처럼 prototype 함수에도 public 키워드를 사용 가능하다.
만약 불가피하게 class 외부에서 private 키워드가 붙은 속성을 수정해야하면 어떻게 해야할까?
바로 class 내부에, private 키워드가 붙은 속성을 변경하는 함수를 제작해 줌으로써 변경 할 수 있다.
class Lsiron {
public name: string;
private familyName : string = 'Lee';
constructor(x:string) {
this.name = this.familyName + x
}
changeFamilyName() { // 변경 함수
this.familyName = 'Kim';
}
}
let siron = new Lsiron('iron')
siron.changeFamilyName() // familyName 이 'Kim' 으로 변경 됨
console.log(siron) // Lsiron {name: 'Leeiron', familyName: 'Kim'} 출력
위 예시처럼 클래스 내부에서 미리 제작한 private 키워드가 붙은 속성변경함수를 사용하여 외부에서 속성을 변경 할 수 있다.
private 사용 시기
- 캡슐화: 클래스의 내부 상태를 외부에서 직접 접근하지 못하게 하고, 클래스 내부의 메서드를 통해서만 접근할 수 있도록 한다.
- 내부 메서드 보호: 클래스 내부에서만 사용되는 헬퍼 메서드나 속성을 정의할 때 사용한다.
멤버란?
TypeScript에서 "멤버"는 클래스 안에 정의된 속성(properties)과 메서드(methods)를 의미한다. 즉, 클래스의 구성 요소를 말한다. 멤버는 클래스의 상태를 나타내는 변수(속성)와 동작을 나타내는 함수(메서드)로 나뉜다.
실생활 예시
- 자동차 클래스
- 속성: make (제조사), model (모델), year (제조 연도)
- 메서드: startEngine(), stopEngine(), drive()
class Car {
public make: string;
public model: string;
private year: number;
constructor(make: string, model: string, year: number) {
this.make = make;
this.model = model;
this.year = year;
}
public startEngine(): void {
console.log(`Engine started for ${this.make} ${this.model}`);
}
public stopEngine(): void {
console.log(`Engine stopped for ${this.make} ${this.model}`);
}
public displayYear(): void {
console.log(`This car was made in ${this.year}`);
}
}
const car = new Car('Toyota', 'Corolla', 2020);
console.log(car.make); // 정상 출력: Toyota
console.log(car.model); // 정상 출력: Corolla
console.log(car.year); // 오류: 'year'는 private 멤버이기 때문에 접근할 수 없다.
car.startEngine(); // 정상 출력: Engine started for Toyota Corolla
car.stopEngine(); // 정상 출력: Engine stopped for Toyota Corolla
car.displayYear(); // 정상 출력: This car was made in 2020
위의 예시에서 make와 model은 public 속성으로, 클래스 외부에서 접근할 수 있다.
반면 year는 private 속성으로, 클래스 외부에서 직접 접근할 수 없다.
startEngine, stopEngine, displayYear 메서드는 public으로 선언되어 외부에서 호출할 수 있다.
참조 : 코딩애플
'언어 > Type Script' 카테고리의 다른 글
Type Script 에서의 export , import 그리고 namespace (0) | 2024.07.16 |
---|---|
Type Script 의 protected 와 static (1) | 2024.07.16 |
Type Script 함수 타입 지정 심화(rest parameter, destructing, never) (1) | 2024.07.14 |
Type Script로 Class와 prototype에 타입지정하기(interface) (0) | 2024.07.12 |
Type Script로 HTML 변경과 조작 (instanceof, optional chaining) (2) | 2024.07.12 |