ExceptionMain06 생성package kr.s01.exception;
public class ExceptionMain06 {
	// throw를 이용한 인위적 예외 발생
	public void methodA(String[] n) throws Exception {
		if(n.length>0) { // 입력한 값이 있는 경우
			for(String s : n) {
				System.out.println(s);
			}
		}
		else { // 입력한 값이 없는 경우
			throw new Exception("입력한 데이터가 없습니다."); // 예외 객체를 생성하여 던짐(=조건을 만족하지 않는 경우에 catch 블럭으로 이동시킴); throw를 명시하지 않으면 생성된 예외 객체가 메서드와 관련 없는(=예외 발생이 아닌) 것으로 인식됨
		}
	}
	
	public static void main(String[] args) {
		ExceptionMain06 ex = new ExceptionMain06();
		try {
			ex.methodA(args);
		}
		catch(Exception e) {
			System.out.println(e.getMessage()); // 예외 객체에 명시한 메시지를 출력
		}
	}
}
ExceptionMain07 생성package kr.s01.exception;
import java.util.Scanner;
class NegativeNumberUseException extends Exception { //사용자 정의 예외 클래스
	public NegativeNumberUseException(String str) { // 예외 문구를 지정할 수 있도록 인자를 명시
		super(str); // 인자를 Exception에 전달
	}
}
public class ExceptionMain07 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.print("0 이상의 수를 입력 > ");
		try {
			int a = input.nextInt();
			if(a >= 0) {
				System.out.println("입력한 수 : " + a);
			}
			else { // 사용자가 정의한 예외를 인위적으로 발생
				throw new NegativeNumberUseException("음수를 사용할 수 없습니다.");
			}
		}
		catch(NegativeNumberUseException e) { // 사용자가 정의한 예외가 발생한 경우
			System.out.println(e.getMessage());
		}
		catch(Exception e) { // 그 외의 예외가 발생한 경우
			System.out.println("예외가 발생했습니다.");
		}
		finally {
			if(input!=null) input.close(); // 예외 발생 여부와 관계없이 자원 정리; input이 null인 경우 close할 수 없으므로 조건문 처리
		}
	}
}
java.lang 패키지에 포함된 기본 클래스ch07-langnUtil 프로젝트에 새 패키지 kr.s05.wrapper 생성 후 새 클래스 WrapperMain01 생성package kr.s05.wrapper;
public class WrapperMain01 {
	public static void main(String[] args) {
		boolean b = true; // 기본 자료형 데이터
		Boolean wrap_b = new Boolean(b); // 명시적 객체 생성; deprecated됨
		Boolean wrap_b2 = b; // 암시적 객체 생성
		System.out.println(wrap_b2); // 참조 자료형 데이터
		
		Integer wrap_i = new Integer(200);
		Integer wrap_i2 = 200;
		System.out.println(wrap_i2);
	}
}
WrapperMain02 생성package kr.s05.wrapper;
public class WrapperMain02 {
	public static void main(String[] args) {
		// 명시적으로 객체 생성
		Integer obj1 = new Integer(12);
		Integer obj2 = new Integer(7);
		
		// 연산
		int result = obj1.intValue() + obj2.intValue(); // intVaule() 메서드를 이용해 객체의 데이터를 int로 반환
		System.out.println("result = " + result);
		
		// 암시적으로 객체 생성
		Integer obj3 = 10;
		Integer obj4 = 20;
		int result2 = obj3 + obj4; // 자동 Boxing, Unboxing이 일어나므로 별도의 메서드 필요 없이 Integer 객체끼리 바로 연산하고 그 결과를 int 변수에 저장 가능
		System.out.println("result2 = " + result2);
	}
}
java.util 패키지에 포함되어 있는 인터페이스로, List와 Set에 상속됨add()
remove()
size()
contains()
true, 그렇지 않으면 false를 반환하는 메서드isEmpty()
true, 그렇지 않으면 false를 반환하는 메서드java.util 패키지에 포함되어 있는 인터페이스로, Collection을 상속받음get()
set()
indexOf()
lastIndexOf()
java.util 패키지에 포함되어 있는 클래스로, List 인터페이스를 구현java.util 패키지의 Collections 클래스를 이용
sort()
reverse()
ch09-collections 생성하고 새 패키지 kr.s01.list 생성 후 새 클래스 ArrayListMain01 생성package kr.s01.list;
import java.util.ArrayList;
class A {
	// Object의 toString() 메서드를 재정의
	@Override public String toString() {
		return "클래스 A";
	}
}
class B {
	
}
public class ArrayListMain01 {
	public static void main(String[] args) {
		ArrayList al = new ArrayList();
		// 데이터 저장; 서로 다른 클래스 자료형의 객체들을 보관할 경우, 다시 데이터 읽어올 때 다운캐스팅이 번거로우므로 실제로는 같은 클래스의 객체들만 보관
		al.add(new A()); // A 객체의 주소를 Object로 업캐스팅하여 전달
		al.add(new B()); // B 객체의 주소를 Object로 업캐스팅하여 전달
		al.add(10); // 10을 감싼 Integer 객체의 주소를 Object로 업캐스팅하여 전달(자동 Boxing)
		al.add("하늘"); // 문자열 객체의 주소를 Object로 업캐스팅하여 전달
		System.out.println(al); // toString() 메서드가 리스트에 저장된 데이터(=객체 주소)의 목록으로 재정의되어 있음
	}
}
ArrayListMain02 생성package kr.s01.list;
import java.util.ArrayList;
public class ArrayListMain02 {
	public static void main(String[] args) {
		// 리스트는 저장되는 순서를 유지하며, 중복 저장을 허용
		ArrayList al = new ArrayList();
		al.add("가나다"); // 인덱스 0번, String이 Object로 업캐스팅
		al.add("라마바");
		al.add("사아자");
		al.add("차카파");
		
		// 반복문을 이용한 ArrayList의 요소 출력
		for(int i=0;i<al.size();i++) { // 리스트의 길이는 size() 메서드를 이용
			String name = (String)al.get(i); // ArrayList에 저장된 요소는 get() 메서드를 통해 반환할 수 있으며, Object로 반환되므로 다운캐스팅해야 함
			System.out.println(name);
		}
	}
}
ArrayListMain03 생성package kr.s01.list;
import java.util.ArrayList;
public class ArrayListMain03 {
	public static void main(String[] args) {
		// 제네릭 표현: 객체를 생성할 때 객체에 저장할 수 있는 요소의 자료형을 클래스명과 생성자명 다음에 <>로 지정; 제네릭 표현을 사용하지 않으면 데이터 읽어올 때 ClassCastException 등 예외가 발생할 수 있으므로, 사용이 권장됨
		ArrayList<String> al = new ArrayList<String>();
		al.add("서울"); // 제네릭 표현을 쓰면 Object로 업캐스팅되지 않고 String으로 저장됨
		al.add("부산");
		// al.add(1000); // 제네릭 표현을 써서 ArrayList 객체를 생성할 때 저장되는 객체의 자료형을 String으로 지정했으므로 Integer 객체를 저장할 수 없음(=컴파일시 오류 발생)
		al.add("인천");
		
		// 반복문을 이용한 ArrayList의 요소 출력
		for(int i=0;i<al.size();i++) {
			String city = al.get(i); // 제네릭 표현을 쓰면 Object가 아니라 String으로 반환
			System.out.println(city);
		}
		
		// 확장 for문을 이용한 ArrayList의 요소 출력
		for(String city : al) {
			System.out.println(city);
		}
	}
}
ArrayListMain04 생성package kr.s01.list;
import java.util.ArrayList;
public class ArrayListMain04 {
	public static void main(String[] args) {
		ArrayList<String> al = new ArrayList<String>();
		al.add("사과");
		al.add("망고");
		al.add("바나나");
		al.add("오렌지");
		al.add("사과");
		System.out.println("삭제 전");
		for(int i=0;i<al.size();i++) {
			System.out.println(i + " : " + al.get(i));
		}
		// al.remove(2); // remove() 메서드에 인덱스 값을 입력하여 지정한 요소 삭제; 인덱스 변동 발생
		al.remove("사과"); // remove() 메서드에 저장된 요소를 입력시, 일치하는 (첫 번째) 요소 삭제; 인덱스 변동 발생
		System.out.println("삭제 후");
		for(int i=0;i<al.size();i++) {
			System.out.println(i + " : " + al.get(i));
		}
		
		ArrayList<Integer> al2 = new ArrayList<Integer>();
		al2.add(10);
		al2.add(5);
		al2.add(3);
		al2.add(20);
		
		System.out.println("삭제 전");
		for(int i=0;i<al2.size();i++) {
			System.out.println(i + " : " + al2.get(i));
		}
		
		// al2.remove(2); // 인덱스를 지정해 요소 삭제
		// Integer n = 10;
		// al2.remove(n); // 10과 일치하는 요소 삭제
		al2.remove((Integer)10); // 그냥 10을 입력하면 int라 인덱스로 인식하여 예외 발생하므로 Integer임을 명시해야 함
		
		System.out.println("삭제 후");
		for(int i=0;i<al2.size();i++) {
			System.out.println(i + " : " + al2.get(i));
		}
		
		al2.set(1, 30); // set() 메서드에 인덱스를 지정하고 변경할 데이터를 입력하여 지정한 요소의 데이터를 변경
		System.out.println("변경 후");
		for(int i=0;i<al2.size();i++) {
			System.out.println(i + " : " + al2.get(i));
		}
	}
}
ArrayListMain05 생성package kr.s01.list;
import java.util.ArrayList;
public class ArrayListMain05 {
	public static void main(String[] args) {
		ArrayList<Integer> al = new ArrayList<Integer>();
		al.add(10);
		al.add(20);
		al.add(15);
		al.add(16);
		
		System.out.println(al);
		for(int i=0;i<al.size();i++) { // 요소의 값을 조건부로 삭제하는 경우, 인덱스를 0부터 검사하게 되면 요소가 삭제될 때 인덱스 변동이 일어나 놓치는 요소가 발생; 인덱스를 마지막부터 검사하면 요소를 삭제해도 인덱스 변동이 일어나지 않으므로 문제가 발생하지 않음
			if(al.get(i)%2==0) { //요소의 값이 짝수인 경우
				al.remove(i); // 해당 요소를 삭제
			}
		}
		System.out.println("인덱스 0부터 반복문 시작 : " + al);
		
		ArrayList<Integer> al2 = new ArrayList<Integer>();
		al2.add(10);
		al2.add(20);
		al2.add(15);
		al2.add(16);
		
		System.out.println(al2);
		for(int i=al2.size();i>0;i--) {
			if(al2.get(i-1)%2==0) {
				al2.remove(i-1);
			}
		}
		System.out.println("마지막 인덱스부터 반복문 시작 : " + al2);
	}
}
ArrayListMain06 생성package kr.s01.list;
import java.util.ArrayList;
import java.util.Collections; // ArrayList에는 정렬 메서드가 없음
public class ArrayListMain06 {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("머루");
		list.add("사과");
		list.add("앵두");
		list.add("자두");
		list.add("사과");
		list.add("사과");
		
		// 인덱스 탐색
		int index1 = list.indexOf("사과"); // 앞에서부터 "사과"를 탐색
		System.out.println("첫 번째 사과 : " + index1);
		int index2 = list.lastIndexOf("사과"); // 끝에서부터 "사과"를 탐색
		System.out.println("마지막 사과 : " + index2);
		int index3 = list.indexOf("망고"); // 없는 요소의 인덱스를 탐색하면 -1로 반환
		System.out.println("망고 : " + index3);
		
		// 정렬
		Collections.sort(list); // 사전순으로 요소를 정렬(=인덱스 재배치)
		System.out.println(list);
		Collections.reverse(list); // 사전순의 역순으로 요소를 정렬
		System.out.println(list);
	}
}
ArrayListMain07 생성package kr.s01.list;
import java.util.ArrayList;
class CartItem { // 문자열과 int를 묶어 관리하기 위해 클래스 생성
	private String name; // 상품명
	private int num; // 수량
	private int price; // 가격
	
	public CartItem() {} // 기본 생성자
	public CartItem(String name, int num, int price) { // 인자가 있는 생성자
		this.name = name;
		this.num = num;
		this.price = price;
	}
	
	// Getters and Setters
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
}
public class ArrayListMain07 {
	public static void main(String[] args) {
		ArrayList<CartItem> list = new ArrayList<CartItem>();
		list.add(new CartItem("라면", 10, 10000));
		list.add(new CartItem("김치", 5, 20000));
		list.add(new CartItem("만두", 20, 30000));
		
		// 반복문을 이용한 요소 출력; ArrayList가 2차원 배열을 대체할 수 있고, 데이터 추가, 변경, 삭제가 가능하므로 더 편리
		for(int i=0;i<list.size();i++) {
			CartItem c = list.get(i);
			System.out.println(c.getName() + ", " + c.getNum() + ", " + c.getPrice());
		}
		System.out.println();
		for(CartItem item : list) {
			System.out.println(item.getName() + ", " + item.getNum() + ", " + item.getPrice());
		}
	}
}
ArrayListMain08 생성package kr.s01.list;
import java.util.Random;
import java.util.ArrayList;
public class ArrayListMain08 {
	public static void main(String[] args) {
		/*
		 * [실습] 로또 프로그램
		 * 1부터 45까지의 범위에서 겹치지 않는 6개 수를 구하면서 ArrayList에 저장하고 출력하시오.
		 */
		ArrayList<Integer> lottery = new ArrayList<Integer>();
		Random lt = new Random();
		while(lottery.size()<6) { // lottery의 길이가 6이 되면 루프 중단
			int num=lt.nextInt(45)+1; // 0부터 44까지의 범위에서 정수형 난수를 발생하여 1을 더한 값을 num에 저장
			if(!lottery.contains(num)) { // lottery에 num이 없는 경우
				lottery.add(num); // lottery에 num을 저장
			}
		}
		System.out.println(lottery);
	}
}
java.util 패키지에 포함되어 있는 클래스로, List 인터페이스를 구현VectorMain01 생성package kr.s01.list;
import java.util.Vector;
public class VectorMain01 {
	public static void main(String[] args) {
		Vector<Double> v = new Vector<Double>();
		// 객체
		v.add(100.3);
		v.add(3.14);
		v.add(1000.); // 1000.0에서 0 생략 가능
		
		// 확장 for문
		for(Double n : v) {
			System.out.println(n); // Vector에 저장된 요소 출력
		}
		
		// 자원 검색
		double search = 1000.0; // 검색할 요소
		int index = v.indexOf(search);
		if(index!=-1) { // 검색할 요소가 v에 있는 경우
			System.out.println("검색 요소 " + search + "의 위치 : " + index);
		}
		else { // 검색할 요소가 v에 없는 경우
			System.out.println("검색 요소 " + search + "이/가 v에 없습니다.");
		}
		
		// 자원 삭제
		double del = 3.14; // 삭제할 요소
		if(v.contains(del)) { // 삭제할 요소가 v에 있는 경우
			v.remove(del);
			System.out.println(del + "의 삭제를 완료하였습니다 : " + v);
		}
		else { // 삭제할 요소가 v에 없는 경우
			System.out.println(del + "이/가 v에 없습니다 : " + v);
		}
	}
}
java.util 패키지에 포함되어 있는 클래스로, Vector를 상속받음push()
pop()
peek()
kr.s02.stack 생성하고 새 클래스 StackMain 생성package kr.s02.stack;
import java.util.Stack;
public class StackMain {
	public static void main(String[] args) {
		String[] array = {"진달래", "백합", "개나리", "벚꽃", "장미"};
		Stack<String> stk = new Stack<String>();
		
		// stk에 push() 메서드로 데이터를 저장
		for(int i=0;i<array.length;i++) {
			stk.push(array[i]);
		}
		System.out.println(stk);
		
		// stk에서 pop() 메서드로 데이터를 꺼냄(=stk 안의 데이터는 지워짐)
		while(!stk.isEmpty()) { // stk이 비어 있지 않은 동안 루프
			System.out.print(stk.pop() + "\t");
		}
		System.out.println("\n"+stk);
	}
}
package kr.s02.mathtest;
import java.util.Scanner;
public class RandomMain02 {
	public static void main(String[] args) {
		/*
		 * [실습] 가위바위보 게임
		 * 컴퓨터가 난수를 발생시켜 0=가위, 1=바위, 2=보를 낸다.
		 * 메뉴 > 1. 게임하기, 2. 종료
		 * [출력 예시]
		 * 가위바위보 입력 > 0. 가위, 1. 바위, 2. 보
		 * 경우 1) 무승부! (컴퓨터 : 가위, 당신 : 가위)
		 * 경우 2) 컴퓨터 승리! (컴퓨터 : 가위, 당신 : 보)
		 * 경우 3) 당신 승리! (컴퓨터 : 가위, 당신 : 바위)
		 */
		String[] item = {"가위", "바위", "보"};
		Scanner input = new Scanner(System.in);
		while(true) {
			System.out.println("========");
			System.out.println("1. 게임하기, 2. 종료하기");
			System.out.println("========");
			System.out.print("메뉴 > ");
			int num = input.nextInt();
			if(num == 1) {
				System.out.print("가위바위보 입력(0. 가위, 1. 바위, 2. 보) > ");
				int user = input.nextInt();
				// 배열의 인덱스로 사용할 것이므로 범위에 맞는지 검사
				if(user <0 || user > 2) {
					System.out.println("잘못 입력했습니다.");
					continue;
				}
				// 난수 생성하고 결과 판정
				int computer = (int)(Math.random()*3);
				/*
				 * 컴퓨터 - 사용자 = 결과 판정
				 * 0 - 0 = 0 무승부
				 * 0 - 1 = -1 사용자 승리
				 * 0 - 2 = -2 컴퓨터 승리
				 * 1 - 0 = 1 컴퓨터 승리
				 * 1 - 1 = 0 무승부
				 * 1 - 2 = -1 사용자 승리
				 * 2 - 0 = 2 사용자 승리
				 * 2 - 1 = 1 컴퓨터 승리
				 * 2 - 2 = 0 무승부
				 */
				int result = computer - user;
				if(result == 0) {
					System.out.println("무승부! 컴퓨터 : " + item[computer] + ", 사람 : " + item[user]);
				} else if(result == -1 || result == 2) {
					System.out.println("사람 승리! 컴퓨터 : " + item[computer] + ", 사람 : " + item[user]);
				} else { // result == -2 || result == 1
					System.out.println("컴퓨터 승리! 컴퓨터 : " + item[computer] + ", 사람 : " + item[user]);
				}
			}
			else if(num == 2) {
				System.out.println("프로그램 종료");
				break;
			}
			else {
				System.out.println("잘못 입력하셨습니다.");
			}
		}
		input.close();
	}
}