일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- flask
- TypeScript
- 파이썬
- 튜플
- node
- AWS
- merge
- lambda
- MongoDB
- SSA
- RDS
- 중급파이썬
- pandas
- crud
- EC2
- docker
- git
- async
- Class
- wetube
- dict
- 채팅
- Vue
- S3
- socket io
- 카톡
- Props
- react
- NeXT
- SAA
- Today
- Total
초보 개발자
7. 클래스와 오브젝트 getter setter 접근제한자 본문
객체지향 프로그래밍이란 !?
연관된 변수와 함수들을 한 덩어리로 묶어서 구조화하여 표현하는 프로그래밍 스타일을 뜻한다.
Class 와 Object가 대표적이고 이 둘은 뗄레야 뗄 수 없는 관계이다.
객체들은 클라스를 통해서 만들어 질 수 있고,
클래스는 객체가 어떤모습을 가질지를 정의하고 묘사하는 객체의 설계도, 생산틀이다.
클라스 내에 정의 된 변수 => 프로퍼티
클라스 내에 정의 된 함수 => 메소드
class Employee {
fullName: string;
age: number;
printInfo = () =>
console.log(`이름은 ${this.fullName}이고 ${this.age}살입니다.`);
}
const a = new Employee();
a.fullName = "taehyeki";
a.age = 5;
a.printInfo();
new생성자를 사용하여 a라는 인스턴스를 만들어내고 프로퍼티에 접근하여 값을 넣은 뒤 함수를 출력해보자.
클라스 속에서 정의된 함수들은 클라스 내 정의된 변수들에게 접근가능(this사용)
이름은 taehyeki이고 5살입니다. 라는 값을 출력할 수 있다.
방금 해본 방식은 인스턴스를 생성하고 그 뒤에 일일이 인스턴스의 프로퍼티를 지정해주는 방식을 사용하였는데
복잡하고 보기도 좋지않다. 좀더 깔끔하게 만들기 위해서는 생성자(Constructor)를 사용해주면 된다.
class Employee {
constructor(private _fullName: string, private age: number) {}
get fullName() {
return this._fullName;
}
set fullName(value) {
this._fullName = value;
}
printInfo = () =>
console.log(`이름은 ${this.fullName}이고 ${this.age}살입니다.`);
}
const a = new Employee("taehyeki", 5);
console.log("getter", a.fullName);
a.fullName = "hiKim";
console.log("setter", a.fullName);
a.printInfo();
객체가 생성될 때 컨스트럭터의 매개변수로 전달된 값은 객체의 프로퍼티 값으로 자동으로 그 값이 초기화 되고 할당된다.
모든 class를 constructor라고 불리는 메서드를 가질 수 있고 클라스로부터 객체를 생성할 때 호출(자동으로)되며
객체의 초기화를 담당한다.
접근제한자는 클라스 속 멤버 변수 (프로퍼티)와 메소드에 적용될 수 있는 키워드이며
클라스 외부로 부터의 접근을 통제하는 것을 말한다.
Public Private Protected가 있다.
Public => 클라스의 외부에서 접근 가능함 (생략 가능)
Private => 클라스 내에서만 접근가능, 클라스의 외부에서 접근 불가능 (변경 및 조회 불가지만 getter, setter 추가시 변경 및 조회 가능) 변수 앞에 _을 넣어 비공개멤버임을 암시해준다
Protected => 클라스 내부, 그리고 상속받은 자식 클라스에서 접근가능
class Car {
//color:string;
constructor(private color:string) {
this.color = color;
}
start() {
console.log("start");
}
}
const bmw = new Car("red");
이러한 코드를 자바스크립트에서 작성하면 아무런 문제가 없지만 타입스크립트에서는 오류가 난다
왜냐하면 타입스크립트에서 클래스를작성할때 멤버변수는 미리 선언을 해줘야한다. 하지만
위에서 작성한 것처럼 접근제한자를 사용하거나 readonly속성을 적어주면 멤버변수를 미리 선언하지 않아도 된다!!
class Car {
private name: string = "z4";
constructor(private color: string) {
this.color = color;
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
con() {
console.log(this.color, this.name); // 오류메시지
}
}
const z = new Bmw("gogo");
z.con(); // gogo z4
Car의 멤버 변수로 name을 private접근 제한자를 통해 생성하였고
constructor 생성자 메서드로 color또한 private접근 제한자를 통해 생성하였습니다.
이 경우 Car를 상속받은 Bmw에서 console.log(this.color)를 사용하면 private라서 접근이 안된다는 오류 메시지가 뜹니다. z객체 안 name과 color가 존재 하지만!!! 부모에서 private로 접근제한자를 두었기 때문에 참조를 할 수 없다. con()함수를 사용하기 위해서는 부모인 Car클래스로 옮겨야 Bmw클래스에서 사용할 수 있다. 옮겨도 private con()이라고 붙이면 사용할 수 없다.
class Car {
static wheels = 4;
}
console.log(Car.wheels); //4
static으로 생성하면 this가 아닌(this로 접근하면 오류남) 클래스 명을 사용하여 접근해야한다.
abstract class Car {
static wheels = 4;
abstract con(): void;
}
const car1 = new Car(); // 생성불가
class Car2 extends Car {
con() {
console.log(Car.wheels);
}
}
추상클래스는 Class앞에 abstract를 붙이면 된다
추상클래스는 인스턴스를 생성할 수 없다. 상속을 통해서만 사용이 가능하다
또한 abstract(추상) 메서드를 생성하면 상속받은 클래스내에서 구현을 꼭 해주어야 한다. (추상 메서드는 추상 클래스내에서만 사용 가능하다는 것도 알아두어야한다 )
추상화는 프로퍼티나 메서드에 이름만 선언해주고 구체적인 기능은 상속받는 쪽에서 구현해 주는 것을 말한다. 추상 클래스를 상속받아 만든 수많은 객체들이 동일한 메서드를 가지고 있겠지만 구체적인 기능은 다 다를 것이다.
'TYPE SCRIPT' 카테고리의 다른 글
6 함수 기본 매개변수 선택적 매개변수 (0) | 2021.09.07 |
---|---|
5 Types(any, union) type guard (0) | 2021.09.07 |
4. interface (0) | 2021.09.07 |
3 Types (0) | 2021.09.07 |
2. Typescript 설치 및 만들기 (0) | 2021.09.06 |