π 1. μΆμν΄λμ€λ?
public abstract class Player {
abstract void play();
abstract void stop();
}
ν΄λμ€λ₯Ό μ€κ³λλΌκ³ νλ€λ©΄, μΆμν΄λμ€(Abstract Class)λ λ―Έμμ± μ€κ³λλΌκ³ ν μ μλ€. μ¬κΈ°μ λ§νλ λ―Έμμ±μ λ¨μ§ λ―Έμμ± λ©μλ(μΆμ λ©μλ)λ₯Ό ν¬ν¨νκ³ μλ€λ μλ―Έμ΄λ€. λ―Έμμ± μ€κ³λλ‘ μμ±λ μ νμ λ§λ€ μ μλ―μ΄ μΆμ ν΄λμ€λ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€. μΆμ ν΄λμ€λ μμμ ν΅ν΄μ μμν΄λμ€μ μν΄μλ§ μμ±λ μ μλ€.
μΆμ ν΄λμ€ μ체λ‘λ ν΄λμ€λ‘μμ μν μ λ€ λͺ»νμ§λ§, μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νλ λ° μμ΄μ λ°νμ΄ λλ μ‘°μ ν΄λμ€λ‘μ μ€μν μλ―Έλ₯Ό κ°λλ€. μΆμ ν΄λμ€λ ν΄λμ€μ μΆμνλ₯Ό μ λͺ©μμΌ λ³΄λ€ κ΅¬μ‘°μ μ΄κ² κ°μ²΄λ₯Ό μ€κ³νκ³ , νλ‘κ·Έλ¨μ μ μ§λ³΄μμ±μ μ¬λ €μ£Όλ©°, λ§μΌ νλ‘κ·Έλ¨μ μ΄λ ν κΈ°λ₯μ μ κ·Έλ μ΄λνλ€κ³ νλ©΄ μμ κ³Ό μΆκ°μ λν΄ μ μ°μ μ΄κ² νμ¬, νλ¦¬ν° λμ νλ‘κ·Έλ¨κ³Ό μ루μ μ κ°λ°ν μ μκ² ν΄μ€λ€.
μ°Έκ³ λ‘ μΆμ λ©μλλ₯Ό ν¬ν¨νκ³ μμ§ μμ ν΄λμ€μλ ν€μλ 'abstract'λ₯Ό λΆμ¬μ μΆμ ν΄λμ€λ‘ μ§μ ν μλ μλ€. μΆμ λ©μλκ° μλ μμ±λ ν΄λμ€λΌ ν μ§λΌλ μΆμν΄λμ€λ‘ μ§μ λλ©΄ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
π 2. μΆμ λ©μλ
μΆμ ν΄λμ€λ μΆμ λ©μλλ₯Ό μΌλ°μ μΌλ‘ ν¬ν¨νκ³ μλλ°, μΆμ λ©μλμ λν΄μ μ΄ν΄λ³΄λλ‘ νμ. λ©μλλ μ μΈλΆμ ꡬνλΆ(λͺΈν΅)λ‘ κ΅¬μ±λμ΄ μλ€. μ μΈλΆλ§ μμ±νκ³ κ΅¬νλΆλ μμ±νμ§ μμ μ±λ‘ λ¨κ²¨ λ κ²μ΄ μΆμλ©μλλ€.
public abstract class Player {
abstract void play(); // μΆμ λ©μλ
abstract void stop(); // μΆμ λ©μλ
}
μ¦, μ€κ³λ§ ν΄ λκ³ μ€μ μνλ λ΄μ©μ μμ±νμ§ μμκΈ° λλ¬Έμ λ―Έμμ± λ©μλμΈ κ²μ΄λ€. μ€μ μμ λ΄μ©μΈ ꡬνλΆκ° μλ λ©μλκ° λ¬΄μ¨ μλ―Έκ° μμκΉ μΆκΈ°λ νκ² μ§λ§, λ©μλλ₯Ό μμ±ν λ μ€μ μμ λ΄μ©μΈ ꡬνλΆλ³΄λ€ λ μ€μν λΆλΆμ΄ μ μΈλΆμ΄λ€.
λ©μλμ μ΄λ¦κ³Ό λ©μλμ μμ μ νμν 맀κ°λ³μ, κ·Έλ¦¬κ³ μμ μ κ²°κ³Όλ‘ μ΄λ€ νμ μ κ°μ λ°νν κ²μΈκ°λ₯Ό κ²°μ νλ κ²μ μ½μ§ μμ μΌμ΄λ€. κ·Έλμ μ μΈλΆλ§ μμ±ν΄λ λ©μλμ μ λ° μ΄μμ΄ μμ±λ κ²μ΄λΌ ν΄λ κ³ΌμΈμ΄ μλλ€.
π 3. μΆμν΄λμ€ μ¬μ©λ²
μΆμν΄λμ€λ μλμ κ°μ΄ abstractλ₯Ό μ΄μ©νμ¬ μμ±ν μ μλ€.
public abstract class Player {
abstract void play();
abstract void stop();
}
κ·Έλ¦¬κ³ μΆμν΄λμ€λ‘λΆν° μμλ°λ μμν΄λμ€κ° μ€λ²λΌμ΄λ©μ ν΅ν΄ μ‘°μμΈ μΆμν΄λμ€μ μΆμ λ©μλλ₯Ό λͺ¨λ ꡬνν¨μΌλ‘μ¨ μΆμν΄λμ€μ μ¬μ©μ΄ κ°λ₯ν΄μ§λ€.
public class AudioPlayer extends Player {
@Override
void play() {
System.out.println("AudioPlayer Play~");
}
@Override
void stop() {
System.out.println("AudioPlayer Stop!!");
}
}
λ§μΌ μ‘°μμΌλ‘λΆν° μμλ°μ μΆμ λ©μλ μ€ νλλΌλ ꡬννμ§ μλλ€λ©΄, μμν΄λμ€ μμ μΆμ ν΄λμ€λ‘ μ§μ ν΄ μ£Όμ΄μΌ νλ€.
public abstract class CDPlayer extends Player{
@Override
void play() {
System.out.println("CDPlayer Play~");
}
// μΆμ λ©μλμΈ stop()μ ꡬννμ§ μμ
}
π 4. μΆμν΄λμ€μ μμ±μ
μμμ μΆμ ν΄λμ€λ₯Ό μ΄μ©νμ¬ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μλ€κ³ μΈκΈνμλ€. μ¦, μΆμ ν΄λμ€λ ν΄λμ€μ μΌμ’ μ΄λΌκ³ νμ§λ§ new μμ±μλ₯Ό ν΅ν΄ μΈμ€ν΄μ€ κ°μ²΄λ₯Ό μ§μ λ§λ€ μ μλ€. μλνλ©΄ μΆμ ν΄λμ€λ μμ ꡬ쑰μμ λΆλͺ¨ ν΄λμ€λ₯Ό λνλ΄λ μν λ‘λ§ μ΄μ©λκΈ° λλ¬Έμ΄λ€.
public abstract class Player {
abstract void play();
abstract void stop();
public Player() {
System.out.println("Player Constructor");
}
}
public static void main(String[] args) {
Player player = new Player(); // ERROR
}
λ°λΌμ λ°λμ μΆμ ν΄λμ€λ μ΄λ μμμ ν΄λμ€μ μμμν€κ³ , μμ ν΄λμ€λ₯Ό μΈμ€ν΄μ€ννμ¬ μ¬μ©ν΄μΌ νλ€.
public abstract class Player {
abstract void play();
abstract void stop();
public Player() {
System.out.println("Player Constructor!!");
}
}
public class AudioPlayer extends Player {
@Override
void play() {
System.out.println("AudioPlayer Play~");
}
@Override
void stop() {
System.out.println("AudioPlayer Stop!!");
}
}
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer(); // Player Constructor!!
}
μΈμ€ν΄μ€λ₯Ό μ§μ λ§λ€ μ μμ λΏ, super() λ©μλλ₯Ό μ΄μ©νμ¬ μΆμ ν΄λμ€μ μμ±μλ₯Ό νΈμΆν μ μλ€λ μ μ μμλλλ‘ νμ.
π 5. μΆμ ν΄λμ€μ νμ©
π 1. κ³΅ν΅ λ©€λ²μ ν΅ν©μΌλ‘ μ€λ³΅ μ κ±°
μλμ κ°μ΄ AudioPlayer, CDPlayer λͺ¨λ nameμ΄λΌλ νλμ play()μ stop()μ΄λΌλ λ©μλλ₯Ό κ°μ§λ€κ³ νμ.
public class AudioPlayer {
String name;
void play() {
System.out.println("AudioPlayer Play~");
}
void stop() {
System.out.println("AudioPlayer Stop!!");
}
}
public abstract class CDPlayer{
String name;
void play() {
System.out.println("CDPlayer Play~");
}
void stop() {
System.out.println("CDPlayer Stop!!");
}
}
μ΄λ μΆμ ν΄λμ€λ₯Ό μ΄μ©νμ¬ κ³΅ν΅ λ©€λ²λ₯Ό ν΅ν©νκ³ μ€λ³΅μ μ κ±°ν μ μλ€.
public abstract class Player {
String name;
abstract void play();
abstract void stop();
}
public class AudioPlayer extends Player {
@Override
void play() {
System.out.println("AudioPlayer Play~");
}
@Override
void stop() {
System.out.println("AudioPlayer Stop!!");
}
}
public abstract class CDPlayer extends Player {
@Override
void play() {
System.out.println("CDPlayer Play~");
}
@Override
void stop() {
System.out.println("CDPlayer Stop!!");
}
}
μ΄ λΆλΆμ΄ μΆμν΄λμ€μ μΈν°νμ΄μ€μ μ°¨μ΄λΌκ³ ν μ μλ€. Java8μ μΈν°νμ΄μ€λ μΆμν΄λμ€μ κ°μ΄ νλλ₯Ό μ μΈν΄ μ€ μ μμ§λ§, λͺ¨λ λ©€λ²λ³μλ public static finalμ΄μ΄μΌ νλ€λ μ μ½μ¬νμ΄ μλ€. μ¦, κ³΅ν΅ μμκ° λμ΄ λ²λ¦°λ€λ κ²μ΄λ€.
νμ§λ§, μΆμ ν΄λμ€λ₯Ό μ΄μ©νλ€λ©΄ μμ ν΄λμ€μμ μ€λ³΅λλ λ³μλ€μ μμμΌλ‘ λ¬Άμ΄ ν΅ν©μμΌ μ£Όλ κΈ°λ₯μ μ 곡ν μ μλ€.
π 2. ꡬνμ κ°μ μ±μ ν΅ν κΈ°λ₯ 보μ₯
abstractλ₯Ό λΆμ¬μ μΆμλ©μλλ‘ μ μΈνλ μ΄μ λ μμ ν΄λμ€μμ μΆμ λ©μλλ₯Ό λ°λμ ꡬννλλ‘ κ°μνκΈ° μν΄μλ€
Animalμ΄λΌλ μΆμν΄λμ€κ° μκ³ μ΄κ²μ μμν΄λμ€κ° μμνλ€κ³ κ°μ ν΄ λ³΄μ.
public abstract class Animal {
abstract void eat();
}
public class Dog extends Animal {
@Override
void eat() {
System.out.println("Dog is eating!!");
}
}
public class Cat extends Animal {
@Override
void eat() {
System.out.println("Cat is eating!!");
}
}
public static void main(String[] args) {
Animal[] animals = {new Dog(), new Cat()};
for(Animal animal : animals){
animal.eat();
}
}
// μΆλ ₯
Dog is eating!!
Cat is eating!!
μ¬κΈ°μ Catμ΄λΌλ μλ‘μ΄ λλ¬Όμ΄ μΆκ°λμλ€κ³ μκ°ν΄ 보μ. λ§μ΅ Cat ν΄λμ€κ° eat()μ΄λΌλ μΆμ λ©μλλ₯Ό ꡬννμ§ μμκ³ , κ·Έλ¦¬κ³ μ΄κ²μ΄ λ¬Έμ κ° λμ§ μλλ€λΌκ³ νλ©΄ λ€μ μ½λμμ λ°νμ μν©μμ λ¬Έμ κ° λ°μν κ²μ΄λ€.
public class Lion extends Animal{
}
public static void main(String[] args) {
Animal[] animals = {new Dog(), new Cat(), new Lion()};
for(Animal animal : animals){
animal.eat();
}
}
Lionμ eat()μ μ€λ²λΌμ΄λ© νμ§ μμκΈ° λλ¬Έμ animal λ°°μ΄ μμ μλ Lionμ eat() λ©μλλ₯Ό μ€νν μ μλ€.
νμ§λ§, μΆμ ν΄λμ€λ ꡬνμ κ°μ νκΈ° λλ¬Έμ μ»΄νμΌ μμ μ eat()μ ꡬννμ§ μμ κ²μ μ μ μμ΄μ μμ κ°μ λ¬Έμ κ° λ°μνμ§ μλλ‘ ν΄μ€λ€.
π 3. κ·κ²©μ λ§λ μ€κ³ ꡬν
μΆμ ν΄λμ€λ₯Ό μμνκ² λλ©΄ 미리 κ·κ²©μ λ§κ² μ μΈλΆκ° μμ±λμ΄ μκΈ° λλ¬Έμ μ μΈλΆλ₯Ό κ³ λ―Όν νμ μμ΄ κ΅¬νλΆλ§ μμ±νμ¬ κ·κ²©μ λ§κ² μ€κ³λ₯Ό ꡬνν μ μλ€.
ν΄λΉ κΈμ
λ¨κΆμ± λμ 'μλ°μ μ μ',
Inpa λμ 'μΆμ ν΄λμ€(Abstract) μ©λ μλ²½ μ΄ν΄νκΈ°'
λ₯Ό μ°Έκ³ νμμ΅λλ€.
'π JAVA > μ£Όμ κ°λ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μΆμν΄λμ€(Abstract Class) VS μΈν°νμ΄μ€(Interface) (1) | 2023.06.13 |
---|---|
μΈν°νμ΄μ€(Interface) (0) | 2023.06.13 |
μ λ€λ¦(Generics) - 곡λ³(Covariant), λΆκ³΅λ³(Invariant), λ°κ³΅λ³(Contravariant) (0) | 2023.05.29 |
νλ³ν(μΊμ€ν , Casting) - μ μΊμ€ν (Up-Casting), λ€μ΄μΊμ€ν (Down-Casting) (0) | 2023.05.24 |
μ λ€λ¦(Generics) - κΈ°λ³Έ κ°λ (0) | 2023.05.13 |