순서가 있는 컬렉션을 저장할 때 쓰는 자료구조 배열
let arr = new Array();
let arr = [];
let fruits = ["사과", "오렌지", "자두"];
각 배열 요소에는 0부터 시작하는 숫자가 매겨져있음
배열 내에 특정 요소를 얻고 싶다면 대괄호 안에 순서를 나타내는 숫자인 인덱스를 넣어주면됨
fruits[0] // 사과
fruits[1] // 오렌지
fruits[2] // 자두
fruits[1] 배
fruits[3] = '레몬'
let fruits = ["사과", "오렌지", "자두"]
alert(fruits.length) // 3
alert(fruits) // 사과, 오렌지, 자두
큐(queue)는 배열을 사용해 만들 수 있는 대표적인 자료구조, 배열과 마찬가지로 순서가 있는 컬렉션을 저장하는 데 사용
-먼저 집어넣은 요소가 먼저 나옴
-선입선출 형태 (First-in-First-Out) FIFO
스택(stack) : 힌쪽 끝에 요소를 더하거나 뺼 수 있게 해주는 자료구조
-흔히 카드와 비교, 쌓여있는 맨 위에 새로운 카드를 더해주거나 빼는 것처럼 스택도 한쪽 끝에 요소를 집어넣거나 추출할 수 있기 때문
-후입선출 형태 (Last-In-First-Out) LIFO
let fruits = ["사과", "오렌지", "배"];
alert(fruits.pop()); // 배열에서 "배"를 제거하고 제거된 요소를 띄움
alert(fruits) // 사과, 오렌지
let fruits = ["사과", "오렌지"];
fruits.push("배");
alert(fruits); //"사과", "오렌지", "배"
<fruits.push(...)를 호출 fruits[fruits.length] = ...같은 효과!
배열 앞에 무언가를 해주는 메서드
let fruits = ["사과", "오렌지", "배"];
alert(fruits.shift()); // 배열에서 '사과'를 제거하고 제거된 요소를 띄움
alert(fruits); // 오렌지, 배
let fruits = ["오렌지", "배"];
fruits.unshift('사과');
alert(fruits); //사과, 오렌지, 배
배열의 본질은 객체
배열을 '순서가 있는 자료의 컬렉션'처럼 다루지 않고 일반 객체처럼 다루면 기법이 제대로 동작하지 않음
let fruits = [] //빈 배열을 하나 만듬
fruits[99999] = 5; //배열의 길이보다 훨씬 큰 숫자를 사용해 프로퍼티를 만듬
fruits.alge = 25; // 임의의 이름을 사용해 프로퍼티를 만듬
이렇게 코드를 작성하면 자바스크립트 엔진이 배열을 일반 객체처럼 다루게 되어 배열을 다룰 대만 적용되는 기법이 동작하지않음
배열은 순서가 있는 자료를 저장하는 용도로 만들어진 특수한 자료구조
이런 특성을 고려하여 배열을 조정해야함
pop와 push는 빠르지만 shift와 unshift는 느림
: 이동을 수반하지않기 떄문에
배열이 순서가 있는 자료형이라는걸 명심하자!
<for...of>
let fruits = ["사과", "오렌지", "자두"];
for (let fruit of fruits) {
alert(fruit);
}
현재 요소의 인덱스는 얻을 수 없고, 값만 얻을 수 있음
<for...in>
let arr = ["사과", "오렌지", "배"];
for (let key in arr) {
alert(arr[key]) // 사과, 오렌지, 배
}
2)for..in은 반복문 배열이 아니라 객체와 함께 사용할 때 최적화되어 있어서 배열을 사용하면 객체에 사용하는 것에 비해 많이 느림!
배열에는 되도록 for...in을 쓰지말자!
배열에 무언가를 조작하면 length 프로퍼티가 자동으로 갱신
length 프로퍼티는 배열 내 요소의 개수가 아니라 가장 큰 인덱스에 1을 더한 값
let fruits = []
fruits[123] = '사과'
alert(fruits.length); // 124
이렇게 배열을 사용하면 안됨
length의 값을 수동으로 증가시키면 아무 일도 일어나지않음, 값을 감소시키면 배열이 잘림, 짧아진 배열은 다시 되돌릴 수 없음
let arr = [1, 2, 3, 4, 5];
arr.length = 2; //'요소 2개만 남기고 잘라봅시다.'
alert.(arr); [1, 2]
arr.length = 5; //본래 길이로 되돌리기
alert(arr[3]); //삭제된 기본 요소들이 복구되지 않음
arr.length = 0;을 이용해 배열을 비울수도 있음
let arr = new Array("사과", "배", "기타");
new Array()는 잘 사용되지 않음
숫자형 인수 하나를 넣으면 new Array를 호출 배열이 만들어지는데, 배열엔 요소가 없는 반면 길이는 인수와 같아짐
let arr = new Array(2); //
alert(arr[0]) //undefined가 출력, 요소가 하나도 없는 배열이 만들어짐
alert(arr.length) // 길이는 2
배열 역시 배열의 요소가 될 수 있음 , 이런 배열을 가리켜 다차원 배열이라 부름
let matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
alert(matrix([1][1]) ; //5, 중심에 있는 요소
배열 toString 메서드가 구현 , 호출하면 요소를 쉼표로 구분한 문자열 반환
let arr = [1, 2, 3];
alert(arr) ; // 1, 2, 3
alert(String(arr) === "1, 2, 3"); // true
이항 덧셈 연산자 "+" 피연산자 중 하나가 문자열인 경우 나머지 피연산자도 문자열로 변환
alert(""+1); // "1"
alert("1"+1); // "11"
alert(:1,2"+1); // "1,21"
1)배열은 복사가 될까요?
4
2)배열과 관련된 연산
let styles = ["jazz", "Blues"]
styles.push("Rock-n-Roll")
styles.[Math.floor((styles.length -1) /2)] = "Classics";
styles.shift()
styles.unshift("Rap","Reggae")
3)배열 컨텍스트에서 함수 호출하기
4)입력한 숫자의 합 구하기
function solution(num) {
let numbers = []
while (true) {
let value = prompt("숫자를 입력해주세요", 0)
if (value = '' || value !== isFinite || value = "Cancel") {
number.push(+value)
}
let sum = 0;
for (let number of numbers) {
sum += number
}
return sum;
}
5)최대합 부분 배열
function getMaxSubSum(arr) {
for (let i = 0; i < arr.length; i++) {
let SubSum = 0
for (let j = i; j < arr.length; j++) {
SubSum += arr[j]
MaxSum = Math.max(MaxSum, SubSum)
}
}
return MaxSum
}
function getMaxSubSum(arr) {
let maxSum = 0;
let partialSum = 0;
for (let item of arr) {
partialSum += item;
maxSum = Math.max(maxSum partialSum);
if (partialSum < 0) partialSum = 0;
}
return maxSum;
}