벡엔드 웹프로그래밍/java

JAVA 프로그래밍 54일차 (25/2/3)

wkun 2025. 2. 3. 17:56

contents

 

chapter11

1.컬렉션 프레임워크(Collection Framework)이란?

2.Set

1)HashSet

2)TreeSet

3.List

1)ArrayList

2)LinkedList

4.Queue와 Stack

1)Queue

2)Stack

5.Map

1)Map

컬렉션 프레임 정리

<회원관리 프로그램>

 

---------------------------------------------------------------------------

 

 

chapter11

 

1.컬렉션 프레임워크(Collection Framework)이란?

-컬렉션 프레임워크이란 데이터를 효율적으로 다루기 위한 클래스들의 집합임

-프로그래밍에서 많은 데이터를 저장할 때는 어떤 형태로 저장하는 것이 효율적일지 고려 해야 함. 그러한 고민을 통해 만들어진 효율적인 구조를 자료구조(Data Structure)라고 하며, 자바에서는 이를 클래스로 제공함. 이 클래스들의 집합을 컬렉션 프레임워크(Collection Framework)라고 함

-컬렉션  프레임워크는 Collection 인터페이스를 구현하는 Set, List, Queue 그리고 독자적인 Map 인터페이스가 있음. Collection 인터페이스의 중요한 메서드는 다음과 같음. Collection 인터페이스를 구현하는 클래스들은 같은 조작방법을 가지게 됨

 

*데이터를 묶어 관리하는 방법

변수-> 1.변수(변수 여러개): 같은 타입

            2.객체(변수 여러개): 다른 타입은 가능!

메서드 설명
boolean add(E e) 파라미터로 지정된 요소를 컬렉션에 추가
boolean contains(Object obj) 객체 obj가 컬렉션에 존재하는지 여부
boolean isEmpty() 컬렉션이 비어있는지 아닌지 여부
Iterator iterator() 해당 컬렉션 요소의 iterator 객체를 반환
boolean remove(Object obj) 객체 obj를 제거
int size() 요소의 개수를 반환

 

-iterator() 메서드는 해당 컬렉션의 iterator를 반환하는 메서드임. iterator란 컬렉션의 요소에 접급해서 반복적인 작업을 할 때 도움을 주는 객체임. 따라서 이를 반환하여 iterator 객체 내부의 클래스를 사용하면 상당히 효율적인 작업을 함

Iterator 객체의 메서드 설명
hasNaxt() 다음 요소가 있는지 없는지 판단
next() 다음 요소를 반환

 

-컬렉션의 iterator를 반환받은 후 메서드를 사용해서 순차적으로 요소에 접근함. 먼저 컬렉션의 iterator 객체를 반환받음. 참보변수 it를 통해 iterator를 사용함

ZonedDateTime zdt = ZonedDateTime.now(ZoneLd.of("UTC");

 

-while문의 조건으로 it.hasNext()를 사용함. 이렇게 작성하면 다음 요소가 있으면 계속해서 작업하고 없으면 멈추게 되어 모든 요소에 대해 작업이 가능함. it.next() 메서드는 다음 요소를 반환하기 때문에 while문과 더불어서 원하는 작업을 함

 

while(it.hasNext()){
         System.out.println(it.next());

 

*클래스의 종류

1.전역변수(저장)          
           ↓   
     저장용도                     
           ↓ 
     instance                        

 2.함수(API)
기능을 활용(함수)
          
        static
        사용자 선택을 제공
         :instance

 

package ch11;


import java.util.Scanner;


class member{//인스턴스, 저장
String age;
String name;
int x;
boolean y;
}


public class exam { //클래스 객체 static 생성 , 기능
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("안녕하세요 회원관리 시스템입니다.");
member mb = new member();//저장용도
System.out.println("나이를 입력해주세요!");
mb.age = sc.nextLine();
System.out.println("이름을 입력해주세요!");
mb.name = sc.nextLine();
}
}


}

 

2.Set 

-Set은 영어로 집합이라는 뜻으로 요소들을 집합적으로 모아놓은 자료구조임. Set 인터페이스의 특징으로는 중복된 데이터를 가지지 않으며 저장 순서를 유지하지 않는다는 특징이 있음

Set 인터페이스
1.중복된 요소를 가지지 않는다. //중복된 요소를 추가하면 false 반환 ->같은 Data type을 가질 수 없다
2.저장 순서를 유지하지 않는다.  -> 꺼낼 때 순서x           

 

-Set 인터페이스를 구현한 클래스로는 HashSet, TreeSet 등이 있음

 

1)HashSet

-HashSet은 Set 인터페이스를 구현하였으므로 중복이 없고, 저장하는데 순서가 없음

생성자 설명
HashSet() HashSet 클래스의 기본 생성자
HashSet(Collection collection) 컬렉션의 요소로 HashSet 객체 생성
HashSet(int capacity) capacity의 용량을 가진 객체 생성

 

-HashSet은 Collection 인터페이스의 메서드를 구현하였으므로 같은 메서드명으로 컬렉션 작업이 가능함. HashSet에서 add() 메서드로 요소를 추가할 경우 중복된 요소가 이미 존재하면 false를 반환하고 요소를 추가하지 않음

 

2)TreeSet

-TreeSet은 기존의 Set 인터페이스에서 정렬기능이 추가된 형태임. 하지만 마찬가지로 중복된 데이터는 허용하지 않음.

-TreeSet이 데이터를 정렬하는 방식은 기존의 데이터와 비교하여 작은 값은 왼쪽에, 큰 값은 오른쪽에 추가하여 마치 Tree 구조처럼 저장하는 방식임. 이러한 규칙을 통해 정렬되기 때문에 범위 검색에 효과적인 자료구조임

 

<HashSet과 TreeSet의 요소를 저장한 결과를 비교해보는 코드>

package ch11;
import java.util.TreeSet;
import java.util.HashSet;
import java.util.Iterator;


public class exam89 {


public static void main(String[] args) {
String demon = new String("demon"); //String 1
String banana = new String("banana"); //String 2
String tomato = new String("tomato"); //String 3
String apple = new String("apple"); //String 4
String cargo = new String("cargo"); //String 5

HashSet hs = new HashSet(); //주소 저장(1, 2, 3, 4, 5)
hs.add(demon);
hs.add(banana);
hs.add(tomato);
hs.add(apple);
hs.add(cargo);

System.out.println("<HashSet 출력>");
Iterator it = hs.iterator();
while(it.hasNext()) { // 다음 것 있나? 커서 다음으로 이동
System.out.print(" " + it.next()); //주세요
}

TreeSet ts = new TreeSet(); //주소 저장(1, 2, 3, 4, 5)
ts.add(demon);
ts.add(banana);
ts.add(tomato);
ts.add(apple);
ts.add(cargo);

System.out.println("");
System.out.println("<TreeSet 출력>");
Iterator its = ts.iterator();
// while(its.hasNext()) { // 다음 것 있나? true(bof), false(eof= -1) 커서 다음으로 이동
// System.out.print(" " + its.next()); //주세요
// }
System.out.println("for문 구현");
for(int i = 0; i < ts.size(); i++) { //i 필요없음
its.hasNext();//커서를 다음으로 이동
System.out.println(its.next());//해당데이터 반환
}



}


}

 

실행 결과

<HashSet 출력>
banana apple demon tomato cargo
<TreeSet 출력>
for문 구현
apple
banana
cargo
demon
tomato

 

3.List

-리스트(List)는 데이터를 일렬로 늘어놓은 구조를 말함. 리스트는 저장되는 요소들의 순서가 유지되며, 중복을 허용함. List 인터페이스를 구현한 클래스로는 ArrayList, LinkedList 등이 있음

-List 인터페이스의 주요 메서드는 다음과 같음

메서드 설명
void add(int index, E elem) index 위치에 요소 elam 추가
E get(int index) index 위치에 있는 요소를 반환
int indexOf(Object o) 요소 o가 있는 위치를 반환
ListIterator listiterator() ListIterator 객체를 반환
E remove(int index) index 위치에 있는 요소 삭제하고 삭제한 요소를 반환
E set(int index, E elem) 지정한 index의 요소를 elem으로 변경

 

1)ArrayList

-ArrayList는 배열에서 발전된 형태의 List임. 요소를 추가하면 0번 인덱스부터 차례대로 요소가 저장됨. 다만 특정 메서드를 사용해서 원하는 위치에 요소를 추가하거나, 삭제, 반환할 수 있음

 

*데이터 꺼낼 때

1.이터레이터 방식(순차접근)

2.get방식-> 직접 지정

 

<ArrayList의 기본적인 사용방법을 알아보기 위한 코드>

package ch11;
import java.util.*;


public class exam90 {


public static void main(String[] args) {
String demon = new String("demon"); //String 1
String banana = new String("banana"); //String 2
String tomato = new String("tomato"); //String 3
String apple = new String("apple"); //String 4
String cargo = new String("cargo"); //String 5

ArrayList<String> list = new ArrayList<String>(); //ArrayList<Object> list = new ArrayList<Object>(); < >생략
list.add(demon);
list.add(banana);
list.add(tomato);
list.add(apple);
list.add(cargo);

System.out.println("foreach문");
for(String test : list) {
System.out.println(test);

}
System.out.println("for문");
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}


}


}

 

실행 결과

foreach문
demon
banana
tomato
apple
cargo
for문
demon
banana
tomato
apple
cargo

 

2)LinkedList

-LinkedList는 List 인터페이스를 구현하면서 Queue 인터페이스도 함께 구현함. LinkedList는 말 그대로 요소들이 서로 유기적으로 연결(Link)되어있는 리스트이며 각 요소가 자신의 이전 요소의 주소와 다음 요소의 주소를 가지고 있는 구조임

 

<LinkedList를 만들고 반환하는 코드>

package ch11;


import java.util.Iterator;
import java.util.LinkedList;


public class exam91 {


public static void main(String[] args) {
String demon = new String("demon");
String banana = new String("banana");
String tomato = new String("tomato");
String apple = new String("apple");
String cargo = new String("cargo");

LinkedList ll = new LinkedList();
ll.add(demon);
ll.add(banana);
ll.add(tomato);
ll.add(apple);
ll.add(cargo);

Iterator its = ll.iterator();
while(its.hasNext()) {
System.out.println(" "+its.next());
}

}


}

   

실행 결과

demon
banana
tomato
apple
cargo

 

4.Queue와 Stack

-Queue는 먼저 들어온 데이터를 먼저 내보내는 형태이고, Stack은 마지막에 들어온 데이터가 가장 먼저 나가는 자료 구조임

 

1)Queue

-Queue 인터페이스는 한쪽 방향에서는 요소를 추가하고 다른 쪽에서는 요소를 내보내는 형태임. 먼저 들어온 요소가 먼저 출력되기 때문에 FIFO(First In First Out)구조라고 함

메서드 설명
boolean add(E e) Queue에 요소 e를 추가
E element() Queue의 제일 상단 요소 반환
E remove() Queue의 최상단 요소를 반환 후 제거
boolean offer(E e) Queue에 요소 e를 추가
E peek() Queue의 제일 상단 요소 반환
E poll() Queue의 최상단 요소를 반환 후 제거

 

-Queue의 메서드를 보면 위의 세 가지 메서드와 아래 세 가지 메서드가 이름만 다를 뿐 동작하는 방식은 같은 것을 볼 수 있음. 이들의 차이는 위의 add(), element(); remove()는 예외를 발생시키고, 아래의 offer(), peek(), poll() 메서드는 예외를 발생시키지 않는 것임.

-예를 들면 Queue에 아무런 자료가 없을 때 element 메서드를 사용하는 경우에는 NoSuchElementExeption이 발생하지만 peek 메서드를 사용하는 경우에는 예외는 발생하지 않고 null 값만을 반환함

 

2)Stack

-Stack은 요소를 저장하는 방향과 출력하는 방향이 같음. 마지막에 추가되는 요소가 가장 먼저 출력되기 때문에 LIFO(Last In First Out) 구조라고 불림. 가장 늦게 저장된 e가 가장 먼저 출력되고 가장 먼저 저장되었던 a가 가장 마지막으로 출력될 것임

-마지막에 들어온 요소가 가장 먼저 출력되어야 하는 경우에 Stack 구조를 사용함

메서드 설명
E element() 요소를 반환
E peek() 요소를 반환
E pop() 요소 하나를 제거하면서 반환
E push(E item) 새로운 요소 추가
int search(Object o) 요소 o가 있는지 검색해서 위치를 반환

 

5.Map

-Map 인터페이스는 키와 값을 쌍으로 저장하는 구조임

-Map에서는 키를 통해서 값을 참조할 수 있으며 이는 수학의 함수와 비슷한 구조임. 키를 통해서 값을 가져오는 방식은 함수에 x와 y가 쌍을 이루는 것과 유사함

-Map 인터페이스를 구현한 대표적인 클래스에는 HashMap, TreeMap 등이 있음

-키와 값을 사용한다는 점이 공통적인 특징임. 다만 HashMap은 내부적으로 해싱(Hashing) 검색을 사용하기 때문에 대용량관리에 좋은 성능을 보이고 TreeMap은 트리에 저장되는 방식을 사용하여 순서대로 저장된다는 특징이 있음

메서드 설명
boolean containsKey(Object key) 해당 키가 있는지 여부 반환
boolean containsValue(Object value) 해당 값이 있는지 여부 반환
V get(Object key) 해당 key와 쌍인 값을 반환
boolean isEmpty() 맵 객체에 요소가 없는지 판단
Set<key> keySet() 키들을 set형태로 반환
V put(K key, V value) 키와 값을 요소로 추가
V remove(Object key) 이 키를 가진 요소를 제거
int size() 전체 요소의 개수를 반환

 

<HashMap을 이용하여 간단하게 사전(Dictionary) 프로그램 만들기>

1)

package ch11;
import java.util.HashMap;
public class exam92 {


public static void main(String[] args) {
String demon = new String("demon");
String banana = new String("banana");
String tomato = new String("tomato");
String apple = new String("apple");
String cargo = new String("cargo");

HashMap<String, String> hm = new HashMap<String, String>();
// 키 , 데이터 cf)add(객체) /put(키, 데이터 객체)
hm.put("데몬", demon);
hm.put("바나나", banana);
hm.put("토마토", tomato);
hm.put("애플", apple);
hm.put("카고", cargo);
System.out.println("해당하는 뜻은: "+ hm.get("데몬")); //키값


}


}

 

실행 결과

해당하는 뜻은: demon

 

2)

package ch11;


import java.util.HashMap;
import java.util.Scanner;


public class exam921 {


public static void main(String[] args) {
HashMap hm = new HashMap();
Scanner sc = new Scanner(System.in);

hm.put("apple", "사과");
hm.put("papper", "종이");
hm.put("flower", "꽃");
String voca;

System.out.println("알고 싶은 단어를 입력하세요.");
voca = sc.nextLine();

if(hm.containsKey(voca)) {
System.out.println("해당하는 뜻은: " + hm.get(voca));
}else {
System.out.println("해당 단어에 대한 뜻은 데이터베이스에 없습니다.");
}
}


}

 

실행 결과

알고 싶은 단어를 입력하세요.
papper
해당하는 뜻은: 종이
알고 싶은 단어를 입력하세요.
clock
해당 단어에 대한 뜻은 데이터베이스에 없습니다.

 

-put 메서드를 통해 영어단어를 키로 한글 뜻을 값으로 하는 데이터 쌍을 HashMap에 저장함

-입력을 받고 입력받은  값에 해당하는 키가 존재하는지 containsKey() 메서드로 확인함. 일치하는 키가 존재한다면 get() 메서드를 통해 키에 해당하는 값을 영어단어의 뜻으로 출력하고 해당하는 키가 없으면 데이터베이스에 아직 없다고 출력함

 

 

컬렉션 프레임워크 정리

컬렉션 프레임워크
종류 중복여부 정렬 장점 단점 객체생성 입력 출력
HashSet X X 중복을 허용하지 않으므로 빠른 데이터 검색이 가능 요소의 순서를 유지하지 않으므로 해쉬코드 및 equals함수를 잘못사용시 성능이 저하되는 경우가 있음 HashSet hs = new HashSet( );
HashSet<String> hs = new HashSet<String>( );
hs.add(Object); Iterator it = hs.iterator( );
while(it.hasNext( )) {
System.out.print(" "+it.next( ));
}
TreeSet X O 오름차순으로 자동으로 정렬되므로 범위검색이나 정렬된 데이터 접근이 효율적임 데이터 삽입 및 삭제시 성능이 저하되는 요인으로 작용 TreeSet ts = new TreeSet( );
TreeSet<String> ts = new TreeSet<String>( );
ts.add(Object); Iterator it = ts.iterator( );
while(it.hasNext( )) {
System.out.print(" "+it.next( ));
}
ArrayList O O 인덱스를 기반으로 빠른 조회가 가능하며 크기를 동적으로 조절할 수 있음 중간 삽입, 삭제시 성능저하의 원인으로 작용됨 ArrayList list = new ArrayList();
ArrayList<String> list = new ArrayList<String>();
list.add(Object); list1.get(2)
LinkedList O O 요소의 삽입 및 삭제가 빠름 인덱스를 기반으로 접근이 안되므로 속도가 느려질수있음(순차접근) LinkedList linklist = new LinkedList( );
LinkedList<String> linklist = new LinkedList<String>( );
linklist.add(Object); Iterator its = linklist.iterator( );
while(its.hasNext( )) {
System.out.print(" "+its.next( ));
}
HashMap X(key)
O(Data)
X key-value 기반의 데이터 저장 및 검색이 빠름 키는 유일해야하며 중복을 허용하지 않음 키의 순서를 보장하지 않고 키값의 충돌이 발생하면 성능이 저하됨 HashMap hm = new HashMap( );
HashMap<String,String> hm = new HashMap<String,String>( );
hm.put(text, Object); hm.get(text)

 

 

<회원관리 프로그램>

package project1;


import java.util.ArrayList;
import java.util.Scanner;
import java.util.ArrayList;


public class start {


public static ArrayList<member> memberlist = new ArrayList<member>(); //주소 저장


public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int choice = 0;
// 회원가입
// 회원조회


while (true) {
System.out.println("회원관리 프로그램입니다."); // 다시 시작
System.out.println("0. 종료");
System.out.println("1. 회원가입");
System.out.println("2. 전체회원조회");
System.out.println("3. 특정회원조회");
choice = sc.nextInt(); // 밖에 있으면 무한반복, 다시 입력하기 위해 여기 위치
if (choice == 0) {
System.out.println("프로그램을 종료합니다.");
break;


} else if (choice == 1) {
join();


} else if (choice == 2) {
search();


}else if (choice == 3) {
membersearch();
}
else {
System.out.println("잘못입력하셨습니다.");
}
}


}


public static void join() {
System.out.println("회원가입을 실행합니다."); // 함수 연결 하기
Scanner text = new Scanner(System.in); // 문자, 숫자 섞어쓸 수 없음, 한번 쓰면 오염됨
Scanner number = new Scanner(System.in);
member mb = new member();


// member mb = new member(); //1.먼저 입력


System.out.println("아이디를 입력해주세요!");
String id = text.nextLine();
// mb.setId(id);


System.out.println("패스워드를 입력해주세요!");
String password = text.nextLine();
// mb.setPassword(password);


System.out.println("이름을 입력해주세요!");
String name = text.nextLine();
// mb.setName(name);


System.out.println("나이를 입력해주세요");
int age = number.nextInt();
// mb.setAge(age);
member mb = new member(name, id, password, age); //2.나중에 입력 - 멤버 매개변수


memberlist.add(mb);

}

public static void search() {
System.out.println("전체회원조회입니다.");
for (member mb : memberlist) {
System.out.println("-------멤버--------");
System.out.println("아이디:" + mb.getId());
System.out.println("패스워드:" + mb.getPassword());
System.out.println("이름:" + mb.getName());
System.out.println("나이:" + mb.getAge());
System.out.println("-----------------");


}
}
public static void membersearch() {
System.out.println("찾으실 회원의 아이디를 입력하세요");
Scanner sc = new Scanner(System.in);
String id = sc.nextLine();
for(int i = 0; i < memberlist.size(); i++) {
member mb = memberlist.get(i);
String getId = mb.getId();
if(id.equals(getId)) { //검색엔진 if
System.out.println("-------멤버--------");
System.out.println("아이디:" + mb.getId());
System.out.println("패스워드:" + mb.getPassword());
System.out.println("이름:" + mb.getName());
System.out.println("나이:" + mb.getAge());
System.out.println("-----------------");
break;
}
}
}
}
package project1;
//project의 main은 하나만 가짐
public class member {
private String name;
private String id;
private String password;
private int age; //데이터 저장변수에 접근하지 못하도록 하기위해 private

//생성자: 필수

public member(String name, String id, String password, int age) {
super();
this.name = name;
this.id = id;
this.password = password;
this.age = age;
}
public member() {} //기본생성자
//getter, setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}



}