์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Absolute
- AGI
- ai
- AI agents
- AI engineer
- AI researcher
- ajax
- algorithm
- Algorithms
- aliases
- Array ๊ฐ์ฒด
- ASI
- bayes' theorem
- Bit
- Blur
- BOM
- bootstrap
- canva
- challenges
- ChatGPT
- Today
- In Total
A Joyful AI Research Journey๐ณ๐
[37] 230220 Java Ch. 8 ์ธํฐํ์ด์ค: 1. ์ธํฐํ์ด์ค, 2. ํ์ ๋ณํ๊ณผ ๋คํ์ฑ [K-๋์งํธ ํธ๋ ์ด๋ 37์ผ] ๋ณธ๋ฌธ
[37] 230220 Java Ch. 8 ์ธํฐํ์ด์ค: 1. ์ธํฐํ์ด์ค, 2. ํ์ ๋ณํ๊ณผ ๋คํ์ฑ [K-๋์งํธ ํธ๋ ์ด๋ 37์ผ]
yjyuwisely 2023. 2. 20. 12:32230220 Mon 37th class
Ch. 8 ์ธํฐํ์ด์ค
์ง๋: p. 370 ~ (๊ต์ฌ: ํผ์ ๊ณต๋ถํ๋ ์๋ฐ, ์ ์: ์ ์ฉ๊ถ)
ํ๋น๋ฏธ๋์ด_ํผ๊ณต์_์ฉ์ด์ง.pdf
์ฉ์ด ์ฐธ๊ณ
์ค๋ ๋ฐฐ์ด ๊ฒ ์ค ๊ธฐ์ตํ ๊ฒ์ ์ ๋ฆฌํ๋ค.
์ง๋ ์์ ๋ ๋ฐฐ์ด ๊ฒ ์ค ๋ค์ ๊ธฐ์ตํ ๊ฒ
2023.02.17 - [1. Revision 2023/Java] - [36] 230217 Ch. 7 ์์(3): 3. ์ถ์ ํด๋์ค
์ถ์ ํด๋์ค[๋ถ๋ชจ]: ํด๋์ค๋ค์ ๊ณตํต์ ์ธ ํน์ฑ์ ์ถ์ถํด์ ์ ์ธํ ํด๋์ค
ํด๋์ค๋ค์ ๊ณตํต์ ์ธ ํ๋์ ๋ฉ์๋๋ฅผ ์ถ์ถํด์ ์ ์ธํ ํด๋์ค์ด๋ค.
์ค์ฒด ํด๋์ค[์์]: ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ์ ์๋ ํด๋์ค (์ด๋๊น์ง ๋ฐฐ์ด ๊ฒ!)
์ค์ฒด ํด๋์ค๋ ์ถ์ ํด๋์ค์ ๋ชจ๋ ํน์ฑ์ ๋ฌผ๋ ค๋ฐ๊ณ , ์ถ๊ฐ์ ์ธ ํน์ฑ(ํ๋์ ๋ฉ์๋)์ ๊ฐ์ง ์ ์๋ค.
An argument is a way for you to provide more information to a function.
๊ธฐํ)
API stands for Application Programming Interface.
API = ์ค๋ช
์, ์์ ๊ฐ์ ๊ฒ
An application programming interface(API) is a way for two or more computer programs to communicate with each other.
7 Examples of APIs in Use Today
- Twitter Bots.
- Log-In Using XYZ.
- Weather Snippers.
- Pay with PayPal.
- Google Maps.
- Travel Booking.
- E-Commerce.
https://docs.oracle.com/javase/8/docs/api/
ex) Math ํด๋ฆญํ์ ๋ ๋์ค๋ Method Summary๋ฅผ ๋ณด๋ฉด ์์ค๋ฅผ ๊ฐ๋ฆฌ๋ ์ธํฐํ์ด์ค๋ง ์ ๊ณตํด์ค๋ค.
Ch. 8 ์ธํฐํ์ด์ค
์ฑ ์ ๋ชฉ์ฐจ
08-1 ์ธํฐํ์ด์ค
08-2 ํ์ ๋ณํ๊ณผ ๋คํ์ฑ
์ธํฐํ์ด์ค(interface): ๊ฐ์ฒด์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ์ํ ํ์
๊ฐ๋ฐ ์ฝ๋์ ๊ฐ์ฒด๊ฐ ์๋ก ํต์ ํ๋ ์ ์ ์ญํ ์ ํ๋ค.
๊ฐ๋ฐ ์ฝ๋๊ฐ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถ์ํจ๋ค. ๊ตฌ์ฑ ๋ฉค๋ฒ๋ ์์ ํ๋์ ์ถ์ ๋ฉ์๋์ด๋ค.
์ค๊ณ ๋ชฉ์ ์ด ์๋ ๊ตฌํ ๋ชฉ์ ์ผ๋ก ์ด๋ค. ์ถ์ ํด๋์ค๋ณด๋ค ๋ ์ถ์์ ์ผ๋ก ํ๋ค.
๊ตฌํ์ด ์ ๋์ด ์๋ ๋ถ๋ชจ ํด๋์ค๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํด๊ฐ ์ฝ๋ค.
Why And When To Use Interfaces?
1) To achieve security - hide certain details and only show the important details of an object (interface).
2) Java does not support "multiple inheritance" (a class can only inherit from one superclass). However, it can be achieved with interfaces, because the class can implement multiple interfaces. Note: To implement multiple interfaces, separate them with a comma (see example below).
์ฐธ๊ณ : https://www.w3schools.com/java/java_interface.asp
์ธํฐํ์ด์ค(interface)๋?
์์ ํด๋์ค๊ฐ ์ฌ๋ฌ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์๋ฐ์ ์ ์๋ค๋ฉด, ๋ค์ํ ๋์์ ์ํํ ์ ์๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ฒ ๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ๋ค์ค ์์์ ํ ๊ฒฝ์ฐ ๋ฉ์๋ ์ถ์ฒ์ ๋ชจํธ์ฑ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด ์๋ฐ์์๋ ํด๋์ค๋ฅผ ํตํ ๋ค์ค ์์์ ์ง์ํ์ง ์์ต๋๋ค.
ํ์ง๋ง ๋ค์ค ์์์ ์ด์ ์ ๋ฒ๋ฆด ์๋ ์๊ธฐ์ ์๋ฐ์์๋ ์ธํฐํ์ด์ค๋ผ๋ ๊ฒ์ ํตํด ๋ค์ค ์์์ ์ง์ํ๊ณ ์์ต๋๋ค.
์ธํฐํ์ด์ค(interface)๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ์ด ๋๋ ํ์ ์ ๊ณตํ๋ฉด์, ๋ค๋ฅธ ํด๋์ค ์ฌ์ด์ ์ค๊ฐ ๋งค๊ฐ ์ญํ ๊น์ง ๋ด๋นํ๋ ์ผ์ข ์ ์ถ์ ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
์๋ฐ์์ ์ถ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋๋ฟ๋ง ์๋๋ผ ์์ฑ์, ํ๋, ์ผ๋ฐ ๋ฉ์๋๋ ํฌํจํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ธํฐํ์ด์ค(interface)๋ ์ค๋ก์ง ์ถ์ ๋ฉ์๋์ ์์๋ง์ ํฌํจํ ์ ์์ต๋๋ค.
Another way to achieve abstraction in Java, is with interfaces.
An interface is a completely "abstract class" that is used to group related methods with empty bodies:
// interface
interface Animal {
public void animalSound(); // interface method (does not have a body)
public void run(); // interface method (does not have a body)
}
Notes on Interfaces:
- Like abstract classes, interfaces cannot be used to create objects (in the example above, it is not possible to create an "Animal" object in the MyMainClass)
- Interface methods do not have a body - the body is provided by the "implement" class
- On implementation of an interface, you must override all of its methods
- Interface methods (์ถ์ ๋ฉ์๋) are by default abstract and public
- Interface attributes are by default public, static and final
- An interface cannot contain a constructor (as it cannot be used to create objects)
8.1.1 ์ธํฐํ์ด์ค ์ ์ธ
์ธํฐํ์ด์ค ์ ์ธ์ class ํค์๋ ๋์ ์ interface ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฐ์์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ํด๋์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ ๋์๋ ์ ๊ทผ ์ ์ด์์ ํจ๊ป interface ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์๋ฐ์์ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํฉ๋๋ค.
์ ๊ทผ์ ์ด์ interface ์ธํฐํ์ด์ค ์ด๋ฆ { public static final ํ์ ์์ ์ด๋ฆ = ๊ฐ; ... public abstract ๋ฉ์๋ ์ด๋ฆ (๋งค๊ฐ๋ณ์ ๋ชฉ๋ก); ... }โ
๋จ, ํด๋์ค์๋ ๋ฌ๋ฆฌ ์ธํฐํ์ด์ค์ ๋ชจ๋ ํ๋๋ public static final์ด์ด์ผ ํ๋ฉฐ, ๋ชจ๋ ๋ฉ์๋๋ public abstract์ด์ด์ผ ํฉ๋๋ค.
์ด ๋ถ๋ถ์ ๋ชจ๋ ์ธํฐํ์ด์ค์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ ๋ถ๋ถ์ด๋ฏ๋ก ์ด ์ ์ด์๋ ์๋ตํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์๋ต๋ ์ ์ด์๋ ์ปดํ์ผ ์ ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ถ๊ฐํด ์ค๋๋ค.
class A{
// ํ๋ (๋ณ์, ์์)
// ์์ฑ์
// ๋ฉ์๋
}
interface A{
// ์์ ํ๋
// ์์ฑ์(X)
// ์ถ์ ๋ฉ์๋
}
1) ์์ ํ๋ (Constant field) ์ ์ธ
์ธํฐํ์ด์ค์ ์์ ํ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก public static final ํน์ฑ์ ๊ฐ์ง๋ค. ๊ด๋ก์ ์ผ๋ก ํ๋ ์ด๋ฆ์ ๋ชจ๋ ๋๋ฌธ์๋ก ์์ฑํด์ผ ํ๋ฉฐ, ์ ์ธ ์ ์ด๊ธฐ๊ฐ์ ๋์
ํด์ผ ํ๋ค.
(static final ์๋ต ๊ฐ๋ฅ)
[public static final] ํ์
์์์ด๋ฆ = ๊ฐ;
์์ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ฑํ๋, ์๋ก ๋ค๋ฅธ ๋จ์ด๋ก ๊ตฌ์ฑ๋์ด ์์ ๊ฒฝ์ฐ์๋ ์ธ๋๋ฐ(_)๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๊ด๋ก์ด๋ค.
ex) MODEL, MAX_VALUE
์ธํฐํ์ด์ค ์์๋ ๋ฐ๋์ ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐ๊ฐ์ ์ง์ ํด์ผ ํ๋ค.
์์) ์์ ํ๋ ์ ์ธ
public interface RemoteControl {
//์์ ํ๋
//public static final int MAX_VALUE = 10;
//public static final int MIN_VALUE = 0;
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
}
2) ์ถ์ ๋ฉ์๋ ์ ์ธ
์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ฉ์๋๋ public abstract๊ฐ ์๋ต๋๊ณ ๋ฉ์๋ ์ ์ธ๋ถ๋ง ์๋ ์ถ์ ๋ฉ์๋์ด๋ค. ๊ตฌํ ํด๋์ค๋ ๋ฐ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผํ๋ค.
(abstract ์๋ต ๊ฐ๋ฅ)
[public abstract] ๋ฆฌํดํ์
๋ฉ์๋์ด๋ฆ(๋งค๊ฐ๋ณ์, ...);
์์) ์ถ์ ๋ฉ์๋ ์ ์ธ
public interface RemoteControl {
//์์ ํ๋
//public static final int MAX_VALUE = 10;
//public static final int MIN_VALUE = 0;
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
//์ถ์ ๋ฉ์๋
//public abstract void turnOn();
//public abstract void turnOff();
//public abstract void setVolume(int volume);
public void turnOn();
public void turnOff();
public void setVolume(int volume);
}
8.1.2 ์ธํฐํ์ด์ค ๊ตฌํ
๊ฐ๋ฐ ์ฝ๋๊ฐ ์ธํฐํ์ด์ค ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
๊ฐ์ฒด๋ ์ธํฐํ์ด์ค์์ ์ ์๋ ์ถ์ ๋ฉ์๋์ ๋์ผํ ๋ฉ์๋ ์ด๋ฆ, ๋งค๊ฐ ํ์
, ๋ฆฌํด ํ์
์ ๊ฐ์ง ์ค์ฒด ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ์ธํฐํ์ด์ค์ ๊ตฌํ(implement) ๊ฐ์ฒด๋ผ๊ณ ํ๊ณ , ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํด๋์ค๋ฅผ ๊ตฌํ ํด๋์ค๋ผ๊ณ ํ๋ค.
implements: ๊ตฌํ ํด๋์ค๋ ์ด๋ค ์ธํฐํ์ด์ค๋ก ์ฌ์ฉ ๊ฐ๋ฅํ์ง(์ด๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋์ง)๋ฅผ ๊ธฐ์ ํ๊ธฐ ์ํด ํด๋์ค ์ ์ธ ์ implements ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
To access the interface methods, the interface must be "implemented" (kinda like inherited) by another class with the implements keyword (instead of extends). The body of the interface method is provided by the "implement" class:
// Interface
interface Animal {
public void animalSound(); // interface method (does not have a body)
public void sleep(); // interface method (does not have a body)
}
// Pig "implements" the Animal interface
class Pig implements Animal {
public void animalSound() {
// The body of animalSound() is provided here
System.out.println("The pig says: wee wee");
}
public void sleep() {
// The body of sleep() is provided here
System.out.println("Zzz");
}
}
class Main {
public static void main(String[] args) {
Pig myPig = new Pig(); // Create a Pig object
myPig.animalSound();
myPig.sleep();
}
}
1) ๊ตฌํ ํด๋์ค
public class ๊ตฌํํด๋์ค ์ด๋ฆ implements ์ธํฐํ์ด์ค์ด๋ฆ{
//์ธํฐํ์ด์ค์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋ ์ ์ธ
}
์์ 1) ๊ตฌํ ํด๋์ค
public class Television implements RemoteControl {
//ํ๋
private int volume;
//์ธํฐํ์ด์ค์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋์ ๊ตฌํ ๋ฉ์๋ ์ ์ธ
//turnOn() ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋
public void turnOn() {
System.out.println("TV๋ฅผ ์ผญ๋๋ค.");
}
//turnOff() ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋
public void turnOff() {
System.out.println("TV๋ฅผ ๋๋๋ค.");
}
//setVolume() ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME;
} else if (volume<RemoteControl.MIN_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME;
} else {
this.volume = volume;
}
System.out.println("ํ์ฌ TV ๋ณผ๋ฅจ: " + this.volume);
}
}
์์ 2) ๊ตฌํ ํด๋์ค
public class Audio implements RemoteControl {
//ํ๋
private int volume;
//์ธํฐํ์ด์ค์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋์ ๊ตฌํ ๋ฉ์๋ ์ ์ธ
//turnOn() ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋
public void turnOn() {
System.out.println("Audio๋ฅผ ์ผญ๋๋ค.");
}
//turnOff() ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋
public void turnOff() {
System.out.println("Audio๋ฅผ ๋๋๋ค.");
}
//setVolume() ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME;
} else if (volume<RemoteControl.MIN_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME;
} else {
this.volume = volume;
}
System.out.println("ํ์ฌ Audio ๋ณผ๋ฅจ: " + this.volume);
}
}
์ธํฐํ์ด์ค๋ก ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธํฐํ์ด์ค ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ํด์ผ ํ๋ค.
์ธํฐํ์ด์ค ๋ณ์;
๋ณ์ = ๊ตฌํ๊ฐ์ฒด;
์ธํฐํ์ด์ค ๋ณ์ = ๊ตฌํ๊ฐ์ฒด;
์์ 3) ์ธํฐํ์ด์ค ๋ณ์์ ๊ตฌํ ๊ฐ์ฒด ๋์
public class RemoteControlExample {
public static void main(String[] args) {
//int a;
RemoteControl rc;
//a = 10;
rc = new Television();
//a = 20;
rc = new Audio();
}
}
2) ๋ค์ค ์ธํฐํ์ด์ค ๊ตฌํ ํด๋์ค
์ธํฐํ์ด์ค๋ ๋ค์ค์์์ด ๊ฐ๋ฅํ๋ค. (์ถ์ ํด๋์ค๋ ๋ค์ค์์์ด ์ ๋๋ค.)
์ธํฐํ์ด์ค๋ ์์ค๋ฅผ ๊ฐ๋ฆฌ๋ ๋ชฉ์ ์ผ๋ก ๋ณด์๊ณผ ์ฐ๊ด์ด ์๋ค.
์ค๊ณ, ๊ตฌํ ๊ตฌ๋ถ์ผ๋ก๋ ์ฐ์ธ๋ค.
To implement multiple interfaces, separate them with a comma.
public class ๊ตฌํํด๋์ค์ด๋ฆ implements ์ธํฐํ์ด์คA, ์ธํฐํ์ด์คB{
//์ธํฐํ์ด์ค A์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋ ์ ์ธ
//์ธํฐํ์ด์ค B์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋ ์ ์ธ
}
์์ )
interface FirstInterface {
public void myMethod(); // interface method
}
interface SecondInterface {
public void myOtherMethod(); // interface method
}
class DemoClass implements FirstInterface, SecondInterface {
public void myMethod() {
System.out.println("Some text..");
}
public void myOtherMethod() {
System.out.println("Some other text...");
}
}
class Main {
public static void main(String[] args) {
DemoClass myObj = new DemoClass();
myObj.myMethod();
myObj.myOtherMethod();
}
}
๋ค์ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ, ๊ตฌํ ํด๋์ค๋ ๋ชจ๋ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋์ ๋ํด ์ค์ฒด ๋ฉ์๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
์์ 1) ์ธํฐ๋ท์ ๊ฒ์ํ ์ ์๋ Searchable ์ธํฐํ์ด์ค
search() ์ถ์ ๋ฉ์๋
public interface Searchable {
//์ถ์ ๋ฉ์๋
//public abstract void search(String url);
void search(String url);
}
์์ 2) ๋ค์ค ์ธํฐํ์ด์ค ๊ตฌํ ํด๋์ค
public class SmartTelevision implements RemoteControl, Searchable{
private int volume;
//RemoteControl์ ์ถ์ ๋ฉ์๋์ ๋ํ ์ค์ฒด ๋ฉ์๋
@Override
public void turnOn() {
System.out.println("TV๋ฅผ ์ผญ๋๋ค.");
}
@Override
public void turnOff() {
System.out.println("TV๋ฅผ ๋๋๋ค.");
}
@Override
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME;
} else if (volume<RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME;
} else {
this.volume = volume;
}
System.out.println("ํ์ฌ TV ๋ณผ๋ฅจ: " + this.volume);
}
//Searchable์ ์ถ์ ๋ฉ์๋์ ๋ํ ์ค์ฒด ๋ฉ์๋
@Override
public void search(String url) {
System.out.println(url + "์ ๊ฒ์ํฉ๋๋ค.");
}
}
์์ 3) ์ธํฐํ์ด์ค ๋ณ์์ ๊ตฌํ ๊ฐ์ฒด ๋์
public class SmartTelevisionExample {
public static void main(String[] args) {
SmartTelevision tv = new SmartTelevision();
RemoteControl rc = tv;
Searchable searchable = tv;
}
}
8.1.3 ์ธํฐํ์ด์ค ์ฌ์ฉ p. 379
๊ตฌํ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค ๋ณ์์ ๋์
๋๋ค๋ ๊ฒ์ ์์์ผ๋, ์ง๊ธ๋ถํฐ ์ธํฐํ์ด์ค๋ก ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋.
ํด๋์ค๋ฅผ ์ ์ธํ ๋ ์ธํฐํ์ด์ค๋ ํ๋, ์์ฑ์ ๋๋ ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์, ์์ฑ์ ๋๋ ๋ฉ์๋์ ๋ก์ปฌ ๋ณ์๋ก ์ ์ธ๋ ์ ์๋ค.
ex) ๋ค์์ RemoteControl ์ธํฐํ์ด์ค๋ฅผ ํ๋, ์์ฑ์ ๋๋ ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์ ๊ทธ๋ฆฌ๊ณ ๋ฉ์๋์ ๋ก์ปฌ ๋ณ์๋ก ์ ์ธํ๋ค.
public class MyClass {
//ํ๋
//int a = 10;
RemoteControl rc = new Television();
//์์ฑ์
MyClass(){}//๊ธฐ๋ณธ ์์ฑ์(๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์ฑ์)
MyClass(RemoteControl rc){//๋งค๊ฐ๋ณ์๊ฐ ํ ๊ฐ์ธ ์์ฑ์
this.rc = rc;
}
//๋ฉ์๋
void method() {
//๋ก์ปฌ ๋ณ์
RemoteControl rc = new Audio();
}
void methodB(RemoteControl rc) {...}
}
์์ 1) ์ธํฐํ์ด์ค ์ฌ์ฉ MyClass.java
package ch08;
public class MyClass {
//ํ๋
//int a = 10;
RemoteControl rc = new Television();
//์์ฑ์
MyClass(){//๊ธฐ๋ณธ ์์ฑ์(๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์ฑ์)
}
MyClass(RemoteControl rc){//๋งค๊ฐ๋ณ์๊ฐ ํ ๊ฐ์ธ ์์ฑ์
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
//๋ฉ์๋
void methodA() {
//๋ก์ปฌ ๋ณ์
RemoteControl rc = new Audio();
rc.turnOn();
rc.setVolume(5);
}
void methodB(RemoteControl rc) {
rc.turnOn();
rc.setVolume(5);
}
}
์์ 2) ์ธํฐํ์ด์ค ์ฌ์ฉ MyClassExample.java
public class MyClassExample {
public static void main(String[] args) {
System.out.println("1)------------------");
MyClass myClass1 = new MyClass(); //MyClass์ ๊ธฐ๋ณธ์์ฑ์๋ฅผ ํธ์ถ
myClass1.rc.turnOn();
myClass1.rc.setVolume(5);
System.out.println("2)------------------");
MyClass myClass2 = new MyClass(new Audio());//MyClass์ ๋งค๊ฐ๋ณ์๊ฐ ํ ๊ฐ์ธ ์์ฑ์ ํธ์ถ
System.out.println("3)------------------");
MyClass myClass3 = new MyClass(); //MyClass์ ๊ธฐ๋ณธ์์ฑ์๋ฅผ ํธ์ถ(Television ํด๋์ค)
myClass3.methodA();
System.out.println("4)------------------");
MyClass myClass4 = new MyClass();
myClass4.methodB(new Television());
}
}
๊ฒฐ๊ณผ)
1)------------------
TV๋ฅผ ์ผญ๋๋ค.
ํ์ฌ TV ๋ณผ๋ฅจ: 5
2)------------------
Audio๋ฅผ ์ผญ๋๋ค.
ํ์ฌ Audio ๋ณผ๋ฅจ: 5
3)------------------
Audio๋ฅผ ์ผญ๋๋ค.
ํ์ฌ Audio ๋ณผ๋ฅจ: 5
4)------------------
TV๋ฅผ ์ผญ๋๋ค.
ํ์ฌ TV ๋ณผ๋ฅจ: 5
๋ง๋ฌด๋ฆฌ p. 384
5๊ฐ์ง ํค์๋๋ก ๋๋ด๋ ํต์ฌ ํฌ์ธํธ
1) ์ธํฐํ์ด์ค (interface) [8์ฅ 370์ชฝ]: ๊ฐ์ฒด์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ์ํ ํ์
์ด๋ฉฐ ๊ฐ๋ฐ ์ฝ๋์ ๊ฐ์ฒด๊ฐ ์๋ก ํต์ ํ๋ ์ ์ ์ญํ ์ ํ๋ค. ๊ฐ๋ฐ ์ฝ๋๊ฐ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถ์ํจ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ์ฝ๋๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ ํ์๊ฐ ์๊ณ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ง ์๊ณ ์์ผ๋ฉด ๋๋ค.
๊ตฌ์ฑ ๋ฉค๋ฒ๋ ์์ ํ๋์ ์ถ์ ๋ฉ์๋์ด๋ค.
2) ์์ ํ๋: ์ธํฐํ์ด์ค์ ์์ ํ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก public static final ํน์ฑ์ ๊ฐ์ง๋ค. ๊ด๋ก์ ์ผ๋ก ํ๋ ์ด๋ฆ์ ๋ชจ๋ ๋๋ฌธ์๋ก ์์ฑํด์ผ ํ๋ฉฐ, ์ ์ธ ์ ์ด๊ธฐ๊ฐ์ ๋์
ํด์ผ ํ๋ค.
3) ์ถ์ ๋ฉ์๋: ์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ฉ์๋๋ public abstract๊ฐ ์๋ต๋๊ณ ๋ฉ์๋ ์ ์ธ๋ถ๋ง ์๋ ์ถ์ ๋ฉ์๋์ด๋ค. ๊ตฌํ ํด๋์ค๋ ๋ฐ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผํ๋ค.
4) implements: ๊ตฌํ ํด๋์ค๋ ์ด๋ค ์ธํฐํ์ด์ค๋ก ์ฌ์ฉ ๊ฐ๋ฅํ์ง(์ด๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋์ง)๋ฅผ ๊ธฐ์ ํ๊ธฐ ์ํด ํด๋์ค ์ ์ธ ์ implements ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
5) ์ธํฐํ์ด์ค ์ฌ์ฉ: ํด๋์ค๋ฅผ ์ ์ธํ ๋ ์ธํฐํ์ด์ค๋ ํ๋, ์์ฑ์ ๋๋ ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์, ์์ฑ์ ๋๋ ๋ฉ์๋์ ๋ก์ปฌ ๋ณ์๋ก ์ ์ธ๋ ์ ์๋ค.
์ธํฐํ์ด์ค๊ฐ ํ๋ ํ์ ์ผ๋ก ์ฌ์ฉ๋ ๊ฒฝ์ฐ: | ํ๋์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ํ ์ ์๋ค. |
์ธํฐํ์ด์ค๊ฐ ์์ฑ์์ ๋งค๊ฐ ๋ณ์ ํ์ ์ผ๋ก ์ฌ์ฉ๋ ๊ฒฝ์ฐ: | new ์ฐ์ฐ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑ์์ ๋งค๊ฐ๊ฐ์ผ๋ก ๋์ ํ ์ ์๋ค. |
์ธํฐํ์ด์ค๊ฐ ๋ก์ปฌ ๋ณ์ ํ์ ์ผ๋ก ์ฌ์ฉ๋ ๊ฒฝ์ฐ: | ๋ณ์์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ํ ์ ์๋ค. |
์ธํฐํ์ด์ค๊ฐ ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์ ํ์ ์ผ๋ก ์ฌ์ฉ๋ ๊ฒฝ์ฐ: | ๋ฉ์๋ ํธ์ถ ์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๊ฐ์ผ๋ก ๋์ ํ ์ ์๋ค. |
Q3) main() ๋ฉ์๋์์ printSound()๋ฅผ ํธ์ถํ ๋ Cat๊ณผ Dog ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ ์คํํ๋ฉด ๊ฐ๊ฐ "์ผ์น"๊ณผ "๋ฉ๋ฉ"์ด ์ถ๋ ฅ๋๋๋ก Cat๊ณผ Dog ํด๋์ค๋ฅผ ์์ฑํ๋ผ.
์์ 1) Soundable ์ธํฐํ์ด์ค
sound() ์ถ์ ๋ฉ์๋๋ ๊ฐ์ฒด์ ์๋ฆฌ๋ฅผ ๋ฆฌํดํ๋ค.
package ch08;
public interface Soundable {
String sound();
}
์์ 2) ์๋๋ฅผ ์์ฑํ์์ค.
package ch08;
public class Cat implements Soundable {
//๋ฉ์๋ ์ฌ์ ์(์ค๋ฒ๋ผ์ด๋ฉ)
public String sound() {
return "์ผ์น";
}
}
์์ 3) ์๋๋ฅผ ์์ฑํ์์ค.
package ch08;
public class Dog implements Soundable {
//๋ฉ์๋ ์ฌ์ ์(์ค๋ฒ๋ผ์ด๋ฉ)
public String sound() {
return "๋ฉ๋ฉ";
}
}
์์ 4) SoundableExample ํด๋์ค์์ printSound() ๋ฉ์๋๋ Soundable ์ธํฐํ์ด์ค ํ์
์ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
Soundable soundable = new Cat();
package ch08;
public class SoundableExample {
public static void printSound(Soundable soundable) {//์ธํฐํ์ด์ค ํ์
, ๋ณ์
System.out.println(soundable.sound());
}
public static void main(String[] args) {
printSound(new Cat());
printSound(new Dog());
}
}
๊ฒฐ๊ณผ)
์ผ์น
๋ฉ๋ฉ
8.2 ํ์ ๋ณํ๊ณผ ๋คํ์ฑ p. 386
๋คํ์ฑ์ ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ฉ์๋ ์ฌ์ ์์ ํ์
๋ณํ์ด ํ์ํ๋ค. ์ธํฐํ์ด์ค๋ ์ ๊ณตํ๋ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ผ๋ก ๋คํ์ฑ์ ๊ตฌํํ๋ ๋ฐ ๋ง์ด ์ฌ์ฉ๋๋ค.
์์์ ๊ฐ์ ์ข
๋ฅ์ ํ์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ธฐ์ ์ด๊ณ , ์ธํฐํ์ด์ค๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋์ผํ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ธฐ์ ์ด๋ค.
8.2.1 ์๋ ํ์
๋ณํ
์๋ ํ์ ๋ณํ: ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค ๋ณ์์ ๋์ ๋๋ ๊ฒ
class Tire{}
์์ ๋ถ๋ชจ
class HankookTire extends Tire{}
class KumhoTire extends Tire{}
main(){
Tire t = HankookTire //์ฐธ์กฐ ์๋ ํ์ ๋ณํ (๋ถ๋ชจ(ํฐ) ← ์์(์์))
}
Interface Tire{}
๊ตฌํํด๋์ค ์ธํฐํ์ด์ค
class HankookTire implements Tire{}
main(){
์ธํฐํ์ด์ค = ๊ตฌํํด๋์ค
Tire t = HankookTire //์ฐธ์กฐ ์๋ ํ์ ๋ณํ(์ธํฐํ์ด์ค ← ๊ตฌํ)
ํด๋์ค์ ํด๋์ค ๊ฐ์ ๊ด๊ณ
๋ถ๋ชจ ํด๋์ค ํ์ ๋ณ์ = ์์ ํด๋์ค;
์ธํฐํ์ด์ค์ ํด๋์ค ๊ฐ์ ๊ด๊ณ
์ธํฐํ์ด์ค ๋ณ์ = ๊ตฌํ๊ฐ์ฒด;
8.2.2 ํ๋์ ๋คํ์ฑ p. 387
๋คํ์ฑ: ์์์ ๊ฐ์ ์ข ๋ฅ์ ํ์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ธฐ์ ์ด๊ณ , ์ธํฐํ์ด์ค๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋์ผํ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ธฐ์ ์ด๋ผ๋ ๊ฐ๋ ์์ ์ฐจ์ด๋ ์์ง๋ง ๋ ๋ค ๋คํ์ฑ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋น์ทํ๋ค. ๋ชจ๋ ์ฌ์ ์์ ํ์ ๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ด์ด: ์ธํฐํ์ด์ค ํ์
(ํด๋์ค ํ์
X)
ํ๊ตญ ํ์ด์ด, ๊ธํธ ํ์ด์ด: ๊ตฌํ ํด๋์ค (์์ ํด๋์ค X)
ํ๋์ ๋คํ์ฑ: Car์ run() ๋ฉ์๋๋ฅผ ์์ ํ์ง ์์๋ ๋ค์ํ roll() ๋ฉ์๋์ ์คํ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์์ 1) ์ธํฐํ์ด์ค
package ch8_2;
//[1]
public interface Tire {
// public abstract void roll(); (์ถ์ ๋ฉ์๋)
public void roll();//roll๋ฉ์๋ ํธ์ถ ์ฌ์ฉ ๋ฐฉ๋ฒ ์ค๋ช
}
์์ 2) ๊ตฌํ ํด๋์ค
package ch8_2;
//[2]
public class HankookTire implements Tire{
@Override//๋ฉ์๋ ์ฌ์ ์(์ค๋ฒ๋ผ์ด๋ฉ)
public void roll() { //Tire ์ธํฐํ์ด์ค ๊ตฌํ
System.out.println("ํ๊ตญ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.");
}
}
์์ 3) ๊ตฌํ ํด๋์ค
package ch8_2;
//[3]
public class KumhoTire implements Tire{
@Override//๋ฉ์๋ ์ฌ์ ์(์ค๋ฒ๋ผ์ด๋ฉ)
public void roll() { //Tire ์ธํฐํ์ด์ค ๊ตฌํ
System.out.println("๊ธํธ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.");
}
}
์์ 4) ํ๋ ๋คํ์ฑ
package ch8_2;
//[4]
public class Car {
//ํ๋: ์ธํฐํ์ด์ค ํ์
ํ๋ ์ ์ธ๊ณผ ์ด๊ธฐ ๊ตฌํ ๊ฐ์ฒด ๋์
Tire frontLeftTire = new HankookTire();
Tire frontRightTire = new HankookTire();
Tire backLeftTire = new HankookTire();
Tire backRightTire = new HankookTire();
//์์ฑ์(๋ฐ๋ก ์ ์ธX) - ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋ ์ถ๊ฐ
//๋ฉ์๋: ์ธํฐํ์ด์ค์์ ์ค๋ช
๋ rol() ๋ฉ์๋ ํธ์ถ
void run() {
frontLeftTire.roll();
frontRightTire.roll();
backLeftTire.roll();
backRightTire.roll();
}
}
์์ 5) ํ๋ ๋คํ์ฑ ํ ์คํธ
package ch8_2;
//[5]
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
//Car ํด๋์ค์ ํ๋ ๋คํ์ฑ์ด HankookTire๋ก๋ง ๋์ด ์์ด ํ๊ตญํ์ด์ด 4๊ฐ๊ฐ ์ถ๋ ฅ
myCar.run();
//Car ํด๋์ค์ frontLeftTire, frontRightTire๋ ๊ธํธํ์ด์ด๋ก ๊ต์ฒด
myCar.frontLeftTire = new KumhoTire();
myCar.frontRightTire = new KumhoTire();
myCar.run();
}
}
๊ฒฐ๊ณผ)
ํ๊ตญ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.
ํ๊ตญ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.
ํ๊ตญ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.
ํ๊ตญ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.
๊ธํธ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.
๊ธํธ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.
ํ๊ตญ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.
ํ๊ตญ ํ์ด์ด๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.
8.2.3 ๋งค๊ฐ ๋ณ์์ ๋คํ์ฑ
๋คํ์ฑ: ์์์ ๊ฐ์ ์ข ๋ฅ์ ํ์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ธฐ์ ์ด๊ณ , ์ธํฐํ์ด์ค๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋์ผํ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ธฐ์ ์ด๋ผ๋ ๊ฐ๋ ์์ ์ฐจ์ด๋ ์์ง๋ง ๋ ๋ค ๋คํ์ฑ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋น์ทํ๋ค. ๋ชจ๋ ์ฌ์ ์์ ํ์ ๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค.
์์ 1) ๋งค๊ฐ ๋ณ์์ ์ธํฐํ์ด์คํ
Vehicle ์ฐธ์กฐ ๋ณ์๋ vehicle์ ์๋ ์ธํฐํ์ด์ค์ ์๋ ๊ฒ๋ง ์คํ ๊ฐ๋ฅํ๋ค.
package ch8_2;
//[1]
public class Driver {
public void drive(Vehicle vehicle) {
//Vehicle vehicle = new Bus();
// vehicle.run();
//Vehicle vehicle = new Taxi();
vehicle.run();
}
}
์์ 2) ์ธํฐํ์ด์ค
package ch8_2;
//[2]
public interface Vehicle {
public void run();
}
์์ 3) ๊ตฌํ ํด๋์ค
package ch8_2;
//[3]
public class Bus implements Vehicle{
@Override //๋ฉ์๋ ์ฌ์ ์
public void run() {
System.out.println("๋ฒ์ค๊ฐ ๋ฌ๋ฆฝ๋๋ค.");
}
}
์์ 4) ๊ตฌํ ํด๋์ค
package ch8_2;
//[4]
public class Taxi implements Vehicle{
@Override //๋ฉ์๋ ์ฌ์ ์
public void run() {
System.out.println("ํ์๊ฐ ๋ฌ๋ฆฝ๋๋ค.");
}
}
์์ 5) ๋งค๊ฐ ๋ณ์์ ๋คํ์ฑ ํ
์คํธ
package ch8_2;
//[5]
public class DriverExample {
public static void main(String[] args) {
Driver driver = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
driver.drive(bus);//์๋ํ์
๋ณํ:Vehicle vehicle=bus;
driver.drive(taxi);//์๋ํ์
๋ณํ:Vehicle vehicle=taxi;
}
}
๊ฒฐ๊ณผ)
๋ฒ์ค๊ฐ ๋ฌ๋ฆฝ๋๋ค.
ํ์๊ฐ ๋ฌ๋ฆฝ๋๋ค.
8.2.4 ๊ฐ์ ํ์ ๋ณํ (Casting) p. 394
๊ตฌํ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค ํ์
์ผ๋ก ์๋ ํ์
๋ณํํ๋ฉด, ์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ฉ์๋๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ์ ์ฝ ์ฌํญ์ด ๋ฐ๋ฅธ๋ค. ex) ์ธํฐํ์ด์ค์ 3๊ฐ์ ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์๊ณ ํด๋์ค์๋ 5๊ฐ์ ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์๋ค๋ฉด, ์ธํฐํ์ด์ค๋ก ํธ์ถ ๊ฐ๋ฅํ ๋ฉ์๋๋ 3๊ฐ ๋ฟ์ด๋ค.
๊ตฌํ ํด๋์ค์ ์ ์ธ๋ ํ๋์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ๋ ๋ฐ์ํ๋ค. ์ด๋ ๊ฐ์ ํ์
๋ณํ์ ํด์ ๋ค์ ๊ตฌํ ํด๋์ค ํ์
์ผ๋ก ๋ณํํ ๋ค์, ๊ตฌํ ํด๋์ค์ ํ๋์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ฐ์ ํ์
๋ณํ: ์ธํฐํ์ด์ค์ ๋์
๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ค์ ์๋ ๊ตฌํ ํด๋์ค ํ์
์ผ๋ก ๋ณํํ๋ ๊ฒ
๊ตฌํํด๋์ค ๋ณ์ = (๊ตฌํํด๋์ค) ์ธํฐํ์ด์ค๋ณ์;
int a = 65;
//int <- char
//4byte <- 2byte
int b = 'A' (์๋ ํ์ ๋ณํ)
char c = (char)a;
์์ 1) ์ธํฐํ์ด์ค
public interface Vehicle {
public void run();
}
์์ 2) ๊ตฌํ ํด๋์ค
public class Bus implements Vehicle {
@Override
public void run() {
System.out.println("๋ฒ์ค๊ฐ ๋ฌ๋ฆฝ๋๋ค.");
}
public void checkFare() {
System.out.println("์น์ฐจ์๊ธ์ ์ฒดํฌํฉ๋๋ค.");
}
}
์์ 3) ๊ฐ์ ํ์ ๋ณํ
public class VehicleExample {
public static void main(String[] args) {
//์ธํฐํ์ด์ค ํ์
= ๊ตฌํ ๊ฐ์ฒด (์ฐธ์กฐ ์๋ ํ์
๋ณํ)
Vehicle vehicle = new Bus();
vehicle.run();
//vehicle.checkFare(); (X): Vehicle ์ธํฐํ์ด์ค์๋ checkFare()๊ฐ ์์
//Busํด๋์ค์ checkFare๋ฉ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ํธ์ถ ๊ฐ๋ฅ
//๊ตฌํ๊ฐ์ฒดํ์
= ์ธํฐํ์ด์ค(์ฐธ์กฐ ๊ฐ์ ํ์
๋ณํ)
Bus bus = (Bus) vehicle; //๊ฐ์ ํ์
๋ณํ
bus.run();
bus.checkFare(); //Bus ํด๋์ค์๋ CheckFare()๊ฐ ์์
}
}
8.2.5 ๊ฐ์ฒด ํ์ ํ์ธ
์ฐ๋ฆฌ๋ ์์์์ ๊ฐ์ฒด ํ์ ์ ํ์ธํ๊ธฐ ์ํด instanceof ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ณ , ์ธํฐํ์ด์ค ํ์ ์์๋ ์ฌ์ฉํ ์ ์๋ค.
instanceof: ๊ฐ์ ํ์
๋ณํ์ ํ๊ธฐ ์ ์ ๋ณํ์ด ๊ฐ๋ฅํ์ง ์กฐ์ฌํ ๋ ์ฌ์ฉํ๋ค. ์์์์๋ ์์ ํด๋์ค ํ์
์ธ์ง, ์ธํฐํ์ด์ค์์๋ ๊ตฌํ ํด๋์ค ํ์
์ธ์ง๋ฅผ ํ์ธํ ๋ ์ฌ์ฉํ๋ค.
ex) Vehicle ์ธํฐํ์ด์ค ํ์
์ผ๋ก ๋ณํ๋ ๊ฐ์ฒด๊ฐ Bus์ธ์ง ํ์ธํ๋ ค๋ฉด ์๋์ฒ๋ผ ์์ฑํ๋ค.
if(vehicle instanceof Bus){
Bus bus = (Bus) vehicle;
}
์์ 1) ๊ฐ์ฒด ํ์ ํ์ธ
public class Driver{
public void drive(Vehicle vehicle) {//vehicle: Bus, Taxi ๊ฐ์ฒด
if(vehicle instanceof Bus) {//vehicle ๋งค๊ฐ ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ Bus์ธ์ง ์กฐ์ฌ
Bus bus = (Bus) vehicle;//Bus ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ ์์ ํ๊ฒ ๊ฐ์ ํ์
๋ณํ
bus.checkFare();//Bus ํ์
์ผ๋ก ๊ฐ์ ํ์
๋ณํ์ ํ๋ ์ด์
}
vehicle.run();
}
}
์์ 2) ๊ฐ์ฒด ํ์
ํ์ธ
public class DriverExample{
public static void main(String[] args) {
Driver driver = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
driver.drive(bus);
driver.drive(taxi);
}
}
์ข ๋ ์์๋ณด๊ธฐ) ์ธํฐํ์ด์ค ์์ p. 399
์ธํฐํ์ด์ค ์์: ํด๋์ค๋ ๋ค์ค ์์์ ํ์ฉํ์ง ์์ง๋ง, ์ธํฐํ์ด์ค๋ ๋ค์ค ์์์ ํ์ฉํ๋ค. ์ฆ extends ํค์๋ ๋ค์ ์์ ์ธํฐํ์ด์ค๊ฐ ์ฌ ์ ์๋ค.
์์ ) ์์ ์ธํฐํ์ด์ค
package ch8_2;
//[1]
public interface InterfaceA {
//public void abstract methodA();
public void methodA();
}
์์ ) ์์ ์ธํฐํ์ด์ค
package ch8_2;
//[2]
public interface InterfaceB {
//public void abstract InterfaceB();
public void methodB();
}
์์ ) ํ์ ์ธํฐํ์ด์ค
package ch8_2;
//[3]
public interface InterfaceC extends InterfaceA, InterfaceB {
//public void methodA();
//public void methodB();
//public void abstract methodC();
public void methodC();
}
์์ ) ํ์ ์ธํฐํ์ด์ค ๊ตฌํ
package ch8_2;
//[4]
public class ImplementationC implements InterfaceC{
public void methodA() {
System.out.println("ImplementationC-methodA() ์คํ");
}
public void methodB() {
System.out.println("ImplementationC-methodB() ์คํ");
}
public void methodC() {
System.out.println("ImplementationC-methodC() ์คํ");
}
}
์์ ) ํธ์ถ ๊ธฐ๋ฅ ๋ฉ์๋
package ch8_2;
//[5]
public class Example {
public static void main(String[] args) {
ImplementationC impl = new ImplementationC();
//์ธํฐํ์ด์ค ํ์
= ๊ตฌํ ๊ฐ์ฒด (์ฐธ์กฐ ์๋ ํ์
๋ณํ)
InterfaceA ia = impl;
ia.methodA();
System.out.println();
//์ธํฐํ์ด์ค ํ์
= ๊ตฌํ ๊ฐ์ฒด (์ฐธ์กฐ ์๋ ํ์
๋ณํ)
InterfaceB ib = impl;
ib.methodB();
System.out.println();
//์ธํฐํ์ด์ค ํ์
= ๊ตฌํ ๊ฐ์ฒด (์ฐธ์กฐ ์๋ ํ์
๋ณํ)
InterfaceC ic = impl;
ic.methodA();
ic.methodB();
ic.methodC();
}
}
๊ฒฐ๊ณผ)
ImplementationC-methodA() ์คํ
ImplementationC-methodB() ์คํ
ImplementationC-methodA() ์คํ
ImplementationC-methodB() ์คํ
ImplementationC-methodC() ์คํ
๋ง๋ฌด๋ฆฌ
5๊ฐ์ง ํค์๋๋ก ๋๋ด๋ ํต์ฌ ํฌ์ธํธ
1) ์๋ ํ์
๋ณํ: ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค ๋ณ์์ ๋์
๋๋ ๊ฒ
2) ๋คํ์ฑ: ์์์ ๊ฐ์ ์ข
๋ฅ์ ํ์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ธฐ์ ์ด๊ณ , ์ธํฐํ์ด์ค๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋์ผํ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ธฐ์ ์ด๋ผ๋ ๊ฐ๋
์์ ์ฐจ์ด๋ ์์ง๋ง ๋ ๋ค ๋คํ์ฑ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋น์ทํ๋ค. ๋ชจ๋ ์ฌ์ ์์ ํ์
๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค.
3) ๊ฐ์ ํ์
๋ณํ: ์ธํฐํ์ด์ค์ ๋์
๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ค์ ์๋ ๊ตฌํ ํด๋์ค ํ์
์ผ๋ก ๋ณํํ๋ ๊ฒ
4) instanceof: ๊ฐ์ ํ์
๋ณํ์ ํ๊ธฐ ์ ์ ๋ณํ์ด ๊ฐ๋ฅํ์ง ์กฐ์ฌํ ๋ ์ฌ์ฉํ๋ค. ์์์์๋ ์์ ํด๋์ค ํ์
์ธ์ง, ์ธํฐํ์ด์ค์์๋ ๊ตฌํ ํด๋์ค ํ์
์ธ์ง๋ฅผ ํ์ธํ ๋ ์ฌ์ฉํ๋ค.
5) ์ธํฐํ์ด์ค ์์: ํด๋์ค๋ ๋ค์ค ์์์ ํ์ฉํ์ง ์์ง๋ง, ์ธํฐํ์ด์ค๋ ๋ค์ค ์์์ ํ์ฉํ๋ค. ์ฆ extends ํค์๋ ๋ค์ ์์ ์ธํฐํ์ด์ค๊ฐ ์ฌ ์ ์๋ค.
class A{}
class B extends A{}
main(){
// ์์๊ด๊ณ์ ์๋ ํ์ ๋ณํ
// ๋ถ๋ชจํด๋์ค ํ์ (A) ← ์์ํด๋์ค(B)
A a = new B();
// ์์๊ด๊ณ์ ๊ฐ์ ํ์ ๋ณํ
// ์์ํด๋์ค ํ์ (B) ← ๋ถ๋ชจํด๋์ค(A)
B() = (B) a;
}
======================================
interface A{} // ์ธํฐํ์ด์ค
class B implements A{} // ๊ตฌํ๊ฐ์ฒด
main(){
// ์ธํฐํ์ด์ค์ ๊ตฌํ ๊ฐ์ฒด ๊ด๊ณ์ ์๋ ํ์ ๋ณํ
// ์ธํฐํ์ด์ค ํ์ (A) ← ์์ ํด๋์ค (B)
A a = new B();
// ์ธํฐํ์ด์ค์ ๊ตฌํ ๊ฐ์ฒด ๊ด๊ณ์ ๊ฐ์ ํ์ ๋ณํ
// ๊ตฌํ๊ฐ์ฒด ํ์ (B) ← ์ธํฐํ์ด์ค(A)
B b = (B) a;
}
์ฐธ๊ณ : http://alecture.blogspot.com/2011/05/abstract-class-interface.html
ํ์ธ ๋ฌธ์
Q1 (4) ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ํ์
์ด ์ธํฐํ์ด์ค์ด๋ฉด ๋งค๊ฐ๊ฐ์ผ๋ก ๋ชจ๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์
ํ๋ฉด ์๋ ํ์
๋ณํ์ด ๋๋ค. (O)
interface A{
// ์ถ์ ๋ฉ์๋
void add(A a); //์ธํฐํ์ด์ค
}
class B implements A{
// ๊ตฌํ ๋ฉ์๋
add(B) //๊ตฌํ ๊ฐ์ฒด ๋ณ์
}
์ธํฐํ์ด์ค ํ์ = ๊ตฌํ ๊ฐ์ฒด (์๋ ํ์ ๋ณํ)
A a = new(B);
Q3 DaoExample ํด๋์ค์ main() ๋ฉ์๋์์ dbWork() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ OracleDao์ MysqlDao ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๊ฐ์ผ๋ก ์ฃผ๊ณ ํธ์ถํ๋ค.
dbWork() ๋ฉ์๋๋ ๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ๋งค๊ฐ๊ฐ์ผ๋ก ๋ฐ๊ธฐ ์ํด DataAccessObject ํ์
์ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ DataAccessObject ์ธํฐํ์ด์ค์ OracleDao, MysqlDao ๊ตฌํ ํด๋์ค๋ฅผ ๊ฐ๊ฐ ์์ฑํ๋ผ.
์คํ ๊ฒฐ๊ณผ)
OracleDB์์ ๊ฒ์
OracleDB์ ์ฝ์
OracleDB๋ฅผ ์์
OracleDB๋ฅผ ์ญ์
Mysql์์ ๊ฒ์
Mysql์ ์ฝ์
Mysql๋ฅผ ์์
Mysql๋ฅผ ์ญ์
์ธํฐํ์ด์ค ํ์ = ๊ตฌํ ๊ฐ์ฒด (์๋ ํ์ ๋ณํ)
DataAccessObject dao = new OracleDao();
์์ 1) DaoExample.java
dbWork() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ OracleDao์ MysqlDao ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๊ฐ์ผ๋ก ์ฃผ๊ณ ํธ์ถํ๋ค.
package ch08;
//[1]
public class DaoExample {
//์ธํฐํ์ด์ค ํ์
public static void dbWork(DataAccessObject dao) {
dao.select();
dao.insert();
dao.update();
dao.delete();
}//dbWork ๋
public static void main(String[] args) {
//๊ตฌํ๊ฐ์ฒด
dbWork(new OracleDao());
//๊ตฌํ๊ฐ์ฒด
dbWork(new MysqlDao());
}
}
์์ 2) DataAccessObject.java ์ธํฐํ์ด์ค
package ch08;
//[2]
public interface DataAccessObject {
//์ถ์ ๋ฉ์๋
public void select();
public void insert();
public void update();
public void delete();
}
์์ 3) MysqlDao.java ๊ตฌํ ํด๋์ค
package ch08;
//[3]
public class MysqlDao implements DataAccessObject{
public void select() {
System.out.println("Mysql์์ ๊ฒ์");
}
public void insert() {
System.out.println("Mysql์ ์ฝ์
");
}
public void update() {
System.out.println("Mysql๋ฅผ ์์ ");
}
public void delete() {
System.out.println("Mysql๋ฅผ ์ญ์ ");
}
}
์์ 4) OracleDao.java ๊ตฌํ ํด๋์ค
package ch08;
//[4]
public class OracleDao implements DataAccessObject{
//DataAccessObject interface์ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ตฌํ๋ฉ์๋
public void select() {
System.out.println("OracleDB์์ ๊ฒ์");
}
public void insert() {
System.out.println("OracleDB์ ์ฝ์
");
}
public void update() {
System.out.println("OracleDB๋ฅผ ์์ ");
}
public void delete() {
System.out.println("OracleDB๋ฅผ ์ญ์ ");
}
}