컬렉션 프레임워크
[컬렉션 프레임워크]
프레임워크
ex) 컬렉션, Spring, Mybatis, JPA, ...
뼈대, 틀, 구조, ...
개발자들에게 뼈대를 제공해주겠다. 라는 컨셉
개발 편의성을 제공
"하라는대로, 쓰라는대로"
1) 개발자들의 실력이 상향 평준화
2) 유지보수 용이 ★
컬렉션 프레임워크
배열같은 자료형(자료구조)들을 제공하는 라이브러리
JAVA에서 기본 제공해줌
[배열리스트], [맵], 링크리스트, 집합, 트리, ...
배열리스트
향상된 배열
서로 관련된 데이터들을 저장할 수 있는 자료형
같은 자료형 x -> 서로 다른 자료형들을
같은 공간(메모리)에 저장하는게 맞나?
저장할 개수 x
같은 자료형 저장을 "강제" 해야겠어
"제네릭"
결론) 배열리스트는 반드시 제네릭과 함께 사용해야한다.
접근 제어자 종류
1) public : 모든 메서드 사용할 코드에 사용
2) private : 모든 멤버변수에 사용해야 한다.
JAVA의 모든 멤버변수는 private으로 보호해야한다.
외부에서의 직접 접근을 막아야함
"캡슐화(정보은닉)"
접근 제어자 private 키워드를 작성
감춰진 멤버변수의 값을 받아오는 메서드 getter()
감춰진 멤버변수에게 값을 부여하는 메서드 setter()
※ 체크리스트
1. 변수명,함수명,클래스명
2. 들여쓰기, 주석 -> 코드 가독성
3. 한글 코딩, 설계
4. 유효성 검사
아예 이상한 입력
데이터 상태에 따라 다른 출력 화면
경계값 검사 0~100 0 101
5. 모듈화 : input, output
6. 코드 재사용성이 높은 코드인지?
== 반복되는 코드가 적은지?
== 유지보수가 용이한 코드인지?
private 을 사용한 예시
package class03;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 학생부 프로그램
// CRUD
// 학생 추가 [관]
// 학생 목록 출력
// 1명 검색
// 1등 출력
// 학생 점수 변경 [관]
// 학생 삭제 [관]
class Student {
// 접근 제어자
//public 메서드
// private 멤버변수
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);
}
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 Test01 {
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()) {
// PK가 데이터들의 배열에서 찾은 학번과 같다면
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);
// datas.get(0).set=100;
// 멤버변수의 값을 main()
// 객체코드 외부에서 접근이 가능한 상황
// JAVA 는 public 이 default 상태
// 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("다시!");
}
}
}
}