[Java] ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋คํ์ฑ๊ณผ ํ์ฉ
by rlaehddnd0422์ธํฐํ์ด์ค์ ๋ค์ค ์์
์์ ์ธํฐํ์ด์ค๋ ๋ค์ค์์์ด ๊ฐ๋ฅํ๋ค๊ณ ํ์ต๋๋ค.
public interface Attackable {
void attack(int power);
}
public interface Movable {
void move(int m);
}
public interface Fightable extends Movable, Attackable {
void attackAndMove(int power, int m);
}
- ํด๋์ค ์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํฐํ์ด์ค๋ ๋ถ๋ชจ ์ธํฐํ์ด์ค์ ์ ์๋ ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ์์๋ฐ์ต๋๋ค.
- Fightable์ ๋ณธ์ธ์ ๋ฉค๋ฒ attackAndMove()์ ๋ถ๋ชจ ๋ฉค๋ฒ์ attack(), move()๋ฅผ ๋ฉค๋ฒ๋ก ๊ฐ๊ฒ ๋จ.
public class Fighter implements Fightable {
@Override
public void attack(int power) {
}
@Override
public void attackAndMove(int power, int m) {
}
@Override
public void move(int m) {
}
}
- ์ด ๋ ๋ถ๋ชจ์ ์ ๊ทผ ์ ์ด์๋ public abstract๊ฐ ์๋ต๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ (์ธํฐํ์ด์ค์ ํน์ง) ํด๋์ค์์ ๊ตฌํํ ๋ ๋ถ๋ชจ์ ์ ์ด์๋ฅผ ๋ฐ๋์ public์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
์ธํฐํ์ด์ค์์๋ ๋ค์ค์์์ผ๋ก ์ธํ ๋ฌธ์ ๊ฐ ์์๊น?
ํด๋์ค์์ ๋ค์ค์์์ด ์๋๋ ์ด์ ๋ ๋ ๋ถ๋ชจ ํด๋์ค๊ฐ ๋์ผํ ์๊ทธ๋์ฒ์ ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์์์ด ์ด ๋ ํด๋์ค๋ฅผ ์์๋ฐ๋ ๊ฒฝ์ฐ, ์์ ์ ์ฅ์์๋ ์์๋ฐ์ ๋ ์ด๋ค ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์๋ฐ์์ผ ํ๋ ์ง ์ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ธํฐํ์ด์ค์์๋ ์ด ๋ฌธ์ ๋ฅผ ํผํด๊ฐ ์ ์์ต๋๋ค. why ? ๋ฉ์๋๊ฐ ์ ์๋์ง ์์๊ธฐ ๋๋ฌธ
- ์ด์ฐจํผ ๋ถ๋ชจ ๋ฉ์๋๊ฐ ๊ตฌํ๋์ง ์์๊ธฐ ๋๋ฌธ์, ์์ ํด๋์ค์์๋ ๋ ์ค ์ด๋ ๊ฒ์ ์์ ๋ฐ์๋ ๊ตฌํํด์ฃผ์ด์ผ ํ๋ฏ๋ก, ์ด๋ค ๋ถ๋ชจ๋ก๋ถํฐ ์์๋ฐ์๋์ง์ ๋ํด์๋ ์ ํ์๊ฐ ์์ต๋๋ค.
public interface Mom {
void giveMoney(int money);
}
public interface Father {
void giveMoney(int money);
}
public class Child implements Father, Mom {
@Override
public void giveMoney(int money) {
}
}
์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋คํ์ฑ
๋คํ์ฑ์ ๋ํด ๋ค๋ฃฐ ๋ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ถ๋ชจํ์ ์ ์ฐธ์กฐ๋ณ์๋ก ์ฐธ์กฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ํ์์ต๋๋ค.
public class Tv {
protected String model;
}
public class SmartTv extends Tv {
protected String smartFunction;
private void printSmartFunction(){
System.out.println(this.smartFuntion);
}
}
public class SmartTvTest {
public static void main(String[] args){
Tv t = new SmartTv();
}
}
์ธํฐํ์ด์ค ์ญ์ ์ด๋ฅผ ๊ตฌํํ ํด๋์ค์ ์กฐ์์ด๋ผ ํ ์ ์์ผ๋ฏ๋ก ํด๋น ์ธํฐํ์ด์ค ํ์ ์ ์ฐธ์กฐ๋ณ์๋ก ์ด๋ฅผ ๊ตฌํํ ํด๋์ค(์์)์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฉฐ, ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ํ๋ณํ ๋ํ ๊ฐ๋ฅํฉ๋๋ค.
public interface Fightable {
void attack(int power);
}
public class Fighter implements Fightable{
@Override
public void attack(int power) {
System.out.println(power + "์ ๋ฐ๋ฏธ์ง๋ก ๊ณต๊ฒฉ");
}
}
public class FighterTest {
public static void main(String[] args) {
Fightable f = new Fighter();
f.attack(50);
}
}
์คํ ๊ฒฐ๊ณผ
50์ ๋ฐ๋ฏธ์ง๋ก ๊ณต๊ฒฉ
- ๋ฐ๋ผ์ ๋ฟ๋ง ์๋๋ผ Up-casting(๋ถ๋ชจ → ์์)๋ ๊ฐ๋ฅํฉ๋๋ค.
public class FighterTest {
public static void main(String[] args) {
Fightable f = (Fightable) new Fighter();
f.attack(50);
}
}
- ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ํ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
public interface Fightable {
void attack(int power, Fightable f);
String getName();
}
public class Fighter implements Fightable{
private String name;
public Fighter(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void attack(int power, Fightable f) {
System.out.println("Fighter attack " + f.getName() + " with " + power);
}
}
public class Boxer implements Fightable {
private String name;
public Boxer(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void attack(int power, Fightable f) {
System.out.println("Boxer attack " + f + " with " + power);
}
}
public class FighterTest {
public static void main(String[] args) {
Fightable f = new Fighter("fighter1");
f.attack(50, new Boxer("boxer1"));
}
}
์คํ ๊ฒฐ๊ณผ
Fighter attack boxer1 with 50
๋ฆฌํดํ์ ์ด ์ธํฐํ์ด์ค์ผ ๋
๋ฉ์๋์ ๋ฆฌํดํ์ ์ด ์ธํฐํ์ด์ค โถ๏ธ ๋ฉ์๋๊ฐ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํฉ๋๋ค.
์์ ์ฝ๋
public interface Parseable {
void parse(String fileName);
}
public class HTMLParser implements Parseable {
@Override
public void parse(String fileName) {
System.out.println(fileName + " HTML Parsing");
}
}
public class XMLParser implements Parseable {
@Override
public void parse(String fileName) {
System.out.println(fileName + " XML Parsing");
}
}
public class ParserManager {
public static Parseable getParser(String type) {
if (type.equals("XML")) {
return new XMLParser();
} else{
return new HTMLParser();
}
}
}
public class ParserTest {
public static void main(String[] args) {
Parseable pm = ParserManager.getParser("XML");
pm.parse("doc.xml");
}
}
์ ์ฝ๋์์ ์ถํ ์๋ก์ด ์ข ๋ฅ์ XML Parser ํด๋์ค๊ฐ ๋์๋ ์๋ ์ฝ๋์ ๊ฐ์ด ๋ฆฌํด ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
if (type.equals("XML")) {
// return new XMLParser();
return new NewXMLParser();
}
์ธํฐํ์ด์ค์ ์ฅ์
- ๊ฐ๋ฐ ์๊ฐ ๋จ์ถ
- ์ธํฐํ์ด์ค๊ฐ ์์ฑ๋๋ฉด ์ ์ธ๋ถ๋ง ์๋ฉด ์ด๋ฅผ ์ฌ์ฉํด์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅ
- ํ์คํ ๊ฐ๋ฅ
- ํ๋ก์ ํธ์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ํ์ ์ธํฐํ์ด์ค๋ก ์์ฑํ ๋ค์, ๊ฐ๋ฐ์๋ค์๊ฒ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋๋ก ํจ์ผ๋ก์จ ๋ณด๋ค ์ผ๊ด๋๊ณ ์ ํํ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅ
- ์๋ก ๊ด๊ฒ์๋ ํด๋์ค๋ค์๊ฒ ๊ด๊ณ๋ฅผ ๋งบ์ด์ค ์ ์์
- ์์๊ด๊ณ์ ์์ง๋ ์๊ณ , ๊ฐ์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์๋ก ์๋ฌด ๊ด๊ณ๋ ์๋ ํด๋์ค๋ค์๊ฒ ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ณตํต์ ์ผ๋ก ๊ตฌํํ๋๋ก ํ์ฌ ๊ด๊ณ๋ฅผ ๋งบ์ด์ค ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค - ์ถ์ํด๋์ค - ๊ตฌํ ํด๋์ค ๋์์ธ ํจํด
์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค ์ฌ์ด์ ์ถ์ ํด๋์ค๋ฅผ ํ๋ ๋๊ณ ์ด ์ถ์ ํด๋์ค์ ๊ตฌํ ํด๋์ค์ ๊ณตํต, ์ค๋ณต ๋ถ๋ถ๋ค์ ๋ชจ์๋๋ ํจํด์ ๋๋ค.
์์
public interface Animal {
void walk();
void run();
void sleep();
void eat();
}
public class Lion implements Animal {
private String sex; // ์ค๋ณต
private String color; // ์ค๋ณต
public String getSex() { // ์ค๋ณต
return sex;
}
public String getColor() { // ์ค๋ณต
return color;
}
@Override
public void walk() {
System.out.println("Lion WALK");
}
@Override
public void run() {
System.out.println("Lion RUN");
}
@Override
public void sleep() {
System.out.println("Lion SLEEP");
}
@Override
public void eat() {
System.out.println("Lion EAT");
}
}
public class Tiger implements Animal{
private String sex; // ์ค๋ณต
private String color; // ์ค๋ณต
public String getSex() { // ์ค๋ณต
return sex;
}
public String getColor() { // ์ค๋ณต
return color;
}
@Override
public void walk() {
System.out.println("Tiger WALK");
}
@Override
public void run() {
System.out.println("Tiger RUN");
}
@Override
public void sleep() {
System.out.println("TIGER SLEEP");
}
@Override
public void eat() {
System.out.println("TIGER EAT");
}
}
Tiger์ Lion ํด๋์ค๋ฅผ ๋ณด๋ฉด sex, color, getSex(), getColor() ์ฝ๋์ ์ค๋ณต์ด ๋ฐ์ํ๋๋ฐ ์ด ๋ ์ค๋ณต ๋ฉค๋ฒ๋ค์ ์ถ์ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ค๋ณต์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
package aboutInterface.test3;
public abstract class Mammal implements Animal{
private String sex; // ์ค๋ณต
private String color; // ์ค๋ณต
public String getSex() { // ์ค๋ณต
return sex;
}
public String getColor() { // ์ค๋ณต
return color;
}
}
์ด ๋์์ธ ํจํด์ ์ค๋ณต ์ ๊ฑฐ์ ํจ๊ณผ์ ์ด์ง๋ง, ํด๋์ค ์์์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ์์ผ ํ๋ ๊ฒฝ์ฐ์๋ ํด๋์ค๋ ๋ค์ค์์์ด ์๋๊ธฐ ๋๋ฌธ์ ์ด ํจํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋ด๋ถ ํด๋์ค์ static์ด ๊ถ์ฅ๋๋ ์ด์ ์ ๋ํด (0) | 2023.10.03 |
---|---|
[Java] ๋ด๋ถ ํด๋์ค(Inner class)์ ๋ํด (0) | 2023.10.03 |
[Java] ์ธํฐํ์ด์ค์ ์ฉ๋(usage)์ ๋ํด (0) | 2023.10.02 |
[Java] ๋คํ์ฑ(Polymorphism)์ ๋ํด (0) | 2023.09.27 |
[Java] ์์(Inheritance)์ ๋ํด (1) | 2023.09.27 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422