JAVA_상속_인터페이스 (Interface)

JW__1.7·2022년 8월 2일
1

JAVA 공부일지

목록 보기
17/30

인터페이스 (Interface)

  • 클래스가 구현해야 할 메소드를 선언해 둔 자바 파일
  • 작업지시서 역할을 수행
  • 인터페이스 구현은 implements 키워드를 이용 (상속할 때는 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);			// 실행을 못하게 막고 싶다.
	}
}

Quiz 7

프로듀서, 가수, 노래 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]

Quiz 8

스케쥴러

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();
	}
}

0개의 댓글