본문 바로가기

카테고리 없음

Day10-2

컬렉션 프레임웍(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();
		}
	}