본문 바로가기
시작/TIL(Today I Learned)

221107 JavaScript - DOM과 BOM , 배열 연습, 간단한 알고리즘 문제(선형검색, 완전탐색), 로또 번호 생성기 만들기

by 백씨네 2022. 11. 8.

오늘 내가 배운 것

1. DOM 과 BOM

2. 배열

  • 배열의 기초
  • 배열 선택하기, 배열 길이 구하기
  • 배열에 요소 추가하기
  • 1~100까지를 담은 배열 만들기
  • 배열 안에 요소를 빼기

3. 간단한 알고리즘 문제

  • 선형검색(완전탐색) (Linear search) 

4. 로또 번호 생성기

 

 

 

1. DOM 과 BOM

 

DOM (문서 객체 모델)
DOM = Document Object Model 의 약자이고, 여기서 Document는 HTML을 말한다.


DOM은 자바스크립트로 html을 조작하는 기능을 `브라우저`가 구현한 것
브라우저 기본적으로 HTML, CSS, JS를 해석하는 능력이 있다.
브라우저가 js를 이용해서 HTML, CSS를 조작할 수 있는 기능을 `DOM` 이라고 한다.

 

BOM (브라우저 객체 모델)
BOM = Brower Object Model 의 약자, 문서 이외의 모든 것을 제어하기 위해 브라우저가 제공하는 추가 객체

`navigator` 객체는 브라우저와 운영체제에 대한 정보를 제공한다.
`location` 객체는 현재 URL을 읽을 수 있게 해주고 새로운 URL로 변경(redirect)할 수 있게 해 준다.
`alert`/`confirm`/`prompt` 역시 BOM의 일부입니다. 문서와 직접 연결되어 있지 않지만, 사용자와 브라우저 사이의 커뮤니케이션을 도와주는 순수 브라우저 메서드이다.


Web APIs(Application Programming interface) : 비동기로 돌아간다.


    - DOM : Document object Model
    - BOM : Brower object Model

 


JavaScript 의 표준이 아니다

* interface : 어떠한 동작을 원할 때 그 동작을 하는 기능을 만드는 것.

 

console.log(this)
console.log(window)
console.log(this === window) // t / 같은 객체를 바라보고 있다. //참조형

window 객체 :


1. 브라우저 창(browser window)을 대변하고, 이를 제어할 수 있는 메서드를 제공
2. 자바스크립트 코드의 전역 객체이다.

`console.log(window)`를 출력해보면 console창에 window 객체에 대한 메서드가 많이 나오는데
그중에 document 안에 있는 기능이 다 DOM의 기능이다.

document 경로를 선택할 때 최상위인 window부터
window.document.getElementById()가 기본인데 window는 `생략 가능`하다.

 

 

<!-- html에 작성한 데이터  -->
<h1 id="title"></h1>
    <span>span2</span>
    <h2 id="DOM-title">
        DOM
        <span class="sp">span1</span>
        <span class="sp">span1</span>
        <span class="sp">span1</span>
    </h2>
const title = window.document.getElementById("title")   
// 메서드 // 리턴값 : html 엘리먼트 or null
//  참조 형태
// title에 대입시킨다.


console.log(title)  //title 의 출력값 확인하고
title.innerHTML = 'DOM에 오신 것을 환영합니다.'  // title 안에 내용을 바꿔서 호출 한다.

// 도큐먼트 뒤에 s 있으면 복수형
const sp = document.getElementsByTagName('span')  // span이라는 태그를 다 선택
console.log(sp)  // 배열로 리턴해줌..



//body 내에 h2에 span 을 선택하려면

const domTitle = document.getElementById("DOM-title") //domTitle에 id로 할당한 DOM-title을 대입한다. 
console.log(domTitle) 
const spList = domTitle.getElementsByTagName('span') // #DOM-title 안에 span 태그를 선택하여 spList에 대입
console.log(spList.length)  // spList의 배열의 길이 확인하기

 

문제 1

코드 짜기 전 순서 정리
span1 3개를 span1-1, span1-2, span1-3으로 바꿔주기.
1. 0~2까지 반복하는 for문
2. spList Element를 각각 출력
3. span 1-1  span 1-2 span 1-3으로 바꿀 것이다.

for(i = 0 ; i < spList.length ; i ++){
    console.log(i) // 1. 
    console.log(spList[1])  //2.
    spList[i].innerHTML = 'span1-' + (i+1) //3.
}



// 만약 클래스를 지정했다면

const spList2 = domTitle.getElementsByClassName('sp')  //className도 여러개 선택할 수 있기 때문에 -s 복수형

for(i=0; i < spList2.length; i++){
    spList2[i].innerHTML = "span1-" + (i+1);
}

 

HTML- id, class 호출하기

//바디 안에 id or class를 getElement를 이용해서 호출하는 방법

document.getElementById()
document.getElementsByClassName()

//`getElementById` : ELement의 id값을 호출 하기 위해 사용한다. id는 1개만 선택할 수 있음. 
//똑같은 이름의 id로 지정할 수 있지만 getElement로 호출 시 중복된 id값은 제일 앞에 있는 id 만 호출이 된다.

 

HTML에서  <li> 를 선택하는 방법

<body>
    <h1>logo</h1>
    <ul id="gnb">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
    <script src="./public/js/array.js" type="text/javascript"></script>
</body>
//방법 1 : id를 부여한 태그를 새로운 변수에 대입하여 호출하고, 
//		그 변수를 시작해서 li값을 호출한다.2단계이기 때문에 코드도 길어지고, 가독성이 안좋다. 
const gnb2 = document.getElementById("gnb")
const list2 = gnb2.getElementsByTagName("li")



//방법 2 : 이게 제일 많이 쓰이는 방법이 될텐데, querySelector을 이용하여 작성한다. 
//		CSS에서 사용하던 문법, 직관적이라 보기 편하다, 

const list = document.querySelectorAll('#gnb > li')   //파라미터는 string 타입!!!

//li 전체를 선택하고 싶었기 때문에 querySelectorAll 이고 1개만 선택하고 싶을 땐 querySelector 로 작성한다.(s 없음.)

 

 

 

 

2. 배열

 

배열의 기초

// 배열
const arr = []
const arr2 = []   
console.log( arr===arr2)//False 참조형이기 때문 두 배열 모두 안에 요소가 비었지만 같지않다.

배열 하나에 여러 가지 형태의 데이터 타입을 사용하는 것은 좋지 않다. (사용하는 것 자체는 에러 없음.)


배열 선택하기, 배열 길이 구하기

//index         0         1         2
const arr = ["apple", "banana", "orange"]

// apple, orange, banana 를 console에 출력하고, 배열의 길이를 구하시오
console.log(arr[0])
console.log(arr[1])
console.log(arr[2])
console.log(arr.length)

// apple, banana, orange를 for문을 이용하여 console 에 출력하시오.
for(i=0; i < arr.length; i++){
    console.log(arr[i])
}

 

배열에 요소 추가하기

 

push() : 배열의 마지막에 추가하여 준다.

//방법 1
arr[3] = 'melon'

//방법 2
arr.push("melon")


1~100까지를 담은 배열 만들기

// 1부터 100까지 배열로 표현하기

// 빈 배열 length : 0
const arr3 = [] 

//방법 1
for(i=0; i<100 ; i++){
    arr3[i] = i+1
}

console.log(arr3)

// 방법 2
for( i=1; i <=100; i++){
    arr3.push(i)
}

    console.log(arr3)

 


배열 안에 요소를 빼기

1. pop() : 배열의 마지막 요소를 삭제한다.

// melon 삭제

const arr = ["apple", "banana", "orange", "melon"]

arr.pop() // const arr = ["apple", "banana", "orange"]
console.log(arr) 
arr.push("melon") // const arr = ["apple", "banana", "orange", "melon"]

 

 

2. splice(A,B) : 배열에서 중간에 있는 요소를 뺀다.
parameter A : 삭제할 요소의 인덱스 값 (시작점)
parameter B : 시작점부터 삭제할 요소의 개수

const arr4 = [1,2,3,4,5,6]
arr4.splice(2,1)   // 인덱스 2번 부터 1개 (인덱스 2번만 삭제)
console.lol(arr4)  // [1,2,4,5,6] 배열 자체의 값이 변한다.



3.slice(A,B) : 보이고 싶은 값을 선택한다.
parameter A : 보일 인덱스 번호 (시작점)
parameter B : 보일 인덱스 번호 (종료점 - 미만!)

 

const arr4 = [1,2,3,4,5,6]
let arr5 = arr4.slice(2,5) // 인덱스2번 ~ 인덱스 4번까지 (5미만)
console.log(arr4)  // [1,2,3,4,5,6]
console.log(arr5)  // [3, 4, 5]

arr4의 데이터를 잘라서 arr5에 대입시켜 출력한 것이므로 arr4의 값은 변화가 없다
parameter B의 값이 `미만`임을 주의하자..

 

 

 

 

3. 간단한 알고리즘 문제

 

선형검색(완전탐색) (Linear search)

내가 찾고 싶은 배열에 모든 값을 다 확인한다.

//기본문법

function linearSearch(array, target){
    const length = array.length;
    for(i = 0; i < length; i++){
        if(array[i] === target){
           return i
        } 
    }
    return -1  // 반복문이 끝날 때까지 없었다면 -1 이 나와야하기 때문에 반복문이 끝난 곳에 return
}

const search1 = linearSearch ( [10, 6,3,8,21,5,8,12,99,7], 21 )
const search2 = linearSearch ( [10, 6,3,8,21,5,8,12,99,7], 99 )
const search3 = linearSearch ( [10, 6,3,8,21,5,8,12,99,7], 8 )
const search4 = linearSearch ( [10, 6,3,8,21,5,8,12,99,7], 100 )

console.log(search1) //4    //인덱스 4 : 5번째
console.log(search2) //8    //인덱스 8 : 9번째
console.log(search3) //3    // 2개 있지만 지금 반복문이 앞에서부터 시작하고 그게 처음 값을 확인하면 리턴 하고 함수 종료
console.log(search4) //-1   // 없다.

반환된 i 값은 index의 값이므로 0부터 라는 것을 까먹지 말자.. 

 

 

 

 

4. 로또 번호 생성기

 

로또 번호 생성기

//핵심 코드

//0.0~0.9 랜던값으로 뽑는다.
console.log(Math.random() * 10)

// 0.0~0.9 사이의 값 * 45 한 후 소수점은 다 버린다.
console.log(Math.floor(Math.random() * 45))

코드 짜기 전 순서 정리
1. 1~45까지 배열을 담는다.
2. 배열 6개 짜리를 만든다.
3. 랜덤 숫자로 6개를 뽑는다.

 

<head>
    <style>
        #gnb > li{
            display: inline-block;
            font-size: 40px;
            background: black;
            color: #fff;
            width: 80px;
            height: 80px;
            border-radius: 40px;
            text-align: center;
            line-height: 85px;
            
        }
    </style>
</head>
<body>
    <h1>logo</h1>
    <ul id="gnb">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
    <script src="./public/js/array.js" type="text/javascript"></script>
</body>
const lottoNumber = [] 
const result = []
const lottoBox = document.querySelectorAll("#gnb > li") // string 타입

//lottoNumber 배열에 1~45까지 입력
for(let i=1 ; i <=45 ; i++){
    lottoNumber.push(i)
}

// 0.0~0.9 사이의 값 * 45 한 후 소수점은 다 버린다.
// 로또는 1부터 선택 가능하므로 +1을 해서 최솟값을 1로 잡아준다.
for( i=0; i < 6; i++){
    const number = Math.floor(Math.random() * 45) + 1  
    lottoNumber[number-1] // lottoNumber의 요소를 선택하려면 인덱스번호를 선택해야한다.
                          // number는 1부터 시작하기 때문에 인덱스 번호를 호출하기 위해선
                          // -1 을 해준다.
    lottoNumber.splice(number-1, 1) // 인덱스번호부터 1개만 보여주기 위함
    result.push(number) // result의 마지막에 요소를 추가시켜줌.
}

for(let i = 0; i < result.length; i++){
    lottoBox[i].innerHTML = result[i] // result로 나온 요소를 인덱스번호 0~5까지 값을
                                      // lottoBox의 인덱스0~5번 요소에 바꿔줌
}

 

로또 번호가 아직 중복되는 것이 나오는데...처리할 예정.....

 

새로고침 때 마다 새로 나옴

 

댓글