당분간 javascript 정리하면서 기본개념을 포스팅하려고 해요.
그리고 더 나아가서 ECMAScript 6 관련 내용까지 이어가려고 합니다.
일단 첫 시작은 가볍게 하겠습니다.
바로 변수 타입에 대한 부분인데요.
※변수 생성 단계
자바스크립트는 모든 변수를 객체화해서 사용합니다.
그래서 객체기반언어라고 부르는 사람들도 있죠.
원리를 보면
1. 변수 생성 : 변수에 대한 접근자만 생성
(C언어로 굳이 따지면 void* 타입의 포인터만 생성하는 것처럼 동작하죠)
2. 값 할당 : 할당하는 값에 해당하는 타입의 객체생성 후 접근자와 연결
테스트 결과는 이렇습니다.
단순히 숫자만 넣었는데 메소드가 있네요 ㅎㅎ
이게 어떤걸 의미하냐면 변수 생성할때 타입 구분을 안한다는 거에요.
정확히 말씀드리면
타입은 있지만, 변수 생성 단계에서는 구분을 안합니다.
할당할 값을 보고 그거에 맞춰서 미리 정의된 객체로 생성하는 방식입니다.
자바스크립트의 타입은 크게 primitive 와 참조 방식으로 구분하고
primitive 타입은 당연히 기본적인 숫자 및 boolean 타입, null, undefined 가 되겠습니다.
그 이외에는 모두 참조 타입으로 보면 됩니다.
primitive도 null과 undefined 제외한 숫자, boolean은 Number, Boolean 객체와 연결이 되어서 각 객체의 function을 사용할수 있어요. 그래서 위에서 저렇게 숫자만 넣었는데도 메소드를 호출 가능한거죠.
(이 부분을 제대로 이해하려면 prototype의 동작 방식을 이해해야 하는데, 이 부분은 아직 함부로 설명드리지 못하겠습니다. 개념이 많이 복잡해서요;;; 대충은 이해하는데 그러면 너무 부정확하니까..)
☞ 주의 할 점은 문자 및 문자열이 좀 애매할 수 있는데요.
자바스크립트에서는 '문자'와 '문자열'을 구분하지 않고 문자는 길이 1의 문자열로 보며, 문자열은 당연히 String 객체로 감싸죠. 하나의 문자를 primitive로 볼 수 있는거 아니냐 생각하실텐데, 변수 생성 단계에서 String 객체로 감싸버리니까 변수를 호출하는 시점엔 이미 primitive 라고 할수 없는거에요.
그리고 숫자는 정수/소수 구분을 하지 않습니다.
변수에 정수를 담든, 소수를 담든 상관없이 Number 객체와 연결되죠.
☞ 앞으로 나올 예제를 대비해서 미리 설명을 추가하면
자바스크립트에선 function도 객체로 취급합니다.
뭐 C언어도 보면 포인터로 function 접근 가능하긴 한데,
이와는 완전히 다른게 function 정의를 객체로 묶어버린다고 생각하시면 되요.
그래서 function을 변수처럼 생성하는 게 가능하며, 이를 복사하는 것도 가능합니다.
아래 이미지는 그 예제입니다.
※ 변수 비교
변수를 할당했으면 그 다음부턴 어떻게든 지지고 볶고 하겠죠.
이때 주로 이슈가 되는 부분이 변수 간의 비교입니다.
자바스크립트에서 변수가 동일한지 비교하는 연산자는
'==' 와 '===' 두가지가 있습니다.
(위 사진은 크롬 개발자도구에서 콘솔 열어서 입력하고 결과 뽑아본 것입니다.
크롬 열어서 바로 테스트 하시면 되고요.)
C 기반 언어나, 자바에서 '==' 로만 써와서 '===' 는 어색하실텐데요.
'===' 는 변수의 참조 타입을 먼저 비교하고 그 후 객체가 갖고 있는 값들의 동일여부를 보겠다는 거에요.
'=='는 위와는 반대로 객체 안의 값들이 동일한 거면 참조 타입이 다른건 자동적으로 치환이 가능한 범위에서 동일한 걸로 보겠다는 거죠.
하드체킹과 소프트체킹의 차이 정도로 생각하시고 쓸 때 유의하시면 될거 같습니다.
primitive와 Number, Boolean 등의 Wrapper 객체와의 차이가 여기서 보이죠?
primitive도 Wrapper 객체처럼 사용할 수는 있으나, 엄밀히 말해서 동일한 타입은 아닌거죠. 그래서 변수 생성 쪽에서 설명할 때 '연결'이라는 단어로 설명했습니다.
※ 정리
자바스크립트의 가장 큰 특징은 위에서 본거 처럼 변수의 타입에 대해 느슨하게 관리한다는 거죠. 기존 프로그래밍 언어와의 차별점인데요. 아마 이 부분 때문에 자바스크립트를 깊게 공부하는 걸 시작도 못하는 분들이 많으실 거에요. 아마 jsp 같은 웹 페이지 내에서 자바스크립트를 구현할때는 '=='로 충분하고 오히려 이거만 쓰는게 더 효율적인 때가 많습니다. 대신 Node.js 같은 Server Side Javascript 환경에서 견고한 코드를 짜야한다면 '===' 연산자가 훨씬 정확도를 높일 수 있는거죠. 표준으로 정의된 걸 보면 '===' 연산자를 권장한다고 하는데, 차이점을 잘 알아두는게 먼저일거 같네요.
이에 대한 자세한 설명은 여기를 참조하시면 될거 같습니다.
이상입니다~
'Web 개발 (업데이트 없음)' 카테고리의 다른 글
자바스크립트 개념 정리 (3) - prototype 1탄 (0) | 2018.10.28 |
---|---|
자바스크립트 개념 정리 (2) - context & scope (0) | 2018.10.28 |
자바스크립트 표준 ES6 문법 체킹을 위한 JSHint (0) | 2018.10.28 |
MEAN Stack 강의 사이트 안내 (0) | 2018.10.28 |
Angular 기본 구조 이해 #2 (0) | 2018.10.28 |