본문 바로가기

타입스크립트 TypeScirpt

5-1. TypeScript Classes : 추상클래스, 추상메소드, public/protected/private - 노마드코더 강의 정리

728x90
 아래 포스팅은 노마드코더의 Typescript 강의 내용을 제가 나중에 찾아볼 때를 대비해 정리한 내용입니다.
 오늘 포스팅은 강의 #4.0 ~ 4.1 정리내용, 4.1 후반부의 해시맵은 강의정리 5-2 포스팅에서 계속합니다.
ㅇ 강의 원본 링크  -  https://nomadcoders.co/typescript-for-beginners/lectures/3678
ㅇ 5-1 포스팅(#4.1 해시맵 가정리) - https://awess0me.tistory.com/26

TypeScript의 특징(JS에선 볼수 없음)

1. 추상 클래스, 상속받는 클래스

2. 추상 메소드

3. public, protected, private 


자바나 C#을 공부했다면 객체지향 특징은 어느정도 알고 있을것.

예를 들어 private method, public property 혹은 abstract class라든지 polymorthism, generic 같은 것

모두 TypeScript에서도 가능함!

 

1. TypeScript Class 생성 방법(클래스, 추상클래스)

※ 이 강의는 객체지향이 뭔지 설명하기 위한게 아니라 알고 있다고 생각하는 가정하에서 진행하는 거라 감안할것.

typescript의 private 키워드는 JS로 변환될때 사라짐. 오직 TS에서 코드 보호위해 사용하는 것(JS에선 사용X)

 

아래처럼 class 하위에 private, pulic 으로 변수를 추가해두고

nico.firstName 처럼 private 변수를 밖에서 호출하면 오류가 발생함. private이라 class 밖에선 호출이 불가하기 때문!

물론 JS는 private 개념이 없기 때문에 변환한 코드는 오류가 없다.(noci.nickname 은 오류 발생 안함)

 

추상클래스(Abstractor) : 다른 클래스가 상속받을 수 있는 클래스지만, 이 클래스는 직접 새로운 인스턴스를 만들순 없음

아래처럼 const nico = new User~ 를 사용하면 작동하지 않음.

TS가 추상 클래스의 인스턴스를 만들수 없다고 경고하기 때문(아래 이미지 캡쳐 참고)

 

즉, 추상클래스는 '오직 다른 곳에서 상속받을수만 있는 클래스!'

추상클래스를 상속받을 수만 있고, 직접적으로 인스턴스를 만들지는 못함. 

 

아래처럼 추상클래스에 getFullName()이란 함수를 생성하면, 클래스 상속받은 Player 인스턴스도 이 함수 사용(접근)가능.

물론 getFullName 함수를 private으로 만들면 작동안함. public이기 때문에 접근가능 한 것.

private 이나 public 따라 접근 권한이 달라지며, property 뿐 아니라 method에서도 작동한다는 것을 알수 있음. 

(참고) 물론 abstract를 사용해 생성한 class는 JS로 변환했을땐 abstract가 없음.

           (JS는 지원하지 않는 기능임. 아래 이미지는 JS 변환 코드.)

위 abstract 코드를  JS로 변환한 일반적인 클래스

2. 추상 메소드

추상 메소드를 만들려면, 메소드를 클래스 안에서 구현하지 않으면 됨.

getFullName() 메소드의 구현(implementation)된 부분 { } 안을 구현하지 않으면 됨. 내용없는 메소드.

추상 메소드는 추상 클래스를 상속받는 모든 것들이 구현해야하는 필수 메소드. 내용은 없으나 call signature는 필요함

☞ 추상 클래스 내에 추상 메소드를 생성 할 수 있다.

 

구현이 어떻게 되든 [ 상속받는 것들이 해당 메소드를 구현하길 원한다면 ] 추상클래스 내 추상 메소드를 생성하면 됨

 

3. 접근 지정자(public, protected, private)

하지만 상속한 클래스라도 접근 지정자에 따라 property의 접근 권한이 달라진다.

property가 private이면 상속받은 클래스나 인스턴스에선 해당 property에 접근할 수 없음. 

private은 선언된 클래스 내에서만 접근이 가능함(추상 클래스도 마찬가지)

 

필드를 보호하기 위한 방법이 두개만(private, public) 있는게 아니기 때문인데, protected도 있음 ! 

아래 오류처럼 private property로 정의됐다면, 당연히 인스턴스 밖에서 접근 불가, 다른 자식 클래스에서도 마찬가지.

User 클래스의 인스턴스나 메소드에서 접근할 순 있으나  이 User 클래스는 추상클래스라서 인스턴스화 불가함.

☞ protected ? property가 외부로부턴 보호되지만 다른 자식 클래스에선 사용되길 원한다면 protected 사용하면 됨!

    (private? property가 외부로부터나, 다른 자식 클래스에서도 사용할수 없고 오직 선언 클래스 내부에서만 사용) 

추상 클래스, 추상 메소드 정의 형태
추상클래스를 상속받은 클래스

추상 클래스 내 property를 protected로 변경하면 아래처럼 정상동작함.

아래는 nickname property를 protected로 변경 후 사라진 오류화면

 

(참고) public은 어디서든(선언 클래스, 상속 클래스, 인스턴스) 접근가능하고 'public' 로 정의하지 않아도 디폴트 상태임.


해당 강의 하단 댓글창에 강의 정리가 깔끔하게 되어있어 같이 캡처.(문제시 얼른 삭제하겠습니다)

끝.


#4.1 강의 후반부에는 지금까지 배운 TS 특징들을 이용해 해시맵 구현하는 부분이 나오는데,

포스팅이 길어져 5-2에서 정리합니다.

5-2. TypeScript 적용 :클래스 타입 생성, constructor 정의 - 노마드코더 강의 정리https://awess0me.tistory.com/26

728x90