본문 바로가기

자바

Day19


추상 클래스와 인터페이스  => 가이드, 규칙
인터페이스 : 추상 클래스의 종류 
-추상클래스(미완성 설계도)보다 추상화 정도가 높다.
-실제구현된 것이 전혀 없는 기본 설계도(알맹이 없는 껍데기)
-추상메서드와 상수만을 멤버로 가질 수 있다.
-인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다. 
-미리 정해진 규칙에 맞게 구현하도록 표준(규칙,규범)을 제시하는데 사용된다. 
-인터페이스도 클래스 처럼 상속이 가능하다.(클래스와 달리 다중상속 허용) 

추상클래스 : 상속의 목적 / 미완성 설계도 / 추상 메서드를 포함하고 있는 클래스

클래스 구분(성격)
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("입력된 데이터가 없습니다.");
		}				
	}
}

 

'자바' 카테고리의 다른 글

day21  (0) 2021.06.13
Day20  (0) 2021.06.01
Day18  (0) 2021.05.28
Day 16  (0) 2021.05.26
Day14  (0) 2021.05.24