필드의 자료형을 Object 클래스로 선언
표현대상을 추상화하여 클래스로 선언할 경우 필드의 자료형에 따라 여러개의 클래스를 선언하여 사용하는 경우 발생
필드의 자료형을 Object 클래스로 선언하면 필드에는 모든 클래스로 생성된 객체를 저장 가능
Object 클래스로 필드가 선언된 클래스의 객체를 생성하여 사용하는 프로그램
public class NonGeneric {
private Object field;
public NonGeneric() { }
public NonGeneric(Object field) {
super();
this.field = field;
}
public Object getField() {
return field;
}
public void setField(Object field) {
this.field = field; }}
public class NonGenericApp {
public static void main(String[] args) {
NonGeneric nonGeneric1=new NonGeneric();
//Integer 객체를 Object 클래스의 매개변수로 전달받아 Object 클래스의 필드값으로 변경
nonGeneric1.setField(100); //오토박싱
//필드값은 Object 클래스 타입의 객체로 반환되므로
//명시적 객체 형변환을 해야 자식클래스의 메소드 호출 가능
Integer returnObject1=(Integer)nonGeneric1.getField();
System.out.println("필드값 = "+returnObject1); //오토언박싱
NonGeneric nonGeneric2=new NonGeneric();
//Double 객체를 Object 클래스의 매개변수로 전달받아 Object 클래스의 필드값으로 변경
nonGeneric2.setField(12.34); //오토박싱
//명시적 객체 형변환을 잘못할 경우 ClassCastException 발생
// → instanceof 연산자를 사용하여 명시적 객체 형변환 전에 검증
if(nonGeneric2.getField() instanceof Double) {
Double returnObject2=(Double)nonGeneric2.getField();
System.out.println("필드값 = "+returnObject2); //오토언박싱
}
NonGeneric nonGeneric3=new NonGeneric();
//String 객체를 Object 클래스의 매개변수로 전달받아 Object 클래스의 필드값으로 변경
nonGeneric3.setField("홍길동");
String returnObject3=(String)nonGeneric3.getField();
System.out.println("필드값 = "+returnObject3); }}
public class Generic<T extends Number> {//Number 상속받은 제네릭 클래스
private T field;//필드 선언
public Generic() { }//기본생성자
public Generic(T field) {//생성자 초기화
super();
this.field = field;
}
public T getField() {//getter, setter 메소드
return field;
}
public void setField(T field) {
this.field = field; }}
public class GenericApp {
public static void main(String[] args) {
//제네릭 클래스를 이용할 경우 제네릭 대신 사용할 클래스를 전달해야만 사용 가능
// → 전달받은 클래스를 제네릭 대신 사용하여 필드 또는 메소드 완성
Generic<Integer> generic1=new Generic<Integer>();//정수형 선언
//제네릭으로 설정된 클래스와 동일한 자료형의 객체를 전달하여 필드에 저장
generic1.setField(100);//오토박싱
//generic1.setField(12.34);
//제네릭으로 설정된 클래스와 다른 자료형의 객체를 전달할 경우 에러 발생
Integer returnObject1=generic1.getField();
System.out.println("필드값 = "+returnObject1);//100
Generic<Double> generic2=new Generic<Double>();
generic2.setField(12.34);
Double returnObject2=generic2.getField();
System.out.println("필드값 = "+returnObject2);//12.34
/*
//제네릭의 부모클래스를 상속받지 않은 자식클래스로 제네릭 클래스 이용 → 에러
Generic<String> generic3=new Generic<String>();
generic3.setField("홍길동");
String returnObject3=generic3.getField();
System.out.println("필드값 = "+returnObject3); }}
*/
데이터 수집 클래스 (Collection Class)
다수의 객체를 효율적으로 저장하고 관리하기 위한 기능을 제공하는 클래스
- 1. Set 인터페이스, 2. List 인터페이스, 3. Map 인터페이스 중 하나를 상속받아 작성된 자식클래스
Set 인터페이스를 상속받은 자료구조 클래스 ( ☆HashSet, Treeset 등 )
객체 저장 순서가 없으며 메모리 주소와 객체에 저장된 값이 같은 객체 저장 불가능 (하나의 값만 저장됨)
HashSet (다수의 객체 생성 가능)
1 ) 제네릭을 사용하지 않고 HashSet 객체 생성 (비권장)
2 ) 제네릭을 사용하여 HashSet 객체 생성 ★
3) 참조변수는 인터페이스(부모)를 이용하여 생성하는 것을 권장
Set.add(E element) : Set 객체에 요소를 추가하는 메소드
Set.toString() : Set 객체에 저장된 모든 요소(객체)를 문자열로 반환하는 메소드
Set.size() : Set 객체에 저장된 요소의 갯수를 반환받아 메소드
Set.remove(E element) : Set 객체에 저장된 요소를 제거하는 메소드
Set.iterator() : Set 객체에 저장된 요소를 반복 처리할 수 있는 Iterator 객체를 반환하는 메소드
Iterator.hasNext() : Iterator 객체로 처리 가능한 요소의 존재 유무를 판단하여 결과를 반환하는 메소드
Iterator.next() : 커서 위치의 요소(객체)를 읽어와 반환하는 메소드
Set.toArray(E[] a) : Set 객체를 배열로 변환하여 반환하는 메소드
public class SetApp {
public static void main(String[] args) {
Set<String> set=new HashSet<String>();
set.add("홍길동");
//set.add(100); 제네릭으로 설정된 클래스의 객체가 아닌 경우 에러 발생
set.add("임꺽정");
set.add("전우치");
//System.out.println("set.toString() = "+set.toString());
System.out.println("set = "+set);//set=[홍길동, 임꺽정, 전우치] (순서미정)
//Set 객체에는 동일한 값이 저장된 중복 객체 저장 불가
set.add("홍길동");
System.out.println("set = "+set);//set=[홍길동, 임꺽정, 전우치] (순서미정)
System.out.println("요소의 갯수 = "+set.size()); //요소의 갯수=3
set.remove("임꺽정");
System.out.println("set = "+set);//set = [홍길동, 전우치]
Iterator<String> iterator=set.iterator();
//Iterator 객체를 이용하여 Set 객체에 저장된 모든 요소에 대한 일괄처리
while(iterator.hasNext()) { //반복처리할게 있으면 실행
String str=iterator.next();
System.out.print(str+" "); //홍길동 전우치
}
System.out.println();
//향상된 for 구문을 사용하여 Set 객체에 저장된 요소에 대한 일괄처리
// → 향상된 for 구문은 내부적으로 Iterator 객체를 사용하여 반복 처리
for(String str:set) {
System.out.print(str+" ");//홍길동 전우치
}
System.out.println(); }}
public class LottoSetApp {
public static void main(String[] args) {
Set<Integer> lottoSet=new HashSet<Integer>();
//Set 인터페이스 상속받아 Integer 객체(lottoset) 생성
Random random=new Random(); //random 객체 생성
while(true) {
//1~45 범위의 난수값을 Set 객체의 요소로 추가하여 저장
// → Set 객체에 동일한 값의 요소 중복 저장 불가능
lottoSet.add(random.nextInt(45)+1);
//Set 객체에 저장된 요소의 갯수가 6인 경우 반복문 종료
if(lottoSet.size()==6) break;
}
//Set.toArray(E[] a) : Set 객체를 배열로 변환하여 반환하는 메소드
// → Set 객체에 저장된 모든 요소를 배열로 생성하여 배열 요소에 모두 저장
Integer[] lotto=lottoSet.toArray(new Integer[0]);
//lottoset을 배열로 변환하여 Integer lotto에 저장
Arrays.sort(lotto); //lotto배열의 요소를 오름차순으로 정렬
System.out.println("행운의 숫자 = "+Arrays.toString(lotto));}}
//lotto배열의 요소를 문자열로 반환
List 인터페이스를 상속받은 자료구조 클래스 ( ☆ArrayList, Vector, LinkedList 등 )
List 객체는 요소를 차례대로 저장
List.add(E element) : List 객체에 요소를 추가하는 메소드
List.toString() : List 객체에 저장된 모든 요소를 문자열로 변환하여 반환하는 메소드
List.size() : List 객체에 저장된 요소의 갯수를 반환하는 메소드
List.get(int index) : List 객체에 저장된 요소 중 첨자 위치의 요소를 반환하는 메소드
List.add(int index, E element) : List 객체에 원하는 첨자 위치에 요소를 삽입하는 메소드
List.remove(E element) : List 객체에 저장된 요소를 제거하는 메소드
List.remove(int index) : List 객체에서 원하는 첨자 위치의 요소를 제거하는 메소드
List.set(int index, E element) : List 객체에서 원하는 첨자 위치의 요소를 변경하는 메소드
Iterator 객체 사용하여 List 객체에 저장된 요소에 대한 일괄 처리
Collections 클래스 : 자료구조 관련 클래스의 객체 요소에 대한 처리 기능을 메소드로 제공하는 클래스
List.clear() : List 객체에 저장된 모든 요소를 제거하여 초기화 처리하는 메소드
List.isEmpty() : List 객체에 저장된 요소가 하나도 없는 경우 [true]를 반환하는 메소드
for(int i=0;i<list.size();i++) {System.out.print(list.get(i)+" ");}
Iterator<String> iterator=list.iterator();
while(iterator.hasNext()) {
System.out.print(iterator.next()+" ");}
for(String str:list) {
System.out.print(str+" ");}
public class ListApp {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("홍길동");
list.add("임꺽정");
list.add("전우치");
list.add("일지매");
//System.out.println("list.toString() = "+list.toString());
System.out.println(list);// [홍길동, 임꺽정, 전우치, 일지매]
//List 객체에는 동일한 값의 객체를 요소로 저장 가능
list.add("임꺽정");
System.out.println(list);// [홍길동, 임꺽정, 전우치, 일지매, 임꺽정]
System.out.println(list.size());//요소의 갯수 = 5
System.out.println("3번째 요소에 저장된 이름="+list.get(2));//전우치
list.add(4, "장길산");
System.out.println(list);//[홍길동, 임꺽정, 전우치, 일지매, 장길산, 임꺽정]
//매개변수로 전달받은 객체와 같은 요소가 여러개인 경우 첫번째 요소만 제거
//list.remove("임꺽정");//index=1의 임꺽정 제거
list.remove(5); //index=5의 임꺽정 제거
System.out.println(list);//[홍길동, 임꺽정, 전우치, 일지매, 장길산]
list.set(1, "임걱정"); //index=1을 임걱정으로 변경
System.out.println(list);// [홍길동, 임걱정, 전우치, 일지매, 장길산]
//List 객체에 저장된 요소에 대한 일괄 처리
//1. 일반 for 구문 사용 → IndexOutOfBoundsException 발생 가능
for(int i=0;i<list.size();i++) {
System.out.print(list.get(i)+" ");//홍길동 임걱정 전우치 일지매 장길산
}
System.out.println();
//List 객체에 저장된 요소에 대한 일괄 처리 2. Iterator 객체 사용
Iterator<String> iterator=list.iterator();
while(iterator.hasNext()) {//반복처리할게 있으면 실행
System.out.print(iterator.next()+" ");//홍길동 임걱정 전우치 일지매 장길산
}
System.out.println();
//List 객체에 저장된 요소에 대한 일괄 처리 3. 향상된 for 구문 사용
for(String str:list) {
System.out.print(str+" ");//홍길동 임걱정 전우치 일지매 장길산
}
System.out.println();
//Collections.sort(List<E> list) : List 객체의 요소를 정렬하는 메소드
Collections.sort(list);
System.out.println(list);//[일지매, 임걱정, 장길산, 전우치, 홍길동]
list.clear();//모든 요소를 제거
if(list.isEmpty()) {
System.out.println("List 객체에 저장된 요소가 없습니다.");
}//List 객체에 저장된 요소가 하나도 없습니다.
//Arrays.asList(E.. element):0개 이상의 요소가 저장된 List 객체를 생성하여 반환
List<Integer> numberList=Arrays.asList(10,20,30,40,50);
System.out.println(numberList); }}// [10, 20, 30, 40, 50]
Map 인터페이스를 상속받은 자료구조 클래스 (☆HashMap, Hashtable, TreeMap, Properties 등)
Map 인터페이스를 상속받은 자식클래스는 이름과 값에 대한 제네릭 2개 전달하여 사용
Map<Integer, String> map=new HashMap<Integer, String>();
Map.put(K key, V value) : Map 객체에 엔트리를 추가하는 메소드
Map.toString() : Map 객체에 저장된 모든 엔트리를 문자열로 변환하여 반환하는 메소드
Map.remove(K key) : Map 객체에 저장된 엔트리를 이름(Key)을 이용하여 제거하는 메소드
Map.get(K key) : Map 객체에 저장된 엔트리에서 이름(Key)을 이용하여 값(Value)을 검색하여 반환하는 메소드
Map.keySet() : Map 객체에 저장된 모든 엔트리의 이름(Key)를 Set 객체로 반환하는 메소드
Map.values() : Map 객체에 저장된 모든 엔트리의 값(Value)을 Collection 객체로 반환하는 메소드
public class MapApp {
public static void main(String[] args) {
//Map 인터페이스를 상속받은 자식클래스는 이름과 값에 대한 제네릭 2개 전달하여 사용
Map<Integer, String> map=new HashMap<Integer, String>();
map.put(1000, "홍길동");
map.put(2000, "임꺽정");
map.put(3000, "전우치");
map.put(4000, "일지매");
map.put(5000, "장길산");
//System.out.println(map.toString()); : 순서 없이 저장됨
System.out.println(map);
//{2000=임꺽정, 4000=일지매, 1000=홍길동, 3000=전우치, 5000=장길산}
map.put(2000, "임걱정");
System.out.println(map);
//{2000=임걱정, 4000=일지매, 1000=홍길동, 3000=전우치, 5000=장길산}
map.remove(4000);
System.out.println(map);
//{2000=임꺽정, 1000=홍길동, 3000=전우치, 5000=장길산}
String name=map.get(1000);
System.out.println("name = "+name); //name=홍길동
//Map 객체에 저장된 엔트리에 대한 일괄 처리 - Iterator 객체 사용
//Map.keySet() : Map 객체에 저장된 모든 엔트리의 이름을 Set 객체로 반환
Iterator<Integer> iteratorKey=map.keySet().iterator();
while(iteratorKey.hasNext()) {//반복처리할게 있으면 실행
Integer key=iteratorKey.next();//Set 객체에 저장된 key를 반환받아 저장
System.out.println(key+" = "+map.get(key));
}//2000=임걱정 /n 1000=홍길동 ....
//Map.values() : Map 객체에 저장된 모든 엔트리의 값을 Collection 객체로 반환
Iterator<String> iteratorValue=map.values().iterator();
while(iteratorValue.hasNext()) {
System.out.print(iteratorValue.next()+" ");
}//임걱정 홍길동 전우치 장길산
System.out.println();
//Map 객체에 저장된 엔트리에 대한 일괄 처리 - 향상된 for 구문 사용
for(Integer key:map.keySet()) {
System.out.println(key+" = "+map.get(key));
}//2000=임걱정 /n 1000=홍길동 ....
for(String value:map.values()) {
System.out.print(value+" ");
}//임걱정 홍길동 전우치 장길산
System.out.println();}}
public class Student implements Comparable<Student> {
private int num;//필드 선언
private String name;
public Student() { }//기본생성자
public Student(int num, String name) {//생성자 초기화
super();
this.num = num;
this.name = name;
}
public int getNum() {//getter, setter 메소드 선언
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//Object 클래스의 toString() 메소드를 오버라이드 선언
// → VO 클래스에 저장된 필드값을 반환받아 확인하기 위해 선언
@Override
public String toString() {
return "학번 = "+num+", 이름 = "+name;
}
//Object 클래스의 hashCode() 메소드를 오버라이드 선언
// → 객체의 메모리 주소 대신 VO 클래스의 필드값을 반환
@Override
public int hashCode() {
return num;
}
//override를 이용해 해시코드와 필드값을 같게 만들어서 중복값을 저장하지 않도록 설정(set)
//Object 클래스의 equals() 메소드를 오버라이드 선언
// → VO 클래스에 저장된 필드값을 비교하여 결과를 반환하기 위해 사용
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
//매개변수로 전달받은 객체를 명시적 객체 형변환하여 참조변수에 저장
Student student=(Student)obj;
//메소드 객체(this)와 매개변수로 전달받은 객체(obj)의 필드값 비교하여 논리값 반환
// → 학번를 비교하여 같은 경우 [true] 반환
if(num==student.num) return true;
}
//비교가 불가능하거나 학번이 다른 경우 [false] 반환
return false; }}
}
//객체의 컬럼값을 매개변수로 전달받은 객체의 컬럼값과 비교하여 결과를 반환하는 메소드
//객체의 컬럼값이 큰 경우 양수 반환, 매개변수로 전달받은 객체의 컬럼값이 큰 경우 음수
//반환되며 같은 경우 0을 반환하도록 명령 작성
// => 오름차순 또는 내림차순 정렬을 위한 비교값 설정
@Override
public int compareTo(Student o) {
//return num-o.num; : 학번을 비교하여 오름차순 정렬되도록 설정
//return o.num-num; : 학번을 비교하여 내림차순 정렬되도록 설정
//return name.compareTo(o.name); : 이름을 비교하여 오름차순 정렬되도록 설정
return o.name.compareTo(name);//이름을 비교하여 내림차순 정렬되도록 설정
}
}
public class StudentSetApp {
public static void main(String[] args) {
Set<Student> studentSet=new HashSet<Student>(); //Set 객체 생성
studentSet.add(new Student(1000, "홍길동"));
studentSet.add(new Student(2000, "임꺽정"));
studentSet.add(new Student(3000, "전우치"));
//Set 객체에 동일한 값이 저장된 Student 객체가 요소로 저장 가능
// → Student 객체에 저장된 값은 같지만 객체는 다르므로 요소로 저장 가능
//hashCode() 메소드와 equals() 메소드를 오버라이드 선언하여 동일한 값이
//저장된 객체가 Set 객체의 요소로 저장하지 않도록 설정 가능
// → 매개변수로 전달받은 객체를 hashCode() 메소드로 기존 요소의 HashCode와 비교하여
//같은 경우 equals() 메소드로 필드값을 비교해 같으면 Set 객체에 추가되지 않도록 동작
// → HashCode가 다르거나 비교 필드값이 다르면 Set 객체에 요소가 추가되어 저장
studentSet.add(new Student(4000, "홍길동"));
Iterator<Student> iterator=studentSet.iterator();
while (iterator.hasNext()) {
//객체를 반환받아 출력할 경우 Student.toString() 메소드 자동 호출
System.out.println(iterator.next()); }}}
//학번 = 2000, 이름 = 임꺽정 ··· 순서 없음
public class Student implements Comparable<Student> {
private int num;
private String name;
.
:
//Object 클래스의 toString() 메소드를 오버라이드 선언
// → VO 클래스에 저장된 필드값을 반환받아 확인하기 위해 선언
@Override
public String toString() {
return "학번 = "+num+", 이름 = "+name;//필드값 확인 위해서 toString 오버라이드
}
//Object 클래스의 hashCode() 메소드를 오버라이드 선언
// → 객체의 메모리 주소 대신 VO 클래스의 필드값을 반환
@Override
public int hashCode() {
return num;
}
//Object 클래스의 equals() 메소드를 오버라이드 선언
// → VO 클래스에 저장된 필드값을 비교하여 결과를 반환하기 위해 사용
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
//매개변수로 전달받은 객체를 명시적 객체 형변환하여 참조변수에 저장
Student student=(Student)obj;
//메소드의 객체와 매개변수로 전달받은 객체(obj)의 필드값을 비교하여 논리값 반환
// → 학번를 비교하여 같은 경우 [true] 반환
if(num==student.num) return true;
}
//비교가 불가능하거나 학번이 다른 경우 [false] 반환
return false;
}
//객체의 컬럼값을 매개변수로 전달받은 객체의 컬럼값과 비교하여 결과를 반환하는 메소드
//객체의 컬럼값이 큰 경우 양수 반환, 매개변수로 전달받은 객체의 컬럼값이 큰 경우 음수
//반환되며 같은 경우 0을 반환 → 오름차순 또는 내림차순 정렬을 위한 비교값 설정
@Override
public int compareTo(Student o) {
//return num-o.num;//학번을 비교하여 오름차순 정렬되도록 설정
//return o.num-num;//학번을 비교하여 내림차순 정렬되도록 설정
//return name.compareTo(o.name);//이름을 비교하여 오름차순 정렬되도록 설정
//compare메소드에서 비교값이 양수면 자리 변경, 음수 또는 0이면 객체의 자리가 그대로 유지
return o.name.compareTo(name); }}//이름을 비교하여 내림차순 정렬되도록 설정
private List<Student> studentList=new ArrayList<Student>();
//학번을 전달받아 콜렉션 필드에 저장된 요소의 학번과 비교하여 같은 요소의 첨자를 반환
private int getStudentIndex(int num) {//학번을 전달받아 스튜던트 요소의 첨자 반환
int index=-1;//초기값설정
//콜렉션 필드에 저장된 모든 요소에 일괄처리 위한 반복문
for(int i=0;i<studentList.size();i++) {
//콜렉션 필드에 저장된 요소의 학번과 매개변수로 전달받아 학번이 같은 경우
if(studentList.get(i).getNum()==num) {
index=i;//변수의 요소의 첨자 저장
break;
}
}
return index;//요소의 첨자 반환
//콜렉션 필드에서 요소가 미검색된 경우 -1 반환 (학생정보가 저장X → false)
}
//학생정보를 전달받아 콜렉션 필드의 요소로 추가하고 처리 결과를 반환하는 메소드
//false 반환 : 콜렉션 필드의 요소 추가 실패, true : 콜렉션 필드의 요소 추가 성공
//전달받은 학생정보의 학번이 이미 콜렉션 필드에 저장된 요소의 학번과 같은 경우
//추가되지않도록 작성 (중복 저장 방지)
public boolean addStudent(Student student) {
//콜렉션 필드에 이미 저장된 학번의 학생정보인 경우
if(getStudentIndex(student.getNum())!=-1) {
return false;
}
studentList.add(student);//List 객체에 요소를 추가하는 메소드 호출
return true;
}
//학생정보를 전달받아 콜렉션 필드의 요소를 변경하고 처리 결과를 반환하는 메소드
// → false 반환 : 콜렉션 필드의 요소 변경 실패, true : 콜렉션 필드의 요소 변경 성공
// → 전달받은 학생정보의 학번이 콜렉션 필드에 저장된 요소의 학번이 아닌 경우 변경 실패
public boolean modifyStudent(Student student) {
int index=getStudentIndex(student.getNum());
//콜렉션 필드에 저장된 학번의 학생정보가 아닌 경우
if(index==-1) {
return false;
}
studentList.set(index, student);//List객체에서 첨자위치의 요소 변경하는 메소드 호출
return true;
}
//학번을 전달받아 콜렉션 필드의 요소를 삭제하고 처리 결과를 반환하는 메소드
// → false 반환 : 콜렉션 필드의 요소 삭제 실패, true : 콜렉션 필드의 요소 삭제 성공
// → 전달받은 학번이 콜렉션 필드에 저장된 요소의 학번이 아닌 경우 삭제 실패
// → 삭제할때는 학번(고유값)만 전달받아서 찾아 삭제하면 됨
public boolean removeStudent(int num) {
int index=getStudentIndex(num);
//콜렉션 필드에 저장된 학번의 학생정보가 아닌 경우
if(index==-1) {
return false;
}
studentList.remove(index);//List 객체에서 첨자위치의 요소를 삭제하는 메소드 호출
return true;
}
//학번을 전달받아 콜렉션 필드의 요소를 검색하여 학생정보를 반환하는 메소드
public Student getStudent(int num) {
int index=getStudentIndex(num);
//콜렉션 필드에 저장된 학번의 학생정보가 아닌 경우
if(index==-1) {
return null;//검색된 학생정보가 없는 경우 null 반환
}
return studentList.get(index);//List객체에서 첨자위치의 요소를 반환하는 메소드 호출
}
//콜렉션 필드에 저장된 모든 학생정보를 반환하는 메소드
public List<Student> getStudentList() {
return studentList;
}
}
public class StudentManagerApp {
public static void main(String[] args) {
StudentManager manager=new StudentManager();
//학생정보를 전달하여 저장매체(콜렉션 필드)에 저장하는 메소드 호출
manager.addStudent(new Student(1000, "홍길동"));
manager.addStudent(new Student(2000, "임꺽정"));
manager.addStudent(new Student(3000, "전우치"));
manager.addStudent(new Student(4000, "일지매"));
boolean result=manager.addStudent(new Student(5000, "장길산"));
if(result) {
System.out.println("학생정보를 성공적으로 저장 하였습니다.");
} else {
System.out.println("이미 저장된 학생정보이므로 저장되지 않습니다.");
}//학생정보를 성공적으로 저장 하였습니다
//학번이 [2000]인 학생정보를 저장매체에서 검색하여 출력
Student searchStudent=manager.getStudent(2000);
if(searchStudent==null) {//검색된 학생정보가 없는 경우
System.out.println("해당 학번의 학생정보를 찾을 수 없습니다.");
} else {//검색된 학생정보가 없는 경우
System.out.println(searchStudent);//학생정보 출력
}//학번 = 2000, 이름 = 임꺽정
//저장매체에서 학번이 [2000]인 학생의 이름을 [임걱정]으로 변경
searchStudent.setName("임걱정");
manager.modifyStudent(searchStudent);
System.out.println("학생정보를 성공적으로 변경 하였습니다.");
//학번이 [4000]인 학생정보를 저장매체에서 삭제
if(manager.removeStudent(4000)) {//삭제된 학생정보가 있는 경우
System.out.println("[메세지]학생정보를 성공적으로 삭제 하였습니다.");
} else {
System.out.println("[메세지]해당 학번의 학생정보를 찾을 수 없습니다.");
}//[메세지]학생정보를 성공적으로 삭제 하였습니다.
//저장매체에 저장된 모든 학생정보를 반환하는 메소드 호출
List<Student> students=manager.getStudentList();
for(Student student:students) {
//Student.toString() 메소드 자동 호출 - 필드값을 반환받아 출력
System.out.println(student);
}//학번 = 1000, 이름 = 홍길동 /n 학번 = 2000, 이름 = 임걱정 ···
//List 객체에 저장된 요소를 정렬하여 출력
//Collections.sort(List<T> list) 메소드의 매개변수에 전달되는 List 객체는 요소값을
//비교하기 위한 기능의 compareTo() 메소드가 오버라이드 선언되지 않은 경우 에러 발생
Collections.sort(students);//이름을 비교하여 내림차순 정렬되도록 설정
for(Student student:students) {
//Student.toString() 메소드 자동 호출 - 필드값을 반환받아 출력
System.out.println(student);
}}}//학번 = 1000, 이름 = 홍길동 /n 학번 = 3000, 이름 = 전우치 ···
public class StudentMapApp {
public static void main(String[] args) {
List<Student> studentListOne=new ArrayList<Student>();
studentListOne.add(new Student(1000, "홍길동"));
studentListOne.add(new Student(2000, "임꺽정"));
studentListOne.add(new Student(3000, "전우치"));
studentListOne.add(new Student(4000, "일지매"));
studentListOne.add(new Student(5000, "장길산"));
List<Student> studentListTwo=new ArrayList<Student>();
studentListTwo.add(new Student(6000, "유재석"));
studentListTwo.add(new Student(7000, "강호동"));
studentListTwo.add(new Student(8000, "신동엽"));
studentListTwo.add(new Student(9000, "김용만"));
Map<Integer, List<Student>> studentMap=new HashMap<Integer, List<Student>>();
studentMap.put(1, studentListOne);
studentMap.put(2, studentListTwo);
for(Integer ban:studentMap.keySet()) {
System.out.println(ban+"반의 학생정보 >> ");
List<Student> studentList=studentMap.get(ban);
for(Student student:studentList) {
System.out.println(student);
}//1반의 학생정보 >> 학번 = 1000, 이름 = 홍길동 ···
//2반의 학생정보 >> 학번 = 6000, 이름 = 유재석 ···