μΆμν΄λμ€λ abstarctλ₯Ό μ¬μ©νκ³ μΈν°νμ΄μ€λ interfaceλ₯Ό μ¬μ©νλ©΄ ꡬνν μ μμ΅λλ€. νμ§λ§ μΈμ μΆμν΄λμ€λ₯Ό μ¬μ©νκ³ μΈμ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν΄μΌ ν κΉμ? μλ§ λ§μ μ£Όλμ΄ κ°λ°μλΆλ€μ΄ λͺ μΎν λ΅μ λ΄λμ§ λͺ»ν κ²μ΄λΌκ³ μκ°ν©λλ€. μ λν μΆμν΄λμ€μ μΈν°νμ΄μ€μ μ μ ν μ¬μ© μ©λλ₯Ό μΈμ§νμ§ λͺ»ν μ± κ°λ°μ ν΄μμ΅λλ€. κ·Έλμ μ΄λ²μ μΆμν΄λμ€μ μΈν°νμ΄μ€μ λν΄ μμ λ³΄κ³ μ ν©λλ€.
μΆμν΄λμ€
μΆμν΄λμ€λ μΌλ°ν΄λμ€μ λ³λ° λ€λ₯Ό κ²μ΄ μμ΅λλ€. λ¨μ§, μΆμ λ©μλλ₯Ό μ μΈνμ¬ μμμ ν΅νμ¬ μμ ν΄λμ€μμ μμ±νλλ‘ μ λνλ ν΄λμ€μ λλ€. κ·Έλμ λ―Έμμ± μ€κ³λλΌκ³ λ ννν©λλ€.
κΈ°λ³Έμ μΌλ‘ μλ μ½λμ κ°μ΄ μμ±νκ² λ©λλ€.
public abstract class ν΄λμ€μ΄λ¦{
public abstract void λ©μλμ΄λ¦();
}
μμμ μν ν΄λμ€μ΄κΈ° λλ¬Έμ νλμ λ°λ‘ κ°μ²΄λ₯Ό μμ±ν μ μμ΅λλ€.
package interface_abstract;
public class main{
public static void main(String[] args) {
//λ§μ½ μΆμν΄λμ€λ₯Ό newμ°μ°μλ‘ μμ±νλ €λ©΄ μλ¬κ° λ°μ
creature c = new creature();//Cannot instantiate the type creature μ€λ₯ λ°μ
}
}
λν μΆμ λ©μλκ° μλ μ΄μ μμ λ°λ ν΄λμ€μ μΌλ° λ©μλλ₯Ό μ€λ²λΌμ΄λ© ν νμλ μμ΅λλ€. λ§μ½ μΆμν΄λμ€μμ μΆμλ©μλλ₯Ό ꡬννλ€λ©΄ λ°λμ μμλ°λ ν΄λμ€μμ μ€λ²λΌμ΄λ©μ ν΄μ£Όμ΄μΌν©λλ€. μλ μ½λλ₯Ό 보μλ©΄ eatκ³Ό walk λ©μλλ μΆμ λ©μλμ΄λ―λ‘ μμλ°λ ν΄λμ€μμ μ€λ²λΌμ΄λ©μ ν΄μ£Όμ΄μΌν©λλ€.
package interface_abstract;
public abstract class creature {
private String name;
private String home;
public creature(String name, String home) {
this.name = name;
this.home = home;
}
public abstract void eat();//μΆμλ©μλ
public abstract void walk();//μΆμλ©μλ
@Override
public String toString() {
return this.name + "μ(λ) " + this.home + "μ μ½λλ€.";
}
}
human μΆμν΄λμ€μ λΆλͺ¨ν΄λμ€μΈ creatureμμ μΆμλ©μλλ₯Ό μ μΈν΄μ£ΌμκΈ° λλ¬Έμ creature μΆμν΄λμ€λ₯Ό μμλ°λ human μΆμν΄λμ€μ μ€λ²λΌμ΄λ© ν΄μ£Όμ΄μΌ ν©λλ€. λ§μ½ μΆμλ©μλκ° μλ μΌλ°λ©μλλΌλ©΄ λ°λμ μ€λ²λΌμ΄λ©μ ν΄μ€ νμλ μμ΅λλ€.
package interface_abstract;
public abstract class human extends creature{
public human(String name, String home) {
super(name, home);
}
@Override
public void eat() {
System.out.println("λ°₯μ λ¨Ήμ΅λλ€.");//μ€λ²λΌμ΄λ©μ λ°λμ ν΄μ£Όμ΄μΌ ν©λλ€.
}
@Override
public void walk() {
System.out.println("μ΄μ‘±λ³΄νμ ν©λλ€.");//μ€λ²λΌμ΄λ©μ λ°λμ ν΄μ£Όμ΄μΌ ν©λλ€.
}
}
μΈν°νμ΄μ€
μΆμν΄λμ€κ° λ―Έμμ± μ€κ³λλΌλ©΄ μΈν°νμ΄μ€λ κΈ°λ³Έ μ€κ³λλΌκ³ ν μ μμ΅λλ€. μΆμν΄λμ€μ²λΌ λ€λ₯Έ ν΄λμ€λ₯Ό μμ±νλλ° λμμ μ£Όμ§λ§ μΆμ ν΄λμ€μ λ€λ₯΄κ² λ€μ€μμ(ꡬν)μ΄ κ°λ₯ν©λλ€.
public interface μΈν°νμ΄μ€μ΄λ¦{
public abstract void λ©μλμ΄λ¦();//μΆμλ©μλ
public void λ©μλμ΄λ¦();//μΌλ°λ©μλ
}
μΈν°νμ΄μ€λ μΆμν΄λμ€μ λ€λ₯΄κ² μΆμλ©μλλ μΌλ°λ©μλλ λ°λμ μ€λ²λΌμ΄λ©μ ν΄μ£Όμ΄μΌ ν©λλ€.
package interface_abstract;
public class messi extends human implements talkable, swimmable{
public messi(String name, String home) {
super(name, home);
}
@Override
public void talk() {
System.out.println("μ
μΌλ‘ λ§μ ν©λλ€.");
}
// implementsλ‘ κ΅¬νν swimmableμ λ©μλλ₯Ό μ£Όμμ²λ¦¬νμμ λ
// The type messi must implement the inherited abstract method swimmable.swim() μλ¬κ° λ°μ
// @Override
// public void swim() {
// System.out.println("μμ ν, νν λ±μ ν©λλ€.");
// }
}
μΆμν΄λμ€ vs μΈν°νμ΄μ€
κ²°κ΅ μΆμν΄λμ€λ§μΌλ‘λ μΆ©λΆν μΈν°νμ΄μ€μ μν μ λμ ν μ μμ΅λλ€. κ·Έλ°λ° μ κ΅³μ΄ 2κ°μ§λ‘ λλ μ μ¬μ©ν κΉμ? μ΄λ‘ μ μΆμν΄λμ€λ§μΌλ‘ μΈν°νμ΄μ€ μν μ λμ ν μ μμ§λ§ μ€μ λ‘ κ°λ°μ νλ€λ³΄λ©΄ λμ μ¬μ©μ©λλ λ€λ₯΄λ€λ κ±Έ μ μ μμ΅λλ€.
μ¬μ©μ©λμ μ°¨μ΄μ
μΆμν΄λμ€λ IS -A "~μ΄λ€."
μΈν°νμ΄μ€λ HAS -A "~μ ν μ μλ"
μλ°μ νΉμ±μ ν κ°μ ν΄λμ€λ§ μμμ΄ κ°λ₯νκΈ° λλ¬Έμ ν΄λΉ ν΄λμ€μ ꡬλΆμ μΆμν΄λμ€ μμμ ν΅ν΄ ν΄κ²°νκ³ , ν΄λΉ ν΄λμ€κ° ν μ μλ κΈ°λ₯λ€μ λν΄μλ μ¬λ¬ κ°μ μμ(ꡬν)μ΄ κ°λ₯ν μΈν°νμ΄μ€λ‘ ꡬνν©λλ€.
μΆμν΄λμ€ λ§κ³ μ λΆ μΈν°νμ΄μ€λ‘ κΈ°λ₯μ ꡬννλ©΄ μλλ? λΌκ³ μκ°νμ€ μλ μλλ° μμμ μΈκΈν λ°μ κ°μ΄ μΈν°νμ΄μ€λ§ μ΄μ©νμ¬ ν΄λμ€μ κΈ°λ³Έ ν(κΈ°λ₯)μ ꡬμ±νκ² λλ€λ©΄ μΈν°νμ΄μ€ λ΄μ μ μν λͺ¨λ λ©μλλ€μ λ€μ μ€λ²λΌμ΄λ© ν΄μΌ νλ λ²κ±°λ‘μμ΄ μμ΅λλ€. λΆνμν λ©μλκΉμ§ μ€λ²λΌμ΄λ© ν΄μΌ ν©λλ€.
λ°λλ‘ μΆμν΄λμ€λ‘λ§ ν΄λμ€μ κΈ°λ₯μ ꡬννλ©΄ μλλ? λΌκ³ μκ°νμ€ μλ μλλ° μμμ μΈκΈν λ°μ κ°μ΄ μλ°λ νλμ ν΄λμ€λ§ μμν μ μμ΅λλ€.
λ°λΌμ μΆμν΄λμ€μ μΈν°νμ΄μ€λ₯Ό μ μ ν μμ΄ κ°λ°μ ν΄μΌν©λλ€.
μμ λ₯Ό 보μ¬λλ¦¬κ² μ΅λλ€.
creature μΆμν΄λμ€
package interface_abstract;
public abstract class creature {
private String name;
private String home;
public creature(String name, String home) {
this.name = name;
this.home = home;
}
public abstract void eat();
public abstract void walk();
@Override
public String toString() {
return this.name + "μ(λ) " + this.home + "μ μ½λλ€.";
}
}
μΈκ°κ³Ό λλ¬Ό λͺ¨λ μλͺ 체λΌλ κ²μ ꡬνν creature μΆμν΄λμ€μ λλ€. μλͺ 체λΌλ©΄ μ΄λ¦κ³Ό μ¬λ κ³³μ΄ μκ³ λ¨Ήκ³ κ±·κΈ° λλ¬Έμ eatκ³Ό walk μΆμλ©μλλ₯Ό ꡬννμ΅λλ€. toString κ°μ κ²½μ° μ΅μμ κ°μ²΄μΈ object ν΄λμ€μ μλ λ©μλλ‘ creatureλ©μλμμ λ€μ μ€λ²λΌμ΄λ© νμμ΅λλ€. object ν΄λμ€λ extendsλ₯Ό ν΅ν΄ μμνμ§ μμλ μλμΌλ‘ μμλ©λλ€.
human μΆμν΄λμ€
package interface_abstract;
public abstract class human extends creature{
public human(String name, String home) {
super(name, home);
}
@Override
public void eat() {
System.out.println("λ°₯μ λ¨Ήμ΅λλ€.");
}
@Override
public void walk() {
System.out.println("μ΄μ‘±λ³΄νμ ν©λλ€.");
}
}
μΈκ°(human)μ creature μΆμν΄λμ€λ‘λΆν° μμμ λ°μ΅λλ€. human ν΄λμ€μμ eatκ³Ό walkλ₯Ό μ€λ²λΌμ΄λ© νμμ΅λλ€. λλ¬Όκ³Ό λ€λ₯΄κ² μΈκ°μ λ°₯μ ν΄λ¨Ήκ³ , μ¬μ‘±λ³΄νμ΄λ ν€μμ΄ μλ μ΄μ‘±λ³΄νμ ν΅ν΄ κ±·κΈ° λλ¬Έμ΄μ£ .
animal μΆμν΄λμ€
package interface_abstract;
public abstract class animal extends creature{
public animal(String name, String home) {
super(name, home);
}
}
λλ¬Ό(animal) μΆμν΄λμ€λ creature μΆμν΄λμ€λ‘λΆν° μμμ λ°μ΅λλ€. λλ¬Όλ§λ€ μ¬μ‘±λ³΄νμ ν μλ μκ³ , μ΄μ‘±λ³΄νμ ν μλ μμ΄μ animal ν΄λμ€μμ μ€λ²λΌμ΄λ©μ νμ§μμμ΅λλ€. λ λλ¬Όμ μ‘μμΌ μλ μκ³ μ΄μμΌ μλ μκΈ° λλ¬Έμ μ€λ²λΌμ΄λ©μ νμ§ μμμ΅λλ€. λ°μ tigerν΄λμ€μ elephant ν΄λμ€μμ λ°λ‘ μ€λ²λΌμ΄λ©μ νκ² λ©λλ€.
messi ν΄λμ€
package interface_abstract;
public class messi extends human implements talkable, swimmable{
public messi(String name, String home) {
super(name, home);
}
@Override
public void talk() {
System.out.println("μ
μΌλ‘ λ§μ ν©λλ€.");
}
@Override
public void swim() {
System.out.println("μμ ν, νν λ±μ ν©λλ€.");
}
}
λ©μλ human μΆμν΄λμ€λ₯Ό μμλ°μ΅λλ€. κ·Έλ¦¬κ³ talkable, swimmable μΈν°νμ΄μ€λ₯Ό μμ(ꡬν)λ°μ΅λλ€. λ©μλ μ¬λμ΄κΈ°μ λ§μ ν μλ μκ³ μμμ ν μ μμ΅λλ€. μΈκ°μΌ κ²½μ° μμμ ν λ μμ νμ΄λ νν λ±μ ν μ μμ΅λλ€.
tiger ν΄λμ€
package interface_abstract;
public class tiger extends animal implements swimmable{
public tiger(String name, String home) {
super(name, home);
}
@Override
public void swim() {
System.out.println("κ°ν€μμ ν©λλ€.");
}
@Override
public void eat() {
System.out.println("μ‘μμ ν©λλ€.");
}
@Override
public void walk() {
System.out.println("μ¬μ‘±λ³΄νμ ν©λλ€.");
}
}
νΈλμ΄λ animal μΆμν΄λμ€λ‘λΆν° μμμ λ°μ΅λλ€. νΈλμ΄λ λ©μμ λ€λ₯΄κ² λ§μ ν μ μκΈ°μ μμ κ΄λ ¨λ swimmable μΈν°νμ΄μ€λ§ μμ(ꡬν)λ°μ΅λλ€. νΈλμ΄λ μ‘μμ΄λ―λ‘ eat λ©μλλ₯Ό μ€λ²λΌμ΄λ©μ ν΄μ£Όμκ³ λν μ¬μ‘±λ³΄νμ νκΈ° λλ¬Έμ walk λ©μλ λν μ€λ²λΌμ΄λ© ν΄μ£Όμμ΅λλ€. λ©μλ μμ νμ νλ λ°λ©΄ νΈλμ΄λ κ°ν€μμ ν΅ν΄ μμνλ―λ‘ swimmable μΈν°νμ΄μ€μ swim λ©μλλ₯Ό μ€λ²λΌμ΄λ© ν΄μ£Όμμ΅λλ€.
elephant ν΄λμ€
package interface_abstract;
public class elephant extends animal{
public elephant(String name, String home) {
super(name, home);
}
@Override
public void eat() {
System.out.println("μ΄μμ ν©λλ€.");
}
@Override
public void walk() {
System.out.println("μ¬μ‘±λ³΄νμ ν©λλ€.");
}
}
μ½λΌλ¦¬λ νΈλμ΄μ λ§μ°¬κ°μ§λ‘ animal ν΄λμ€λ₯Ό μμλ°μ΅λλ€. νμ§λ§ μμμ ν μ μκΈ°μ(ν μλ μκ² μ§λ§ λͺ»νλ€κ³ κ°μ νκ² μ΅λλ€.) swimmable μΈν°νμ΄μ€λ₯Ό μμ(ꡬν)λ°μ§ μμ΅λλ€. λν λ§λ ν μ μκΈ° λλ¬Έμ talkable μΈν°νμ΄μ€ λν μμ(ꡬν)λ°μ§ μμ΅λλ€.
talkable μΈν°νμ΄μ€
package interface_abstract;
public interface talkable {
public void talk();
}
λ§ ν μ μλ κΈ°λ₯μ ꡬνν μΈν°νμ΄μ€μ λλ€.
swimmable μΈν°νμ΄μ€
package interface_abstract;
public interface swimmable {
public void swim();
}
μμν μ μλ κΈ°λ₯μ ꡬνν μΈν°νμ΄μ€μ λλ€.
main ν΄λμ€
package interface_abstract;
public class main{
public static void main(String[] args) {
messi m = new messi("λ©μ", "μννΈ");
tiger t = new tiger("νΈλμ΄", "μ κΈ");
elephant e = new elephant("μ½λΌλ¦¬", "μ΄μ");
//λ©μ
String str1 = m.toString();
System.out.println(str1);
m.eat();
m.walk();
m.talk();
m.swim();
//νΈλμ΄
System.out.println("---------------------");
String str2 = t.toString();
System.out.println(str2);
t.eat();
t.walk();
t.swim();
//μ½λΌλ¦¬
System.out.println("---------------------");
String str3 = e.toString();
System.out.println(str3);
e.eat();
e.walk();
}
}
μ€νκ²°κ³Ό
μΆμν΄λμ€ μ¬μ© μκΈ° : μμκ΄κ³λ₯Ό μ νκ³ μ¬λΌκ°μ λ κ°μ μ‘°μν΄λμ€λ₯Ό μμνλ λ° κΈ°λ₯κΉμ§ μλ²½ν λκ°μ κΈ°λ₯μ΄ νμν κ²½μ°
μΈν°νμ΄μ€ μ¬μ© μκΈ° : μμκ΄κ³λ₯Ό μνκ³ μ¬λΌκ°μ λ λ€λ₯Έ μ‘°μν΄λμ€λ₯Ό μμνλλ° κ°μ κΈ°λ₯μ΄ νμν κ²½μ°
κ·ΈλΌ μ΄μ μΆμν΄λμ€μ μΈν°νμ΄μ€μ λν΄ κ°μ΄ μ€μλμ? μ΄μ μΆμν΄λμ€μ μΈν°νμ΄μ€μ λν΄ μμ보μμ΅λλ€.
μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€.
conference
μΆμν΄λμ€μ μΈν°νμ΄μ€μ μ©λ, μ°¨μ΄μ , 곡ν΅μ
'...' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] μλ° staticμ μλ―Έμ μ¬μ©λ² (2) | 2021.06.06 |
---|---|
μ κ°λ°μλ μλͺ»λ κΈ°μ μ νμ λ°₯ λ¨Ήλ―μ΄ νλ? (4) | 2021.06.05 |
[AWS] EC2λ₯Ό μ΄μ©νμ¬ Node.js μλ² λ°°ν¬νκΈ° (4) | 2021.05.23 |
[Java] μλ°μ λμκ³Όμ Java Compilerμ JVM (16) | 2021.05.11 |
[CA] λ°μ΄λ리 νμΌκ³Ό λ°μ΄νΈ νμΌ κ·Έλ¦¬κ³ μ»΄νμΌ, λ§ν¬ (4) | 2021.05.10 |