[TS] 클래스

heyhey·2023년 7월 11일
0

TypeScript 🦫

목록 보기
2/5
post-thumbnail

TS의 클래스는 JS 의 클래스와 유사하지만, TS만의 고유한 확장 기능이 있다.

클래스 정의

class Person{
  constructor(){
    this.name = name
  }
  walk(){
    console.log("hi")
  }
}

기존 JS에서 클래스를 선언하듯이 만들면 에러가 발생한다.

클래스 몸체에 클래스 프로퍼티를 사전 선언해야한다.

class Person{
  name : string;
  constructor(){
    this.name = name
  }
  walk(){
    console.log("hi")
  }
}

2. 접근 제한자

클래스 기반 객체 지향 언어가 지원하는 접근 제한자를 지원하며, 의미 또한 동일하다

  • public
    - 모든 곳에서 접근 가능🅾️
  • protected
    - 자식 클래스 내부 접근 가능🅾️
    • 클래스 인스턴스 접근 불가 ❌
  • private
    - 자식 클래스 내부 접근 불가 ❌
    • 클래스 인스턴스 접근 불가 ❌

다른 클래스 기반 언어는 암묵적으로 projtected 로 지정되어 공개되지만,
TS는 public으로 선언된다.

3. 생성자 파라미터에 접근 제한자 선언

접근 제한자는 생성자 파라미터에도 선언이 가능하다
이때 접근 제한자가 사용된 생성자 파라미터는 암묵적으로 클래스 프로퍼티로 선언되고,
생성자 내부에서 별도의 초기화가 없어도 암묵적으로 초기화가 수행된다.

public

class Person{
  constructor(public x:string){}
}
const p = new Person("Hey");
p // {x:"Hey"}
p.x // Hey

접근 제한자가 선언된 생상자 파라미터 x는 클래스 프로퍼티로 선언되고 자동으로 초기화된다.
public으로 선언되었기 때문에 외부에서 참조도 가능하다.

private

class Person{
  constructor(private x:string){}
}
const p = new Person("Hey");
p // {x:"Hey"}
p.x // Error

x는 멤버 변수로 선언되고 초기화된다.
x는 클래스 내부에서만 차조 가능하다.

접근 제한자를 선언하지 않으면, 생성자 내부에서만 유효한 지역변수가 되어 생성자 외부에서 참조가 불가능하다.

4. readonly

readonly 가 선언되면 선언된 클래스 프로퍼티 선언시에만 할당할 수 있다.
선언시 또는 생성자 내부에서만 값을 할당할 수 있다.
보통 상수의 선언에 사용한다.

class Person{
	private readonly CASE : string = "ADMIN"
  	private readonly AGE : number;
  	constructor(age:number){
    	this.AGE = age
    }
}
const a= new Person(15)
a.AGE = 20 // Error

AGE 속성은 private이며 'Person' 클래스 내에서만 액세스할 수 있다

5. static

클래스의 정적 메소드를 정의한다.
클래스의 인스턴스가 아닌 클래스 이름으로 호출하기 때문에, 인스턴스를 생성하지 않고 호출 가능하다.

class Person{
	constuctor(){}
  	static method(){
      console.log("HI")
    }
}
Person.method() 
new Person().method() // Error

정적 메소드에서는 this 를 사용할 수 없다.
정적 메소드 내부에서 this는 클래스의 인스턴스가 아닌 클래스 자신을 가리킨다.

정적 메소드는 인스턴스로 호출할 수 없다.

class Foo {
  static instanceCounter = 0;
  constructor() {
    // 생성자가 호출될 때마다 카운터를 1씩 증가시킨다.
    Foo.instanceCounter++;
  }
}
Foo.instanceConter // 0
const foo1 = new Foo()
const foo2 = new Foo()
Foo.instanceCounter // 2
foo1.instanceCounter // Error

static 키워드를 클래스 프로퍼티에도 사용할 수 있다.
메소드와 마찬가지로, 클래스 이름으로 호출하며, 인스턴스를 생성하지 않고도 호출할 수 있다.

6. 추상 클래스

추상 메소드는 내용이 없이 메소드 이름과 타입만이 선언되는 메소드를 뜻한다.
하나 이상의 추상 메소드를 포함하며, 일반 메소드도 포함할 수 있다.

abstract를 사용해서 선언한다.
직접 인스턴스를 생성할 수 없고, 상속만을 위해서 사용한다.
추상 클래스를 상속받은 클래스는, 추상 클래스의 추상 메소드를 반드시 구현하여야 한다.

abstract class Animal {
  abstract makeSound():void;
  move(): void{
	console.log("HIHI")  
  }
}

이렇게 만든 추상 메소드를 통해 직접 인스턴스를 생성할 수 없다.
반드시 상속받아 다른 클래스를 생성해야한다.

class Dog extends Animal {
  // 추상 클래스를 상속한 클래스는 추상 클래스의 추상 메소드를 반드시 구현하여야 한다
  makeSound() {
    console.log('bowwow~~');
  }
}

인터페이스와 비슷한 구조라고 할 수 있다.
인터페이스는 모든 메소드가 추상 메소드이지만,
추상 클래스는 일반 메소드도 포함 가능하다.

profile
주경야독

0개의 댓글