공부를 하다 놀라운 사실을 알게 되었다. tutorialspoint에서 자바스크립트 항목을 보고 있는데 항목에 객체지향이라는 부분이 있는게 아닌가? 해당 항목으로 들어가보니 첫머리에 이렇게 적혀 있었다.
JavaScript is an Object Oriented Programming (OOP) language.
자바스크립트는 객체 지향 프로그래밍 언어입니다.
놀라운 정보에 바로 조사에 착수했다. 나는 지금 자바스크립트를 이용해서 웹게임을 만드는 프로젝트를 진행하고 있는데, 자바를 배우면서 자바스크립트도 class같은 개념이 있어서 필드랑 함수를 효율적으로 관리할 수 있었으면 좋겠다 생각하고 있던 찰나였기 때문이었다. (내가 만드는 웹게임은 하나의 기능이 조금씩 형태를 바꾸면서 자주 반복되기 때문. 예를들어 전투시스템 같은 경우) 조사를 해보니 자바스크립트에도 자바와 마찬가지로 class라는 개념이 있었다. 놀랍다!
본문
프로그래밍 언어는 다음과 같은 네 가지 기본적인 기능이 제공되는 경우 객체 지향 언어라고 불릴 수 있다.
- 캡슐화(Encapsulation)
- 상속성(Inheritance)
- 다형성(Polymorphism)
- 추상화(Abstraction)
자바스크립트가 이에 해당하는 특성을 모두를 가지고 있는지는 조금 더 공부가 필요해 보이지만 현재로는 1, 2, 3번은 해당이 되는 듯하다. 근거는 다음과 같다.
- 캡슐화 : 자바스크립트는 멤버필드에 public 접근과 private 접근 권한을 제어할 수 있다. (but 이것은 정말로 최신기능이기 때문에 실제로 사용되려면 시간이 필요할 수 있다고 한다.)
- 상속성 : 자바스크립트는 클래스를 상속할 수 있다. 자바와 마찬가지로 extends 키워드를 사용해서 특정 클래스를 상속하고 상속받을 수 있다.
- 다형성 : 자바스크립트는 오버라이딩(Overriding)이 가능하다. 오버로딩이 되는지는 조금 더 확인이 필요할 것 같다. (생성자를 두개 만들어서 테스트 해 보았는데 "A class may only have one constructor(클래스는 하나의 생성자를 가져야 합니다.)"라는 오류를 만났다. 자바스크립트 문법을 아직 잘 모르기 때문에 확실히는 조금 더 공부가 필요할듯. 아래의 사진 참고)
오늘 알게된 부분과 문법들을 아래에 순서와 상관없이 정리하고 이 글을 마치도록 하겠다. (아직은 추가적인 공부가 필요하다!)
+ 명시해야 할 부분 : 위 문법은 과거에도 허용되던 문법이었지만 ES6 이후 정식적으로 class의 개념이 자바스크립트에 도입이 되면서 class의 형태로 사용이 되었다고 한다. (과거에는 class를 따로 정의하지 않았다고 한다.)
문법 정리
1. class 선언
class Animal {
//constructor
constructor(species, age) {
//fields
this.species = species;
this.age = age;
}
//methods
move() {}
eat() {}
}
자바와 두드러지게 차이가 나는 부분은, 자바스크립트는 따로 멤버 필드를 선언하지 않는다는 것. 필드를 생성자 내부에서 정의하고 선언한다는 것이 가장 차이나는 부분인 것 같다. 두 번째로 다른 부분은 생성자를 선언할 때 클래스의 이름을 그대로 따르지 않고 constructor라고 표기하는 것.
- javascript는 멤버 필드를 생성자 내부에서 정의한다.
- javascript에서 생성자는 클래스의 이름을 따지 않고 constructor라는 이름을 쓴다.
그 이외 부분은 자바와 놀랍도록 유사한듯.
2. 인스턴스 생성
class Animal {
//constructor
constructor(species, age) {
//fields
this.species = species;
this.age = age;
}
//methods
move() {}
eat() {}
}
const puppy = new Animal("dog", 3);
인스턴스를 만들어 객체화 할때도 자바와 대체로 비슷하다. 다만 데이터타입을 따로 명시하지 않는다는 점이 다른 것 같다. 콘솔에 새로운 인스턴스 puppy를 찍으면 저렇게 object(자바스크립트 배울 때 저런 형태를 object라고 한다고 배웠던 기억이 있는데 이래서 저걸 object라고 했었구나... 충격)가 출력이 되는데 아래의 Prototype은 뭔지 모르겠다. 공부하다보니 언급이 되는 부분인 것 같은데 다음에 공부해봐야 할듯.
- 인스턴스를 만들 때 자바스크립트는 데이터타입을 따로 명시하지 않는다.
3. Getter & Setter
class Animal {
//constructor
constructor(species, age) {
//fields
this.species = species;
this.age = age;
}
//getter and setter
get getAge() {
return this.age;
}
set setAge(age) {
this.age = age;
}
}
getter와 setter의 경우 형태가 많이 달라서 조금 헷갈렸다. 자바였다면 int getAge(), void setAge() 이렇게 했을텐데 자바스크립트는 따로 앞쪽에 get, set을 명시해서 사용하는 것 같았다. 조금 혼란스러운 부분
- 자바스크립트는 get, set을 따로 명시한다!
4. public & private
이 부분은 최근에 추가된 기능이기 때문에 아직 사용되지 않을 수 있다고 한다. 브라우저에 따라서는 지원을 안할 수 있다.
자바스크립트는 생성자를 사용하지 않고 필드를 정의할 수도 있는데, 만약 변수명을 그냥 평범하게 지을 경우는 public 접근제어가 붙고 접두사?로 #을 붙이면 private 접근제어가 붙는다고 한다.
- isPublicField = 1; // public 변수
- #isPrivateField = 2; // private 변수
추가적으로 따로 챕터를 두지 않았지만 static 기능도 지원을 한다고 하며 이 또한 최신 기능이기 때문에 실제로 사용하기까지는 시간이 필요할 수 있다!
5. 상속
class Animal {
//constructor
constructor(species, age) {
//fields
this.species = species;
this.age = age;
}
}
class Human extends Animal {
constructor(species, age, name) {
super(species, age);
this.name = name;
}
}
상속도 지원이 된다! 상속은 아직까지 확인한 바로는 자바와 완전히 동일한 것 같다. 프로젝트를 할 때 코드 효율성이 비약적으로 증가할듯... (패키지 개념은 없겠지? 파일 두개로 나눠서 작업해도 클래스를 불러올 수 있으려나..?)
6. 오버라이딩
class Animal {
//constructor
constructor(species, age) {
//fields
this.species = species;
this.age = age;
}
move() {
console.log("주로 4발로 걷습니다.")
}
}
class Human extends Animal {
constructor(species, age, name) {
super(species, age);
this.name = name;
}
move() {
console.log("사람은 술을 마시지 않으면 주로 두발로 걷습니다.")
}
}
Animal 클래스의 move가 "주로 4발로 걷습니다"이었음에도 Human 클래스에서 move 메소드(자바스크립트에서는 함수라고 불러야하나?)를 오버라이딩 했기 때문에 위와 같은 메시지가 출력된다. 이는 다형성에 대한 예로, 상속과 함께 코드의 효율성을 비약적으로 증가시킬 수 있을 것으로 여겨진다.
7. instanceof
자바스크립트에도 자바와 동일하게 특정 객체가 어떤 클래스의 인스턴스인지를 판별할 수 있는 기능이 존재한다. 바로 instanceof.
테스트를 위해 임의의 class God를 만들고 Jinseok이라는 객체가 Human의 인스턴스인지, God의 인스턴스인지 판별해보았다. 결과는 위의 그림과 같다. 아쉽지만 Jinseok은 신이 아니라 인간이다. (논외이지만 개인적으로 객체라는 개념은 나에게 플라톤의 이데아를 떠올리게 한다. class는 이데아, instance는 현상. 뭔가 공학적인 요소로 철학을 설명할 수 있을 것 같다. 진짜 tmi 논외다.......)
이상으로 오늘은 객체지향언어로서의 자바스크립트의 모습을 조금 살펴보았다. 자바를 배우면서 얻었던 정보들을 다른 언어를 배우면서 똑같이 적용할 수 있다는 부분에서 많은 생각을 했었던 공부였다. 결국 프로그래밍 언어란 인간의 필요에 의해 만들어진 인위적인 언어라고 생각한다. 자연적인 언어같은 경우와는 달리 철저하게 필요에 의해 만들어진 언어이기 때문에 이렇게 한개의 언어적 요소가 다른 언어와 거의 1:1로 상응하며 닮을 수 있는 것은 아닌가 싶다. 인위적인 의도로서 탄생한 프로그래밍 언어의 이러한 특수한 특성을 이해한다면 언어를 배우는데 많은 아이디어를 얻을 수 있다고 생각한다. 프로그래밍 언어에 대한 (약간은 인문학적인?) 이러한 이해가 심화되고 구체화되면 될수록 언어를 바라보는 시각이 더욱 깊어질 것이라고 생각한다. 그리고 이는 곧 좋은 개발자가 될 수 있는 훌륭한 자양분이 될 것이라고 나는 생각한다.
많은 부분에서 수확이 있었던 공부였다.
'JavaScript' 카테고리의 다른 글
자바스크립트 공식사이트 | 개발 환경설정 (0) | 2021.09.21 |
---|