extends
)abstract
키워드를 생략할 수 있다.형식 및 구성
public interface 인터페이스명 {
상수
추상메소드 // 본문 X
default 메소드 // 본문 O
private 메소드 // 본문 O
static 메소드 // 본문 O
}
public interface 안에서는
public abstract void a();
를 줄여서 public void a();
로 사용할 수 있다.
public abstract class A {
public abstract void a();
public abstract void b();
public void c() {}
}
public class B extends A {
@Override
public void a() { }
@Override
public void b() { }
}
A obj = new B();
obj.a();
obj.b();
obj.c();
상속할 때는 extends
사용하지만, interface
로 구현할 때는 implements
를 사용한다.
public interface A {
public void a();
public void b();
default void c() {}
}
public class B implements A {
@Override
public void a() { }
@Override
public void b() { }
}
A obj = new B();
obj.a();
obj.b();
obj.c();
위에 있는 이미지와 비슷하게 구현했다.
package ex01_interface;
public interface Shape {
// final 상수
public final static double PI = 3.141592; // static 생략가능
// 추상 메소드
public double getArea(); // public abstract double getArea()에서 abstract 생략가능
// default 메소드(본문이 있는 메소드)
public default void message() {
System.out.println("나는 도형이다.");
}
}
package ex01_interface;
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
super();
this.radius = radius;
}
@Override
public double getArea() {
return PI * Math.pow(radius, 2);
}
}
package ex01_interface;
public class Main {
public static void main(String[] args) {
Shape s = new Circle(1);
System.out.println(s.getArea());
}
}
다중 상속 : 부모가 여럿 있을 때 사용, 클래스만 2개 상속 받는건 X
package ex02_interface;
public abstract class Phone {
public abstract void call();
public abstract void sms();
}
package ex02_interface;
public interface Computer {
public void game();
public void internet();
}
상속 (extends) 먼저, 구현 (implements) 나중
package ex02_interface;
public class SmartPhone extends Phone implements Computer {
@Override
public void call() {
System.out.println("전화기능");
}
@Override
public void sms() {
System.out.println("SMS기능");
}
@Override
public void game() {
System.out.println("게임기능");
}
@Override
public void internet() {
System.out.println("인터넷기능");
}
}
p1의 game()
internet()
/ p2의 call()
sms()
은 캐스팅 해줘야 한다.
package ex02_interface;
public class Main {
public static void main(String[] args) {
// 메소드 호출 연습
Phone p1 = new SmartPhone();
p1.call();
p1.sms();
((Computer) p1).game();
((Computer) p1).internet();
System.out.println("-------------------------");
Computer p2 = new SmartPhone();
((Phone) p2).call();
((Phone) p2).sms();
p2.game();
p2.internet();
System.out.println("-------------------------");
SmartPhone p3 = new SmartPhone();
p3.call();
p3.sms();
p3.game();
p3.internet();
}
}
반환값
전화기능
SMS기능
게임기능
인터넷기능
-------------------------
전화기능
SMS기능
게임기능
인터넷기능
-------------------------
전화기능
SMS기능
게임기능
인터넷기능
애완동물에게 먹이주고, 산책하기
package ex03_interface;
public class Pet {
private String petName;
public Pet(String petName) {
super();
this.petName = petName;
}
public String getPetName() {
return petName;
}
public void setPetName(String petName) {
this.petName = petName;
}
}
package ex03_interface;
// extends Pet : 애완동물이다
// implements Walkable : 산책이 된다
public class Dog extends Pet implements Walkable {
public Dog(String petName) {
super(petName);
}
}
package ex03_interface;
// extends Pet : 애완동물이다
// implements Walkable : 산책이 된다
public class Cat extends Pet implements Walkable {
public Cat(String petName) {
super(petName);
}
}
package ex03_interface;
// extends Pet : 애완동물이다
public class Snake extends Pet {
public Snake(String petName) {
super(petName);
}
}
package ex03_interface;
public class Person {
public void foodFeed(Pet pet,String food) {
System.out.println(pet.getPetName() + "에게 " + food + "주기");
}
public void walk(Walkable pet) {
System.out.println(((Pet) pet).getPetName() + "와 산책");
}
}
산책이 가능한 애완동물(Pet)은 Walkable 인터페이스를 구현시키고,
산책 메소드에서는 Walkable 타입의 애완동물만 받는다.
package ex03_interface;
public interface Walkable {
}
package ex03_interface;
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("백구");
Cat cat = new Cat("냥냥이");
Snake snake = new Snake("낼름이");
Person person = new Person();
person.foodFeed(dog, "개껌"); // 백구에게 개껌주기
person.foodFeed(cat, "츄르"); // 냥냥이에게 츄르주기
person.foodFeed(snake, "쥐"); // 낼름이에게 쥐주기
person.walk(dog); // 백구와 산책
person.walk(cat); // 냥냥이와 산책
// person.walk(snake); // 실행을 못하게 막고 싶다.
}
}
프로듀서, 가수, 노래 2곡이 있다.
package quiz07_song;
public class Producer {
public void produce(Singer singer, Song song) {
singer.addSong(song);
}
}
package quiz07_song;
public class Singer {
private String name;
private Song[] songs;
private int idx;
public Singer(String name, int cnt) {
this.name = name;
songs = new Song[cnt];
}
public void addSong(Song song) {
if(idx == songs.length) {
return;
}
songs[idx++] = song;
}
public void info() {
System.out.println("가수이름 " + name);
System.out.println("대표곡");
for(int i = 0; i < idx; i++) {
System.out.println(songs[i]);
}
}
}
package quiz07_song;
public class Song {
private String title;
private double playTime;
public Song(String title, double playTime) {
super();
this.title = title;
this.playTime = playTime;
}
@Override
public String toString() {
return "Song [title=" + title + ", playTime=" + playTime + "]";
}
}
package quiz07_song;
public class Main {
public static void main(String[] args) {
Producer producer = new Producer();
Singer singer = new Singer("가수", 2); // 가수, 노래가 2개
Song song1 = new Song("노래1", 3.5);
Song song2 = new Song("노래2", 4.5);
producer.produce(singer, song1);
producer.produce(singer, song2);
singer.info();
}
}
반환값
가수이름 가수
대표곡
Song [title=노래1, playTime=3.5]
Song [title=노래2, playTime=4.5]
스케쥴러
package quiz08_schedule;
public class Day {
private String schedule;
public String getSchedule() {
return schedule;
}
public void setSchedule(String schedule) {
this.schedule = schedule;
}
}
package quiz08_schedule;
import java.util.Scanner;
public class WeekScheduler {
private int nthWeek; // 1 ~ n주차
private Day[] week;
private String[] dayNames = {"일", "월", "화", "수", "목", "금", "토"};
private Scanner sc;
public WeekScheduler(int nthWeek) {
this.nthWeek = nthWeek;
week = new Day[7];
sc = new Scanner(System.in);
}
private void makeSchedule() {
System.out.println("◈◈◈◈◈ 등록 ◈◈◈◈◈");
System.out.println("요일 입력 >>> ");
String dayName = sc.next().substring(0, 1); // "월요일"이라고 해도 "월"만 사용
sc.nextLine();
for(int i = 0; i < week.length; i++) { // private Day[] week;의 길이
if(dayName.equals(dayNames[i])) {
if(week[i] == null) { // 등록된 스케쥴이 없으면
System.out.print("스케쥴 입력 >>> ");
String schedule = sc.nextLine(); // 스케쥴에 공백 입력이 가능
Day day = new Day();
day.setSchedule(schedule);
week[i] = day;
System.out.println(dayName + "요일에 새 스케쥴이 등록 되었습니다.");
} else {
System.out.println(dayName + "요일은 이미 스케쥴이 있습니다.");
}
return; // if-else 이후에는 끝
}
}
System.out.println(dayName + "요일은 없는 요일입니다."); // "최요일" 처럼 잘못된 요일 입력할 경우
}
private void changeSchedule() {
System.out.println("◈◈◈◈◈ 변경 ◈◈◈◈◈");
System.out.print("변경할 요일 입력 >>> ");
String dayName = sc.next().substring(0, 1);
sc.nextLine();
for(int i = 0; i < week.length; i++) {
if(dayName.equals(dayNames[i])) {
if(week[i] == null) {
System.out.println(dayName + "요일은 스케쥴이 없습니다.");
System.out.print("새 스케쥴을 등록할까요?(y/n) >>> ");
String yesNo = sc.next().substring(0, 1);
sc.nextLine();
if(yesNo.equalsIgnoreCase("y")) {
System.out.print("새 스케쥴 입력 >>> ");
String schedule = sc.nextLine();
Day day = new Day();
day.setSchedule(schedule);
week[i] = day;
System.out.println(dayName + "요일에 새 스케쥴이 등록 되었습니다.");
} else {
System.out.println("스케쥴 변경이 취소 되었습니다.");
}
} else {
System.out.println(dayName + "요일의 스케쥴은 " + week[i].getSchedule() + "입니다.");
System.out.print("변경할까요?(y/n) >>> ");
String yesNo = sc.next().substring(0, 1);
sc.nextLine();
if(yesNo.equalsIgnoreCase("y")) {
System.out.print("변경할 스케쥴 입력 >>> ");
String schedule = sc.nextLine();
week[i].setSchedule(schedule);
System.out.println(dayName + "요일의 스케쥴이 변경 되었습니다.");
} else {
System.out.println("스케쥴 변경이 취소 되었습니다.");
}
}
return;
}
}
System.out.println(dayName + "요일은 없는 요일입니다."); // "최요일" 처럼 잘못된 요일 입력할 경우
}
private void deleteSchedule() {
System.out.println("◈◈◈◈◈ 삭제 ◈◈◈◈◈");
System.out.print("삭제할 요일 입력 >>> ");
String dayName = sc.next().substring(0, 1);
sc.nextLine();
for(int i = 0; i < week.length; i++) {
if(dayName.equals(dayNames[i])) {
if(week[i] == null) {
System.out.println(dayName + "요일은 스케쥴이 없습니다.");
} else {
System.out.println(dayName + "요일의 스케쥴은 " + week[i].getSchedule() + "입니다.");
System.out.print("삭제할까요?(y/n) >>> ");
String yesNo = sc.next().substring(0, 1);
sc.nextLine();
if(yesNo.equalsIgnoreCase("y")) {
week[i] = null;
System.out.println(dayName + "요일의 스케쥴이 삭제 되었습니다.");
} else {
System.out.println("스케쥴 삭제가 취소 되었습니다.");
}
}
return;
}
}
System.out.println(dayName + "요일은 없는 요일입니다."); // "최요일" 처럼 잘못된 요일 입력할 경우
}
private void printWeekSchedule() {
System.out.println("◈◈◈◈◈ 전체조회 ◈◈◈◈◈");
System.out.println(nthWeek + "주차 스케쥴 안내");
for(int i = 0; i < week.length; i++) {
System.out.print(dayNames[i] + "요일 - ");
System.out.println(week[i] == null ? "X" : week[i].getSchedule());
}
}
public void manage() {
while(true) {
System.out.print("1.등록 2.변경 3.삭제 4.전체조회 0.종료 >>> ");
int choice = sc.nextInt();
sc.nextLine();
switch(choice) {
case 1: makeSchedule(); break;
case 2: changeSchedule(); break;
case 3: deleteSchedule(); break;
case 4: printWeekSchedule(); break;
case 0 : System.out.println("스케쥴러를 종료합니다."); return;
default: System.out.println("인식할 수 없는 명령입니다.");
}
}
}
}
package quiz08_schedule;
public class Main {
public static void main(String[] args) {
WeekScheduler scheduler = new WeekScheduler(38);
scheduler.manage();
}
}