Java기반 Back-End 개발자 & 정보처리산업기사 과정 강의 14일차 정리

misung·2021년 4월 2일
0

자료구조

ArrayList

ArrayList<자료형> 리스트명 = new ArrayList<자료형>();

import java.util.ArrayList;

ArrayList<int> arrList = new ArrayList<int>();

인터페이스로 add, get, remove 등을 사용하고
순환 시 iterator을 사용하여 순환한다.

ArrayList 실습

예시 1. ArrayList의 기본적인 사용

// 문자열을 담을 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
JSP

JAVA
ORACLE
CSS
JSP

i : 0
JAVA
i : 1
CSS
i : 2
JSP

예시 2.

// 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

예시 3. 이전에 작성했던 Member 클래스를 ArrayList의 자료형으로 정하여 멤버를 추가하고 출력해보자.

// 객체를 담는 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

예시 4. 13일차에 작성한 회원 관리 프로그램의 MemberManager 클래스 내의 Member 배열을, ArrayList로 변경하여 만들어보자.

// 입력받을 스캐너 선언 
	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

try {
	에러가 발생할 것으로 예상되는 구문; 
} catch (Exception e) {
	에러 발생 시 출력할 구문;
} finally {
	반드시 실행하고자 하는 구문;
}

여기서 Exception의 경우, 발생하는 예외처리들 중 가장 포괄적인 의미를 가지므로, 세부/개별적인 예외사항을 잡고 싶다면, Exception보다 앞쪽에 catch 구문과 함께 해당하는 종류의 Exception을 작성해야 한다. finally는, 위의 예외 처리 사항에 관계없이 반드시 한번은 실행되므로 할당한 리소스의 해제 등의 용법으로 사용할 수 있다.

try ... catch 실습하기

예시 1.

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

예시 2.

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

상속

extends

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;
}  

0개의 댓글

관련 채용 정보