써먹는 웹개발
[Java] 15강 인터페이스 본문
15강 인터페이스(interface)
- 한 객체가 다양한 역할을 수행하려면?
ex) 홍팍이는 개발자이자 강사이며, 친구이다.
1. 인터페이스란
- 정의 : 역할을 부여하는 것
- 특징 : 추상 메소드로 구현한다.
추상 메소드란? 중괄호 내부가 없는 껍데기 메소드
ex) 스마트폰은 알람, 전화기, 메신저의 역할을 한다.
2. 인터페이스의 정의 및 구현
- 형식
interface NAME { // 프로토타입 메소드들.. } |
- 예 : Alarm 인터페이스를 만들어보자
기능 : 비프음 내기와 음악 재생
주의사항 : 인터페이스 내의 메소드에 중괄호 없음
interface Alarm { public void beep(); // 추상메소드 public void playMusic(); // 추상메소드 } |
- 인터페이스 구현을 선언
위에서 만든 인터페이스를 클래스에 구현하자 이를 위해 implements 키워드를 사용한다.
// SmartPhone 클래스가 Alarm 역할을 수행하기로 함! class SmartPhone implements Alarm { // 내부 구현 생략.. } |
- 추상 메소드 오버라이딩
이제 Alarm 인터페이스의 모든 추상 메소드를 재정의(오버라이딩) 해야 한다. 중괄호 내부가 없기 때문이다.
class SmartPhone implements Alarm { // 프로토타입 메소드를 재정의! public void beep() { System.out.println("삐~ 삐삑, 삐비비빅!"); }
// 프로토타입 메소드를 재정의! public void playMusic() { System.out.println("아침 해가 빛나는~ 끝이 없는 바닷가!"); } } |
3. 인터페이스의 장점
프로그램 설계의 명확성 : 인터페이스를 사용하면 프로그램 설계가 보다 명확해진다.
관계성 부여 : 서로 다른 객체들이 같은 인터페이스를 구현한다면, 인터페이스를 타입으로 하여 업캐스팅 할 수 있다.
다형성 : 여러 인터페이스를 구현하게 함으로써, 한 객체를 여러 타입으로 해석할 수 있게 된다.
4. 요약
인터페이스란
- 역할을 부여하는 것
- 추상 메소드로 구성
- 추상 메소드란, 중괄호 내부가 없는 껍데기 메소드
인터페이스 정의 및 구현
- 인터페이스 구현 시, implements 키워드를 사용한다.
- 해당 인터페이스(역할)를 구현하는(부여받은) 클래스를 구현해 클래스라 한다.
- 구현체 클래스는 모든 추상 메소드를 오버라이딩(재정의)해야 한다.
인터페이스의 장점
- 프로그램 설계의 명확성
- 서로 다른 객체에게 관계성 부여 (업캐스팅 가능)
- 한 객체를 다양한 인터페이스로 해석 가능(다형성)
5. 개념실습
1. 인터페이스 정의 및 구현
public class SmartPhoneTest {
public static void main(String[] args) {
// 객체 생성
SmartPhone sp = new SmartPhone("아이폰", "010-0000-0000");
// 전화 걸기
sp.call("010-1234-5678");
// 전화벨이 울림
sp.ring();
}
}
interface Phone {
// targetNumber로 전화를 걸거야! 어떻게? 그건 아직 몰라!
public void call(String targetNumber);
// 전화벨이 울릴거야! 어떻게? 그건 아직 몰라!
public void ring();
}
class SmartPhone implements Phone {
protected String name;
protected String phoneNumber;
public SmartPhone(String name, String phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
/* Phone 인터페이스의 모든 프로토타입 메소드를 구현하시오. */
public void call(String targetNumber){
System.out.printf("%s로 전화를 겁니다!\n",targetNumber);
}
public void ring(){
System.out.print("전화벨이 울립니다~");
}
}
2. 인터페이스 정의 및 구현-2
public class SmartPhoneTest2 {
public static void main(String[] args) {
// 객체 생성
SmartPhone sp = new SmartPhone("갤럭시 S10");
// 비프음 내기
sp.beep();
// 음악 재생하기
sp.playMusic("상어송");
}
}
interface Alarm {
public void beep(); // 비프음
public void playMusic(String title); // 음악 재생
}
class SmartPhone implements Alarm {
private String name; // 모델명
public SmartPhone(String name) {
this.name = name;
}
/* Alarm 인터페이스의 추상 메소드를 재정의하시오. */
public void beep(){
System.out.println("삐빕! 삐비비빕~!");
}
public void playMusic(String title){
System.out.printf("[%s]을 재생합니다..!", title);
}
}
3. 인터페이스와 다형성
public class Polymorphism {
public static void main(String[] args) {
// 성기사 객체 생성
HolyKnight uther = new HolyKnight("우서", 180);
// 탱커로서의 역할 수행
Tanker t = uther;
t.increaseHp();
// 힐러로서의 역할 수행
Healer h = uther;
h.heal();
}
}
interface Tanker {
public void increaseHp();
}
interface Healer {
public void heal();
}
/* 1. 탱커와 힐러 역할을 부여하세요. */
class HolyKnight implements Tanker, Healer {
private String name;
private int hp;
public HolyKnight(String name, int hp) {
this.name = name;
this.hp = hp;
}
/* 2. Tanker의 메소드를 오버라이딩하세요. */
public void increaseHp(){
hp += 50;
System.out.println("전체 체력 +50 증가시킵니다.");
}
/* 3. Healer의 메소드를 오버라이딩하세요. */
public void heal(){
hp += 30;
System.out.println("체력을 +30 회복합니다.");
}
}
4. 다형성 인생 - 인터페이스
public class VariousRoles {
public static void main(String[] args) {
// HongPark 객체 생성
HongPark park = new HongPark();
// 각 직업으로 변신
Developer devPark = park;
Instructor instPark = park;
Masseur masPark = park;
/* 3. 직업별 메소드를 호출하여 코드를 완성하세요. */
devPark.programming("Java");
instPark.teach("자료구조");
masPark.massage();
}
}
interface Developer {
public void programming(String lang);
}
interface Instructor {
public void teach(String subject);
}
interface Masseur {
public void massage();
}
/* 1. 홍팍 클래스에 개발자, 강사, 마사지사 역할을 부여하세요. */
class HongPark implements Developer, Instructor, Masseur {
private String name = "홍팍";
/* 2. 구현하기로 한 인터페이스의 메소드를 오버라이딩 하세요.*/
public void programming(String lang){
System.out.printf("%s -> %s 프로그래밍 중!\n", name, lang);
}
public void teach(String subject){
System.out.printf("%s -> %s 수업 중!\n", name, subject);
}
public void massage() {
System.out.printf("%s -> 마사지 중!\n", name);
}
}
5. 인터페이스와 업캐스팅
public class ObjectGrouping {
public static void main(String[] args) {
// 다양한 객체 생성
Bird bird = new Bird();
Helicopter copter = new Helicopter();
Rocket rocket = new Rocket();
// 인터페이스 타입으로 그룹화
Flyable[] flyableThings = { bird, copter, rocket };
// 모든 날것들을 날림
for (int i = 0; i < flyableThings.length; i++) {
Flyable temp = flyableThings[i];
temp.fly();
}
}
}
interface Flyable {
public void fly();
}
class Bird implements Flyable {
/* 1. fly() 메소드를 오버라이딩 하세요. */
public void fly(){
System.out.printf("<새>가 날개를 퍼덕이며 날아갑니다!");
}
}
class Helicopter implements Flyable {
/* 2. fly() 메소드를 오버라이딩 하세요. */
public void fly(){
System.out.printf("<헬기>가 프로펠러를 힘차게 돌리며 날아갑니다!");
}
}
class Rocket implements Flyable {
/* 3. fly() 메소드를 오버라이딩 하세요. */
public void fly(){
System.out.printf("<로켓>이 제트 엔진을 분출하며 날아갑니다!");
}
}
6. 인터페이스와 ArrayList
public class InterfaceType {
public static void main(String[] args) {
// 다양한 타입의 객체 생성
Orderable jokbal = new Food("족발", 19800);
Orderable airpod = new Electronics("에어팟", 199000);
Orderable shirt = new Clothing("셔츠", 49900);
int sum = jokbal.discountedPrice()+airpod.discountedPrice()+shirt.discountedPrice();
// 결과 출력
System.out.printf("총합: %d원\n", sum);
}
}
interface Orderable {
public int discountedPrice();
}
class Food implements Orderable {
private String name;
private int price;
public Food(String name, int price) {
this.name = name;
this.price = price;
}
/* 1. 오버라이딩을 통해, 음식 할인율을 적용하세요. */
public int discountedPrice() {
return (int) (price * 0.9);
}
}
class Electronics implements Orderable {
private String name;
private int price;
public Electronics(String name, int price) {
this.name = name;
this.price = price;
}
/* 2. 오버라이딩을 통해, 전자기기 할인율을 적용하세요. */
public int discountedPrice() {
return (int) (price * 0.8);
}
}
class Clothing implements Orderable {
private String name;
private int price;
public Clothing(String name, int price) {
this.name = name;
this.price = price;
}
/* 3. 오버라이딩을 통해, 의류 할인율을 적용하세요. */
public int discountedPrice() {
return (int) (price * 0.7);
}
}
// 해당 화면에서 ArrayList 사용시 에러발생하여 ArrayList를 쓰지 않고 처리
7. 리뷰: 인터페이스
public class InterfaceReview {
public static void main(String[] args) {
// 객체 생성
Sounding dog = new Dog();
Sounding baby = new Baby();
Sounding tiger = new Tiger();
Sounding robot = new Robot();
dog.sound();
baby.sound();
tiger.sound();
robot.sound();
}
}
/* 인터페이스 및 클래스를 작성하시오. */
interface Sounding{
public void sound();
}
class Dog implements Sounding {
public void sound(){
System.out.println("Dog: 멍멍!");
}
}
class Baby implements Sounding {
public void sound(){
System.out.println("Baby: 응애!");
}
}
class Tiger implements Sounding {
public void sound(){
System.out.println("Tiger: 어흥!");
}
}
class Robot implements Sounding {
public void sound(){
System.out.println("Robot: 삐빕!");
}
}
강의 출처 : cloudstudying.kr/lectures/267
'Study > Java & Python' 카테고리의 다른 글
[Java] 14강 상속, 클래스의 확장 (0) | 2021.02.25 |
---|---|
[Java] 13강 자바 API (0) | 2021.02.25 |
[Java] 12강 접근 제한자와 게터(getter)&세터(setter) (0) | 2021.02.25 |
[Java] 11강 레퍼런스와 static편 학습 내용 보내드립니다. (0) | 2021.02.25 |
[Java] 10강 생성자 호출과 정의 (0) | 2021.02.25 |