자바스크립트 자체에는 Class 가 없다. 대신 prototype을 이용한 클래스 흉내내기가 있는 것이다. prototype은 확실히 다른 객체지향 언어인 JAVA같은 것과는 다르다.
그런데 뻘짓을 하며 찾아보다 보니.. 자바스크립트 class도 존재한다는것을 알게됬다. 정말 자바스크립트 안에 완전하게 있는 건 아니고, ECMAScript라는 자바스크립트 문법 추가버전에서 사용이 가능한 기능이다.
(이런거 IE가 반영할 일은 없으니 IE 쓸 생각은 때려치워라.)
자바스크립트 Class
class 클래스명 { 내용 }
위와 같이 쓰면 class 생성이 끝난다. ES에는 class 라는 키워드 자체가 추가되어서, 저런식으로 정확하게 "이것이 클래스다" 라고 말해줄 수 있다.
그리고 일반적으로 JS에서 만드는 function 클래스와는 다르게 무조건 new를 사용해야만 한다. 그렇지 않으면 오류가 난다.
1 2 3 4 5 6 7 8 | class phone { constructor(name){ this.name = name; } } let myPhone = new phone("잼잼"); console.log(myPhone.name) | cs |
그리고 class 에서는 그냥 단순 함수인 prototype과는 다르게, 각종 함수들을 끼워넣는 방식으로 만든다. 클래스 내에 있는 함수들은 function 연산자 없이 함수명만 써주면 된다.
그중에, constructor 라는 함수는 "생성"을 했을 때 호출되는 함수다. new 연산자를 이용해서 호출했을때, 저 함수가 호출된다.
저기에서 초기화 할 함수들은 초기화해주면 되겠다.
이런식으로 "잼잼" 이 뜬다. constructor 함수에서 this.name을 잼잼 으로 만들었기 때문이다.
1 2 3 4 5 6 7 8 9 10 11 12 | class phone { constructor(name){ this.name = name; } static canPlayGame(){ return true; } } let myPhone = new phone("잼잼"); console.log(myPhone.name); console.log(phone.canPlayGame()); | cs |
또, 정적 멤버를 만들어 둘 수도 있다. 단순히 함수 앞에 "static" 키워드를 붙이면 된다. 그러면 이제 클래스명.멤버명 으로 바로 접근할수 있는 정적 함수가 된다.
여기서 주의할 점은! class에서 생성된 "객체" 로는 정적 함수에 접근할 수 없다. 무조건 class에서 바로 접근해야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 | class phone { constructor(name){ this.name = name; } static get canPlayGame(){ return true; } } let myPhone = new phone("잼잼"); console.log(myPhone.name); console.log(phone.canPlayGame); | cs |
이렇게 여러 키워드를 중첩시킬수도 있다. static과 get을 사용해서, 변수에 접근하려고 할때 true를 반환시키게 한다.
1 2 3 4 5 6 7 | class A extends Array {} let myA = new A; myA.push("one"); myA.push("2"); myA.push("삼"); | cs |
역시 클래스! 클래스답게, 리얼 상속도 가능하다.
자바랑 마찬가지로 extends 키워드를 쓰고 뒤에 상속받을 클래스명을 쓰면 상속받게 된다. 위 예제에서는 Array 라는 기본클래스를 상속했는데, 이렇게 할 경우 마치 array 인 것 처럼, push 함수도 이용할 수 있고 배열이 만들어진다.
여기에 마음대로 기능을 넣고 빼고 할수 있다.
주의할 점
주의할 점이 떠오른게 딱 하나 있는데, 바로 "호이스팅" 관련 문제다. 일반적으로 우리가 사용하는 function은 하나의 스크립트 더미에서 위에 있던 아래에 있던 가장 상단에서 정의한것처럼 만들어버린다. 아래에서 선언을 해도 그 위에서 접근이 가능하다는것.
하지만 class는 다르다. 무조건 사용되기 전에 선언을 해야 된다.
이런점만 주의한다면, class 사용하는데 큰 무리는 없을 것이다. 앞으로는 이런 최신 구문을 사용해서 클래스를 만들어보자!!
+
'프로그래밍 > javascript(ES)' 카테고리의 다른 글
자바스크립트 sleep 함수 (0) | 2018.05.29 |
---|---|
자바스크립트 eval 함수 (1) | 2018.03.19 |
자바스크립트 비트 연산자 (0) | 2018.01.25 |
자바스크립트 32 비트 정수 구조, 음수 int (2) | 2018.01.23 |
자바스크립트 정규식 RegExp 사용법 (0) | 2018.01.21 |