KDT/Java

240111 Java

001cloudid 2024. 1. 11. 17:41
728x90

컬렉션 프레임워크

제네릭

프로그램에서 변수를 선언할 때 모든 변수는 자료형이 있다. 메소드에서 매개변수를 사용할 때도 자료형을 가지고 있다.

대부분은 하나의 자료형으로 구현하지만, 변수나 메소드의 자료형을 필요에 따라 여러 자료형으로 바꿀 수 있다면

프로그램이 유연할 것이다.

어떤 값이 하나의 참조 자료형이 아닌 여러 참조 자료형을 사용할 수 있도록 프로그래밍하는 것을 '제네릭(Generic) 프로그래밍'이라고 한다.

제네릭 프로그램은 참조 자료형이 변환될 때 이에 대한 검증을 컴파일러가 하므로 안정적이다.

 

어떤 변수가 여러 참조 자료형을 사용할 수 있도록 Object 클래스를 사용하면 다시 원래 자료형으로 반환해주기 위해 매번 형 변환을 해야하는 번거로움이 있다. 이러한 경우에 사용하는 프로그래밍 방식이 제네릭이다.

여러 참조 자료형이 쓰일 수 있는 곳에 특정한 자료형을 지정하지 않고, 클래스나 메소드를 정의한 후 사용하는 시점에 어떤 자료형을 사용할 것인지 지정하는 방식이다.

 

제네릭 클래스 정의

다이아몬드 연산자 <>

ArrayList<String> list = new ArrayList<>();

<> 생략 가능

선언된 자료형을 보고 생략된 부분이 String임을 컴파일러가 유추할 수 있기 때문에 생성 부분에서는 생략 가능

 

자료형 매개변수 T와 static

 

제네릭에서 자료형 추론하기

 

컬렉션 프레임워크

프로그램 개발을 건물 짓는 일에 비유한다.

원하는 건물을 짓기 위해서는 구조를 잘 잡아야하듯

프로그램을 개발할 때도 사용하는 자료를 어떤 구조로 관리할 것인지가 중요하다.

그래야 프로그램의 기능을 효과적으로 구현할 수 있기 때문이다.

이 때 사용하는 것이 자료 구조(data structure)이다.

자료 구조는 프로그램 실행 중 메모리에 자료를 유지,관리하기 위해 사용한다.

java.util 패키지에서 제공하고 있는데, 이를 컬렉션 프레임워크라고한다.

 

자바 컬렉션 프레임워크에는 여러 인터페이스가 정의되어 있고, 그 인터페이스를 구현한 클래스가 있다.

각 인터페이스의 특성과 클래스 활용법을 알면 개발 목적에 맞게 잘 활용할 수 있다.

출처 : https://opentutorials.org/course/2517/14159

컬렉션 프레임워크의 전체 구조는 Collection 인터페이스와 Map 인터페이스 기반으로 이루어져 있다.

Collection 인터페이스는 하나의 자료를 모아서 관라하는 데 필요한 기능을 제공.

Map 인터페이스는 쌍(pair)으로 된 자료들을 관리하는 데 유용한 기능을 제공.

 

Collection 인터페이스

List를 구현한 클래스는 순차적인 자료를 관리하는 데 사용하는 클래스이고,

Set 인터페이스는 집합과 유사하다. 순서와 상관없이 중복을 허용하지 않는다. 따라서 Set 계열의 클래스는 중복되지 않는 개체를 다루는 데 사용

 

List 인터페이스 : 순서가 있는 자료 관리, 중복허용 ArrayList, Vector, LinkedList,Stack, Queue 등

Set 인터페이스 : 순서가 정해져 있지 않음. 중복을 허용하지 않음. HashSet, TreeSet

 

Collection 인터페이스에 선언된 메소드 중 자주 사용하는 메소드

  • boolean add(E e) : 객체를 추가
  • void clear() : 모든 객체를 제거
  • Iterator <E> iterator : 순환할 반복자(iterator)를 반환
  • boolean remove(Object o) : 인스턴스가 존재하면 제거
  • int size() : 요소의 개수 반환

Map 인터페이스

하나가 아닌 쌍(Pair)으로 되어 있는 자료를 관리하는 메소드들이 선언되어 있다.

key-value 쌍이라고 표현하는데 이 때 키 값은 중복될 수 없다.

ex) key : 이름 나이 직업 취미 특기

이름이라는 key 는 유일하게 딱하나 있을 수 있다.

이에 대응하는 value 값은 여러 개 일수도 있고 중복될 수 있다.

 

Map은 기본적으로 검색용 자료 구조이다. 즉 어떤 key값을 알고 있을 때 value를 찾기 위한 자료 구조이다.

Map인터페이스에 선언된 메소드 중 자주 사용하는 메소드

  • V put(K key, V value) : key에 해당하는 value값을 map에 넣음
  • V get(K key) : key에 해당하는 value 값을 반환
  • boolean isEmpty() : Map이 비었는지 여부를 반환
  • boolean containsKey(Object key) : Map에 해당 key가 있는지 여부를 반환
  • boolean containsValue(Object value) : Map에 해당 value가 있는지 여부를 반환
  • Set keyset() : key 집합을 Set로 반환.(※ 중복 안되므로 Set)
  • Collection values() : key가 있는 경우 삭제
  • boolean remove(Object key, Object value) : key가 있는 경우 key에 해당하는 vaule가 매개변수와 일치할 때 삭제

package collection;

 

public class Member {

 

private int memberId; //회원 아이디

private String memberName; //회원 이름

 

public Member(int memberId, String memberName) {

this.memberId = memberId;

this.memberName = memberName;

}

 

public int getMemberId() {

return memberId;

}

 

public void setMemberId(int memberId) {

this.memberId = memberId;

}

 

public String getMemberName() {

return memberName;

}

 

public void setMemberName(String memberName) {

this.memberName = memberName;

}

 

@Override

public String toString() {

return memberName + " 회원님의 아이디는 " + memberId +"입니다.";

}

 

 

 

}

 

List 인터페이스

List 인터페이스에는 객체를 순서에 따라 저장하고 유지하는 데 필요한 메소드가 선언되어 있다.

순차 자료 구조의 대표적인 예는 배열이다. 배열을 구현한 대표 클래스로는 ArrayList, Vector가 있고,

배열과 구현 방식은 다르지만 순차 자료 구조를 구현한 LinkedList가 있따.

 

ArrayList 클래스

객체 배열을 구현한 클래스이며, 컬렉션 인터페이스와 그 하위 List 인터페이스를 구현하였다.

객체 순서를 기반으로 순차적으로 자료를 관리하는 프로그램을 구현할 때 사용한다.

package collection.arraylist;

 

import java.util.ArrayList;

import collection.Member; //Member 클래스는 collection 패키지에 있으므로 import해줘야함

 

public class MemberArrayList {

private ArrayList<Member> arrayList; //ArrayList 선언

 

public MemberArrayList() {

arrayList = new ArrayList<Member>(); //Member형으로 선언한 ArrayList 생성

}

 

//ArrayList에 회원을 추가하는 메소드

public void addMember(Member member) {

arrayList.add(member);

}

 

//해당 아이디를 가진 회원을 ArrayList에서 찾아 제거

public boolean removeMember(int memberId) {

for(int i = 0 ; i < arrayList.size(); i++) {

Member member = arrayList.get(i); //get()메소드로 회원을 순차적으로 가져옴

int tempId = member.getMemberId() ;

if(tempId==memberId) { //회원 아이디가 매개변수와 일치하면

arrayList.remove(i); //해당 회원을 삭제

return true;

}

}

//반복문이 끝날 때까지 해당 아이디를 찾지 못한 경우

System.out.println(memberId + "가 존재하지 않음");

return false;

}

 

//전체 회원을 출력하는 메소드

public void showAllMember() {

for(Member member : arrayList) {

System.out.println(member);

}

System.out.println();

}

 

 

 

}

 

get(i) 메소드는 순차 관리를 하는 배열에서 사용하는 메소드이며,

여기에서는 매개변수의 i에 해당하는 객체를 ArrayList에서 반환해준다.

(※순서와 관계없는 Set 인터페이스를 구현한 클래스에서는 get()메소드를 제공하지 않는다.)

회원 아이디가 매개변수로 전달받은 아이디와 같으면 해당 회원을 배열에서 삭제한다.

성공적으로 삭제한 경우 true, 그렇지 않은 경우 false를 반환하기 때문에 반환형이 boolean이다.

package collection.arraylist;

 

import collection.Member;

 

public class MemberArrayListTest {

 

public static void main(String[] args) {

MemberArrayList memberArrayList = new MemberArrayList();

//새로운 회원 인스턴스 생성

Member m1 = new Member(1001,"일번");

Member m2 = new Member(1002,"이번");

Member m3 = new Member(1003,"삼번");

Member m4 = new Member(1004,"사번");

 

//ArrayList에 회원 추가

memberArrayList.addMember(m1);

memberArrayList.addMember(m2);

memberArrayList.addMember(m3);

memberArrayList.addMember(m4);

 

memberArrayList.showAllMember();

 

memberArrayList.removeMember(m4.getMemberId()); //사번 회원 삭제

memberArrayList.showAllMember(); //사번 회원을 삭제한 후 다시 전체 회원 출력

 

}

 

}

 

package collection.arraylist;

 

import collection.Member;

 

public class MemberArrayListTest {

 

public static void main(String[] args) {

MemberArrayList memberArrayList = new MemberArrayList();

//새로운 회원 인스턴스 생성

Member m1 = new Member(1001,"일번");

Member m2 = new Member(1002,"이번");

Member m3 = new Member(1003,"삼번");

Member m4 = new Member(1004,"사번");

 

//ArrayList에 회원 추가

memberArrayList.addMember(m1);

memberArrayList.addMember(m2);

memberArrayList.addMember(m3);

memberArrayList.addMember(m4);

 

memberArrayList.showAllMember();

 

memberArrayList.removeMember(m4.getMemberId()); //사번 회원 삭제

memberArrayList.showAllMember(); //사번 회원을 삭제한 후 다시 전체 회원 출력

 

}

 

}

일번 회원님의 아이디는 1001입니다.

이번 회원님의 아이디는 1002입니다.

삼번 회원님의 아이디는 1003입니다.

사번 회원님의 아이디는 1004입니다.

 

일번 회원님의 아이디는 1001입니다.

이번 회원님의 아이디는 1002입니다.

삼번 회원님의 아이디는 1003입니다.

 

ArrayList와 Vector 클래스

Vector는 ArrayList처럼 배열을 구현한 클래스이다.

두 개의 가장 큰 차이는 동기화 지원 여부이다.

동기화(synchronization)란 두 개 이상의 스레드가 동시에 Vector를 사용할 때 오류가 나지 않도록 실행 순서를 보장하는 것

 

스레드란 작원 단위이다. 프로그램이 메모리에서 수행되려면 스레드 작업이 생성되어야 한다.

이때 하나의 스레드만 수행되면 단일 스레드, 두 개 이상의 스레드가 동시에 실행되는 경우 멀티스레드라고 한다.

두 개 이상의 스레드가 동시에 실행되면 같은 메모리 공간(리소스)에 접근하기 때문에 변수 값이나 메모리 상태에 오류가 생길 수 있다. 이때 메모리에 동시에 접근하지 못하도록 순서를 맞추는 것이 동기화이다.

 

권장 : ArrayList > Vector, 수행 속도 : ArrayList > Vector. 

 

ArrayList를 사용해 구현했는데 나중에 프로그램에서 동기화가 필요하여 Vector로 바꾸지 않고 아래와 같이 생성 코드를 쓰면된다.

Collections.synchronizedList(new ArrayList<String>());

 

LinkedList 클래스

728x90

'KDT > Java' 카테고리의 다른 글

240124 Java - 예외 1  (0) 2024.01.24
240115 Java  (0) 2024.01.15
240110 Java  (0) 2024.01.10
240108 Java  (0) 2024.01.08
240104 Java  (0) 2024.01.04