태그 글목록: 자바스크립트

프로토타입(prototype)1 – 속성상속

create()

var stooge = {
	"first-name" : "Jerome",
	"last-name" : "Howard"
};
var another_stooge = Object.create(stooge); 

Object.create(stooge); 를 통해
stooge 오브젝트와 another_stooge는 프로토타입으로 연결되었다.
좀 더 정확히 말하면 another_stooge가 stooge의 요소를 상속받고 있다.

stooge와 another_stooge 모두 “first-name”, “last-name” 요소를 갖고있다.

먼저 stoogenickname을 추가해보자.

stooge.nickname ="Curly";
//stooge 
 Object {first-name: "Jerome", last-name: "Howard", nickname: "Curly"}

와 같은 결과를 갖는다.

이제 두 객체에서 nickname을 접근해보면

stooge.nickname         // "Curly"
another_stooge.nickname // "Curly"

로 같게 나온다.

another_stoogenickname을 추가해보다

another_stooge.nickname ="Moe";

그리고 두 객체에서 nickname을 접근해보면

stooge.nickname         // "Curly"
another_stooge.nickname // "Moe"

stooge의 nickname은 변경이 안되었다.
사실 another_stooge 도 변경됬다기 보다는
nickname 요소를 another_stooge객체 자신이 갖고있는 것과 stooge객체에서 상속받은것 두개인것이다.
대신 자신의 요소를 먼저 바라본다. 이를 확인해보기위해 nickname요소를 삭제해본다.

delete

객체의 요소를 삭제할때는 delete를 사용한다.

delete another_stooge.nickname;

이 때 자신의 것만 삭제되고 상속받은 것은 삭제되지 않아 계속 nickname접근이 가능하다.

stooge.nickname         // "Curly"
another_stooge.nickname // "Curly"

프로토타입의 요소로 접근되는것이라 stooge 와 같은 결과를 얻는다.

javascript에서 Object(객체)내의 element(요소) 접근

다음은 flight  객체이다.

var flight = {
	airline : "Oceanic",
	number : 815,
	departure : {
		IATA : "SYD",
		time : "2015-09-22 15:55",
		city : "Sydney" 

	},
	arrival: {
		IATA : "LAX",
		time : "2015-09-23 15:55",
		city : "Los Angeles"
	}
}

flight 객체안에 airline 요소를 접근하는 방법

  1. flight.airline      // “Oceanic”
  2. filght[“ariline”] // “Oceanic”

결과는 같다.

var stooge = {
	"first-name" : "Jerome",
	"last-name" : "Howard"
};

하지만 위  first-name 처럼 하이픈(“-“)이 들어가면 연산작업이 이루어지므로 따옴표(“) 고 감싸주어야 한다. 예약어를 굳이 사용하고자 할때도  마찬가지이다.
이때는 ‘.’으로 접근 할 수 가 없다.

  1. stooge.first-name      //NaN (x)
  2. stooge[“first-name”] // “Jerome” (o)

javascript 로또 자동번호 생성

우리나라 로또추첨방식은 6/45 즉, 45개의 공중에 6개의 공을 선택한다.
45개의 숫자중 6개의 숫자를 무작위로 선택 후 작은번호부터 재배열 하는것이다.

기존의  알고리즘이 난수를 발생하여 45개중 공을 선택하여 기존의 공과 중복이 되는지를 검출했다면
좀더 효율적인 방법이 없을까 하여. 한번 뽑아낸 공은 제외시키고 그 다음공은 나머지 공에서 추출하는 방법을 고민해보았다.
(이 방법이 현실과 닮아 있긴하다)

  • 일단 반복문을 통해 push()로 1 ~ 45번까지 aryLotto 배열에 담는다.
    그리고 바로  여섯 번에 걸쳐 공을 꺼내게 되는데
  • Math.random() 난수발생 후  Math.floor()를 통해 0~44 까지의 임의 숫자를 생성한다.
    보통 1~45의 숫자를 선택하기 위해 난수발생후 +1을 해주지만 이번방식은 배열의 위치만을 사용할것이므로 그대로 쓴다.
  • 만약 첫번째 난수로 33가 나왔다면 이는 ’34’이란 숫자가 선택된것이다. (idx 변수에 담았다)
    이 34이란 숫자는 나의 로또 번호중 첫번째가 되었다. 이를 배열 myLotto에 push()해서담는다.
  • 담고나서 기존 45개 배열aryLotto에서 선택된 숫자 ’34’ (배열index 로는 33)를 splice()를 통해 삭제한다. splice(idx,1) 에서 첫번째 인자는 배열 index이고 두번째 인자는 갯수이다.(한개의 번호만 제외하는것이므로 1을 사용했다.)
var myLotto = [];
var aryLotto = [];
var idx = 0;

for (var i = 1; i < 46; ++i) aryLotto.push(i)  

while (myLotto.length < 6){
    idx = Math.floor(Math.random()*aryLotto.length);
    myLotto.push(aryLotto[idx]);
    aryLotto.splice(idx,1);
}
  
myLotto.sort(sortNumber);
  
function sortNumber(a, b) {
  return a - b;
}
  • 다시 정리하면 45개의 숫자가 담긴 배열에서 33번째숫자(34)를 선택해서 새배열에 담고
    그 33번째 숫자(34)를 삭제한것이다.
  • 이 과정이 5번반복되면 되는데 중요한것은 빠진 숫자만큼 전체갯수가 줄었기때문에 난수발생시 그만큼 숫자를 줄여야 한다. (첨에 45개중에 골랐다면 그담은 44개중에 골라야하므로)  이는 aryLotto의 배열의 길이(aryLotto.length)와 같으므로 난수발생시 이 길이를 곱해주면된다.
  • 5개의 숫자가 담겼다. 하지만 무작위로 선택된 5개의 숫자를  작은 수 부터 정렬하면 좋겠다. javascript에서 sort()라는 정렬함수를 제공하지만 이는 수를 크기별로 정렬하지 못하고 알파벳순으로 정렬한다.(예를들어 5, 11,7,1,3,10,8 를 sort로 정렬하면 1,10,11,3,5,8 로 정렬된다  우리가 기대한 1,3,5,7,8,10,11이 아니다) 그러므로 펑션을 하나 써서 sort를 해주어야한다.
    function sortNumber(a, b) {
      return a - b;
    }
    aryMyLott.sort(sortNumber);
  • 이제 정렬이 제대로 된다.

이로서 javascript를 이용한  중복검사를 하지 않는 로또자동생성 프로그램을 만들어 보았다.이 프로그램에 사용된 js함수를 정리하면 다음과 같다.

  • push()
  • Math.random()
  • Math.floor()
  • splice()
  • sort()