java 제네릭, 컬렉션

limchard·2023년 10월 27일
0

java

목록 보기
41/48

이론

배열(array)의 경우 값과 순서가 정해져 있다. 제네릭과 컬렉션을 이를 보안하여 값과 순서 변동이 배열에 비해 자유롭다.
사용 이유 : 많은 데이터를 처리하기 위해 배열을 이용했지만, 크기가 고정, 삽입 삭제가 오래걸림
⇒ 그로 인해 동적 배열 개념인 Set,List,Map을 사용함!!
Set : 데이터의 중복허용 안됨, 순서를 유지하지 않는 집합
List : 데이터의 중복허용 됨, 순서유지
Map : Key값을 알면 Value값을 구하기 가능
인터페이스 설 명 특 징 대표 구현 클래스

List순서가 있는 데이터의 조합데이터의 중복을 허용ArrayList, LinkedList
Set순서를 유지하지 않는 데이터의 집합데이터의 중복을 허용HashSet, LinkedHashSet
Map키(key)와 값(value)의 쌍으로 이루어진 데이터 집합순서 유지 X, 키 중복 X, 값 중복 OHashMap, LinkedHashMap, Properties

컬렉션-자료구조

구조 : 컬렉션(인터페이스 or 클래스)<제네릭> 변수=new 컬렉션(클래스만)<제네릭>();


set, HashSet

  • Set : 데이터의 중복허용이 안됨. 순서를 유지하지 않아도 되는 집합
  • List : 데이터의 중복 허용. 순서를 유지해야 함.
  • Map : Key값을 알면 Value값을 구하기 가능하다.
  • 위 셋중에 List가 제일 중요하다.
  • List : interface이므로 생성 불가
  • array list : class이므로 생성 가능
package Day0703;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class ExHashSet_10 {

    public static void main(String[] args) {
        // 컬렉션:자료의 구조를 의미한다.(set,vector,arraylist)
        // 컬렉션이 복수의 자료형을 저장으나 안정성이 조금 떨어질 수 있다. 그래서 나온것이 제네릭이다.
        // (인터페이스 or 클래스)<데이터형> 참조변수명(객체이름)=new 클래스명<데이터형>;

        Set<String> set1=new HashSet<String>();
        // Set에 String데이터를 담겠다-Set은 인터페이스이므로 객체생성이 불가능하다.

        // 추가... 배열에 비해 가변적이다.
        set1.add("사과");
        set1.add("포도");
        set1.add("사과"); // 중복되었으므로 갯수포함 안됨.
        set1.add("키위");
        set1.add("오렌지");
        set1.add("바나나");

        System.out.println("데이터 갯수: "+set1.size());
        System.out.println();

        System.out.println("출력#1_for~each");
        for(String s:set1){
            System.out.println(s);
        }
        System.out.println();

        System.out.println("출력#2_Iterator");
        Iterator<String> iter= set1.iterator();
        while(iter.hasNext()){  // 돌려줄게 있으면 true,
            System.out.println(iter.next());
        }
        System.out.println();
        System.out.println("출력#3_for");
        Object[] ob=set1.toArray();
        for(int i=0;i< ob.length;i++){
            System.out.println(ob[i]);
        }

        // 모든데이터 삭제
        set1.clear();

        if(set1.isEmpty())
            System.out.println("Set타입안에 데이터가 없다."); //true
        else
            System.out.println("Set타입안에 데이터가 있다."); // false
    }
}

결과

데이터 갯수: 5
출력#1_for~each
포도
오렌지
사과
키위
바나나
출력#2_Iterator
포도
오렌지
사과
키위
바나나
출력#3_for
포도
오렌지
사과
키위
바나나
Set타입안에 데이터가 없다.

예제2

package Day0703;

import java.util.HashSet;

public class SetInt_11 {

    public static void main(String[] args) {
        HashSet<Integer> set1=new HashSet<>();
         // Set과 HashSet의 차이는 인터페이스와 클래스 차이이다.

        set1.add(11);
        set1.add(23);
        set1.add(42);
        set1.add(11);
        set1.add(33);
        set1.add(76);

        System.out.println("갯수: "+set1.size());

        System.out.println("출력3_for");

        Object[] ob=set1.toArray();
        for(int i=0;i< ob.length;i++){
            System.out.printf("%5d",ob[i]);
        }
    }
}

결과

갯수: 5
출력3_for
33 23 42 11 76

List

  • 가장 많이사용하는 interface는 List이다.
  • List인터페이스를 구현한 Vector, ArrayList
  • 순차적으로 데이터 들어감, 중복데이터 허용
  • 처음생성시 일정한 갯수로 생성이 된다. 그 이상의 데이터를 넣으면 공간이 자동증가한다.
package Day0703;

import java.util.List;
import java.util.Vector;

public class List_12 {

    public static void main(String[] args) {

//        List<String> list=new Vector<>();
        Vector<String> list=new Vector<>();
//      List,Vector가 컬렉션이다.
//      <제네릭>
        System.out.println("초기할당크기: "+list.capacity());
        System.out.println("초기 데이타 크기: "+list.size());

        list.add("사과");
        list.add("포도");
        list.add("사과"); // 중복이 가능하다
        list.add("키위");
        list.add("수박");
        list.add("낑깡");

        System.out.println("초기할당크기: "+list.capacity());
        System.out.println("초기 데이타 크기: "+list.size());

        System.out.println("출력#1");
        for(int i=0;i< list.size();i++){
//          System.out.println(list.get(i));
          String s=list.get(i);
          System.out.println(s);
        }

        System.out.println("출력#2_for~each");
        for(String st:list){
          System.out.println(st);
        }

        System.out.println("출력#3_toArray");
        Object[] ob= list.toArray();
        for(int i=0;i<ob.length;i++){
          System.out.println(ob[i]);
        }
    }
}

결과

초기할당크기: 10
초기 데이타 크기: 0
초기할당크기: 10
초기 데이타 크기: 6
출력#1
사과
포도
사과
키위
수박
낑깡
출력#2_for~each
사과
포도
사과
키위
수박
낑깡
출력#3_toArray
사과
포도
사과
키위
수박
낑깡

예제2

  • 명시적 생성자
  • 일반 생성자
package Day0704;

public class Board_02 {

    private String writer; // 글쓴이
    private String subject; // 제목
    private String content; // 내용

    // 디폴트 생성자
    public String getWriter() {
        return writer;
    }

    public void setWriter(String writer) {
        this.writer = writer;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    // 일반생성자
    public Board_02(){

    }

    // 명시적 생성자
    public Board_02(String w, String s, String c) {
        this.writer=w;
        this.subject=s;
        this.content=c;

    }
}

package Day0704;

import java.util.List;
import java.util.Scanner;
import java.util.Vector;

public class VectorBoard_02 {

    // 값을 담자.
    //Vector list=new Vector();
    List<Board_02> list=new Vector(); // List는 interface이다. Vector는 클래스이다.
    // 클래스 타입으로 지정했으므로 데이터를 꺼내고 받을 때도 클래스이어야 한다.

    // 입력 메서드 호출
    public void inputBoard(){
        Scanner sc=new Scanner(System.in);
        String writer,subject,content;

        System.out.println("작성자명?");
        writer=sc.nextLine();
        System.out.println("제목?");
        subject=sc.nextLine();
        System.out.println("내용?");
        content=sc.nextLine();

        //Board_02 data=new Board_02(writer,subject,content);
        Board_02 data=new Board_02();
        data.setWriter(writer);
        data.setSubject(subject);
        data.setContent(content);

        list.add(data);

        System.out.println("현재데이터 갯수: "+list.size());
    }

    // 출력 메서드 호출
    public void writeBoard(){
        System.out.println("**게시판 출력**");
        System.out.println("================================");

        for(int i=0;i< list.size();i++){
            Board_02 b=list.get(i); // 리스트내에 지정된 위치에 있는 요소값을 돌려준다.

            System.out.println("번호: "+(i+1)+"\\t작성자: "+b.getWriter());
            System.out.println("제목: "+b.getSubject());
            System.out.println("내용: "+b.getContent());
            System.out.println("------------------------------------");
        }
    }

    public static void main(String[] args) {
        //메서드가 static이 아니라서 생성하고 불러올 수 있다
        //static이라면 메서드명만으로 생성 가능
        VectorBoard_02 vb=new VectorBoard_02();
//        vb.inputBoard();
        Scanner sc=new Scanner(System.in);
        int n;

        while (true){
            System.out.println("1.추가    2.전체출력     9.종료 ");
            n=Integer.parseInt(sc.nextLine());

            if(n==1){
                vb.inputBoard();
            } else if (n==2) {
                vb.writeBoard();
            } else if (n==9) {
                System.out.println("프로그램 종료");
                break;
            } else {
                System.out.println("잘못입력했어요");
                continue;
            }
        }
    }
}

결과

1.추가 2.전체출력 9.종료
1
작성자명?
작성자
제목?
제목이다
내용?
내용이없다
현재데이터 갯수: 1
1.추가 2.전체출력 9.종료
1
작성자명?
추가작성자
제목?
추가제목이다
내용?
제목아니내용추가다
현재데이터 갯수: 2
1.추가 2.전체출력 9.종료
4
잘못입력했어요
1.추가 2.전체출력 9.종료
2
게시판 출력
번호: 1 작성자: 작성자
제목: 제목이다
내용: 내용이없다
번호: 2 작성자: 추가작성자
제목: 추가제목이다
내용: 제목아니내용추가다
1.추가 2.전체출력 9.종료
9
프로그램 종료

ArrayUnit(배열)

package Day0703;

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

public class ArrayUnit_13 {

    public static void write(String title,List<String> list){
        System.out.println("***"+title+"***");
        for (int i=0;i< list.size();i++){
            System.out.println(i+":"+list.get(i));
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // List의 여러가지 메서드를 확인 및 연습

        String[] data={"영주","순영","연주","진평"};

        // 배열의 데이터를 list에 넣기
        List<String> list=new ArrayList<>();

        for(String d:data){
            list.add(d);
        }
        write("초기에 배열데이타 add 후 출력",list);

        ////////////////////////////////////////
        System.out.println("1번 인덱스 삭제하기");
        list.remove(1);
        write("1번 삭제후 결과",list);      /////////////////////////////////////////////////
        System.out.println("현규 추가하기");
        list.add("현규");
        write("현규 추가 후 출력",list);       ////////////////////////////////////////////////
        System.out.println("값 변경");
        list.set(0,"영환");
        write("0번 인덱스 변경 후 출력",list);
      /////////////////////////////////////////
        System.out.println("전체삭제");
        list.clear();
        System.out.println("크기: "+list.size());
    }
}
***초기에 배열데이타 add 후 출력***
0:영주
1:순영
2:연주
3:진평
1번 인덱스 삭제하기
***1번 삭제후 결과***
0:영주
1:연주
2:진평
현규 추가하기
***현규 추가 후 출력***
0:영주
1:연주
2:진평
3:현규
값 변경
***0번 인덱스 변경 후 출력***
0:영환
1:연주
2:진평
3:현규
전체삭제
크기: 0

예제2

package Day0704;

import java.util.ArrayList;

public class ArrayList_01 {

    public static void main(String[] args) {

        String[] flowers={"장미꽃","프리지아","벚꽃","수국"};
        // 임플리먼트 한 클래스? 임플리먼트?
        // 객체 삽입, 삭제할 수 있는 컨테이너 클래스를 생성해주자.
        ArrayList<String> list=new ArrayList<>();
        //리스트와 어레이 리스트의 차이 인터페이스와 그걸 반영한 클래스

        // 데이터 담기
        for(String f:flowers){
            list.add(f);  // 삽입
        }

        System.out.println("size: "+list.size());
/*
        // 이건 내가 한거. 일반 배열로 list가 아니다. 나중에 수정 불가.
        System.out.println("#출력1_for");
        for(int i=0;i<flowers.length;i++){
            System.out.println(flowers[i]);
        }
 */
        System.out.println("#출력1_for");
        for(int i=0;i<flowers.length;i++){
            String s=list.get(i);
            System.out.println(s);
        }

        System.out.println("#출력2_for-each");
        for(String e:list){
            System.out.println(e);
        }
    }
}

결과

size: 4
#출력1_for
장미꽃
프리지아
벚꽃
수국
#출력2_for-each
장미꽃
프리지아
벚꽃
수국
profile
java를 잡아...... 하... 이게 맞나...

0개의 댓글