추상 클래스와 인터페이스 => 가이드, 규칙
인터페이스 : 추상 클래스의 종류
-추상클래스(미완성 설계도)보다 추상화 정도가 높다.
-실제구현된 것이 전혀 없는 기본 설계도(알맹이 없는 껍데기)
-추상메서드와 상수만을 멤버로 가질 수 있다.
-인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
-미리 정해진 규칙에 맞게 구현하도록 표준(규칙,규범)을 제시하는데 사용된다.
-인터페이스도 클래스 처럼 상속이 가능하다.(클래스와 달리 다중상속 허용)
추상클래스 : 상속의 목적 / 미완성 설계도 / 추상 메서드를 포함하고 있는 클래스
클래스 구분(성격)
1.데이터 저장
2. 기능
3.상속을 목적으로 하는 클래스 => 가이드 규칙 => 일반,추상클래스 , 인터페이스
제너릭 클래스의 이해와 설계
프레임 워크의 의미 : 잘 정의된, 약속된 구조와 골격
컬렉션 프레임워크 : 인스턴스의 저장과 참조를 위해 잘 정의된, 클래스들의 구조
컬렉션 프레임워크가 제공하는 기능의 영역 :
자료 구조의 이론적인 특성을 안다면 , 보다 적절하고 합리적인 활용이 가능하다.
-자료구조(배열,리스트,스택,큐,트리,해시),
-알고리즘(정렬,탐색,최대,최소 등...)
List<E> 인터페이스를 구현하는 대표적인 제네릭 클래스
-> ArrayList<E>, LinkedList<E>
List<E> 인터페이스를 구현 클래스의 인스턴스 저장 특징
-> 동일한 인스턴스의 중복 저장을 허용한다.
-> 인스턴스의 저장 순서가 유지된다.
ArrayList<E>의 단점 : - 저장소의 용량을 늘리는 과정에서 많은 시간이 소요된다.
-데이터의 삭제에 필요한 연산과정이 매우 길다.
ArrayList<E>의 장점
-데이터의 참조가 용이해서 빠른 참조가 가능하다.
기본 자료형 정보를 이용해서 제네릭 인스턴스 생성 불가능!
따라서 Wrapper 클래스를 기반으로 컬렉션 인스턴스를 생성한다.
FriendInfoHandler 클래스에 배열대신 ArrayList<> 컬렉션으로 코드 수정 |
package com.test_10.infomanager3;
import java.util.*;
public class FriendInfoHandler {
// 저장 데이터(객체)를 배열로 저장하고 관리하는 기능을 가지는 클래스
// 2021 -05-31 배열 -> 컬렉션
// Friend[] friends;
// int numOfFriend; // 배열의 입력 index역활, 정보의 개수
ArrayList<Friend> friends;
Scanner scan = new Scanner(System.in);
// 생성자
public FriendInfoHandler(int num) {
friends = new ArrayList<Friend>(num);
// this.friends = new Friend[num];
// numOfFriend = 0; // 안해줘도 되지만 명시적으로 표시해주기위해 사용
}
// 데이터의 입력 처리
// 사용자로부터 친구의 정보를 입력받아서 -> 인스턴스를 생성 -> 배열에 저장한다.
public void addFriend(int choice) { // choice -> 1.(고교) or 2.(대학)
System.out.println("이름을 입력해주세요.>> ");
String name = scan.nextLine();
System.out.println("전화번호를 입력헤주세요 >> ");
String phoneNumber = scan.nextLine();
System.out.println("주소를 입력해주세요 >>");
String address = scan.nextLine();
// 이름이 중복되지 않게 하는 코드 작성해보기
if (choice == 1) { // 고교 친구
System.out.println("직업을 입력해주세요 >>");
String work = scan.nextLine();
// HighFriend hFriend = new HighFriend(name,phoneNumber, address, work);
// addFriendInfo(hFriend); +v
// 인스턴스 생성
addFriendInfo(new HighFriend(name, phoneNumber, address, work));
// 배열에 요소 추가
// friends[numOfFriend++] = hFriend;
} else if (choice == 2) { // 2.대학
System.out.println("전공을 입력해주세요 >>");
String major = scan.nextLine();
// 인스턴스 생성
// addFriendInfo(new UnivFriend(name, phoneNumber, address, major));
System.out.println("email을 입력해주세요>>");
String email = scan.nextLine();
System.out.println("학년을 입력해주세요.");
int year = Integer.parseInt(scan.nextLine());
addFriendInfo(new PhoneUnivInfor(name, phoneNumber, address, major, email, year));
// 배열에 요소 추가
// friends[numOfFriend++] = univFriend;
} else if(choice == 3) {
System.out.println("가족관계를 입력해주세요.>>");
String relation = scan.nextLine();
addFriendInfo(new PhoneFamily(name, phoneNumber,address,relation));
}else {
}
}
// Friend 클래스를 상속하는 타입의 인스턴스를 받아 배열에 저장
public void addFriendInfo(Friend f) {
// 배열에 요소 추가
// friends[numOfFriend++] = f;
// List에 요소 추가
friends.add(f);
System.out.println("정보가 저장되었습니다.");
}
public void showAllBasicData() {
System.out.println("친구의 모든 기본 정보를 출력합니다.");
System.out.println("------------------------------");
// 2021-05-31 수정 : List 출력 수정
if (!friends.isEmpty()) {
for (int i = 0; i < friends.size(); i++) {
// friends[i].showBasicInfo();
friends.get(i).showBasicInfo();
System.out.println("------------------------------");
}
} else {
System.out.println("입력된 정보가 없습니다.");
}
System.out.println("------------------------------");
}
// 모든 데이터를 출력하는 메소드
public void showAllData() {
System.out.println(" 모든 정보를 출력합니다.");
System.out.println("------------------------------");
//2021-05-31 : 수정
// 요소의 저장방식이 배열-> 컬렉션 => 반복문 수정
if ( friends.size()> 0) {
for (int i = 0; i < friends.size(); i++) {
// friends[i].showData();
friends.get(i).showData();
System.out.println("------------------------------");
}
} else {
System.out.println("입력된 정보가 없습니다.");
}
System.out.println("------------------------------");
}
public void deletData() {
System.out.println("삭제할 이름을 입력해주세요.");
String name = scan.nextLine();
boolean isTrue = false;
// int point = 0;
// for (int i = 0; i < numOfFriend; i++) {
// if ((friends[i].name).equals(name)) {
// isTrue = true;
// point = i;
// }
// }
// if (isTrue == true) {
// // 삭제할 데이터부터 배열의 길이 끝까지 한칸씩 앞으로 밀면서 저장한다.
// for (int i = point; i < numOfFriend; i++) {
// friends[i] = friends[i + 1];
// System.out.println("[" + name + "] 의 데이터가 삭제되었습니다.");
// }
// // 마지막 배열에 null값이 저장되기 때문에 배열의 길이를 한칸 없앤다.
// numOfFriend--;
// }else {
// System.out.println("데이터에 저장된 이름이 없습니다.");
// }
//2021-05-31 배열 -> 컬렉션
for(int i =0; i < friends.size(); i++) {
참조 변수 Friends의 인스턴스에 접근하여 저장된 name과 사용자가 입력한 name과 비교하여
같은 값이 있으면 삭제
if(friends.get(i).name.equals(name)) {
isTrue = true;
friends.remove(i);
}
}
// 저장된 값이 없을 경우
if(isTrue == false) {
System.out.println("입력된 데이터가 없습니다.");
}
}
}