Javascript - 기본 자료형과 메서드

  • 기본자료형도 속성을 가지고 있다.
  • 기본자료형에 메소드를 입력하면 일시적으로 객체로 변환됨.
  • 라인이 끝나는 순간 객체에서 기본자료형으로 복귀
var primitiveNum = 273;
var objectNum = new Number(273);

document.write(typeof(primitiveNum));	//number 타입
document.write(typeof(objectNum));	// object 타입

기본자료형의 메서드 –> 일회용 옷의 개념
한번 사용하고 버린다

primitiveNum.a =10;
// primitiveNum.a에 10 할당
// 라인이 끝나는 순간 다시 기본자료형으로 복귀

document.write(primitiveNum.a);
// 윗 라인에서 선언된 primitiveNum과 관계없이 undefined 출력

메서드를 추가하여 기본자료형일회용 메서드로서 활용 가능

Number.prototype.power = function (){
  return this *this;
}
document.write(primitiveNum.power());	// 273*273 = 74529

Javascript - 값복사와 참조복사

1. 기본 자료형(숫자,Bool,문자열) - 값 복사
  • 값 복사(깊은 복사) : 할당된 데이터 값을 복사
  • 기본 자료형은 가볍기 때문에 실질적인 데이터 값을 복사
  • clone
var originalValue = 10;
var newValue = originalValue; // newValue = 10

originalValue=273;  //originalValue 값 변경

document.write(originalValue);	// originalValue = 273
document.write(newValue);	// newValue = 10
2. 특수자료형 (객체,배열, …) - 참조 복사
  • 참조복사 : 자료형에 할당된 주소값(참조)을 복사
  • 배열 내부에 있는 메모리 주소가 복사됨`
  • 복사된 배열의 값이 동일하게 변경됨
var originalArray = [1,2,3,4];  //주소값 : 0x10
var newArray = originalArray;   //주소값 : 0x10

originalArray[0] = 273; // 원본 배열의 0번째 값 변경

document.write(originalArray);
// originalArray = [273,2,3,4]

document.write(newArray);
// newArray = [273,2,3,4]
3. 배열을 값복사로 사용하고 싶을 때
  • 새로운 배열을 생성하여 원본 배열의 데이터 값을 복사
  • 주소값이 다르기 때문에 영향을 받지 않음.
var orgArr=[1,2,3,4];
var newArr=[];	//새로운 배열 생성

for(var i=0; i<orgArr.length; i++){
  newArr[i] = orgArr[i];
}	//배열의 값 복사

orgArr[0] = 223; // 원본 배열의 0번째 값 변경

document.write(orgArr);	//orgArr = [223,2,3,4]
document.write(newArr);	//newArr = [1,2,3,4]

See the Pen Javascript : 값복사와 참조복사 by Cathy Go Eun Woo (@cathy-go-eun-woo) on CodePen.

Javascript - Object 객체

  • 자바스크립트에 내장되어있는 모든 기본 객체들의 부모
  • Object 객체가 가지고 있는 기능들을 모든 객체(Number 객체 … )들이 상속을 받아 활용
1. Object 객체기능

자주 사용되는 편은 아님.

constructor
hasOwnProperty
isPrototypeOf
propertyIsEnumerable
toLocaleString
toString,valueOf
2. Constructor 를 활용한 자료형 구분
  • 자료형이 다른 두 데이터를 비교하고 싶을 때
  • typeOf 는 데이터 타입이 다를 때 비교가 불가능
  • 객체형 데이터도 숫자로 취급하여 데이터 타입을 확인하고 싶을 때,
  • constructor(생성자 함수)를 활용 : 자바 스크립트 모든 객체가 가지고 있는 메서드
  • constructor : 자기 자신을 생성할 때 사용하는 함수
function isNumber(value){
  return value.constructor === Number;
  //매개변수의 자료형이 숫자인지 판별
}

var primitiveNum=273;
var objectNum = new Number(273);

document.write(isNumber(primitiveNum)); //숫자(기본자료형) : true
document.write(isNumber(objectNum));  //숫자(객체자료형) : true
document.write(isNumber("string")); //문자열 :false
document.write(isNumber(false));  //boolean : false

See the Pen Javascript : Object 객체 by Cathy Go Eun Woo (@cathy-go-eun-woo) on CodePen.

Javascript - Call ()

  • call() : 모든 함수가 내장하고 있는 메서드
  • call 을 사용하여 다른 객체에 속한 함수를 사용할 수 있음.
  • 첫번쨰 매개변수 : this (메서드를 사용할 객체 지정)
  • 두번째 이하 매개변수 : 호출하는 함수로 전달
var person1 = {
    성 : "우",
    이름 : "고은",
    평균 : function(국어, 영어, 수학) {
        var avg = ((국어 + 영어 + 수학) / 3).toFixed(2);

        return this.성 + " " + this.이름 + "의 평균점수는 " + avg + "입니다.";
        }
};

var person2 = {
    성 : "김",
    이름 : "이박"
};

person2 에서 person1 의 메서드를 가져와 사용
thisperson2로 지정

document.write(person1.평균(80,80,90));
document.write(person1.평균.call(person2,80,90,85));  

See the Pen Javascript : Call () by Cathy Go Eun Woo (@cathy-go-eun-woo) on CodePen.

Javascript - 캡슐화 (Encapsulation)

  • 캡슐화 : 정보 은닉하기
  • 객체의 자료와 행위를 하나로 묶고, 실제 구현내용을 외부에 감춘다.
  • 캡슐화 규칙 : 속성명을 밑줄로 시작하는 것

캡슐화 방법 1. 밑줄(_)로 시작하는 변수는 ‘절대 건드리지 말자’라는 약속!
  • 한계점 : 개발자들의 언어 규칙일 뿐, 실제 자바스크립트 내에서 제한 할 수는 없음.

1.1 Rectangle 생성자 함수 선언

function Rectangle(width, height){
  this._width = width; // width 변수는 건드리지 말자.
  this._height = height; // height 변수도 건드리지 말자.
}

1.2 메서드(프로토타입) 선언

Rectangle.prototype.getArea = function (){
  return this._width * this._height;
}

1.3 인스턴스 생성 및 출력

var rectangle = new Rectangle(5,7);
document.write('Area : ' + rectangle.getArea() );	// Area : 35

See the Pen Javascript 캡슐화 1 : 밑줄로 시작하는 속성명 by Cathy Go Eun Woo (@cathy-go-eun-woo) on CodePen.


캡슐화 방법 2. 클로저를 활용하여 외부에서 변수에 접근할 수 없도록 하자.
  • Getter / Setter 이용하여 캡슐화하기
  • 내부에 코드를 작성하여 원래 변수를 보호하는 목적
  • 자기 자신도 직접 접근이 불가능하기 때문에 getter 를 이용하여 접근
  • 한계점 : 생성자 함수 안에 Getter/Setter 함수를 선언하므로 약간의 메모리 낭비가 발생
  • 하지만, 완벽한 캡슐화가 가능하다.

2.1 Rectangle 생성자 함수 선언
생성자 함수 안에 Getter/Setter 선언

function Rectangle (width, height) {
  var _width = width;
  var _height = height;

  // 2.1.1 Getter
  	this.getWidth = function () { return _width; }
  	this.getHeight = function () { return _height; }

  // 2.1.2 Setter : 0보다 작은 수를 입력하면 값 세팅 불가 !
  	this.setWidth = function (value) {
    	if(value<=0){ return alert("0보다 작은 값은 넣을 수 없습니다."); }
    	_width=value;
  	}

  	this.setHeight = function (value) {
 		 if(value<=0){ return alert("0보다 작은 값은 넣을 수 없습니다."); }
    	_height=value;
   }

}

2.2 메서드(프로토타입) 선언
자기 자신도 직접 접근이 불가능 –> getter 를 이용하여 접근

Rectangle.prototype.getArea = function (){
  return this.getWidth() * this.getHeight();
}

2.3 인스턴스 생성 및 출력

var rectangle = new Rectangle(5,7);
rectangle.setHeight(10); // 값 변경하기
document.write('Area : ' + rectangle.getArea() );	// Area : 50

See the Pen Javascript 캡슐화 2 : 클로저 사용 by Cathy Go Eun Woo (@cathy-go-eun-woo) on CodePen.


캡슐화 방법 3. 혼합하기.
  • (방법1) + (방법2) 혼합하여 사용
  • 기존의 클로저 방식의 메모리 낭비 문제를 해결하기 위한 타협점
  • 프로토 타입으로 캡슐화하기

3.1 Rectangle 생성자 함수 선언

function Rectangle (width, height) {
  this._width = width;
  this._height = height;
}

3.2 Getter/Setter 를 프로토타입으로서 선언
리턴 타입을 this.속성명 형태로 변환

  Rectangle.prototype.getArea = function (){
    return this._width * this._height;
  }

  Rectangle.prototype.getWidth = function () {
    return this._width;
  }

  Rectangle.prototype.getHeight = function () {
    return this._height;
  }

  Rectangle.prototype.setWidth = function (value) {
    if(value<=0) { return alert("0보다 작은 값은 넣을 수 없습니다."); }
    this._width = value;
  }

  Rectangle.prototype.setHeight = function (value) {
  if(value<=0) { return alert("0보다 작은 값은 넣을 수 없습니다."); }
    this._height = value;
   }

2.3 인스턴스 생성 및 출력

var rectangle = new Rectangle(5,7);
rectangle.setHeight(20);	// 값 변경하기
document.write('Area : ' + rectangle.getArea() ); // Area : 100

See the Pen Javascript 캡슐화 3 : 혼합 by Cathy Go Eun Woo (@cathy-go-eun-woo) on CodePen.