ArrayList<
자료형
>리스트명
= new ArrayList<자료형
>();import java.util.ArrayList; ArrayList<int> arrList = new ArrayList<int>();
인터페이스로 add
, get
, remove
등을 사용하고
순환 시 iterator
을 사용하여 순환한다.
// 문자열을 담을 ArrayList. 기본 생성자 사용 시 10개의 객체 저장 가능 ArrayList<String> arrList = new ArrayList<String>(); // ArrayList의 add() 메소드를 사용하면 데이터를 저장할 수 있다. arrList.add("JAVA"); // 0번 인덱스 arrList.add("ORACLE"); // 1번 인덱스 arrList.add(2, "JSP"); // 2번 인덱스를 지정해 삽입 // get() 메소드에 index값을 넣어서 해당 위치의 요소 불러오기 가능 //System.out.println(arrList.get(0)); for (int i = 0; i < arrList.size(); i++) { System.out.println(arrList.get(i)); } System.out.println(); /* * 배열에서는 이렇게 이미 요소가 든 배열의 index를 지정하여 * 요소를 삽입한 경우, 요소가 대치되어지지만, * ArrayList의 경우, 해당 위치의 요소가 뒤로 하나씩 밀려난다. */ arrList.add(2, "CSS"); // 그것을 출력해봄으로써 확인할 수 있다. for (int i = 0; i < arrList.size(); i++) { System.out.println(arrList.get(i)); } // 여기서는 "ORACLE"을 지우게 될 것이다. arrList.remove(1); System.out.println(); // 그러면, 지워진 자리가 빈 것이 아닌 하나씩 당겨진 것을 볼 수 있다. for (int i = 0; i < arrList.size(); i++) { System.out.println("i : " + i); System.out.println(arrList.get(i)); }
→
JAVA
ORACLE
JSPJAVA
ORACLE
CSS
JSPi : 0
JAVA
i : 1
CSS
i : 2
JSP
// String 타입의 ArrayList 생성 ArrayList<String> nameList = new ArrayList<String>(); // 3명의 이름을 저장 nameList.add("김철수"); nameList.add("아무개"); nameList.add("John Doe"); // 저장된 이름을 확인 for (int i = 0; i < nameList.size(); i++) { System.out.println(i + "번째 " + "이름 : " + nameList.get(i)); }
→
0번째 이름 : 김철수
1번째 이름 : 아무개
2번째 이름 : John Doe
// 객체를 담는 ArrayList ArrayList<Member> memList = new ArrayList<Member>(); Member mem = new Member(); int memberNum = 1; mem.setMemberNum(memberNum); mem.setId("abc"); mem.setPassword("123"); mem.setName("John"); mem.setEmail("abc@def.com"); memList.add(mem); mem = new Member(); memberNum++; mem.setMemberNum(memberNum); mem.setId("def"); mem.setPassword("456"); mem.setName("Jane"); mem.setEmail("def@ghi.com"); memList.add(mem); // 1번 회원의 이름 출력 // 배열의 경우, memList[0].getName(); String userName1 = memList.get(0).getName(); System.out.println("1번 회원의 이름 : " + userName1); // 2번 회원의 이름 출력 String userName2 = memList.get(1).getName(); System.out.println("1번 회원의 이름 : " + userName2);
→
1번 회원의 이름 : John
2번 회원의 이름 : Jane
// 입력받을 스캐너 선언 Scanner sc = new Scanner(System.in); // 13일차에 배열로 선언했던 것과 다르게, ArrayList로 변경! ArrayList<Member> memList = new ArrayList<Member>(); Member mem; // 회원 번호 부여할 변수 int memberNum = 0; // 기본 메뉴 출력 메소드 public void showMenu() { System.out.println("========================================================="); System.out.println("| 1. 회원가입 | 2. 회원정보 | 3. 정보수정 | 4. 회원목록 | 5. 종료 |"); System.out.println("========================================================="); System.out.print("메뉴 선택 : "); } // 메뉴 숫자 입력받을 메소드 public int inputNum() { int input = sc.nextInt(); return input; } // 회원가입 메소드 public void signIn() { mem = new Member(); // 회원 번호는 일단 회원번호 변수 +1로 해준다. (변수는 배열에 쓰일거라 0~99) mem.setMemberNum(memberNum + 1); System.out.println("회원 가입 메뉴입니다."); // 같은 아이디가 있다는 가정 하에 시작 boolean hasSameId = true; while (hasSameId) { // id를 입력받고 회원 객체에 저장 System.out.print("아이디 입력 : "); String id = sc.next(); // 아직 객체가 하나도 없으면 if (memList.size() == 0) { // 바로 id 설정 mem.setId(id); // 중복 아이디 없는 것으로 판단 hasSameId = false; // 객체가 하나라도 있으면 } else { // 아이디 중복 검사하여, 중복 검출 시 재입력받도록 for (int i = 0; i < memList.size(); i++) { // 매 객체마다 중복된 id를 가졌는지 검사 if (memList.get(i).getId().equals(id)) { System.out.println("중복된 아이디가 존재합니다."); break; // 중복된 아이디가 하나도 없으면 여기에 도달하게 될 것. // 매번 검사하느라 효율이 떨어질 수 있다고 생각됨. } else if ((i + 1) == memList.size()) { mem.setId(id); // 중복 id가 없는 것으로 판단 hasSameId = false; } } } } // 비밀번호 입력받고 저장 System.out.print("비밀번호 입력 : "); String password = sc.next(); mem.setPassword(password); // 이름 입력받고 저장 System.out.print("이름 입력 : "); String name = sc.next(); mem.setName(name); // 이메일 입력받고 저장 System.out.print("이메일 입력 : "); String email = sc.next(); mem.setEmail(email); // 각 정보가 다 저장된 회원 객체를, 회원 객체 배열에 저장. // -> 이젠 순차적으로 알아서 들어갈 것 memList.add(mem); // 회원 번호를 1만큼 증가. memberNum++; System.out.println("회원 가입이 완료되었습니다."); } // 회원정보 메소드 public void showMemberInfo() { System.out.println("회원 정보 메뉴입니다."); // 찾으려는 회원이 존재하는지 searchMember를 통해 검색 int index = this.searchMember(); // 찾으려는 회원이 존재하면 if (index != -1) { System.out.println("아이디 : " + memList.get(index).getId() + " 비밀번호 : " + memList.get(index).getPassword() + " 이름 : " + memList.get(index).getName() + " 이메일 : " + memList.get(index).getEmail()); } } // 정보수정 메소드 public void changeMemberInfo() { System.out.println("정보수정 메뉴입니다."); // 해당 회원이 존재하는지 확인 int index = this.searchMember(); // 회원이 존재하면 if (index != -1) { boolean run = true; while (run) { System.out.println("========================================="); System.out.println("| 1. 이름변경 | 2. 이메일변경 | 3. 정보수정종료 |"); System.out.println("========================================="); int menuSel = this.inputNum(); switch (menuSel) { case 1: System.out.print("변경할 이름 입력 : "); String name = sc.next(); memList.get(index).setName(name); System.out.println("이름 변경 완료"); break; case 2: System.out.print("변경할 이메일 입력 : "); String email = sc.next(); memList.get(index).setName(email); System.out.println("이메일 변경 완료"); break; case 3: run = false; break; default: System.out.println("잘못된 입력입니다."); } } } System.out.println("정보수정 종료."); } // 회원목록 메소드 public void showMemberList() { for (int i = 0; i < memList.size(); i++) { // 배열과 다르게 따로 null인지 아닌지 검사할 필요가 없음 System.out.println("아이디 : " + memList.get(i).getId() + " 이름 : " + memList.get(i).getName() + " 이메일 : " + memList.get(i).getEmail()); } } // 아이디, 비밀번호 기반으로 회원 확인 후 index 반환하는 메소드 public int searchMember() { System.out.println("[계정 확인]"); System.out.print("아이디 : "); String id = sc.next(); System.out.print("비밀번호 : "); String pw = sc.next(); int index = -1; for (int i = 0; i < memList.size(); i++) { // 해당 요소(회원 정보)가 존재하고, 입력한 아이디값과 저장된 아이디가 동일하면 // -> 이제 비어있는지 아닌지 확인할 필요 없음 // -> 아이디 & 비밀번호 모두 일치 시 if (memList.get(i).getId().equals(id) && memList.get(i).getPassword().equals(pw)) { index = i; // 아이디 & 비밀번호 불일치시 } else { System.out.println("아이디/비밀번호 불일치"); } } return index; }
try { 에러가 발생할 것으로 예상되는 구문; } catch (Exception e) { 에러 발생 시 출력할 구문; } finally { 반드시 실행하고자 하는 구문; }
여기서 Exception의 경우, 발생하는 예외처리들 중 가장 포괄적인 의미를 가지므로, 세부/개별적인 예외사항을 잡고 싶다면, Exception보다 앞쪽에 catch 구문과 함께 해당하는 종류의 Exception을 작성해야 한다. finally는, 위의 예외 처리 사항에 관계없이 반드시 한번은 실행되므로 할당한 리소스의 해제 등의 용법으로 사용할 수 있다.
try { int[] arr = new int[2]; arr[3] = 10; // NullPointerException 잡히면 이쪽으로, } catch (NullPointerException e) { // 어떠한 오류가 발생했는지 출력 e.printStackTrace(); System.out.println("오류 발생"); // ArrayIndexOutOfBoundsException 걸리면 이쪽으로. } catch (ArrayIndexOutOfBoundsException e) { System.out.println("ArrayIndexOutOfBoundsException"); } System.out.println("TryCatch");
→
ArrayIndexOutOfBoundsException
TryCatch
try { System.out.println("출력1"); int[] arr = new int[2]; // 오류가 발생할 지점 arr[3] = 10; // 오류가 발생한 이후의 코드는 실행되지 않는다. System.out.println("출력2"); } catch (Exception e) { e.printStackTrace(); // finally 블럭은 반드시 한 번은 실행된다. } finally { System.out.println("finally 출력"); } System.out.println("출력3");
→
출력1
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 2
at day14.Ex05_TryCatch2.main(Ex05_TryCatch2.java:12)
finally 출력
출력3
class Customer { String customerName; int point; } class VipCustomer extends { String vipCode; }
VIP 손님도 손님이므로, 손님 클래스가 가지고 있는 필드를 동일하게 갖는다. (손님 이름, 포인트) 거기에, VIP 손님만이 가지는 VIP 손님 관리용 코드를 따로 가지는 식으로, 상속에 대한 예시를 제시해볼 수 있다.
예시 1.
ParentPhone
// 모델명, 색상 protected String model; String color; public Ex08_ParentPhone(String model, String color) { this.model = model; this.color = color; }
ChildPhone
// 사이즈, 제조사 int size; String company; void childPhoneMethod() { System.out.println("protected model" + model); // 다른 패키지에 있는 경우와 달리, 같은 패키지에 있으므로 접근 가능. System.out.println("default color" + color); } public Ex08_ChildPhone(String model, String color, int size, String company) { // 부모 클래스에 매개 변수를 사용하는 생성자가 생기면서, 사용 불가 // 부모 클래스에서 이미 채워지므로.. // this.model = model; // this.color = color; // 따라서 겹치지 않도록 이렇게, 부모 클래스의 생성자를 호출해야 된다 super(model, color); this.size = size; this.company = company; }