[Java] 자바 101 기초 강의 #11 ( List형 )

    오늘은 List형에 대해서 알려드리도록 하겠습니다. 혹시 Python과 같이 자유로운 언어를 배우신 분들이라면, 자바의 List는 좀 어려울 수 있습니다. 파이썬과 다르게 좀 더 엄격하기 때문입니다.

     

    List는 구현된 객체가 아니라 interface로 되어 있어서 늘 List로 객체를 생성할 수 없습니다. interface가 무슨 소린가? 생각할 수 있는데 일단 interface는 껍데기와 같은 존재라고 생각하면 쉽습니다. 인터페이스는 중후반부 내용이기 때문에 여기서는 껍데기라는 정도로만 넘어가면 좋겠네요.

     

    [Java] 자바 101 기초 강의 #11 ( List형 )


    List의 개념

    List는 특정 타입형으로 이루어진 데이터를 연속으로 다룰 때 사용하는 타입입니다. 현재 여기서 글을 쓰는 것도 연속적인 단어들로 이루어져 있습니다. 즉 단어들만 데이터를 담고 싶을 경우 List 형태로 담을수가 있습니다. 혹은 주식의 경우 매일매일 차트 모양이 바뀌게 되는데, 주식의 가격을 시간에 따라 화면에 뿌려주고 싶을 경우 List에 담아서 주식 그래프에 전달을 하면 됩니다.

     

    즉, 동일한 타입이 여러개 있을 때 담는 타입이구나라고 생각하면 될 것 같네요.

     

    List 종류

    • ArrayList
    • Vector
    • LinkedList

     

    리스트의 종류는 ArrayList와 Vector, LinkedList가 있으나, Vector는 ArrayList로 대체하기에 실질적으로는 2가지만 있다 생각을 하시면 됩니다. ArrayList와 LinkedList는 우선 단순하게 값을 가지고 오고 활용하는 것에서는 ArrayList가 위라고 할 수 있지만, 값을 추가, 삭제 하는 작업들이 들어가면 LinkedList가 더 유리합니다.

     

    https://javatutorial.net/difference-between-arraylist-and-linkedlist-in-java/

     

    아직 위의 표가 잘 이해가 안되실 겁니다. 실상 개발을 하다보면, ArrayList만 써도 큰 문제는 없으며 추가, 삭제가 많을 경우 LinkedList를 써서 속도를 직접 비교해보시는 것이 좋을 것 같네요. 

     

     

    List 선언

    List<타입> 변수명 = new ArrayList<> ();

    ArrayList로 객체를 생성하거나, LinkedList로 객체를 생성하든 구현 방식은 똑같기 때문에 포스팅에 대한 예제는 ArrayList로 하겠습니다. 위와 같이 선언을 할 때 List<> 사이에 타입을 지정합니다. 여기서 타입은 String과 같은 단순한 타입일 수도 있고, List<Map<String, Obect>>와 같은 복잡한 타입을 선언할 수도 있습니다.

     

    그리고 new로 객체를 생성하게 되는데 List 자체가 껍데기이기 때문입니다. List에 생명을 불어 넣기 위해 new로 객체를 생성하고, 생명은 ArrayList로 부여한다가 됩니다.

     

    List 값 추가 ( add )

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("삼성전자");
        list.add("테슬라");
        list.add("카카오");
        list.add("네이버");
    
        System.out.println(list);
    }

     

    list에 값을 추가하는 것은 list 변수에 .add 메소드를 호출하여 저장이 가능합니다. 위의 결과를 실행하면

     

     

    위와 같이 list 결과가 출력됩니다. 

     

    List 값 삭제 ( remove )

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("삼성전자");
        list.add("테슬라");
        list.add("카카오");
        list.add("네이버");
    
        System.out.println(list);
    
        list.remove(0);
        System.out.println(list);
    }

     

    list 변수에 remove를 호출하면 아래와 같이 0번째에 위치한 삼성전자가 삭제된 것을 알 수 있습니다.

     

    삼성전자 삭제 캡쳐화면

     

    값을 삭제 할 때 위치값으로 삭제할 수도 있지만, 해당 값을 직접 입력하여 삭제를 할 수 있습니다.

     

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("삼성전자");
        list.add("테슬라");
        list.add("카카오");
        list.add("네이버");
    
        System.out.println(list);
    
        list.remove("테슬라");
        System.out.println(list);
    }

     

    remove(0)과 같이 숫자값이 아니라 값을 직접 입력하게 되면, 아래와 같이 삭제가 된 것을 확인할 수 있습니다.

     

     

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
    
        System.out.println(list);
    
        list.remove(2);
        System.out.println(list);
    }

     

    그러나 위와 같이, integer로 값을 받은 상황일 경우 index와 값이 모두 동일한 값이 존재할 경우 무엇을 삭제하게 될까요?

     

    index가 삭제된 모습

     

    remove(2)를 하였을 때, index로 1번째인 2가 삭제가 될 지, index 2가 삭제가 될 지 궁금할 수 있는데 위의 결과처럼 이럴 경우 index가 삭제됩니다. 

     

    List 중간 삽입

    List는 기본적으로 후반부에 값이 붙습니다. 하지만 중간에 값을 넣어야 되는 상황이 발생할 수도 있습니다.

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("삼성전자");
        list.add("테슬라");
    
        list.add(1, "애플");
        System.out.println(list);
    }

    list.add에 인자값을 하나 더 추가해서 첫번째에 index 위치를 넣게 되면, 아래와 같이 애플이 중간에 추가된 것을 확인할 수 있습니다.

     

     

    List 병합 ( addAll )

    리스트를 합치고 싶을 때도 있을 것입니다. 

    public static void main(String[] args) {
        List<String> kospiList = new ArrayList<>();
        List<String> nasdaqList = new ArrayList<>();
        List<String> mergeList = new ArrayList<>();
    
        kospiList.add("삼성전자");
        kospiList.add("LG전자");
    
        nasdaqList.add("테슬라");
        nasdaqList.add("애플");
    
        mergeList.addAll(kospiList);
        mergeList.addAll(nasdaqList);
    
        System.out.println(mergeList);
    }

     

    addAll을 사용하게 되면, 현재 리스트의 다음으로 값들을 붙이면서 병합하게 됩니다.

     

    merge된 list 값들

     

     

    반응형

    댓글

    Designed by JB FACTORY