2023/11/16 🫶 인터페이스와 상속
∧∞∧ ∧∞∧ ∧∞∧ ∧∞∧ ∧∞∧ ♪
( ・ω・) ・ω・) ・ω・) ・ω・) ・ω・)
(っ )っ )っ )っ )っ )っ
( __フ( __フ( _フ( __フ( __フ
(_/彡 (_/彡 (_/彡 (_/彡 (_/彡
❤ 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤
상속 정리
상속에 대한 예제로 정리해 보자
tv를 만든다
tv는 스마트 tv와 일반 tv가 있다
스마트 tv는 인터넷이 되고 와이파이 기능이 있다
일반 tv는 인터넷이 안되고 와이파이 기능이 없다
모든 tv는 제조사/제조일/전원을 켜고 끄는 기능이 있다
상속의 키워드를 적어보자
모든 tv가 갖고 있는 속성으로 키워드 정리하면 될 것 같다
제조사/제조일/전원온오프/인터넷기능/와이파이기능을 선언하고
sub class에 인터넷기능과 와이파이기능의 정의만 바꾸면 될 것 같다
--- 선생님의 분석
tv는 super class에 제조사/제조일/전원 켜고 끄는 기능을 정의하고
sub class를 스마트 tv와 일반 tv로 구분한다
스마트 tv는 is-a관계로 tv로 정의할 수 있고, super class자원을 상속받아
sub class(스마트 tv)로 확장하여 새로운 스마트 tv를 정의할 수 있다
일반 tv도 동일하다
이때 스마트 tv는 인터넷 연결이란 기능이 필요함으로 이 기능은 has-a관계가 적당하다
인터넷 기능을 갖고 있는 객체를 참조하면 된다
이때 인터넷이라는 다양한 통신사가 있으므로 어떤 통신사든 연결가능하기 위해서는
인터페이스 기술을 사용하면 된다
객체는 어떤 특징, 어떤 기능을 갖고 있는지 파악 후 디자인패턴을 공부해야 한다
인터페이스
인터페이스에선 객체를 만들 수 없다
정의할 수 있는 게 제한적이다
추상 메서드는 강제성이 있다
참고로 상속을 받거나 인터페이스를 구현받으려면 강제성으로 기능을 부여받아야 한다
인터페이스는 곧 기능을 갖는다와 같다
상속과 인터페이스를 이용한 미니과제
상속과 인터페이스로 설계하고. Database에 저장하기
주제 : 애완동물 관리 프로그램
강아지, 고양이, 물고기가 있습니다.
레벨 1
동물을 등록할 때는
나이, 품종, 이름, 무게, 키(길이)를 저장합니다.
동물을 저장하고, 등록된 모든 동물을 출력하시오.
강아지는 예방접종을 해야 합니다. 예방접종 유무를 같이 출력하세요
물고기는 바다물고기, 민물물고기를 구분해야 합니다. 이 부분도 같이 출력하세요.
개발코드와 분리해서 분석하여
동물은 상속으로 설계하고 DAO를 인터페이스로 정의해서 문제를 해결합니다.
제출물: 클래스다이아그램
* 중간에 바뀜 *
DB설계는 제외하고 Java에서만 구현하기
인터페이스는 동물기준 사료로 두고 강아지와 고양이는 다르게 설계
초반에 이렇게 테이블을 정의하고 진행을 해봤는데 난관에 부딧쳤다.
중간에 선생님이 과제 내용을 바꾸셔서 다시 설계를 하였는데 날아갔다..ㅠㅠㅠ
초기 클래스 다이어그램이다.
나름 고민해서 했는데, 계획이 틀어지면서 참고용으로 사용하였다
클래스다이어그램 Class Diagram
엑셀로 직접 만들어 보았다.
매번 인텔리제이의 다이어그램으로 사용하다가
엑셀로 정리를 해봤더니 설계하는 것에 대해 이해도가 확 올라가는 걸 느꼈다
구현 소스코드
package main;
import controller.AnimalController;
public class Main {
public static void main(String[] args) {
new AnimalController();
}
}
package animal;
import java.util.ArrayList;
public class Animal {
public String type;
public String variety;
public int age = 0;
public String name;
public int weight = 0;
public int height = 0;
public final static ArrayList<Animal> animalList = new ArrayList<>();
public static void list_prt(String variety){
for (Animal animal : animalList) {
if (animal.variety.equals(variety)) {
System.out.println("--------------------------------");
System.out.println("종류 : " + variety);
System.out.println("이름 : " + animal.name);
System.out.println("품종 : " + animal.type);
System.out.println("나이 : " + animal.age);
System.out.println("몸무게 : " + animal.weight + "kg");
System.out.println("키 : " + animal.height + "cm");
}
}
}
}
package animal;
import feed.feedInf;
import static controller.AnimalController.ioText;
public class Animal_CAT extends Animal {
static String feed_title;
feedInf cat;
public Animal_CAT(String variety, feedInf catFeed) {
this.cat = catFeed;
System.out.println("고양이를 등록합니다");
this.variety = variety;
this.name = ioText("이름");
this.type = ioText("품종");
this.age = Integer.parseInt(ioText("나이"));
this.weight = Integer.parseInt(ioText("몸무게"));
this.height = Integer.parseInt(ioText("키"));
cat.feed_Prt();
feed_title = ioText("먹이");
animalList.add(this);
}
public static void cat_prt(){
list_prt("CAT");
System.out.println("사료 종류 : " + feed_title);
}
}
package animal;
import feed.feedInf;
import static controller.AnimalController.ioText;
import static feed.DogFeed.isVaccins;
public class Animal_DOG extends Animal {
static String feeds;
static feedInf dog;
static String vaccine;
public Animal_DOG(String variety, feedInf dogFeed){
this.dog = dogFeed;
System.out.println("강아지를 등록합니다");
this.variety = variety;
this.name = ioText("이름");
this.type = ioText("품종");
this.age = Integer.parseInt(ioText("나이"));
this.weight = Integer.parseInt(ioText("몸무게"));
this.height = Integer.parseInt(ioText("키"));
dog.feed_Prt();
this.feeds = ioText("먹이");
this.vaccine = isVaccins();
animalList.add(this);
}
public static void dog_prt(){
list_prt("DOG");
System.out.println("접종 여부 : " + vaccine);
System.out.println("사료 종류 : " + feeds);
}
}
package animal;
import static controller.AnimalController.ioText;
public class Animal_FISH extends Animal {
public Animal_FISH(String fish) {
System.out.println("물고기를 등록합니다");
this.variety = fish;
this.name = ioText("이름");
System.out.println("품종 : 바다물고기 or 민물물고기 중 선택");
this.type = ioText("품종");
if (this.type.equals("바다물고기") || this.type.equals("민물물고기")) {
this.age = Integer.parseInt(ioText("나이"));
this.weight = Integer.parseInt(ioText("몸무게"));
this.height = Integer.parseInt(ioText("키"));
animalList.add(this);
} else System.out.println("잘못된 입력 입니다");
}
}
package controller;
import animal.Animal;
import animal.Animal_CAT;
import animal.Animal_DOG;
import static controller.AnimalController.ioText;
public class Animal_List_Search extends animal.Animal{
private Animal_List_Search(){}
private static Animal_List_Search instance;
public static Animal_List_Search getInstance(){
if (instance == null) instance = new Animal_List_Search();
return instance;
}
public void animal_List(){
animal_select();
switch (Integer.parseInt(ioText("번호"))){
case 1 :
Animal_CAT.cat_prt();
break;
case 2 :
Animal_DOG.dog_prt();
break;
case 3:
Animal.list_prt("FISH");
break;
case 4 :
System.out.println("초기메뉴로 이동합니다");
break;
default :
System.out.println("잘못된 입력입니다. 초기화면으로 돌아갑니다");
break;
}
}
private void animal_select() {
System.out.println("동물별 등록된 리스트보기입니다");
System.out.println("1. 고양이");
System.out.println("2. 강아지");
System.out.println("3. 물고기");
System.out.println("4. 이전화면");
}
}
package controller;
import animal.*;
import feed.CatFeed;
import feed.DogFeed;
import java.util.Scanner;
public class AnimalController {
static Scanner in = new Scanner(System.in);
public AnimalController() {
boolean flag = true;
try {
while (flag) {
int number = Integer.parseInt(ioMenu());
switch (number) {
case 1:
new Animal_CAT("CAT", new CatFeed());
break;
case 2:
new Animal_DOG("DOG", new DogFeed());
break;
case 3:
new Animal_FISH("FISH");
break;
case 4:
Animal_List_Search animalListSearch = Animal_List_Search.getInstance();
animalListSearch.animal_List();
break;
case 5:
System.out.println("프로그램종료");
flag = false;
break;
default:
System.out.println("잘못된 입력입니다.");
break;
}
}
} catch (Exception e) {
System.out.println("잘못된 입력입니다.");
}
}
public static String ioText(String text){
System.out.print("\t"+text+"입력 >> ");
return in.nextLine();
}
private String ioMenu() {
System.out.println("1. CAT");
System.out.println("2. DOG");
System.out.println("3. FISH");
System.out.println("4. LIST");
System.out.println("5. EXIT");
return ioText("번호");
}
}
package feed;
public interface feedInf {
public void feed_Prt();
}
------------------------------------------------------------------------------------
package feed;
import static controller.AnimalController.ioText;
public class DogFeed implements feedInf{
public void feed_Prt(){
System.out.println("강아지 사료목록");
System.out.println("1. 칼슘 사료");
System.out.println("2. 단백질 사료");
}
public static String isVaccins(){
System.out.println("예방접종 여부 : 예 or 아니오 중 선택");
return ioText("예방접종 여부");
}
}
------------------------------------------------------------------------------------
package feed;
public class CatFeed implements feedInf {
public void feed_Prt() {
System.out.println("고양이 사료 목록");
System.out.println("1. 칼슘 사료");
System.out.println("2. 무기질 사료");
System.out.println("3. 비타민 사료");
}
}