컬렉션 프레임웍(collections Framework) |
컬렉션 :여러 객체[데이터]를 모아 놓은 것을 의미
프레임웍 : 표준화,정형화된 체계적인 프로그래밍 방식
인터페이스 | 특징 | |
List | 순서가 있는 데이터의 집합. 데이터의 중복을 허용한다. ex)대기자 명단 |
|
Set | 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다. ex)양의 정수집합,소수의 집합 |
|
Map | 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다. ex)우편번호,지역번호 |
|
구현클래스: HashMap,TreeMap 등 |
<ArrayList> : 컬렉션 프레임웍에서 가장 많이 사용되는 컬렉션 클래스이다. List인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징이 있다. |
ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다. 만약 배열에 더이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장된다. |
package com.test02;
import java.util.*;
public class Sample16 {
public static void main(String[] args) {
ArrayList list1 = new ArrayList<Integer>(10);
list1.add(new Integer(5)); // 첫번째 [0]부터 순서대로 객체어 저장
list1.add(new Integer(4));
list1.add(new Integer(2));
list1.add(new Integer(0));
list1.add(new Integer(1));
list1.add(new Integer(3));
ArrayList list2 = new ArrayList(list1.subList(1, 4)); // list1[1-3] 을 list2에 저장
print(list1, list2);
Collections.sort(list1); // list1을 오름차순으로 숫자 정렬
Collections.sort(list2);
print(list1, list2);
System.out.println("list.1.containsAll(list2) : " + list1.containsAll(list2)); // list2가 list1에 포함되어있는지 체크
list2.add("B"); // add(Object obj)를 이용해 새로운 객체를 저장
list2.add("C");
list2.add(3, "A");
print(list1, list2);
list2.set(3, "AA"); // 4번째 위치에 다른 객체로 변경 A-> AA로 변경됨
print(list1, list2);
System.out.println("list1.retainAll(list2) : " + list1.retainAll(list2));
for (int i = list2.size()-1; i >= 0; i--) {
if (list1.contains(list2.get(i))) list2에서 list1에 포함된 객체들을 찾는다.
list2.remove(i); // 포함된 객체를 찾았다면 삭제한다.
}
print(list1, list2);
System.out.println("===========================================");
}
static void print(ArrayList list1, ArrayList list2) {
System.out.println("list1 :" + list1);
System.out.println("list2 :" + list2);
}
}
<부모 클래스 Vehicle> airplane,car,ship에 공통되는 부분들을 찾아서 vehicle클래스에 정의
package ws1.java2.entity;
import java.util.*;
public class Vehicle implements Comparator<Vehicle> {
private String modelName;
private int maxSpeed;
private int numberLimit;
private boolean available;
public Vehicle() {} // 생성자 생성
public Vehicle(String modelName, int maxSpeed, int numberLimit) { //매개변수가 있는 생성자 오버라이딩
this.modelName = modelName;
this.maxSpeed = maxSpeed;
this.numberLimit = numberLimit;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public int getNumberLimit() {
return numberLimit;
}
public void setNumberLimit(int numberLimit) {
this.numberLimit = numberLimit;
}
public boolean isAvailable() {
return available;
}
public void setAvailable(boolean available) {
this.available = available;
}
public void displayInfo() {
System.out.println("-------------------------------------------");
System.out.println(" 모 델 명 : " + modelName);
System.out.println(" 최고속도 : " + maxSpeed + "km/h");
System.out.println(" 최대정원 : " + numberLimit + "명");
}
public String toString() {
return "[modelName] : " + modelName + ", [maxSpeed] : " + maxSpeed + ", [numberLimit] :" + numberLimit;
}
@Override //배열의 정리를 위해 인터페이스 Comparator를 작성하고 타입은 부모타입인 <Vehicle>을 사용해 참조할 수 있도록 작성
public int compare(Vehicle a, Vehicle b) {
// a 먼저 작성하고 b 와 비교하면 오름차순
// b 먼저 작성하고 a 와 비교하면 내림차순
return a.getModelName().compareTo(b.getModelName()); //클래스변수가 private이기 때문에 읽기함수인 get함수로 값을 리턴시킴
}
// @Override
// public int compare(Vehicle o1, Vehicle o2) {
// // TODO Auto-generated method stub
// return 0;
// }
}
-------------------------------------------------------------------------------------
package ws1.java2.entity;
public class Airplane extends Vehicle {
private int numOfEngine;
public Airplane(String modelName, int maxSpeed, int numberLimit, int numOfEngine) {
super(modelName, maxSpeed, numberLimit);
this.numOfEngine = numOfEngine;
}
public int getNumOfEngine() {
return numOfEngine;
}
public void setNumOfEngine(int numOfEngine) {
this.numOfEngine = numOfEngine;
}
public void displayInfo() {
super.displayInfo();
System.out.println(" 엔진개수 : " + numOfEngine + "개");
}
public String toString() { //오버라이딩값을 정의해 객체가 호출될때 해당되는 객체의 값을 리턴해서 보여준다.
return "[modelName] : "+super.getModelName()+", [maxSpeed] : "+super.getMaxSpeed()+", "
+ "[numberLimit] :"+ super.getNumberLimit()+", [numOfEngine] :"+numOfEngine;
}
}
---------------------------------------------------------------------------------------------------------------
package ws1.java2.entity;
public class Car extends Vehicle {
private int mileage;
public Car(String modelName, int maxSpeed, int numberLimit, int mileage) {
super(modelName, maxSpeed, numberLimit);
this.mileage = mileage;
}
public int getMileage() {
return mileage;
}
public void setMileage(int mileage) {
this.mileage = mileage;
}
public void displayInfo() {
super.displayInfo();
System.out.println(" 평균연비 : " + mileage + "km/l");
}
public String toString() {
return "[modelName] : "+super.getModelName()+", [maxSpeed] : "+super.getMaxSpeed()+", "
+ "[numberLimit] :"+ super.getNumberLimit()+", [mileage] :"+mileage;
}
}
----------------------------------------------------------------------------------------------------------------
package ws1.java2.entity;
public class Ship extends Vehicle {
private int replacement;
public Ship(String modelName, int maxSpeed, int numberLimit, int replacement) {
super(modelName, maxSpeed, numberLimit);
this.replacement = replacement;
}
public int getReplacement() {
return replacement;
}
public void setReplacement(int replacement) {
this.replacement = replacement;
}
public void displayInfo() {
super.displayInfo();
System.out.println(" 배 수 량 : " + replacement + "톤");
}
public String toString() {
return "[modelName] : "+super.getModelName()+", [maxSpeed] : "+super.getMaxSpeed()+", "
+ "[numberLimit] :"+ super.getNumberLimit()+", [replacement] :"+replacement;
}
}
-------------------------------------------------------------------------------------------------------------------------
package ws1.java2.controller;
import ws1.java2.entity.*;
import java.util.*;
// 사용자 정의 클래스를 만들어서 사용할 수 있다.
//class UserComparator implements Comparator<Vehicle> {
// public int compare(Vehicle a, Vehicle b) {
// // a 먼저 작성하고 b 와 비교하면 오름차순
// // b 먼저 작성하고 a 와 비교하면 내림차순
// return a.getModelName().compareTo(b.getModelName());
// }
//}
public class VehicleManager {
ArrayList<Vehicle> al = new ArrayList(7); //ArrayLsit를 생성
public VehicleManager() { //
// 생성자를 통해 각 객체에 맞는 생성자로 배열에 저장
//이 메서드안에서 초기화되게 값을 쌓아나감.
al.add(new Airplane("보잉747", 1300, 300, 4));
al.add(new Airplane("F-15", 1600, 1, 1));
al.add(new Car("그랜저", 180, 5, 10));
al.add(new Car("스파크", 130, 4, 15));
al.add(new Car("스타렉스", 150, 10, 11));
al.add(new Ship("크루즈2", 30, 400, 35000));
al.add(new Ship("노틸러스", 25, 150, 15000));
}
public void sortBymodelName(String input) {
System.out.println(input);
Collections.sort(al, new Vehicle());
for (Vehicle vehicle : al) {
System.out.print("[" + vehicle.getModelName() + "]" + ", ");
// vehicle.displayInfo();
// System.out.println(vehicle.toString());
}
}
public void displayVehicles1() {
for (int i = 0; i < al.size(); i++) {
Object o = al.get(i);
Vehicle a = (Vehicle) o;
a.displayInfo();
}
}
public void displayVehicles2() {
Iterator itr = al.iterator();
while (itr.hasNext()) {
Object o = itr.next();
Vehicle v = (Vehicle) o;
v.displayInfo();
}
}
public void delete(String name) {
Vehicle model = new Vehicle();
for (int i = al.size() - 1; i >= 0; i--) { // 자바에서 문자열이 입력되면 1번재부터 세어지는게 아니라
// 0번째 부터 시작함. 그래서 al.size()-1을 해주는것이다.
Object o = al.get(i);
model = (Vehicle) o;
if (model.getModelName().equals(name)) {
al.remove(i);
}
}
System.out.println(name + " 가 삭제되었습니다. ");
}
}
---------------------------------------------------------------------------------------------------------------------
<메인 클래스>
package ws1.java2.driver;
import java.util.Scanner;
//구동 클래스
import ws1.java2.controller.VehicleManager;
public class VehicleDriver {
public static void main(String[] args) {
VehicleManager vm = new VehicleManager();
Scanner scan = new Scanner(System.in);
// vm.displayVehicles1();
String name1;
vm.displayVehicles2();
System.out.println("삭제할 이름을 작성해주세요.>>");
name1 = scan.nextLine();
vm.delete(name1); // name1에 입력된 값이 delete메서드를 통해 값을 찾고 맞는 값이 있으면 삭제 후 출력
vm.sortBymodelName("오름차순 정렬"); //String 매개변수로 호출 오름차순으로 정리후 값 출력
}
// while 반복문 작성시 사용하기 위한 print 메서드
public static void print() {
System.out.println();
System.out.println("##################<메뉴>###################");
System.out.println(" <1.show vehicle> ");
System.out.println(" <2.add vehicle> ");
System.out.println(" <3.delete vehicle> ");
System.out.println(" <4.sort vehicle> ");
System.out.println(" <9.stop vehicle> ");
System.out.print(">> 메뉴 : ");
}
}
Iterator : 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 한것이다. |
메소드는 hasNext(),next(),remove()등이 있다. |
hasNext() : 읽어올 요소가 남아있는지 확인하는 메소드이다. 요소가 있으면 true, 없으면 false |
next() : 다음 데이터를 반환한다. |
Iterator는 이런 집합체로부터 정보를 얻어낸다고 볼 수 있다. 집합체를 다룰 때는 개별적인 클래스에 대해 데이터를 읽는 방법을 알아야 하기 때문에 각 컬렉션에 접근이 힘들어진다.를 쓰게 되면 어떤 컬랙션이라도 동일한 방식으로 접근이 가능하여 그 안에 있는 항목들에 접근할 수 있는 방법을 제공한다.(다형성) |
<ArrayList>에 저장되어 있는 값을 출력하는 방법
1.for문을 이용하여 출력
ArrayList[] al = new ArrayList[2]; // 길이2인 인스턴스 생성
al.add(new Object(1));
al.add(new Object(2));
for (int i = 0; i < al.size(); i++) {
Object o = al.get(i); // Object type에 값을 담고
Vehicle a = (Vehicle) o; // 출력하려고 하는 객체인 Vehicle로 형변환 시킨다
a.displayInfo(); // Vehicle 객체의 함수를 사용하여 값을 출력한다.
}
}
public void displayVehicles2() {
Iterator itr = al.iterator();
while (itr.hasNext()) {
Object o = itr.next();
Vehicle v = (Vehicle) o;
v.displayInfo();
}
}