본문 바로가기

자바

Day18

상속과 다형성을 이용한 간단한 프로그램 만들기 
Friend 클래스는 인스턴스화 되지 않는다. (HighFriend클래스와 PhoneUnivInfor 클래스의 상위 클래스로만 의미를 지닌다.
Friend 클래스의 showBasicInfo 메소드를 하위클래스에서 각각 오버라이딩 하고 있다.
showBasicInfo 메소드의 오버라이딩 이유는 Friend 클래스를 상속하는 하위클래스가 하나 더 등장할 때마다 위의 메소드는 엄청나게 복잡해지기 때문에 동일한 방식으로 배열에 저장 및 메소드 호출을 할 수 있다.
클래스를 만드는 것 : 새로운 타입을 정의하는 것
다형성 : 상위 타입으로 하위타입의 인스턴스를 참조할 수 있다. 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있지만, 반대로 자손 타입의 참조 변수로 조상타입의 인스턴스를 참조할 수 는 없다.
package com.test_10;
class AAA{}
class BBB extends AAA{}
class CCC extends BBB{}

public class PolymorphsimTest {

	public static void main(String[] args) {
		AAA ref1 = new BBB();
		AAA ref2 = new CCC(); // ok
		BBB ref3 = new CCC(); // ok
		
		CCC ref4 = new CCC();
		BBB ref5 = ref4; // ok
		AAA ref6 = ref4; // ok
		
		AAA ref7 = new CCC();
//		BBB ref8 = ref7; not ok 
//		CCC ref9 = ref7; not ok 
	}

 

package com.test_10.infomanager;
	//상속을 목적으로 하는 클래스 
public class Friend {
	// 이름, 전화번호, 주소
	 String name;
	 String phoneNumber;
	 String address;
	//생성자
	public Friend(String name, String phoneNumber, String address) {
		this.name = name;
		this.phoneNumber = phoneNumber;
		this.address = address;
	}
	
	public void showData() {
		System.out.println("이     름: "+name);
		System.out.println("전화번호: "+phoneNumber);
		System.out.println("주     소: "+address);
	}
    @상속을 통해 연관된 일련의 클래스에 대한 공통적인 규약을 정의하기 위한 오버라이딩 메소드
	public void showBasicInfo() {}
}
========================================================================================================
package com.test_10.infomanager;

public class HighFriend extends Friend {
	
	//고교 친구는 직장 정보를 추가적으로 가진다.
	String work;
	public HighFriend(String name, String phoneNumber, String address,String work) {
		super(name, phoneNumber, address);
		this.work = work;
	}
	@Override //컴파일전에 부수적인 기능을 하게 해주는 annotation 
	public void showData() {
		super.showData();
		System.out.println("직     업: "+work);
	}
	@Override
	public void showBasicInfo() {
		System.out.println("이     름: "+name);
		System.out.println("전화번호: "+phoneNumber);
		System.out.println("직     업: "+work);
	}	
}
==============================================================================================================
package com.test_10.infomanager;

public class PhoneUnivInfor extends Friend {
	String major;
	int year;
	String email;
	public PhoneUnivInfor(String name, String phoneNumber, String address, String major,String email,int year) {
		super(name, phoneNumber, address);
		this.major =major;
		this.email = email;
		this.year = year;
	}
	@Override
	public void showData() {
		super.showData();
		System.out.println("전     공:"+ major);
		System.out.println("메     일: "+email);
		System.out.println("학     년: "+year);
		
	}
	@Override
	public void showBasicInfo() {
		super.showBasicInfo();
		System.out.println("전     공:"+ major);
		System.out.println("메     일: "+year);
		System.out.println("학     년: "+year);
	}
	

}
================================================================================================================
package com.test_10.infomanager;

import java.util.*;

public class FriendInfoHandler {
	// 저장 데이터(객체)를 배열로 저장하고 관리하는 기능을 가지는 클래스
	Friend[] friends;
	int numOfFriend; // ***배열의 입력 index역활, 정보의 개수***
	Scanner scan = new Scanner(System.in);

	// 생성자
	public FriendInfoHandler(int 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 { // 3.
			// System.out.println("전공을 입력해주세요 >>");
			// String major = scan.nextLine();

		}

	}

	// Friend 클래스를 상속하는 타입의 인스턴스를 받아 배열에 저장
	public void addFriendInfo(Friend f) {
		friends[numOfFriend++] = f;
		System.out.println("정보가 저장되었습니다.");
	}

	public void showAllBasicData() {
		System.out.println("친구의 모든 기본 정보를 출력합니다.");
		System.out.println("------------------------------");
		if (numOfFriend > 0) {
			for (int i = 0; i < numOfFriend; i++) {
				friends[i].showBasicInfo();
				System.out.println("------------------------------");
			}
		} else {
			System.out.println("입력된 정보가 없습니다.");
		}
		System.out.println("------------------------------");
	}

	// 모든 데이터를 출력하는 메소드
	public void showAllData() {
		System.out.println(" 모든 정보를 출력합니다.");
		System.out.println("------------------------------");
		if (numOfFriend > 0) {
			for (int i = 0; i < numOfFriend; i++) {
				friends[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 + "] 의 데이터가 삭제되었습니다.");
			}
			// 인덱스 한칸이 줄어들었기 때문에 마지막 배열의 길이를 한칸 줄인다.
			numOfFriend--;
		}
	}
}
============================================================================================================================
****************구동부 클래스*********************
package com.test_10.infomanager;

import java.util.Scanner;

public class FriendBook {

	public static void main(String[] args) {
		FriendInfoHandler handler = new FriendInfoHandler(100);

		while (true) {
			System.out.println("**메뉴 선택***********************");
			System.out.println("1. 고교 친구 정보 입력");
			System.out.println("2. 대학 친구 정보 입력");
			System.out.println("3. 전체 정보 출력");
			System.out.println("4. 기본 정보 출력");
			System.out.println("5. 친구 정보 삭제");
			System.out.println("6. 프로그램 종료");
			System.out.println("*******************************");
			System.out.println("선택>>");

			Scanner scan = new Scanner(System.in);
			
			int choice = Integer.parseInt(scan.nextLine());

			switch (choice) {
			case 1 : case 2 :
				handler.addFriend(choice);
				break;
			case 3 :
				handler.showAllData();
				break;
			case 4 :
				handler.showAllBasicData();
				break;
			case 5 :
				handler.deletData();
				break;
			case 6 : 
				System.out.println("프로그램을 종료합니다.");
				return;				
			}
		}
	}
}
상속을 통해 연관된 일련의 클래스에 대한 공통저인 규약을 정의할 수 있고, 오버라이딩을 적절히 이용하여 코드의 중복을 줄이고 효율적으로 사용할 수 있게 꾸준히 연습하자.
추가적으로 위의 코드에 다른 클래스를 추가해보면서 상속이 필요한 경우 사용하고, 다른 추가적인 메소드를 이용해 프로그램의 기능을 좀 더 확장 시켜보도록 하자.
ex)-같은 이름이 중복된다면 인스턴스의 저장을 허가하지 않는 메소드, 
- 만약 이름이 중복되었다면, 삭제 메소드에서 1개의 인덱스만 삭제하는 것이 아닌 찾은 이름의 인덱스를 다 삭제할 수 있는 기능
- ...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Day20  (0) 2021.06.01
Day19  (0) 2021.05.31
Day 16  (0) 2021.05.26
Day14  (0) 2021.05.24
Day13  (0) 2021.05.21