재밌고 어려운 IT를 이해해보자~!

컬렉션 프레임워크 (Collection Framework) 본문

코리아IT핀테크과정

컬렉션 프레임워크 (Collection Framework)

언제나즐거운IT 2023. 12. 7. 18:05

컬렉션 프레임워크란?

데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
ex) 컬렉션,Spring, Mybatis,JPA,....
뼈대, 틀, 구조, ...abstract 
개발자들에게 뼈대를 제공해주겠다. 라는 컨셉이다.
개발 편의성을 제공

 

장점 
1) 개발자들의 실력이 상향 평준화
2) 유지보수 용이 ★ 최고목표 ★

컬렉션 프레임워크
배열같은 자료형(자료구조)들을 제공하는 라이브러리
JAVA에서 기본 제공해줌
[배열리스트], 링크리스트, 집합, [맵], 트리, ..........

배열리스트란 

향상된 배열
서로 관련된 데이터들을 저장할수있는 자료형
같은 자료형 X == > 서로다른 자료형들을 같은 공간(메모리)에 저장하는게 맞나 ? 
별로 효율이 좋을 것 같지 않다.
==> 같은 자료형 저장을 "강제" !!!!!! 하는것이 바로 제네릭이다.
결론) 배열리스트는 반드시 제네릭과 함께 사용해야한다!!!!

리스트가 가지고 있는 메서드는 무지많다.

배열보다 완전좋음!

public class Test01 {
	public static void main(String[] args) {
		
		ArrayList<Integer> datas = new ArrayList<Integer>(); // 강제중
		datas.add(190);
		System.out.println(datas);
		datas.add(0, 11);
		datas.add(1, 13);
		datas.add(0, 5);
		boolean ans = datas.contains(13);
		boolean ans2 = datas.contains(50);
		System.out.println(ans);
		System.out.println(ans2);
		System.out.println(datas.get(0));
		System.out.println(datas.isEmpty());
		datas.remove(0);
		System.out.println(datas);
		System.out.println(datas.size());
		datas.clear();
		
		System.out.println(datas); //헉 주소값을 알려주지않고 공백을 보여준다!!
		
	}
}

 

리스트 활용

package class01;

import java.util.ArrayList;
import java.util.Random;

public class Test02 {
	public static void main(String[] args) {
		Random rand = new Random();
		int ranNum = rand.nextInt(21) + 10;
		int total=0;
		double avg=0;
		ArrayList<Integer> list = new ArrayList<Integer>();
		for (int i = 1; i < ranNum; i++) {
			if (i % 2 != 0) {
				list.add(i);
			}
		}
		for (int i = 0; i < list.size(); i++) {
			total += list.get(i);
		}
		avg = total*1.0/list.size();
		System.out.println(list);
		System.out.println(total);
		System.out.printf("%.02f",avg);
	}
}

 

Private, Getter, Setter

Private -> 접근제어자 보통 메서드는 public 멤버변수는 private으로 보호한다.
JAVA의 모든 멤버변수는 private으로 보호해야하고 외부에서의 직접 접근을 막아야한다.
"캡슐화(정보은닉)" 을 위해서 접근제어자 private 키워드를 작성
감춰진 멤버변수의 값을 받아오는 메서드 getter()
감춰진 멤버변수에게 값을 부여하는 메서드를 setter(). 

getter setter를 통해서 접근할 수 있으면 어떤 보호가 되는건가 ?!

 

바로 모든 메서드는 기록이 남기 때문에 !! getter setter을 통해서만 멤버변수를 접근하고 조작해야한다.

 

Private, Getter, Setter을 활용한 학생부 프로그램 ( 관리자 존재 )

package class01;

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

// 학생부 프로그램
// CRUD
// 학생 추가 [관]
// 학생 목록 출력
// 1명 검색
// 1등 출력
// 학생 점수 변경 [관]
// 학생 삭제 [관]

class Student{
	//접근제어자
	// public 메서드
	// priavet 멤버변수
	// JAVA의 모든 멤버변수는 private으로 보호해야함
	// 외부에서의 직접 접근을 막아야함
	// "캡슐화(정보은닉)"
	// 접근제어자 private 키워드를 작성
	// 감춰진 멤버변수의 값을 받아오는 메서드 getter()
	// 감춰진 멤버변수에게 값을 부여하는 메서드를 setter()
	// 모든 메서드는 기록이 남기 때문에 getter setter을 통해서만 멤버변수를 조작해야한다. 
	
   private int num; // PK : 사용자가 선택 xxx 프로그램에서 설정 O
   private String name;
   private int score;
   private static Random random=new Random();
   Student(int num, String name){
      this.num=num;
      this.name=name;
      this.score=Student.random.nextInt(101);
   }
   //get멤버변수명()
   //set멤버변수명()
   public int getNum() {
	return num;
}


public void setNum(int num) {
	this.num = num;
}


public String getName() {
	return name;
}


public void setName(String name) {
	this.name = name;
}


public int getScore() {
	return score;
}


public void setScore(int score) {
	this.score = score;
}


@Override
   public String toString() {
      return "["+this.num+"] "+this.name+"학생 "+this.score+"점";
   }
}

public class Test03 {
   
   public static int hasStudent(ArrayList<Student> datas,int num) {
      boolean flag=false;
      int i;
      for(i=0;i<datas.size();i++) {
         if(num==datas.get(i).getNum()) {
            flag=true;
            break;
         }
      }
      
      if(!flag) {
         System.out.println("해당 번호의 학생은 없습니다...");
         i=-1;
      }
      
      return i;
   }

   public static void main(String[] args) {

      ArrayList<Student> datas=new ArrayList<Student>();

      int PK=1001;
      datas.add(new Student(PK++,"샘플01"));
      datas.add(new Student(PK++,"샘플02"));

      //System.out.println(datas);

      Scanner sc=new Scanner(System.in);

      while(true) {
         System.out.println("1. 목록출력");
         System.out.println("2. 학생검색");
         System.out.println("3. 1등출력");
         System.out.println("0. 프로그램 종료");
         System.out.print("입력 >> ");
         int action=sc.nextInt();
         if(action==0) {
            break;
         }
         else if(action==777) {
            while(true) {
               System.out.println("=== 관리자 모드 ===");
               System.out.println("1. 학생추가");
               System.out.println("2. 정보변경");
               System.out.println("3. 학생삭제");
               System.out.println("0. 관리자 모드 종료");
               System.out.print("입력 >> ");
               action=sc.nextInt();
               if(action==0) {
                  break;
               }
               else if(action==1) {
                  System.out.println(PK+"번 학생을 추가합니다.");
                  System.out.print("이름입력 >> ");
                  String name=sc.next();
                  datas.add(new Student(PK++,name));
                  System.out.println("학생추가완료!");
               }
               else if(action==2) {
                  System.out.print("변경할 학생의 번호를 입력 >> ");
                  int num=sc.nextInt();

                  int i=hasStudent(datas,num);
                  if(i<0) {
                     continue;
                  }

                  int score;
                  while(true) {
                     System.out.print("재설정할 점수를 입력 >> ");
                     score=sc.nextInt();
                     if(0<=score && score<=100) {
                        break;
                     }
                     System.out.println("0~100점 사이로 입력해주세요!");
                  }

                  datas.get(i).setScore(score);
                  //멤버변수 값을 main() 에서
                  // 객체코드 외부에서 접근이 가능하다.
                  // JAVA 는 디폴트가 public 상태
                  // JAVA의 모든 멤버변수는 private 설정한다!!!!!!!!
                  // 

                  System.out.println("정보변경완료!");
               }
               else if(action==3) {
                  System.out.print("삭제할 학생의 번호를 입력 >> ");
                  int num=sc.nextInt();

                  int i=hasStudent(datas,num);
                  if(i<0) {
                     continue;
                  }

                  datas.remove(i);
                  System.out.println("학생삭제완료!");
               }
               else {
                  System.out.println("다시!");
               }
            }
         }
         else if(action==1) {
            if(datas.size()==0) {
               System.out.println("데이터없음");
               continue;
            }
            for(Student data:datas) {
               System.out.println(data);
            }
         }
         else if(action==2) {
            System.out.print("학번입력 >> ");
            int num=sc.nextInt();
            boolean flag=false;
            for(Student data:datas) {
               if(data.getNum()==num) {
                  System.out.println(data);
                  flag=true;
                  break;
               }
            }
            if(flag) {
               System.out.println("해당 학번은 검색결과가 없습니다...");
            }
         }
         else if(action==3) {
            int maxIndex=0;
            for(int i=1;i<datas.size();i++) {
               if(datas.get(maxIndex).getScore()<datas.get(i).getScore()) {
                  // datas[maxIndex] == 학생 데이터
                  // datas[maxIndex].score == 학생 점수 데이터
                  maxIndex=i;
               }
            }
            System.out.println("1등은 "+datas.get(maxIndex)+"입니다.");
         }
         else {
            System.out.println("다시!");
         }
      }

   }

}

 

 

Comments