이상학의 개발블로그

[JavaScript] 원시 타입과 참조 타입 본문

JavaScript

[JavaScript] 원시 타입과 참조 타입

학학이 2016. 4. 13. 22:01

자바스크립트는 배우기 쉽지만 다루기 어렵다.

Node.js 를 사용하면서 자바스크립트와 친해지고 있는데 알면 알수록 어려운 언어이다. HTML과 함께 사용하는 웹 쪽 자바스크립트는 쉽게 느껴졌는데

제대로 알고 사용하려고 하니 까다로운 언어이다.


그래서 '객체지향 자바스크립트의 원리' 라는 책을 읽고 있는 중인데 잘 모르고 썻던 자바스크립트에 대해서 좀 더 알아가고 있는거 같아서 블로깅 한다.


타입

자바스크립트에는(ECMAscript5) 클래스라는 개념이 없다. (ECMA6 에는 생긴 것 같다.)

그래서 클래스를 대체하는 타입이라는 개념이 존재한다.

  • 원시타입
  • 참조타입


원시타입

  • Boolean    true || false
  • Number    정수 || 실수
  • String        문자열
  • Null            
  • Undefined


모든 원시 타입은 값을 표현하는 리터럴 형식이 있다.

리터럴 : 코드에 직접 입력된 이름이나 가격처럼 변수에 저장되지 않은 값. 값 자체

리터럴 예



자바스크립트 변수는 원시타입 값이 그대로 저장된다.(메모리 참조가 아닌 값의 복사)

변경 전 변수 객체

color1 

"red

color2 

"red









변경 후 변수 객체

color1 

"blue

color2 

"red




color2의 값은 변경되고 color1은 유지된다.



참조 타입

참조 타입은 ES5에서 클래스가 없기 때문에 클래스와 가장 가까운 개념이다.

참조 값은 참조 타입의 인스턴스이며 객체와 같은 말이다.

객체는 순서가 없는 프로퍼티로 이루어져 있으며 프로퍼티는 이름과 값의 구성이다.


객체 생성

객체 

이름

값 

 이름 

값 


인스턴스화 : 객체를 만드는 것

new 연산자와 생성자를 사용하는 방법

1
var object = new Object(); // 일반 객체를 하나 만들어 object라는 변수에 저장
cs

참조 타입은 할당된 변수에 값을 직접 저장하지 않는다. 그래서 object에 저장된 값은 객체 인스턴스가 아니라 객체가 있는 메모리상 위치를 가리키는 포인터다.



1
2
var object1 = new Object();
var object2 = object1; // ojbect2는 이제 object1과 같은 포인터를 참조한다.
cs




객체 참조 제거

JS는 가비지 컬렉션이 있어서 메모리 할당과 제거에 대해 고민 하지 않아도 된다( Java와 비슷 )

하지만, 명백히 사용하지 않은 변수에 대해서는 참조 제거를 해주는 것이 좋다.


1
2
3
var object1 = new Object();
 
object1 = null// null 값을 넣으면 참조 제거가 된다.
cs


객체를 수백, 수만개 이상 생성하는 대규모 서비스에선 혹시 모를 상황에 대비해 객체 참조 제거를 필수적으로 하는 것이 좋다.

프론트엔드 JS는 잘 모르지만, Node.js에선 로직상 객체를 많이 생성하고 활용한다.

경험 상 객체 복사를 잘못해서 서로 달라야할 2개의 객체가 한 메모리를 참조해 A 변경시 B를 변경해서 오류를 낸 적이 있다.


학교에서 배운 좋은 디자인은 모듈내 응집도는 높고 모듈간 결합도는 낮아야한다는 것을 다시 생각해보는 경험이었다.




Comments