[ μΆμ λ©μλ(abstract method) ]
[ μΆμ λ©μλ ]
- νμ ν΄λμ€μμ λ°λμ μ€λ²λΌμ΄λ© ν΄μΌνλ λ©μλ
- μΆμ λ©μλκ° ν¬ν¨λ ν΄λμ€λ₯Ό μμλ°λ νμ ν΄λμ€κ°
μΆμ λ©μλλ₯Ό ꡬννκΈ° μν΄ μ¬μ©
- μΆμ λ©μλλ μ μΈλΆλ§μ΄ μ‘΄μ¬νλ©° ꡬνλΆλ μμ± x
[ νμ ]
abstract λ°ννμ
λ©μλλͺ
( );
[ μΆμ ν΄λμ€(abstract class) ]
[ μΆμ ν΄λμ€ ]
- νλ μ΄μμ μΆμ λ©μλλ₯Ό ν¬ν¨νλ ν΄λμ€
- κ°μ μ§ν₯νλ‘κ·Έλλ°μμ μ€μν νΉμ§μΈ λ€νμ±μ κ°μ§λ λ©μλμ μ§ν©μ μ μ
- μΆμ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ μμ μ μνμ λΆν μ΄ κ°λ₯, λ 벨 λ¨μ ꡬ쑰 ννλ‘ κ΄λ¦¬ κ°λ₯
- μΆμ ν΄λμ€λ μ체μ μΌλ‘ κ°μ²΄ μμ±μ΄ λΆκ°λ₯ νλ―λ‘
λ°λμ νμ ν΄λμ€λ₯Ό ν΅ν μΆμ λ©μλλ₯Ό λ¨Όμ ꡬνν΄μΌ ν κ°μ²΄ μμ±μ ν΄μΌν¨.
[ μΆμ ν΄λμ€ μμ ]
// -- abstract class --
abstract class EmptyCan{
// -- abstract method --
public abstract void sound();
public abstract void who();
// μΆμ ν΄λμ€μ νΉμ§ : μΌλ° λ©μλ λν κ°μ§ μμμ
public void doSth() {
sound();
who();
}
}
public class AbstractClassTest extends EmptyCan{
// -- method overriding --
public void sound() {
System.out.println("EmptyCan : λΉ κΉ‘ν΅μ μλ¦¬κ° μλνλ€");
}
public void who() {
System.out.println("EmptyCan : λλ λΉ κΉ‘ν΅μ
λλ€.");
}
public void sayHello() {
System.out.println("NewCan : μΆμν΄λμ€ ν
μ€νΈμ
λλ€.");
}
public static void main(String[] args) {
AbstractClassTest nc = new AbstractClassTest();
// EmptyCan ec = new EmptyCan(); -- Error : μΆμ ν΄λμ€λ μΈμ€ν΄μ€ μμ± λΆκ°
EmptyCan ec = nc; // μΆμ ν΄λμ€λ₯Ό μμλ°μ μ¬μ μν νμ ν΄λμ€μ΄κΈ° λλ¬Έμ μ€λ₯ λ°μ x
ec.sound();
ec.who();
// ec.sayHello();
nc.sayHello();
ec.doSth();
}
}
/* [μΆλ ₯ κ²°κ³Ό]
EmptyCan : λΉ κΉ‘ν΅μ μλ¦¬κ° μλνλ€
EmptyCan : λλ λΉ κΉ‘ν΅μ
λλ€.
NewCan : μΆμν΄λμ€ ν
μ€νΈμ
λλ€.
EmptyCan : λΉ κΉ‘ν΅μ μλ¦¬κ° μλνλ€
EmptyCan : λλ λΉ κΉ‘ν΅μ
λλ€.
*/
[ μΈν°νμ΄μ€(interface) ]
[ μΈν°νμ΄μ€ ]
- μΆμ λ©μλλ§μ ν¬ν¨νλ μΆμν΄λμ€μ μΌμ’
- λ©μλλ 묡μμ μΌλ‘ public abstractλ‘ μ μΈ
- μΈν°νμ΄μ€μ μ μν λ³μλ public static final ν€μλλ₯Ό μλ΅ν΄λ
μλμΌλ‘ public static finalμ΄ μ μ©λμ΄ μμλ‘ μ μΈλλ€.
- ꡬνμ μν΄ implements ν€μλλ₯Ό μ¬μ©
- extends ν€μλλ₯Ό ν΅ν μμμΌλ‘λ λ€μ€ μμμ μ§μνμ§ μκΈ° λλ¬Έμ
implementsλ₯Ό ν΅ν λ€μ€ μμμΌλ‘ μ΄λ₯Ό ν΄κ²°
- μ체μ μΌλ‘ κ°μ²΄ μμ±μ΄ λΆκ°λ₯ νκΈ° λλ¬Έμ Implementsλ₯Ό μ¬μ©νμ¬
μμ(ꡬν)λ°μ νμ ν΄λμ€(ꡬν체)μμ λ°λμ overrideλ₯Ό ν΅ν΄ ꡬν νμ
- μΈν°νμ΄μ€λ μΆμν΄λμ€μ μΌμ’ μ΄κΈ° λλ¬Έμ ꡬνμ λ°λ ꡬν체μμ
μΈν°νμ΄μ€μ λ©μλλ₯Ό λ°λμ ꡬνν΄μΌ νλ€λ κ°μ μ±μ κ°μ§
[ μΈν°νμ΄μ€ μ¬μ© μμ 1 ]
class Animal{
String name;
void setName(String name) {
this.name = name;
}
}
// Animal ν΄λμ€λ₯Ό μμλ°λ Ant, Panda ν΄λμ€
class Ant extends Animal{ }
class Panda extends Animal { }
// κ°μ²΄λ₯Ό μ λ¬λ°μ κ°μ²΄μ λ°λΌ λ€λ₯Έ μΆλ ₯μ μννλ AnimalBarking ν΄λμ€
class AnimalBarking {
void barking(Ant ant) {
System.out.println("κ°λ―Έλ κ°¬κ°¬...");
}
void barking(Panda panda) {
System.out.println("νλ€λ νν...");
}
}
public class TestCode {
public static void main(String[] args) {
Ant ant = new Ant();
Panda panda = new Panda();
AnimalBarking ab = new AnimalBarking();
ab.barking(ant);
ab.barking(panda);
}
}
/* [μΆλ ₯ κ²°κ³Ό]
κ°λ―Έλ κ°¬κ°¬...
νλ€λ νν...
*/
μμ μμ μμλ Animal ν΄λμ€λ₯Ό μμλ°λ Ant, Panda ν΄λμ€μ,
Ant, Panda λ κ°μ²΄λ₯Ό λ§€κ°λ³μλ‘ μ λ¬λ°μ μΆλ ₯νλ barking() λ©μλλ₯Ό κ°μ§
AnimalBarking ν΄λμ€κ° μμ±λμ΄ μλ€.
λ§μ½ AnimalBarking ν΄λμ€μμ μ€λ²λ‘λ©νκ³ μλ barking() λ©μλκ° λ¨μ§ Ant, Panda
λ κ°μ²΄λ₯Ό μ λ¬λ°λ κ²μ΄ μλλΌ λ¬΄μν λ§μ κ°μ²΄λ₯Ό λ§€κ°λ³μλ‘μ μ λ¬λ°μ κ²½μ°
λ§€λ² λ§€κ°λ³μ νμ μ΄ λ€λ₯Έ ννλ‘ μ€λ²λ‘λ©μ ν΄μ€μΌ νλ€.
[ μΈν°νμ΄μ€ μ¬μ© μμ 2 ]
// Snail, Dog ν΄λμ€κ° μΆκ°λ κ²½μ°
(... μλ΅ ...)
class Ant extends Animal{ }
class Panda extends Animal{ }
class Snail extends Animal{ }
class Dog extends Animal{ }
class AnimalBarking {
void barking(Ant ant) {
System.out.println("κ°λ―Έλ κ°¬κ°¬...");
}
void barking(Panda panda) {
System.out.println("νλ€λ νν...");
}
void barking(Snail snail) {
System.out.println("λ¬ν½μ΄λ νν...");
}
void barking(Dog dog) {
System.out.println("κ°μμ§λ λλ...");
}
}
(... μλ΅ ...)
μμ μ½λμ κ°μ΄ barking() λ©μλλ₯Ό λ§€λ² μ€λ²λ‘λ©ν΄μΌ νλ€.
μ΄λ΄ κ²½μ° μλμ κ°μ΄ μΈν°νμ΄μ€λ₯Ό νμ©νμ¬ μμ ν μ μλ€.
[ μΈν°νμ΄μ€ μμ 3 ]
// Interfaceλ λ³Έλ λ³κ°μ νμΌλ‘ μ μ₯νλ κ²μ΄ μΌλ°μ μ΄λ€
interface AnimalInterface{
// μΆμ λ©μλ μ μΈ
String getName(); // 묡μμ μΌλ‘ abstractλ‘ μ μΈ
abstract String getBarking();
}
class Animal{
String name;
void setName(String name) {
this.name = name;
}
}
// Animal ν΄λμ€λ₯Ό μμλ°λ Ant, Panda, Snail ν΄λμ€
class Ant extends Animal implements AnimalInterface{
@Override
public String getName() {
return "κ°λ―Έ";
}
@Override
public String getBarking() {
return "κ°¬κ°¬...";
}
}
class Panda extends Animal implements AnimalInterface{
@Override
public String getName() {
return "νλ€";
}
@Override
public String getBarking() {
return "νν...";
}
}
class Snail extends Animal implements AnimalInterface{
@Override
public String getName() {
return "λ¬ν½μ΄";
}
@Override
public String getBarking() {
return "νν...";
}
}
class AnimalBarking {
// interface κ°μ²΄λ₯Ό λ§€κ°λ³μλ‘ λ°μ μ μκ² λ³κ²½
void barking(AnimalInterface a_interface) {
System.out.println(a_interface.getName() + "λ " + a_interface.getBarking());
}
}
public class TestCode {
public static void main(String[] args) {
Ant ant = new Ant();
Panda panda = new Panda();
Snail snail = new Snail();
AnimalBarking ab = new AnimalBarking();
ab.barking(ant);
ab.barking(panda);
ab.barking(snail);
}
}
/* [μΆλ ₯ κ²°κ³Ό]
κ°λ―Έλ κ°¬κ°¬...
νλ€λ νν...
λ¬ν½μ΄λ νν...
*/
μΈν°νμ΄μ€λ₯Ό νμ©ν μ½λμμ Ant, Panda, Snailκ³Ό κ°μ ν΄λμ€λ€μ
AnimalInterfaceλΌλ μΈν°νμ΄μ€λ₯Ό μμ(ꡬν)λ°κ³ μλ€.
μ΄λ ꡬνλ°μ κ° ν΄λμ€λ€μ μΈν°νμ΄μ€μμ λͺ μλμ΄ μλ μΆμ λ©μλμΈ
getName()κ³Ό getBarking()μ λ°λμ ꡬν(μ€λ²λ‘λ©)ν΄μ€μΌ νλ€.
μΈν°νμ΄μ€λ₯Ό νμ©νλ©΄ μμ κ°μ΄ 곡λ μμ μ μν ν΄λμ€κ° λμ΄λλλΌλ
ν κ°μ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ ν΄κ²° κ°λ₯νλ€.
[ κΈ°λ³Έ λ©μλ(Default Methods) ]
- JDK 8λ²μ μ΄νλ‘λΆν° κΈ°λ³Έ λ©μλ(Default method) μ¬μ© κ°λ₯
- λ³Έλ μΈν°νμ΄μ€μ λ©μλλ μΆμλ©μλλ‘μ ꡬν체λ₯Ό κ°μ§ μ μμ
- κΈ°λ³Έ λ©μλλ₯Ό μ¬μ©νλ©΄ ꡬνλ ννμ λ©μλ μμ± κ°λ₯
- κΈ°λ³Έ λ©μλμ κ²½μ° λ©μλμ λ°ννμ μμ default ν€μλλ₯Ό λΆμ¬ μ μΈ
[ κΈ°λ³Έ λ©μλ μμ ]
interface AnimalInterface{
String getName();
String getBarking();
// κΈ°λ³Έ λ©μλ(default method) μ μΈ
default void animalBarking() {
System.out.println(getName() + "λ " + getBarking());
}
}
class Animal{
String name;
void setName(String name) {
this.name = name;
}
}
// Animal ν΄λμ€λ₯Ό μμλ°λ Ant, Panda ν΄λμ€
class Ant extends Animal implements AnimalInterface{
@Override
public String getName() {
return "κ°λ―Έ";
}
@Override
public String getBarking() {
return "κ°¬κ°¬...";
}
}
class Panda extends Animal implements AnimalInterface{
@Override
public String getName() {
return "νλ€";
}
@Override
public String getBarking() {
return "νν...";
}
}
class Snail extends Animal implements AnimalInterface{
@Override
public String getName() {
return "λ¬ν½μ΄";
}
@Override
public String getBarking() {
return "νν...";
}
}
/*
class AnimalBarking {
// interface κ°μ²΄λ₯Ό λ§€κ°λ³μλ‘ λ°μ μ μκ² λ³κ²½
void barking(AnimalInterface a_interface) {
System.out.println(a_interface.getName() + "λ " + a_interface.getBarking());
}
}
*/
public class TestCode {
public static void main(String[] args) {
Ant ant = new Ant();
Panda panda = new Panda();
Snail snail = new Snail();
ant.animalBarking();
panda.animalBarking();
snail.animalBarking();
}
}
κΈ°λ³Έ λ©μλλ₯Ό νμ©νλ©΄ λ°λ‘ Animalbarking ν΄λμ€ μμ΄ μΈν°νμ΄μ€μμμ ꡬνμ ν΅ν΄ μΆλ ₯ κ°λ₯.
λν κΈ°λ³Έ λ©μλλ μ€μ ν΄λμ€μμ μ€λ²λΌμ΄λ©νμ¬ λ€λ₯΄κ² ꡬννμ¬ μ¬μ© κ°λ₯ν¨
[ μ€νν± λ©μλ(Static Methods) ]
- JDK 8λ²μ μ΄νλ‘λΆν° μ¬μ© κ°λ₯
- μΈν°νμ΄μ€μ μ€νν± λ©μλλ₯Ό ꡬνν κ²½μ° `μΈν°νμ΄μ€λͺ .μ€νν±λ©μλλͺ `μ²λΌ
μΌλ° ν΄λμ€μ μ€νν± λ©μλμ κ°μ΄ μ¬μ© κ°λ₯.
[ μ€νν± λ©μλ μμ ]
interface AnimalInterface{
static void display() {
System.out.println("AnimalInterfaceμ μ€νν± λ©μλμ
λλ€.");
}
}
public class TestCode {
public static void main(String args[]){
// μΌλ° ν΄λμ€μ μ€νν± λ©μλμ κ°μ΄ κ°μ²΄ μμ±μμ΄ νΈμΆ κ°λ₯
AnimalInterface.display();
}
}
/* [μΆλ ₯ κ²°κ³Ό]
AnimalInterfaceμ μ€νν± λ©μλμ
λλ€.
*/