Home

JavaScript 배열 메서드 완전 정리 push, pop, shift, unshift의 모든 것

Published in javascript
November 15, 2025
3 min read
JavaScript 배열 메서드 완전 정리 push, pop, shift, unshift의 모든 것

안녕하세요, 코딩하는곰입니다! JavaScript를 다루다 보면 배열 조작은 정말 빈번하게 마주치는 작업인데요. 오늘은 배열의 앞뒤를 조작하는 네 가지 핵심 메서드인 push, pop, shift, unshift를 깊이 있게 파헤쳐보겠습니다. 이 메서드들을 제대로 이해하면 배열 처리에 대한 자신감이 크게 향상될 거예요. 실무에서 바로 적용할 수 있는 다양한 예제와 함정까지 함께 알아보도록 하겠습니다!

배열의 기본 개념과 메서드의 중요성

JavaScript에서 배열은 가장 기본적이면서도 강력한 자료구조 중 하나입니다. 배열을 효과적으로 다루기 위해서는 다양한 메서드들을 숙지하는 것이 필수적인데, 특히 배열의 앞뒤를 조작하는 메서드들은 실제 개발에서 매우 빈번하게 사용됩니다.

배열이란 무엇인가?

배열은 순서가 있는 값들의 집합으로, 인덱스를 통해 각 요소에 접근할 수 있습니다. JavaScript의 배열은 동적이라는 특징이 있어서 크기가 고정되어 있지 않고 필요에 따라 자유롭게 확장하거나 축소할 수 있습니다.

// 기본 배열 생성
let fruits = ['사과', '바나나', '오렌지'];
console.log(fruits); // ['사과', '바나나', '오렌지']

배열 메서드의 분류

배열 메서드는 크게以下几 가지로 분류할 수 있습니다:

  • 변형 메서드: 원본 배열을 직접 수정하는 메서드
  • 접근자 메서드: 원본 배열을 수정하지 않고 새로운 배열을 반환하는 메서드
  • 순회 메서드: 배열 요소를 순회하며 작업을 수행하는 메서드 오늘 우리가 집중할 push, pop, shift, unshift는 모두 변형 메서드에 속합니다. 이들은 원본 배열을 직접 변경한다는 특징을 가지고 있으므로 사용 시 주의가 필요합니다.

배열 메서드 학습의 중요성

배열 메서드를 제대로 이해하지 못하면 코드가 불필요하게 길어지고 가독성이 떨어질 수 있습니다. 또한, 성능상의 이슈도 발생할 수 있어서 각 메서드의 특징과 적절한 사용 시기를 알고 있는 것이 중요합니다.

JavaScript 배열 메서드 완전 정리 push, pop, shift, unshift의 모든 것
JavaScript 배열 메서드 완전 정리 push, pop, shift, unshift의 모든 것


🤖 AI와 머신러닝 개발에 관심이 있다면, 파이썬 튜플 패킹과 언패킹 완벽 가이드 - 코딩하는곰의 심화解析를 참고해보세요.

push 메서드: 배열의 끝에 요소 추가하기

push 메서드는 배열의 끝에 하나 이상의 요소를 추가하고, 배열의 새로운 길이를 반환합니다. 이 메서드는 원본 배열을 직접 변경합니다.

push 메서드의 기본 사용법

let numbers = [1, 2, 3];
// 단일 요소 추가
let newLength = numbers.push(4);
console.log(numbers); // [1, 2, 3, 4]
console.log(newLength); // 4
// 여러 요소 한번에 추가
newLength = numbers.push(5, 6, 7);
console.log(numbers); // [1, 2, 3, 4, 5, 6, 7]
console.log(newLength); // 7

push 메서드의 실전 활용 예제

동적 데이터 수집

let userLogs = [];
function addUserLog(userAction) {
userLogs.push({
action: userAction,
timestamp: new Date(),
id: userLogs.length + 1
});
}
addUserLog('로그인');
addUserLog('페이지 방문');
addUserLog('로그아웃');
console.log(userLogs);
// [
// {action: '로그인', timestamp: 2023-10-01T10:00:00.000Z, id: 1},
// {action: '페이지 방문', timestamp: 2023-10-01T10:05:00.000Z, id: 2},
// {action: '로그아웃', timestamp: 2023-10-01T10:10:00.000Z, id: 3}
// ]

배열 합치기의 대안

let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
// spread operator와 push 조합
arr1.push(...arr2);
console.log(arr1); // [1, 2, 3, 4, 5, 6]

push 메서드의 성능 고려사항

push 메서드는 일반적으로 O(1)의 시간 복잡도를 가지지만, JavaScript 엔진이 내부적으로 배열의 메모리를 재할당해야 하는 경우에는 일시적으로 성능이 저하될 수 있습니다. 대량의 데이터를 추가할 때는 한번에 여러 요소를 추가하는 것이 성능상 유리합니다.

// 비효율적인 방법
for (let i = 0; i < 1000; i++) {
array.push(i);
}
// 효율적인 방법
array.push(...Array.from({length: 1000}, (_, i) => i));

pop 메서드: 배열의 끝에서 요소 제거하기

pop 메서드는 배열의 끝에서 요소를 제거하고, 그 제거된 요소를 반환합니다. 배열이 비어있을 경우 undefined를 반환합니다.

pop 메서드의 기본 사용법

let colors = ['red', 'green', 'blue'];
// 마지막 요소 제거
let removedColor = colors.pop();
console.log(colors); // ['red', 'green']
console.log(removedColor); // 'blue'
// 빈 배열에서 pop 사용
let emptyArray = [];
let result = emptyArray.pop();
console.log(result); // undefined

pop 메서드의 실전 활용 예제

스택(Stack) 자료구조 구현

class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
if (this.items.length === 0) {
return "Stack is empty";
}
return this.items.pop();
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
}
// 스택 사용 예제
let stack = new Stack();
stack.push('Document1');
stack.push('Document2');
stack.push('Document3');
console.log(stack.pop()); // 'Document3'
console.log(stack.pop()); // 'Document2'

실행 취소(Undo) 기능 구현

let actionHistory = [];
function performAction(action) {
actionHistory.push(action);
console.log(`Action performed: ${action}`);
}
function undoAction() {
if (actionHistory.length > 0) {
let lastAction = actionHistory.pop();
console.log(`Undo: ${lastAction}`);
return lastAction;
}
console.log('No actions to undo');
return null;
}
performAction('type text');
performAction('delete word');
performAction('change font');
undoAction(); // Undo: change font
undoAction(); // Undo: delete word

JavaScript 배열 메서드 완전 정리 push, pop, shift, unshift의 모든 것
JavaScript 배열 메서드 완전 정리 push, pop, shift, unshift의 모든 것


센스 있는 닉네임을 만들고 싶을 때는 즐겨찾기 기능까지 지원하는 랜덤 닉네임 생성기가 유용합니다.

shift 메서드: 배열의 앞에서 요소 제거하기

shift 메서드는 배열의 앞에서 요소를 제거하고, 그 제거된 요소를 반환합니다. 이 메서드는 배열의 모든 나머지 요소들의 인덱스를 변경합니다.

shift 메서드의 기본 사용법

let queue = ['첫 번째', '두 번째', '세 번째'];
// 첫 번째 요소 제거
let firstItem = queue.shift();
console.log(queue); // ['두 번째', '세 번째']
console.log(firstItem); // '첫 번째'
// 빈 배열에서 shift 사용
let emptyArray = [];
let result = emptyArray.shift();
console.log(result); // undefined

shift 메서드의 성능 고려사항

shift 메서드는 O(n)의 시간 복잡도를 가집니다. 배열의 첫 번째 요소를 제거한 후, 나머지 모든 요소들의 인덱스를 한 칸씩 앞으로 이동시켜야 하기 때문입니다. 큰 배열에서 빈번하게 shift를 사용하는 것은 성능상 좋지 않을 수 있습니다.

// 큰 배열에서 shift 사용 (비효율적)
let largeArray = Array.from({length: 10000}, (_, i) => i);
console.time('shift operation');
for (let i = 0; i < 1000; i++) {
largeArray.shift();
}
console.timeEnd('shift operation'); // 상대적으로 오래 걸림

shift 메서드의 실전 활용 예제

큐(Queue) 자료구조 구현

class Queue {
constructor() {
this.items = [];
}
enqueue(element) {
this.items.push(element);
}
dequeue() {
if (this.isEmpty()) {
return "Queue is empty";
}
return this.items.shift();
}
front() {
if (this.isEmpty()) {
return "Queue is empty";
}
return this.items[0];
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length;
}
}
// 큐 사용 예제
let ticketQueue = new Queue();
ticketQueue.enqueue('Customer 1');
ticketQueue.enqueue('Customer 2');
ticketQueue.enqueue('Customer 3');
console.log(ticketQueue.dequeue()); // 'Customer 1'
console.log(ticketQueue.dequeue()); // 'Customer 2'

작업 처리 시스템

let taskQueue = [];
function addTask(task) {
taskQueue.push(task);
console.log(`Task added: ${task}`);
}
function processNextTask() {
if (taskQueue.length > 0) {
let nextTask = taskQueue.shift();
console.log(`Processing: ${nextTask}`);
return nextTask;
}
console.log('No tasks to process');
return null;
}
addTask('이미지 리사이징');
addTask('데이터 백업');
addTask('이메일 발송');
processNextTask(); // Processing: 이미지 리사이징
processNextTask(); // Processing: 데이터 백업

unshift 메서드: 배열의 앞에 요소 추가하기

unshift 메서드는 배열의 앞에 하나 이상의 요소를 추가하고, 배열의 새로운 길이를 반환합니다. 이 메서드도 shift와 마찬가지로 모든 기존 요소들의 인덱스를 변경합니다.

unshift 메서드의 기본 사용법

let numbers = [3, 4, 5];
// 단일 요소 추가
let newLength = numbers.unshift(2);
console.log(numbers); // [2, 3, 4, 5]
console.log(newLength); // 4
// 여러 요소 한번에 추가
newLength = numbers.unshift(0, 1);
console.log(numbers); // [0, 1, 2, 3, 4, 5]
console.log(newLength); // 6

unshift 메서드의 성능 고려사항

unshift 메서드도 O(n)의 시간 복잡도를 가집니다. 배열의 앞에 요소를 추가하면 기존의 모든 요소들을 한 칸씩 뒤로 이동시켜야 하기 때문입니다.

// 성능 비교: push vs unshift
let testArray1 = [];
let testArray2 = [];
console.time('push 10000 elements');
for (let i = 0; i < 10000; i++) {
testArray1.push(i);
}
console.timeEnd('push 10000 elements');
console.time('unshift 10000 elements');
for (let i = 0; i < 10000; i++) {
testArray2.unshift(i);
}
console.timeEnd('unshift 10000 elements');

unshift 메서드의 실전 활용 예제

최신 데이터 우선 표시

let newsFeed = [];
function addBreakingNews(news) {
// 중요한 뉴스를 맨 앞에 추가
newsFeed.unshift({
...news,
isBreaking: true,
addedAt: new Date()
});
}
function addRegularNews(news) {
newsFeed.push({
...news,
isBreaking: false,
addedAt: new Date()
});
}
addRegularNews({title: '일반 뉴스 1', content: '내용 1'});
addRegularNews({title: '일반 뉴스 2', content: '내용 2'});
addBreakingNews({title: '속보! 중요한 소식', content: '중요 내용'});
console.log(newsFeed);
// 중요한 뉴스가 맨 앞에 위치하게 됨

히스토리 관리 with 최신 항목 우선

let searchHistory = [];
const MAX_HISTORY = 10;
function addToSearchHistory(query) {
// 중복 제거
const existingIndex = searchHistory.indexOf(query);
if (existingIndex !== -1) {
searchHistory.splice(existingIndex, 1);
}
// 최신 검색어를 맨 앞에 추가
searchHistory.unshift(query);
// 히스토리 크기 제한
if (searchHistory.length > MAX_HISTORY) {
searchHistory.pop();
}
}
addToSearchHistory('JavaScript');
addToSearchHistory('React');
addToSearchHistory('Vue');
addToSearchHistory('JavaScript'); // 중복 추가 - 맨 앞으로 이동
console.log(searchHistory); // ['JavaScript', 'Vue', 'React']

네 메서드의 비교와 활용 전략

성능 비교 표

메서드시간 복잡도사용 사례권장 상황
pushO(1)배열 끝에 추가대부분의 경우
popO(1)배열 끝에서 제거대부분의 경우
shiftO(n)배열 앞에서 제거작은 배열 또는 드문 사용
unshiftO(n)배열 앞에 추가작은 배열 또는 드문 사용

적절한 메서드 선택 가이드

// 상황별 최적의 선택 예제
// 1. 데이터 수집 (끝에서 추가) - push 최적
let dataLog = [];
dataLog.push(newData);
// 2. LIFO(Last-In-First-Out) - push/pop 조합
let stack = [];
stack.push(item);
let lastItem = stack.pop();
// 3. FIFO(First-In-First-Out) - push/shift 조합 (작은 배열에 적합)
let smallQueue = [];
smallQueue.push(item);
let firstItem = smallQueue.shift();
// 4. 큰 배열의 FIFO - 더 효율적인 방법
class EfficientQueue {
constructor() {
this.items = [];
this.head = 0;
}
enqueue(item) {
this.items.push(item);
}
dequeue() {
if (this.head >= this.items.length) return null;
const item = this.items[this.head];
this.head++;
// 주기적으로 배열 정리
if (this.head > 1000) {
this.items = this.items.slice(this.head);
this.head = 0;
}
return item;
}
}

실전 프로젝트에서의 통합 예제

// 태스크 관리 시스템
class TaskManager {
constructor() {
this.highPriorityTasks = []; // unshift/shift 사용 (최신 긴급 작업)
this.normalTasks = []; // push/pop 사용 (일반 작업)
this.completedTasks = []; // push만 사용 (완료된 작업 기록)
}
addUrgentTask(task) {
this.highPriorityTasks.unshift(task);
console.log(`긴급 태스크 추가: ${task}`);
}
addNormalTask(task) {
this.normalTasks.push(task);
console.log(`일반 태스크 추가: ${task}`);
}
processNextTask() {
// 긴급 태스크 먼저 처리
if (this.highPriorityTasks.length > 0) {
const task = this.highPriorityTasks.shift();
this.completedTasks.push({task, completedAt: new Date(), type: 'urgent'});
return `[긴급] ${task}`;
}
// 일반 태스크 처리
if (this.normalTasks.length > 0) {
const task = this.normalTasks.shift();
this.completedTasks.push({task, completedAt: new Date(), type: 'normal'});
return `[일반] ${task}`;
}
return '처리할 태스크가 없습니다.';
}
getStats() {
return {
pendingUrgent: this.highPriorityTasks.length,
pendingNormal: this.normalTasks.length,
completed: this.completedTasks.length
};
}
}
// 사용 예제
const manager = new TaskManager();
manager.addNormalTask('일반 작업 1');
manager.addUrgentTask('긴급 작업 1');
manager.addNormalTask('일반 작업 2');
console.log(manager.processNextTask()); // [긴급] 긴급 작업 1
console.log(manager.processNextTask()); // [일반] 일반 작업 1
console.log(manager.getStats()); // {pendingUrgent: 0, pendingNormal: 1, completed: 2}

JavaScript 배열 메서드 완전 정리 push, pop, shift, unshift의 모든 것
JavaScript 배열 메서드 완전 정리 push, pop, shift, unshift의 모든 것


두뇌 건강을 위해 매일 스도쿠를 풀고 싶다면, AI 기반 힌트와 스토리 모드를 제공하는 스도쿠 저니를 다운로드해보세요.

지금까지 JavaScript 배열의 push, pop, shift, unshift 메서드에 대해 깊이 있게 알아보았습니다. 이러한 기본 메서드들을 제대로 이해하는 것이 더 복잡한 배열 조작의 기초가 됩니다. 각 메서드의 특징과 성능 implications을 이해하면 상황에 맞는 최적의 선택을 할 수 있게 되죠. 실제 프로젝트에서는 이러한 메서드들을 단독으로 사용하기보다는 조합해서 사용하는 경우가 많습니다. 오늘 배운 내용을 바탕으로 여러분의 코드에서 배열을 더 효율적으로 다루시길 바랍니다. 다음 시간에는 더 다양한 배열 메서드들에 대해 알아보겠습니다. 질문이 있으시면 댓글로 남겨주세요! 코딩하는곰이었습니다. 감사합니다!

🎭 문화와 예술을 가까이에서 느끼고 싶다면, 팔공산 단풍축제를 참고해보세요.









최상의 건강을 위한 영양가득한 식품과 정보! life-plus.co.kr 바로가기
최상의 건강을 위한 영양가득한 식품과 정보! life-plus.co.kr 바로가기



다채로운 문화축제와 공연 소식을 공유하는 블로그! culturestage.co.kr 바로가기
다채로운 문화축제와 공연 소식을 공유하는 블로그! culturestage.co.kr 바로가기



비트코인 세계로의 첫걸음! 지금 가입하고 거래 수수료 할인 혜택 받으세요! bitget.com 바로가기
비트코인 세계로의 첫걸음! 지금 가입하고 거래 수수료 할인 혜택 받으세요! bitget.com 바로가기




Tags

#developer#coding#javascript

Share

Previous Article
HTML input 요소 정렬 문제 완벽 해결 가이드 vertical-align과 line-height 활용법

Table Of Contents

1
배열의 기본 개념과 메서드의 중요성
2
push 메서드: 배열의 끝에 요소 추가하기
3
pop 메서드: 배열의 끝에서 요소 제거하기
4
shift 메서드: 배열의 앞에서 요소 제거하기
5
unshift 메서드: 배열의 앞에 요소 추가하기
6
네 메서드의 비교와 활용 전략

Related Posts

(실전 프로젝트) localStorage를 활용한 나만의 메모장 웹 앱 만들기 - 데이터 저장부터 불러오기까지 완벽 구현
December 30, 2025
2 min