[TypeScript] Class - Getters & Setters / readonly / static

dev.galim·2023년 9월 11일
0

TypeScript

목록 보기
5/10

getters & setters

→ 비공개로 설정하려는 속성은 private로 설정하고, 속성값을 읽고 수정하는 getter & setter 함수를 사용.

  • Getters & Setters를 사용하는 이유
    • 클래스의 속성에 직접 접근하는 것을 막고, Getter, Setter 함수를 사용해 값을 받아오거나 수정하기 위해 사용. 만약 속성에 직접 접근해 수정하면 데이터의 무결성이 깨질 수 있기 때문에 Getter, Setter 함수를 활용하여 데이터 수정을 권장하고 있음.
    • 각 객체의 멤버에 접근하는 방법을 세밀하게 제어할 수 있음.
class Person {
	private._name: string;

	get name() { // getter
		return this._name;
	}

	// name의 글자가 10자 이상인 경우 에러를 발생시키는 코드
	set name(name: string) { // setter
		if(name.length > 10) {
			throw new Error("name too long")
		}
		this._name = name;
	}
}

let person = new Person();

console.log(person.name); // undefined
person.name = "june";
console.log(persone.name); // june
person.name = "junejunejunejunejune"; // Error, name이 10자 이상이기 때문에 에러가 발생함.

readonly

→ 읽기만 가능한 속성을 선언하기 위해 사용.

속성을 읽기 전용으로 설정해 변경할 수 없게 만들기 위해 사용.

선언될 때와 생성자에서 값을 설정하면 이후에 수정할 수 없음.

class Person {
	**readonly** age: number = 20; // 선언 초기화
	constructor(age: number) {
		this.age = age;
	}
}

let person = new Person(10); // 생성자 초기화
person.age = 30; // Error, 인스턴스화 된 이후에 값을 변경했기 때문에 에러가 발생함.
  • 최초 클래스 선언할 때나 생성자를 통한 age 필드값을 선언할 때를 제외하고 인스턴스화 된 이후에 age 필드에 값을 할당하게 되면 에러가 발생하게 됨.

static

→ 전역 멤버를 선언할 때 사용.

전역 멤버 → 객체마다 할당되지 않고 클래스의 모든 객체가 공유하는 멤버.

각 인스턴스가 아닌 클래스 자체에서 보이는 전역 멤버를 생성함.

그래서 범용적으로 사용되는 값에 설정함.

클래스명. 을 앞에 붙여 static 멤버에 접근할 수 있음.

ES6에서는 메소드 전용 속성엔 선언되지 않았으나, 타입스크립트에선 사용할 수 있음.

class Grid {
	static orign = { x: 0, y: 0 };
	calculateDistanceFormOrigin(point: { x: number; y: number }) {
		let xDist = point.x - Grid.origin.x;
		let yDist = point.y - Grid.origin.y;
		return Math.sqrt(xDist * xDist + yDist * yDist) / this.slace;
	}
	constructor(public scale: number) {}
}

let grid1 = new Grid(1.0); // 1x scale
let grid2 = new Grid(5.0); // 5x scale

console.log(grid1.calculateDistanceFormOrigin({ x: 10, y: 10}));
console.log(grid2.calculateDistanceFormOrigin({ x: 10, y: 10}));
  • Grid 안에 originstatic으로 선언되어 있기 때문에 origin 필드에 클래스명.을 붙여 접근이 가능함. 뿐만 아니라 클래스 밖에서 Grid.origin을 선언하여 접근 및 할당도 가능함.
profile
열심히 해볼게요

0개의 댓글