Javascript

[새싹 프론트엔드] 3주차 - 3

ddorongg 2022. 11. 2. 20:55

배열

• 데이터 값을 하나의 목록으로 생성

• 여러 개의 원소들을 연속적으로 저장하고, 전체를 하나의 단위로 다루는 데이터 구조

 

예) 가장 좋아하는 과일 3가지 목록

var 과일TOP3 = [“딸기”, “사과”, “바나나”]

변수 3개를 작성하지 않고, 과일TOP3라는 배열 하나만 생성

 

배열을 배워야 하는 이유

배열을 이용하면 변수를 이렇게 만들지 않아도 가능

 

 

배열 생성

✔️ 대괄호([ ]) 사용

✔️ 대괄호 안에 값을 입력. 여러 개일 경우 쉼표(콤마)로 구분

 

예시 1)

 

배열 원소 접근

• 원하는 원소 색인(index)에 대괄호 사용

• 배열의 첫 번째 원소가 0번, 두 번째 원소가 1번

딸기라는 값만 보고싶으면 딸기[0]

 

대괄호 안의 색인을 변경

배열의 원소를 설정 및 변경, 추가 가능

 

배열에 새로운 원소 추가

미리선언하고 나중에 변수 넣기

• 빈 배열 생성  var 과일 = []

• 0~8번 색인에 각각 과일 이름 삽입

 

• 원소는 어떤 색인이든 추가가 가능하다.

• 33번 색인에 과일 추가

(일반적으로 중간에 빈값을 넣고 하지는 않음 보통은 앞에서부터 데이터를 차곡차곡 넣음)

 

한 배열에서 여러 자료형 사용

서로 다른 자료형을 원소로 가진 배열 생성

• (숫자, 문자열, 배열)  *모든 타입 다 넣을 수 있음

 

대괄호를 사용하여 배열 속의 배열의 원소에 접근

내부 배열 원소에 접근

 

배열 다루기

배열은 프로퍼티와 메서드로 다룬다.

프로퍼티 : 배열에 대한 정보 (객체에적용할 수 있는 속성들)

메서드 : 배열을 변경하거나 새로운 배열을 반환

 

배열의 길이

배열 내 원소의 개수를 확인

• length 프로퍼티

• 배열이름.length

* 주로 length를 이용하여 for문의 범위를 지정

 

 

메서드 호출이란?

• 컴퓨터 언어로 어떤 동작을 실행하는 행위

 

배열에 원소 추가 - push & unshift

• 배열 끝 (맨 뒷칸)에 새로운 원소를 추가

push 메서드 호출

• 배열이름.push(추가할_원소_이름)

1. 괄호의 한 원소가 배열에 추가

2. 배열의 길이가 반환

 

• 배열 시작 (맨 앞칸)에 새로운 원소를 추가

• unshift 메서드 호출

• 배열이름.unshift(추가할_원소_이름)

 

배열의 원소 제거 pop & shift

• 배열의 마지막 원소를 제거

• pop 메서드 호출

• 배열이름.pop()

• 마지막 원소를 제거한 후 제거된 원소를 값으로 반환

 

• 배열의 첫 번째 원소를 제거

• shift 메서드 호출

• 배열이름.shift()

• 첫 번째 원소를 제거한 후 제거된 원소를 값으로 반환

 

배열 결합하기  concat 

• 배열 두 개를 결합해서 하나의 배열로 생성

• 첫번째 배열.concat(두번째배열)

* 두 배열의 결합되었다고 해서, 원본 배열이 변하지는 않음

 

여러 배열 결합하기 쉼표

두 개 이상의 배열을 결합해서 하나의 배열로 생성

• 결합하려는 배열을 차례로 괄호 안에 넣고 쉼표로 구분

 

배열 원소 색인 찾기

• 원하는 배열 원소의 색인을 찾는다.

• 배열이름.indexOf(원소)

 

배열을 문자열로 만들기

• 배열에 포함된 모든 원소를 하나의 문자열로 생성

• 배열이름.join()

• 모든 원소를 쉼표로 구분해 넣은 문자열 반환

 

※ 쉼표를 구분자로 사용하고 싶지 않다면?

• 배열이름.join(separator)

 

배열을 문자열로 만들기

• 문자열로 바꾸고 싶은 배열이 있을 때 유용

 

만약, join을 모른다면 다음과 같이 코드를 작성해야 함

주소가 더 길다면 더 많은 코드가 필요

 

스택(stack)

• 맨 처음에 추가한 원소가 맨 마지막에 제거 (like 회전초밥)

• LIFO(Last In First Out)

 

 

큐(queue)

• 데이터를 차례대로 입력하고, 입력된 순서대로 하나씩 꺼내서 처리하기 위해 사용 (like 프린터기)

맨 처음에 추가된 원소를 가장 먼저 제거

• FIFO(First In First Out)

 

 

Math.random()

• 0과 1 사이의 숫자 하나를 무작위로 선택해서 반환

• 1 미만의 숫자만 반환

• 더 큰 숫자를 원하면 Math.random()이 반환한 값에 곱셈

 

Math.floor()

• 소수점 이하의 숫자를 버리고 정수를 생성

 

Math.random()과 Math.floor() 활용

• Math.random()을 통해 나온 값에 배열의 길이를 곱한 후,

• Math.floor()를 호출

• 0, 1, 2, 3 중 하나의 숫자가 무작위로 반환

 

예시-1)

배열의 원소를 랜덤으로 선택

 

 

예시-2)

인디언 이름 제조기 만들기

 

var 색상 = ["푸른", "붉은", "검은", "하얀"];
      var 자연 = ["늑대", "태양", "독수리", "바람"];
      var 단어 = ["눈물", "환상", "기상", "일격", "유랑"];

      document.write("<br/>");

      var 인디언이름 = Math.floor(Math.random() * 4);
      document.write(색상[인디언이름] + 자연[인디언이름] + 단어[인디언이름]);

 

예시-3)

for문을 이용하여 배열의 합 구하기

var sum = 0;
var n = [4, 5, -2, 28, 33];
    for(var i = 0; i < 5; i++)
    {
    sum = sum + n[i];
    }
    document.write(“합은 ” + sum);

 

결과)

 

 


 

 

[실습회고]

for문과 배열을 합쳐서 사용하는 것이 익숙치 않아서 뭔가 어떤 것을 사용해야겠구나는 감이 오는데 그거를 완벽하게 계산이 돌아가기 까지 만드는 것이 아직은 어려운 것 같다,,, 이번 주는 다행히도 복습하는 시간이 이틀 주어져서 연습을 많이 하기는 했지만 여전히 못 푸는 문제들이 있어서 많은 연습을 해야할 것 같다.

 

이 문제는 if문을 사용하여 풀긴 했는데 보다 더 깔끔하게 코드를 짤 수도 분명히 있을 것,,,

클린코드와 비교하기 위해 올림

 <script>
      var 계약금액 = parseInt(prompt("통신요금을 입력해보삼"));
      var 사용개월수 = parseInt(prompt("사용개월 수를 입력해보삼"));
      var 카드코드 = parseInt(
        prompt("신용카드코드를 입력해보삼(11,12,13 중 하나)")
      );
      document.write(`계약 금액 : ${계약금액}`);
      document.write("<br>");
      document.write(`사용 개월 수 : ${사용개월수}`);
      document.write("<br>");
      document.write(`카드코드 : ${카드코드}`);
      document.write("<br>");

      if (사용개월수 <= 6) {
        if (카드코드 == 11) {
          document.write(`최종요금 : ${계약금액 * 0.95}원`);
        } else if (카드코드 == 12) {
          document.write(`최종요금 : ${계약금액 * 0.92}원`);
        } else {
          document.write(`최종요금 : ${계약금액 * 0.88}원`);
        }
      } else if (사용개월수 > 6 && 사용개월수 <= 12) {
        계약금액 *= 0.9;
        if (카드코드 == 11) {
          document.write(`최종요금 : ${계약금액 * 0.95}원`);
        } else if (카드코드 == 12) {
          document.write(`최종요금 : ${계약금액 * 0.92}원`);
        } else {
          document.write(`최종요금 : ${계약금액 * 0.88}원`);
        }
      } else {
        계약금액 *= 0.8;
        if (카드코드 == 11) {
          document.write(`최종요금 : ${계약금액 * 0.95}원`);
        } else if (카드코드 == 12) {
          document.write(`최종요금 : ${계약금액 * 0.92}원`);
        } else {
          document.write(`최종요금 : ${계약금액 * 0.88}원`);
        }
      }
    </script>

 

 

이거는 진짜 가위바위보 자체를 어떻게 비교해야할 지 고민하다가 위에 문제와 마찬가지로 if문으로 그냥 ,, 드럽게,, 모든 경우의 수를 욱여넣어서 만듬,,, ㅋㅋㅋ ㅜㅜ 원래는 더 길고 중간에 막 컴퓨터가 이겨도 진걸로나오고 이래서 골머리 싸매다가 귤님이 또 비긴 거는 따로 빼서 위에 한줄로 정리하라고 조언 주셔서 또 넙죽 받아먹고 해결 완. 깔끔하게 코드 짜고싶어 낟오,,,

 

 <script>
      var input = prompt("가위바위보 게임 (가위바위보 중 하나 입력ㄱ) ");
      var 가위바위보 = ["가위", "바위", "보"];
      var 컴퓨터 = 0;
      var 컴퓨터 = 가위바위보[Math.floor(Math.random() * 가위바위보.length)];
      
      document.write(`컴퓨터는 ${컴퓨터}를 냈습니다`);
      document.write("<br>");
      if (컴퓨터 == input) {
        document.write("비겼습니다");
      } else if (컴퓨터 == "가위") {
        if (input == "바위") {
          document.write("컴퓨터가 졌습니다");
        } else {
          document.write("컴퓨터가 이겼습니다");
        }
      } else if (컴퓨터 == "바위") {
        if (input == "보") {
          document.write("컴퓨터가 졌습니다");
        } else {
          document.write("컴퓨터가 이겼습니다");
        }
      } else {
        if (input == "가위") {
          document.write("컴퓨터가 졌습니다");
        } else {
          document.write("컴퓨터가 이겼습니다");
        }
      }

 

 <script>
      var 돈 = 0;
      var count = 10;

      for (i = 0; i < 10; --i) {
        돈 = parseInt(prompt(`돈을 넣어주세요(남은커피 : ${(count)})`));
        if (돈 > 300) {
          alert(`거스름돈 ${돈 - 300}원과 커피를 줍니다.(남은커피: ${count-=1})`);
        } else if (돈 < 300) {
          alert("돈이 부족합니다");
        } else {
            count-=1;
          alert("커피를 줍니다");
        }
      }
    </script>

분명 for문 이용해서 쉽게 짰는데 ,, 자꾸 돈 모자르게 넣어도 커피 주는 호구커피자판기가 되벌인 것,,, 그래서 이리저리 또 고쳐보다가 var i 자체를 커피갯수로 했었는데 다시 카운트하는 변수를 따로 만들어서 커피 줄 때 변수에 적립하게 하고 남은 커피에 count-=1이라고 지정해줌 돈을 넣을 때 남은 커피는 count로 지정하면 깔꼼하게 되었다 ㅎㅎ 

 

솔직히 이 두 문제 나에게 너무나도 어려웠던 문제,,,, 일단 중복을 제거하는 방법부터 생각 x,,,,, 그리고 두 값을 제외한 나머지의 합과 평균 ,, ? 진심 어케해야 제외됨 ,,, 그래서 혼자 이리저리 코드 짜봐도 랜덤한 숫자 나오게 하는 거까지가 한계인 것이다 ㅋㅋㅋㅋㅋ ㅜㅜ 그래서 물어물어 풀게 됨,,, 근데 ,, 이거 아직 이해를 잘 못해서 다시 복습해야함 이해 완벽히 하면 코드 올려야쥐 ,, 흑흑 난 너무 머리가 나빠,, 요즘 맨날 문제 풀면서 머릿속에서 재생되는 노래 ss501 - 내머리가 나빠서 

 

 

 

 

 

 

새싹DT 기업연계형 프론트엔드 실무 프로젝트 과정 3주차 블로그 포스팅