(1) 속성과 메소드( Attribute & Method ) ( TypeScript )
Github: https://github.com/SHIN96BC/JavaScript-TypeScript-Concept-2022/tree/main/12_Attribute%26Method
1) 속성과 메소드는 객체 안에 들어가 있는 2가지 종류의 데이터이다.
2) '속성'은 실제 순수한 데이터이다.
ex)
const obj = {
name: 'B C',
age: 27,
};
<1> 속성 자체에 속성을 객체 외부에서 내가 원하지 않는 값으로 바뀌는 것을 막을 방법은 없다.
<2> 속성을 내가 원하지 않는 값으로 바뀌는 것을 막으려면 setter 와 getter 를 만들어줘야 한다.
( setter 와 getter 는 클래스객체에서만 사용할 수 있다. )
3) '메소드'는 내용물이 코드의 묶음인 함수가 들어가 있는 속성이 메소드이다.
<1> 객체에서 함수를 여러개 정의할 때는 , 로 구분한다.
ex) 기본형
const obj = {
getFamilyName: function() {
return 'SHIN';
},
};
ex) 축약형 ( function 생략가능 )
const obj = {
getBloodType() {
return 'A';
},
};
ex) 에로우 함수형
const obj = {
getLastName: () => 'SHIN',
};
4) 클래스를 사용해서 객체를 만드는 방법
ex)
class Person {
_bloodType: string;
constructor(bloodType: string) {
this._bloodType = bloodType;
}
}
<1> Getter 와 Setter
1> Setter
1. 객체 외부에서 객체의 속성값을 안전하게 셋팅하고 싶을때 사용한다.
2. 객체 내에서는 코드이고 객체 바깥쪽에서는 데이터처럼 보이게 하는 스펙이다.
3. 외부에서 접근할때 bloodType('A'); 이런식으로 메소드로 접근하는게 아니라,
bloodType = 'A'; 이런식으로 속성처럼 접근하고 싶을때 setter 를 사용한다.
( 메소드 앞에 set 을 붙인다. )
ex)
class Person {
_bloodType: string;
constructor(bloodType: string) {
this._bloodType = bloodType;
}
set bloodType(btype: string) {
this._bloodType = btype;
}
}
const p1 = new Person('A');
p1.bloodType = 'B';
4. 만약에 bloodType 에 'A', 'B', 'O', 'AB' 만 들어가게 제한하고 싶을경우에는 이렇게 한다.
ex)
set bloodType(btype: string) {
if(btype === 'A' || btype === 'B' || btype === 'O'|| btype === 'AB') {
this._bloodType = btype;
}
}
2> Getter
1. 객체 외부에서 객체의 속성값을 안전하게 가져오고 싶을때 사용한다.
2. 객체 내에서는 코드이고 객체 바깥쪽에서는 데이터처럼 보이게 하는 스펙이다.
3. 외부에서 접근할때 bloodType(); 이런식으로 메소드로 접근하는게 아니라,
bloodType; 이런식으로 속성처럼 접근하고 싶을때 getter 를 사용한다.
( 메소드 앞에 get 을 붙인다. )
ex)
class Person {
_bloodType: string;
constructor(bloodType: string) {
this._bloodType = bloodType;
}
get bloodType() {
return this._bloodType;
}
}
const p1 = new Person('A');
p1._bloodType;
4. 혈액형 알파벳 뒤에 무슨무슨 형 이렇게 붙여주고 싶을때는 이렇게 한다.
ex)
get bloodType() {
return `${this._bloodType} 형`;
}
3> Getter 와 Setter 모두 기본적으로 코드이기 때문에 하고싶은 무엇이든 할 수가 있다.
4> Getter 와 Setter 는 일반 객체에서는 만들 수가 없고, 클래스로 만들어진 인스턴스 객체에서
만들 수 있는 스펙중에 하나이다.
5> 내부의 어떤 객체의 값을 보호하면서, 외부에는 사용하는 편의성을 그대로 유지시켜 줄 수있는
아주 편리한 스펙이다.
5) 객체의 속성이나 메소드를 구성 할 수 있는 기능( 추가하거나 삭제하는 기능이다. )
<1> JavaScript 의 동적 바인딩 기능을 이용해서 자동으로 추가, 삭제 해주는 스펙이다.
<2> 추가
ex) const obj = {
name: 'B C',
age: 27,
}
obj.bloodType = 'A';
( TypeScript 에서는 에러가 발생한다. JavaScript 에서만 가능하다. )
<3> 삭제
ex) const obj = {
name: 'B C',
age: 27,
}
delete obj.name;
( TypeScript 에서는 에러가 발생한다. JavaScript 에서만 가능하다. )
<4> 경우에 따라서는 delete 연산자로 객체의 속성을 삭제가 안되게 하고 싶을때가 있는데 그럴때는
이렇게 한다.
1> TypeScript 의 경우
1. 먼저 type 을 만든다.
ex)
type MyObject = {
name: string;
age: number;
getFamilyName: () => string;
getLastName: () => string;
getBloodType: () => string;
}
2. type 에서 옵셔널이 아닌경우에는 반드시 있어야하는 데이터가 되므로 delete 연산자를
사용할 수 없게 막아준다.
3. delete 연산자로 삭제 가능하게 하려면 ? 를 사용해서 옵셔널로 설정해줘야한다.
ex)
type MyObject = {
name?: string;
age?: number;
getFamilyName: () => string;
getLastName: () => string;
getBloodType: () => string;
}
2> JavaScrip 의 경우
1. 객체를 만드는 3번째 방법을 사용한다.
2. Object 라고 하는 최상위 객체가 제공하는 create 라고하는 메소드를 이용해서 객체를
만드는 방법이다.
3. create 메소드의 첫번째 인자는 부모객체로써 작동되게 될 객체를 입력받고,
두번째 인자로는 구성객체라고 하는 객체를 받는다.
( 즉, 그 객체의 정보, 구성정보를 입력한다. )
ex)
const myObj = Object.create(null, {
name: {
value: 'SHIN',
writable: true,
configurable: false,
}
});
4. 여기서 writable 을 true 로 하면 이 객체의 속성값을 바꿀 수가 있게된다.
5. configurable 을 false 로 해놓으면 이 속성을 삭제할 수 없게 된다.
'JS > JavaScript&TypeScript' 카테고리의 다른 글
JavaScript&TypeScript 14. 비동기 함수 (0) | 2022.04.03 |
---|---|
JavaScript&TypeScript 13. 일급 함수 (0) | 2022.04.03 |
JavaScript&TypeScript 11. 함수 ( Function ) (0) | 2022.04.03 |
JavaScript&TypeScript 10. 인터페이스&타입 별칭 (0) | 2022.04.03 |
JavaScript&TypeScript 09. 예외 ( Exception ) (0) | 2022.04.03 |