웹 스터디

코스 전체목록

닫기

배열

배열

배열(array)이란 연관된 데이터를 모아서 통으로 관리하기 위해서 사용하는 데이터 타입이다. 변수가 하나의 데이터를 저장하기 위한 것이라면 배열은 여러 개의 데이터를 하나의 변수에 저장하기 위한 것이라고 할 수 있다. 아래의 예제를 보자. 변수 name에는 문자 egoing이 할당되었다. 이제부터 name을 호출하면 문자 egoing을 사용할 수 있다.

var name = 'egoing'
alert(name);

배열의 생성

그렇다면 여러 개의 데이터를 하나의 변수에 담아서 관리할 수 있는 방법은 없을까? 있다. 배열을 쓰면 된다. 변수 member에 회원정보를 담아보자. 대괄호([])는 배열을 만드는 기호다. 대괄호 안에 데이터를 콤마(,)로 구분해서 나열하면 배열이 된다.

var member = ['egoing', 'k8805', 'sorialgi']

하나의 변수에 3개의 데이터를 담았다. 각각의 데이터를 원소(Element)이라고 부른다. 자 그럼 이 데이터를 꺼내오려면 어떻게 해야 할까? 아래의 예제를 보자.

var member = ['egoing', 'k8805', 'sorialgi']
alert(member[0]);
alert(member[1]);
alert(member[2]);

결과는 아래의 문자열을 차례로 경고창으로 출력 할 것이다.

egoing
k8805
sorialgi

즉 배열에 담겨있는 값을 가져올 때는 대괄호 안에 숫자를 넣는다. 이 숫자를 색인(index)라고 부르고 0부터 시작한다. 즉 첫번째 원소(egoing)를 가져오려면 대괄호 안에 0을 넣어주어야 한다는 것이다. 두번째는 1, 세번째는 2를 입력한다. 이 값을 이용해서 배열에 저정된 값을 가져올 수 있다.

배열이 없다면

그렇다면 배열이 없다면 어떻게 될까? 예를 들어 맴버의 이름을 제공하는 함수를 제공해야 한다고 해보자. 그런데 함수는 하나의 값만을 반환(return) 할 수 있다. 아래의 예를 보자.

function get_member1(){
    return 'egoing';
}
document.write(get_member1());

function get_member2(){
    return 'k8805';
}
document.write(get_member2());


function get_member3(){
    return 'sorialgi'
}
document.write(get_member3());

하나의 함수는 하나의 값만을 반환할 수 있기 때문에 위와 같이 각각의 회원정보를 반환하는 함수를 만들었다.

이번엔 배열를 이용한 아래의 코드를 보자. 맴버를 담고 있는 배열를 반환하고 있다. 간단하지 않은가?

function get_members(){
    return ['egoing', 'k8805', 'sorialgi'];
}
var members = get_members();
document.write(members[0]);
document.write(members[1]);
document.write(members[2]);

배열의 사용

배열의 진가는 반복문과 결합했을 때 나타난다. 반복문으로 리스트에 담긴 정보를 하나씩 꺼내서 처리 할 수 있기 때문이다. 다음 예제를 보자

 

function get_members(){
    return ['egoing', 'k8805', 'sorialgi'];
}
members = get_members();
// members.length는 배열에 담긴 값의 숫자를 알려준다. 
for(i = 0; i < members.length; i++){
    // members[i].toUpperCase()는 members[i]에 담긴 문자를 대문자로 변환해준다.
    document.write(members[i].toUpperCase());	
	document.write('<br />');
}

결과는 아래와 같다.

egoing
k8805
sorialgi

위의 예제에서 주목해야 할 것은 반복문과 배열을 결합한 부분이다. 반복문을 이용해서 배열 members의 내용을 하나씩 꺼낸 후에 이름의 첫글자를 대문자로 변경한 후에 출력하고 있다. 정리하면, 배열이란 연관된 정보를 하나의 그룹으로 관리하기 위해서 사용한다. 그리고 그 정보를 처리 할 때는 반복문을 이용한다.

배열의 제어

배열은 복수의 데이터를 효율적으로 관리, 전달하기 위한 목적으로 고안된 데이터 타입이다. 따라서 데이터의 추가/수정/삭제와 같은 일을 편리하게 할 수 있도록 돕는 다양한 기능을 가지고 있다. 몇가지 중요한 기능들만 살펴보자.

배열의 크기

아래와 같은 방법으로 배열의 크기를 알아낼 수 있다. 결과는 5이다.

var arr = [1, 2, 3, 4, 5];
alert(arr.length);

배열의 조작

추가

다음은 배열의 끝에 원소를 추가하는 방법이다. push는 인자로 전달된 값을 배열(li)에 추가하는 명령이다. 배열 li의 값은 a, b, c, d, e, f가 됐다.

var li = ['a', 'b', 'c', 'd', 'e'];
li.push('f');
alert(li);

다음은 복수의 원소를 배열에 추가하는 방법이다. concat은 인자로 전달된 값을 추가하는 명령이다.

var li = ['a', 'b', 'c', 'd', 'e'];
li = li.concat(['f', 'g']);
alert(li);

다음은 배열의 시작점에 원소를 추가하는 방법이다. 배열 li는 z, a, b, c, d, e가 됐다. unshift는 인자로 전달한 값을 배열의 첫번째 원소로 추가하고 배열의 기존 값들의 색인을 1씩 증가시킨다.

var li = ['a', 'b', 'c', 'd', 'e'];
li.unshift('z');
alert(li);

만약 두번째 인덱스 뒤에 대문자 B를 넣고 싶다면 아래와 같이한다. splice는 첫번째 인자에 해당하는 원소부터 두번째 인자에 해당하는 원소의 숫자만큼의 값을 배열로부터 제거한 후에 리턴한다. 그리고 세번째 인자부터 전달된 인자들을 첫번째 인자의 원소 뒤에 추가한다.

var li = ['a', 'b', 'c', 'd', 'e'];
li.splice(2, 0, 'B');
alert(li);

제거

다음은 배열의 첫번째 원소를 제거하는 방법이다. shift를 사용하면 된다. 아래 결과는 b, c, d, e 다.

var li = ['a', 'b', 'c', 'd', 'e'];
li.shift();
alert(li);

다음은 배열 끝점의 원소를 배열 li에서 제거한다. 이때는 pop를 사용한다. 결과는 a, b, c, d 다.

var li = ['a', 'b', 'c', 'd', 'e'];
li.pop();
alert(li);

정렬

다음은 정렬하는 방법이다. 결과는 a, b, c, d, e 다.

var li = ['c', 'e', 'a', 'b', 'd'];
li.sort();
alert(li);

역순으로 정렬하고 싶을 때는 아래와 같이 한다.

var li = ['c', 'e', 'a', 'b', 'd'];
li.reverse();
alert(li);

댓글

댓글 본문
  1. 박병진
    감사합니다. 10.19 완료
  2. 당근조아
    201016 완료.
  3. 코딩지니어스
    201010 완료
  4. 20201007 완료
  5. Yongbeom Kwon
    200911 완료
  6. Yongbeom Kwon
    배열의 사용 할 차례
  7. 완료
  8. switpotato
    20200814 완료
  9. 김준석
    20.07.26. 학습완료
  10. 지니
    200714완료
  11. 준식
    20200606 진행중
  12. bomnie
    push 맨 뒤에 추가
    unshift 맨 앞에 추가
    concat 배열 데이터를 맨 뒤에서부터 추가 (단, 새로운 변수에 넣어주어야 함)
    splice n번째 인덱스 부터 n개의 인덱스까지 삭제 후 새로운 데이터 추가
    shift 맨 앞 삭제
    pop 맨 뒤 삭제
    sort 오름차순(응용해서 쓰는 방법은 JS사전 참고!)
    reverse 내림차순
  13. ironia
    잘들었습니다.
  14. 김효일
    어떠한 연산에 의해서 배열의 값이 정해진다면(동적) 함수로 정의해야만 하지 않을까요?
    대화보기
    • 매일하나씩
      시작
    • Noah_kim
      완료.
    • 뿡뿡팡야
      완료
    • dlrjdld님에 대한 대답
      상황에 따라서 둘 다 쓰일 수 있다고 생각해요.

      1. 함수 안에 배열이 들어 갈 수 있는 경우
      -> 함수 안에서 배열을 만들고, 배열에 대한 여러가지 처리 들( 계산, 삽입, 삭제, 수정)을 완전히 다 거친 후에 어떤 하나의 완성된 배열을 리턴 받고자 할 때, 즉 단순히 배열을 만드는 것 뿐 아니라 다양한 로직들이 곁들여진 배열을 리턴받고 싶을 때

      2. 본문에 배열이 들어 갈 수 있는 경우
      -> 복잡한 로직이 필요없이 단순한 용도로 배열을 사용할 경우

      제가 든 2가지 경우는 모든 상황을 대표하지는 않습니다. 다만 이런 2가지 경우를 생각해볼 수 있겠다 정도만 생각하면 될 것 같습니다.

      아는 만큼 더 많은 경우의 수가 보이고 앞서 2가지 경우가 아니라 4가지 5가지로 늘어날 수 있는게 공부라고 생각해요~!~!
      대화보기
      • dlrjdld
        질문, 도와주세요 ㅠㅠ<script>
        function loop(){
        return ["one","two","three","four"];
        }
        var loop2 = loop();
        document.write('<li><a href="">'+loop2[0]+'</a></li>');
        document.write('<li><a href="">'+loop2[1]+'</a></li>');
        document.write('<li><a href="">'+loop2[2]+'</a></li>');
        document.write('<li><a href="">'+loop2[0]+'</a></li>');

        ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ vsㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

        var loop3 = ["1","2","3"]
        document.write('<li><a href="">'+loop3[0]+'</a></li>');
        document.write('<li><a href="">'+loop3[1]+'</a></li>');
        document.write('<li><a href="">'+loop3[2]+'</a></li>');
        </script>


        // 함수안에 배열을 집어넣는 거랑 그냥 배열로 쓰는 거랑 차이는 무엇인가요?
        굳이 값이 같은데 함수안에 배열 넣어서 따로 변수를 또 설정해야 해야만 하는 상황이 오나요?
      • 타나
        정렬함수를 직접 만들어 적용할 수 있다는 점이 신박하네요 ㅎㅎ
      • 20.02.08 완료
      • galangal
        20.01.15 완료
      • 2020.01.10
      • 오현주
        2019.12.13 수강
      • 굼벵이
        완료
      • dia7691
        신기하네요 ㅎ
      • 마두사랑
        11-11까지
      • 제니
        10/31/2019 완료!
      • 홍주호
        20191014 완료
      • 박창신
        완료
      • 이이이이이뻐
        랑호앙 님 말씀이 가장 맞는말.

        concat 개념에 대해 따라해보며 정리하자면,

        .concat ['string', 'string'] 형태로 들어가야함. 본문처럼 .concat(['stiring','string']) 하면 오류 남.

        list = ['a', 'b']
        lsit2 = ['c', 'd']

        list = list.concat(list2) 와 같이 기존 배열+배열로 생각하는것이 가장 편한듯.

        중간에 어느분이 .push 에 변수 여러개가 들어갔을때 같은 index로 처리되어서
        그 index를 불러오면 여러 변수가 한 string으로 출력된다고 하셨는데 그건 잘못된 말.
        대화보기
        • 2019.7.23 완료
        • Amy.S
          감사합니다!
        • yuha
          2019.04.21
        • 경신중재이불치야
          감사합니다. 배열 잘 배웠습니다.
        • 쌀쌀
          20190309
          이고잉님 정말 감사합니다!
        • 랑호앙
          음... 복잡하게 생각하실 필요가 없습니다

          concat()메소드는 서로다른 배열 객체를 합쳐주는 기능을 제공하는 함수고

          push()메소드는 해당 배열에 새로운 데이터를 추가하되, 인덱스가 끝나는 부분에 삽입이 되는거에요
          대화보기
          • 호두
            배열에 데이터 추가 삭제
          • 초밥왕
            굿굿굿 잘 보고 있어요
          • 이수정
            읽으실지 모르겠지만 push는 하나를 추가하는 것, 다중은 concat이라고 보는게 맞습니다.

            push에 다중문자를 넣을 경우에는 해당 원소에 여러 개의 원소로 들어가는 것이 아니라 배열인 하나의 원소형태로 들어갑니다.

            예를 들어서 설명 드리자면 li.push(['hi', 'hello']); 를 하게 되면 li에는 concat처럼 li = ['hi' , 'hello'] 가 되는 것이 아니라 li = [['hi', 'hello']] 형태가 되는 것이죠. 그래서 li.length를 해보시면 1개로 출력된답니다!

            그래서 alert(li[0]) 해보시면 hi,hello가 출력되는 걸 보실 수 있습니다.

            이해 되실까요..!
            대화보기
            • 미완성
              20190108
            • 이준하
              아래 제플린 님의 댓글을 읽어보고 다양하게 실험해 보았는데, push 함수도 인자로 배열을 받을 수 있고 concat 함수도 인자로 문자(문자열)를 받을 수 있더군요.
              따라서 직접 짠 프로그램의 실행결과와 댓글에 고수님들의 의견을 종합하여 다음과 같은 결론을 내렸습니다.

              push 함수도 concat 함수도 인자로 문자(문자열)와 배열 모두를 받을 수 있는데
              push 함수는 원소를 추가하는 기능을 수행, 배열을 변화시키고 그 길이를 반환.
              concat 함수는 추가한 배열을 반환. 배열에는 변화 x

              이게 맞나요? 맞다면 원소 하나를 추가할 때는 push, 원소 두개 이상을 추가할 때는 concat 이라는 이고잉님의 설명은 오류가 있는 것 같습니다. 혹시 고수님들께서 조금만 도와주셔서 궁금증을 해결해 주시면 정말 감사하겠습니다...
            • 이준하
              그렇다면
              li.push('c');
              는 배열에 원소 'c'를 끼워넣는 기능을 수행하고 그 결과물(배열)에 대한 길이를 반환하고

              li.concat(['f', 'g']);
              는 특별히 수행하는 기능은 없고 기존의 배열에 두 원소 'f' 와 'g'를 끼워넣은 배열을 그대로 반환하는건가요?

              제 말이 맞다면 상당히 다른 성격의 함수인데, 이 부분에 대한 자세한 설명이 없어서 아쉽네요. 자바 스크립트 고수분들 도와주세요 ㅠㅠ
            • choon
              감사합니다.
            • 코드
              잘 보고 배우고 있어요~ ^^
              감사합니다.
            • 스탐
              감사합니다.
            • rodwn
              splice 메쏘드에서 두번째 인자값 howmany가 필수로 되어있는데 생략하면 앞에 기입한 인덱스 이후로 전체 인덱스 선택인 것 같은데 그러면 필수가아니라 옵셔널 아닌가요??

              예) var numbers = [0,1,2,3,4,5,6,7,8,9]
              numbers.splice(2);
              결과 : numbers = [0,1]
            • HoHo
              a[2], 즉 a배열의 3번째 원소부터 2개 원소를 삭제하고 그 자리에 'x'가 들어갑니다.

              예) a = [1,2,3,4];
              a.splice(2,2,'x');
              console.log(a) // [1,2'x'];

              [배열].splice() 는 원하는 위치에서 삭제를 할 수도 있고, 추가를 할 수도 있습니다.
              삭제 -> a.splice(0,1) // a[0]부터 1개 원소 삭제
              추가 -> a.splice(0,0,'z') // a[0]에 'z'원소 추가하고 원래 있던 원소의 인덱스는 1씩 증가.(원소 삭제 없음)

              [배열].unshift(), [배열].shift()는 배열의 첫번째에서만 추가, 삭제 가능
              [배열].push(), [배열].pop()는 배열의 끝부분에서만 추가, 삭제 가능

              헷갈릴 수 있는데 몇 번 사용해보시면 이해가 되실 거에요~!
              대화보기
              • inpa
                a.splice(인덱스번호, 얼마나, 원소)
                이라면

                a.splice(2, 1, 'x');
                -> a[2]에 있는 원소 1개를 지우고 x를 넣는다
                라고 설명하셧느데

                a.splice(2, 2, 'x');
                는 어떻게 되나요?
                howmany 얼마나 아규먼트부분에는 0,1 만 들어가는건가요?
              버전 관리
              egoing
              현재 버전
              선택 버전
              graphittie 자세히 보기