μΆμν λ€νμ±
Javaμμ μΈν°νμ΄μ€μ μΆμ ν΄λμ€λ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ μ€μν μμμΈ μΆμνμ λ€νμ±μ ꡬννλ λ°μ μ¬μ©νλ€. μ΄ λ κ°λ μ ν΄λμ€κ° κ°μ ΈμΌ ν νμλ μμ±μ μ μνλ λ°©λ²μ μ 곡νλ©°, νΉμ μν©μμ μ΄λ€ κ²μ μ¬μ©νλ κ²μ΄ λ μ ν©νμ§μ λ°λΌ μ ννκ² λλ€.
μΆμν(Abstraction)
μΆμνλ ꡬ체μ μΈ κ΅¬νμ μ¨κΈ°κ³ , νμν λΆλΆλ§μ μΈλΆμ μ 곡νλ κ²μ μλ―Ένλ€.μ΄λ 볡μ‘ν μμ€ν μ μΈλΆ μ¬νμ κ°μΆκ³ , νμν κΈ°λ₯λ§μ μ 곡νλ νλ‘κ·Έλλ° κΈ°λ²μ΄λ€. μλ°μμλ μΈν°νμ΄μ€ νΉμ μΆμ ν΄λμ€λ₯Ό ν΅ν΄ μ΄λ€λΌ μ μλ€.
- Interface(μΆμν) νΉμ Abstract Class(μΆμ ν΄λμ€) → (ꡬν, ꡬ체ν) ν΄λμ€ = λ°μ΄ν° + νμ
- Abstract: What 무μμ μ μ₯? / 무μμ μν? → Concrete: How μ΄λ»κ² μ μ₯? μ΄λ»κ² μν?
- "μ΄λ€ λ°μ΄ν°κ° μλμ§?" → λ°μ΄ν°: νλ(Field) νΉμ μμ±(Attribute)
- "μ΄λ€ νμκ° μλμ§?" → νμ: λ©μλ(Method)
- Abstract: What 무μμ μ μ₯? / 무μμ μν? → Concrete: How μ΄λ»κ² μ μ₯? μ΄λ»κ² μν?
- μΌλ°μ μΈ μ μ λ νλ‘κ·Έλ¨(μ΄ν리μΌμ΄μ )μ΄λ , μλμ°¨λ , μλΉμμ μμμ λ¨Ήλ μ리λ μκ°νμ§ μλλ€.
- κ·Έλ κΈ°λλ¬Έμ μΈν°νμ΄μ€λ μ μ μ μ₯μμλ§ μ¬μ©νλ©΄ λκΈ°λλ¬Έμ, κ·Έ λ΄λΆμ μ리(ꡬ체)λ μΈμ λ μ§ λ€λ°λμ΄λ λλ€.
Interface
μΈν°νμ΄μ€λ ν΄λμ€κ° κ°μ ΈμΌν νλ(λ©μλ)λ₯Ό μ μνλ νμ΄λ€. ꡬν체λ κ°μΆκ³ , νμν λ©μλλ§ λ ΈμΆνλ€. μΈν°νμ΄μ€λ μΆμ λ©μλμ μ μ λ©μλ, λν΄νΈ λ©μλλ₯Ό ν¬ν¨ν μ μλ€.
νΉμ§:
- μμ ν μΆμνλ₯Ό μ 곡νλ€. μΈν°νμ΄μ€ μ체μλ ꡬνμ΄ μκ³ , ν΄λμ€κ° λ°λμ ꡬνν΄μΌ νλ€.
- λ€μ€ μμμ μ§μνλ€. ν΄λμ€λ μ¬λ¬ μΈν°νμ΄μ€λ₯Ό λμμ ꡬνν μ μλ€.
- λν΄νΈ λ©μλ(Java 8)λ₯Ό μ¬μ©ν μ μμ΄, μΌλΆ ꡬνμ μΈν°νμ΄μ€ λ΄μμ μ 곡ν μ μλ€.
Default Method μμ
interface IClass {
public default void method() {
throw new RuntimeException("Have to be implemented");
}
}
λ€μ€ μμ κ°λ₯
interface MakingRamen extends MakingRamenWater, MakingRamenSoup {
}
public interface Vehicle {
public default void doSomething(int n) {
System.out.println("doSomething(Vehicle)");
}
}
public interface VehicleChild extends Vehicle {
}
λ€μ€ ꡬν κ°λ₯(λ¨, λμΌν λ©μλκ° μλ€λ©΄ μλμ κ°μ΄ λν΄νΈ λ©μλλ₯Ό Override ν΄μ€μΌ νλ€.)
public interface Vehicle {
public default void doSomething(int n) {
System.out.println("doSomething(Vehicle)");
}
}
public interface Movable {
public default void doSomething(int n) {
System.out.println("doSomething(Movable)");
}
}
public static class Car implements Vehicle, Movable {
@Override
public void doSomething(int n) {
Vehicle.super.doSomething(n);
Movable.super.doSomething(n);
System.out.println("doSomething(Car)");
}
}
public static void main(String args[]) {
Car car = new Car();
car.doSomething(10);
// μ€ν κ²°κ³Ό
// doSomething(Vehicle)
// doSomething(Movable)
// doSomething(Car)
- Private λ©μλλ Abstractκ° μλ ꡬνμ²΄λ‘ μΈν°νμ΄μ€ λ΄μ μ‘΄μ¬ν μ μλ€.
- μΈν°νμ΄μ€ λν΄νΈ λ©μλκ° λ±μ₯ν¨κ³Ό λμμ μΈν°νμ΄μ€ λ΄ λ©μλ νΈμΆμ΄ κ°λ₯νλ€.
- μΈν°νμ΄μ€ λ΄ μ μ λ©€λ², μ μ λ©μλ μ μκ° κ°λ₯νλ€.
- μΈν°νμ΄μ€ λ΄ μ μ λ©€λ²: `public static final` μλ―Έμμ΄ μμ κ° κ°λ₯νλ€.
- `public`: μ΄μ°¨νΌ μΈν°νμ΄μ€λ `implements`λ‘ κ΅¬νλμ΄μΌνκΈ°μ 무쑰건 `public`μ΄μ΄μΌ νλ€.
- `static`: μ΄μ°¨νΌ μΈν°νμ΄μ€λ κ°μ²΄λ‘ μΈμ€ν΄μ€νλμ§ μλλ€.
- https://1000sang-dev.tistory.com/48 κΈ μ°Έκ³ .
- `final`: μ΄μ°¨νΌ μΈν°νμ΄μ¨λ νμλ§ μ 곡ν λΏμ΄λΌ, ꡬν(ꡬ체)ν΄λμ€μμ λ³Έ νλ μ‘°μμ΄ λΆκ°λ₯νλ€.
- μΈν°νμ΄μ€ λ΄ μ μ λ©μλ: `public` μλ―Έκ° μμ΄ μμ κ° κ°λ₯νμ§λ§ `static`μ μμ κ° λΆκ°λ₯νλ€.
- `public`: μ΄μ°¨νΌ μΈν°νμ΄μ€λ `implements`λ‘ κ΅¬νλμ΄μΌνκΈ°μ 무쑰건 `public`μ΄μ΄μΌ νλ€.
- `static` μμ λΆκ°: κΈ°ν `abstract`λ `default`μ ꡬλ³νκΈ° μν¨μ΄λ€.
- μΈν°νμ΄μ€ λ΄ μ μ λ©€λ²: `public static final` μλ―Έμμ΄ μμ κ° κ°λ₯νλ€.
public interface HeroCreateRepository<T extends Hero, F> {
public static final String EXCEPTION = "have to be implemented : F save(T hero)";
public static void print() {
System.out.println(EXCEPTION);
}
default F save(T hero) {
print();
throw new RuntimeException(EXCEPTION);
}
}
- λ΄λΆμμ λ°λ‘ νΈμΆν μ μκ³ ,
HeroCreateRepository.print();
- μΈλΆμμλ μ΄λ κ² νΈμΆμ΄ κ°λ₯νλ€.
μΆμν΄λμ€ Abstract Class: ν΄λμ€μ μΈν°νμ΄μ€ μ€κ° μ±κ²©
μΆμ ν΄λμ€λ ν΄λμ€μ μΈν°νμ΄μ€μ μ€κ° μ±κ²©μ κ°κ³ μμΌλ©°, μΌλΆλ ꡬνλκ³ μΌλΆλ μΆμμ μΈ λ©μλλ₯Ό κ°μ§λ€. ꡬνμ΄ νμν λ©μλ λΏλ§μλλΌ, ꡬνλ λ©μλλ ν¬ν¨ν μ μλ€.
νΉμ§:
- λΆλΆμ μΌλ‘ ꡬνλ ν΄λμ€λ‘, νλμ λ©μλλ₯Ό ν¬ν¨ν μ μλ€.
- μμμ ν΅ν΄ νμ₯λλ©°, λ¨μΌ μμλ§ κ°λ₯νλ€.
- 곡ν΅λ κΈ°λ₯μ μ 곡νλ©΄μ, νμ ν΄λμ€μμ νΉμ κΈ°λ₯μ ꡬννλλ‘ κ°μ ν μ μλ€.
μμ
abstract class MakingRamen implements RamenProcess {
public void boiling() {
System.out.println("- λΌλ©΄μ ν¨κ» λ§λ€μ΄λ³ΌκΉμ?");
System.out.printf("1. 첫째λ‘, λ¬Όμ %S μ/λ₯Ό λ£μκ²μ.%n", water());
System.out.printf("2. λμ§Έλ‘, μ€νλ %S μ/λ₯Ό λ£μκ²μ. λ©΄λ³΄λ€ μ€νλ¨Όμ !%n", soup());
System.out.printf("3. λ§μ§λ§μΌλ‘λ, λ©΄μ %S μ/λ₯Ό ν¬μ²ν κ²μ.%n", noodle());
System.out.println("- μ, λ€ λ§λ€μμ΅λλ€. λ§μκ² λμΈμ.");
}
}
// μΆλ ₯ κ²°κ³Ό
// -λΌλ©΄μ ν¨κ» λ§λ€μ΄λ³ΌκΉμ?
// 1. 첫째λ‘, λ¬Όμ μλλ¬Ό μ/λ₯Ό λ£μκ²μ.
// 2. λμ§Έλ‘ μ€νλ μ λΌλ©΄ μ€ν μ/λ₯Ό λ£μκ²μ. λ©΄λ³΄λ€ μ€νλ¨Όμ !
// ~~~~~
class MakingSinRamen extends MakingRamen {
public String water() { return "μλλ¬Ό"; }
public String soup() { return "μ λΌλ©΄ μ€ν"; }
public String noodle() { return "건면"; }
}
class MakingJinRamen extends MakingRamen {
public String water() { return "μ μλ¬Ό"; }
public String soup() { return "μ§λΌλ©΄ μ€ν"; }
public String noodle() { return "μλ©΄"; }
}
MakingRamen letsMakingSinRamen = new MakingSinRamen();
letsMakingSinRamen.boiling();
MakingRamen letsMakingJinRamen = new MakingJinRamen();
letsMakingJinRamen.boiling();
μΆμνμ ꡬν:
μΆμ ν΄λμ€λ μΌλΆλΆ λ©μλκ° κ΅¬νλμ΄ μκ³ , λλ¨Έμ§λ ꡬ체μ μΈ ν΄λμ€μμ ꡬνλλ€. κ³΅ν΅ λ‘μ§μ μΆμ ν΄λμ€μμ μ 곡νκ³ , νΉμ λ‘μ§λ§ νμ ν΄λμ€μμ μ€λ²λΌμ΄λ ν μ μλ€.
λ€νμ±(Polymorphism)
λ€νμ±μ νλμ ν΄λμ€λ μΈν°νμ΄μ€κ° λ€μν ννλ‘ λμνλ κ²μ μλ―Ένλ€. μλ°μμ λ€νμ±μ ν΄λμ€ μμκ³Ό μΈν°νμ΄μ€ ꡬνμ ν΅ν΄ κ°λ₯νλ€.
(λΆλͺ¨) ν΄λμ€ λ€νμ±: "ν΄λμ€ μμ"μ ν΅ν
νλμ λμΌ ν΄λμ€μ λ©μλκ° "λμΌν ν΄λμ€ A ννλ₯Ό κ°κ³ μκΈ°μ" → λ€μν ꡬνμ²΄λ‘ νΈμΆλλ κ²
μμ μ½λ
class Animal {
public void sound() {
System.out.println("Animal sound");
}
}
class Dog extens Animal {
@Override
public void sound() {
System.out.println("λ©λ©");
}
}
- ν΄λμ€ μμμ ν΅ν΄ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ¬μ μνμ¬ λ€μν λμμ ꡬννλ€.
- κ°μ²΄λ λΆλͺ¨ νμ μΌλ‘ μ μΈλμ§λ§, μμ ν΄λμ€μ λ©μλλ₯Ό νΈμΆν μ μλ€.
μΈν°νμ΄μ€ λ€νμ±: "μΈν°νμ΄μ€ ꡬν"μ ν΅ν
νλμ λμΌ ν΄λμ€μ λ©μλκ° "λμΌν μΈν°νμ΄μ€ ννλ₯Ό κ°κ³ μκΈ°μ" → λ€μν ꡬνμ²΄λ‘ νΈμΆλλ κ²
μμ μ½λ
public interface Vehicle {
void drive();
}
public class Car implemets Vehicle {
public void drive() {
System.out.println("Driving a car");
}
}
- μΈν°νμ΄μ€λ₯Ό ν΅ν΄ ꡬν ν΄λμ€κ° λ€μν ꡬν체λ₯Ό κ°μ§ μ μλ€.
- λμΌν μΈν°νμ΄μ€λ₯Ό ꡬνν μ¬λ¬ ν΄λμ€λ₯Ό κ°μ νμ μΌλ‘ λ€λ£° μ μλ μ μ°μ±μ μ 곡νλ€.
μΈν°νμ΄μ€μ μΆμ ν΄λμ€μ μ°¨μ΄μ
νΉμ§ | μΈν°νμ΄μ€(Interface) | μΆμ ν΄λμ€(Abstract Class) |
ꡬν μ¬λΆ | λͺ¨λ λ©μλλ κΈ°λ³Έμ μΌλ‘ μΆμμ (Java 8 μ΄ν λν΄νΈ λ©μλ νμ©) |
μΌλΆ λ©μλλ ꡬν κ°λ₯ |
λ€μ€ μμ | λ€μ€ μμ κ°λ₯ | λ¨μΌ μμλ§ κ°λ₯ |
νλ | μμλ§ κ°λ₯(public static final) | νλ(λ©€λ² λ³μ) μ¬μ©κ°λ₯ |
μμ±μ | μμ±μλ₯Ό κ°μ§ μ μμ | μμ±μλ₯Ό κ°μ§ μ μμ |
λͺ©μ | ν΄λμ€κ° κ°μ ΈμΌ ν νλμ μ μ (ꡬνμ ν΄λμ€μ μμ) |
곡ν΅μ μΈ λμμ ꡬννλ©΄μ, νΉμ λμμ νμ ν΄λμ€μ μμ |
μΆμ λ©μλ | λͺ¨λ λ©μλλ κΈ°λ³Έμ μΌλ‘ μΆμμ (abstract) | μΆμ λ©μλμ ꡬνλ λ©μλ νΌν© κ°λ₯ |
μ¬μ© μκΈ° | λ€μ€ μμμ΄ νμνκ±°λ, μ¬λ¬ ν΄λμ€μμ λμΌν νμλ₯Ό μ μν λ | 곡ν΅λ κΈ°λ₯μ μ 곡νκ³ , μΌλΆ ꡬνμ κ°μ ν λ |
βΉοΈμ°Έκ³
[ASAC 6κΈ° κ°μμλ£]
'π»DEV-STUDY > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] SOLID μμΉ (1) | 2024.10.02 |
---|---|
[Java] Enum (0) | 2024.10.01 |
[Java] Finalκ³Ό Static (2) | 2024.09.30 |
[Java] Collection (0) | 2024.09.28 |
[Java] κ°μ²΄ μμ±νλ 3κ°μ§ λ°©λ² (0) | 2024.09.25 |