코어 자바스크립트 (배열)
배열
순서가 있는 컬렉션을 저장할 때 쓰는 자료구조 배열
1.배열 선언
let arr = new Array();
let arr = [];
let fruits = ["사과", "오렌지", "자두"];
각 배열 요소에는 0부터 시작하는 숫자가 매겨져있음
배열 내에 특정 요소를 얻고 싶다면 대괄호 안에 순서를 나타내는 숫자인 인덱스를 넣어주면됨
fruits[0] // 사과
fruits[1] // 오렌지
fruits[2] // 자두
- 같은 방법 으로 수정할 수 있음
fruits[1] 배
- 새로운 요소를 배열에 추가하는 것도 가능
fruits[3] = '레몬'
- length를 사용하면 배열에 담긴 요소가 몇개인지 알아낼 수 있음
let fruits = ["사과", "오렌지", "자두"]
alert(fruits.length) // 3
- 요소 전체를 출력하는 것도 가능
alert(fruits) // 사과, 오렌지, 자두
2.pop.push와 shift.unshit
큐(queue)는 배열을 사용해 만들 수 있는 대표적인 자료구조, 배열과 마찬가지로 순서가 있는 컬렉션을 저장하는 데 사용
- push : 맨 끝에 요소를 추가
- shitf : 제일 앞 요소를 꺼내 제거한 후 남아있는 요소들을 앞으로 밀어줌
-먼저 집어넣은 요소가 먼저 나옴
-선입선출 형태 (First-in-First-Out) FIFO
스택(stack) : 힌쪽 끝에 요소를 더하거나 뺼 수 있게 해주는 자료구조
- push : 요소를 스택 끝에 집어넣음
- pop : 스택 끝 요소를 추출
-흔히 카드와 비교, 쌓여있는 맨 위에 새로운 카드를 더해주거나 빼는 것처럼 스택도 한쪽 끝에 요소를 집어넣거나 추출할 수 있기 때문
-후입선출 형태 (Last-In-First-Out) LIFO
- 데큐(deque, Double Ended Queue) : 처음이나 끝에 요소를 더해주거나 뺴주는 연산을 제공하는 자료구조
- pop : 배열 끝 요소를 제거하고, 제거한 요소를 반환
let fruits = ["사과", "오렌지", "배"];
alert(fruits.pop()); // 배열에서 "배"를 제거하고 제거된 요소를 띄움
alert(fruits) // 사과, 오렌지
- push : 배열 끝 요소를 추가
let fruits = ["사과", "오렌지"];
fruits.push("배");
alert(fruits); //"사과", "오렌지", "배"
<fruits.push(...)를 호출 fruits[fruits.length] = ...같은 효과!
배열 앞에 무언가를 해주는 메서드
- shift : 배열 앞 요소를 제거하고, 제거한 요소를 반환
let fruits = ["사과", "오렌지", "배"];
alert(fruits.shift()); // 배열에서 '사과'를 제거하고 제거된 요소를 띄움
alert(fruits); // 오렌지, 배
- unshift : 배열 앞에 요소를 추가
let fruits = ["오렌지", "배"];
fruits.unshift('사과');
alert(fruits); //사과, 오렌지, 배
3.배열의 내부 동작 원리
배열의 본질은 객체
배열을 '순서가 있는 자료의 컬렉션'처럼 다루지 않고 일반 객체처럼 다루면 기법이 제대로 동작하지 않음
let fruits = [] //빈 배열을 하나 만듬
fruits[99999] = 5; //배열의 길이보다 훨씬 큰 숫자를 사용해 프로퍼티를 만듬
fruits.alge = 25; // 임의의 이름을 사용해 프로퍼티를 만듬
이렇게 코드를 작성하면 자바스크립트 엔진이 배열을 일반 객체처럼 다루게 되어 배열을 다룰 대만 적용되는 기법이 동작하지않음
- arr.test = 5 같이 숫자가 아닌 값을 프로퍼티 키로 사용하는 경우
- arr[0]과 arr[1000]만 추가 그 사이에 아무런 요소도 없는 경우
- arr[1000], arr[999] 같이 요소를 역순으로 채우는 경우
배열은 순서가 있는 자료를 저장하는 용도로 만들어진 특수한 자료구조
이런 특성을 고려하여 배열을 조정해야함
4.성능
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]) // 사과, 오렌지, 배
}
- 문제점
1) for..in은 모든 프로퍼티를 대상으로 순회
브라우저 객체 중, 배열과 유사한 형태를 보이는 유사 배여려 객체가 있음
필요없는 프로퍼티들이 문제를 일으킬 가능성이 생김
2)for..in은 반복문 배열이 아니라 객체와 함께 사용할 때 최적화되어 있어서 배열을 사용하면 객체에 사용하는 것에 비해 많이 느림!
배열에는 되도록 for...in을 쓰지말자!
5.'length'프로퍼티
배열에 무언가를 조작하면 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;을 이용해 배열을 비울수도 있음
6.new Array()
let arr = new Array("사과", "배", "기타");
new Array()는 잘 사용되지 않음
숫자형 인수 하나를 넣으면 new Array를 호출 배열이 만들어지는데, 배열엔 요소가 없는 반면 길이는 인수와 같아짐
let arr = new Array(2); //
alert(arr[0]) //undefined가 출력, 요소가 하나도 없는 배열이 만들어짐
alert(arr.length) // 길이는 2
7.다차원 배열
배열 역시 배열의 요소가 될 수 있음 , 이런 배열을 가리켜 다차원 배열이라 부름
let matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
alert(matrix([1][1]) ; //5, 중심에 있는 요소
8.toString
배열 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;
}
Author And Source
이 문제에 관하여(코어 자바스크립트 (배열)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tastestar/코어-자바스크립트-배열저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)