본문으로 바로가기

1. 배열

데이터 관리

개발을 하다 보면 여러 다양한 데이터 처리를 위해 여러 개의 객체를 사용하게 되는 경우가 많습니다.

EX. 회원들의 여러 데이터를 받아서 평균값을 구한다던지...

이 경우 각각 변수로 선언하기보다는 한 곳에 묶어서 저장도 하고 검색도 하고 삭제도 하는 편의성이 필요합니다.

이를 해결하기 위한 가장 간단한 방법은 배열을 사용하는 것입니다.

public class Test {
    public static void main(String[] args) {
        // 배열 생성(배열 생성 시 저장할 개수 선언)
        Member[] members = new Member[10];

        // 객체 추가(저장)
        members[0] = new Member("veneas", 28);
        members[1] = new Member("mike", 26);
        members[2] = new Member("jackson", 35);

        // 객체 꺼내기(검색)
        Member member = members[0];
        System.out.println(member.getAge());

        // 객체 삭제
        members[1] = null;
    }

    static class Member {
        private String name;
        private Integer age;

        public Member(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public Integer getAge() {
            return age;
        }
    }
}

 

배열의 한계점

배열은 위의 예시와 같이 매우 쉽게 생성하고 사용할 수 있지만 한계점이 있습니다.

 

1. 배열 생성 시 저장 할 수 있는 개수를 미리 선언해야합니다. 따라서 불특정 다수의 객체를 저장하기에는 한계가 있습니다. 그렇다고 많이 선언해서 메모리를 낭비하는 것은 좋지 않습니다.

Member[] members = new Member[10];

 

2. 배열의 특정 인덱스 객체를 삭제할 경우 해당 인덱스가 비어버리게 되어 비어있는지 확인을 해야 하는 코드가 필요하게 됩니다. (NullPointerException)

// 배열 생성(배열 생성 시 저장할 개수 선언)
Member[] members = new Member[10];

// 객체 추가(저장)
members[0] = new Member("veneas", 28);
members[1] = new Member("mike", 26);
members[2] = new Member("jackson", 35);

// 객체 꺼내기(검색)
Member member = members[0];
System.out.println(member.getAge());

// 객체 삭제
members[1] = null;

// 객체 꺼내기(에러 발생) -> 한계점
System.out.println(members[1].getAge()); //NullPointerException

 

2. 컬렉션 프레임워크의 등장

자바는 이런 배열의 단점을 해결하기 위해 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 이와 관련된 인터페이스와 인터페이스를 구현한 클래스를 개발하여 포함시켜 놓습니다.

이러한 인터페이스와 구현 클래스들을 컬렉션 프레임워크라고 합니다.

 

※ 용어 정리
컬렉션: 수집해서 저장하는 것
프레임워크: 여러 기능을 가진 클래스와 라이브러리가 '특정 결과물을 구현하고자' 합쳐진 형태(사용 방법을 미리 정해 놓은 라이브러리)
라이브러리: 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것

 

[예시]

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        // List 인터페이스를 구현한 ArrayList 객체 생성(불특정 다수의 객체 저장 가능)
        List<Member> memberList = new ArrayList<>();

        // 객체 추가
        memberList.add(new Member("veneas", 28));
        memberList.add(new Member("mike", 26));
        memberList.add(new Member("jackson", 35));

        // 객체 검색
        Member member = memberList.get(0);
        System.out.println(member.getAge());

        // 객체 삭제(객체 삭제 시 앞으로 한 칸씩 인덱스가 땡겨짐)
        memberList.remove(1);
    }

    static class Member {
        private String name;
        private Integer age;

        public Member(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public Integer getAge() {
            return age;
        }
    }
}

 

3. 컬렉션 프레임워크

컬렉션 프레임워크

  • 주요 인터페이스는 List, Set, Map이 있습니다.
  • List, Set 인터페이스는  둘 다 객체를 인덱스로 관리하고 그에 따라 공통기능이 많기 때문에 이 인터페이스의 공통된 기능(메소드)를 모아 Collection 인터페이스로 정의되어있습니다. (Collection 인터페이스 상속)
  • Map 인터페이스는 객체를 키와 값으로 관리하는 방식으로 List, Set과는 완전 다른 구조로 따로 정의되어 있습니다.

 

그리고 이를 구현한 구현 클래스로는 다음과 같습니다.

List 인터페이스: ArrayList, Vector, LinkedList  
Set 인터페이스: HashSet, TreeSet
Map 인터페이스: HashMap, Hashtable, TreeMap, Properties

 

※ 용어 정리
인터페이스: 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형(사용하는 방법)

 

각 주요 인터페이스 특징

[List]

- 저장 순서 유지 O, 

- 중복 저장 O

 

[Set]

- 저장 순서 유지 X,

- 중복 저장 X

 

[Map]

- 키와 값 형태로 저장

- 키는 중복 저장 X