자바
Day18
더러덕스
2021. 5. 28. 19:21
상속과 다형성을 이용한 간단한 프로그램 만들기 |
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개의 인덱스만 삭제하는 것이 아닌 찾은 이름의 인덱스를 다 삭제할 수 있는 기능 - ... |