π§ 1. μμμ΄ λμ£ ?
νμ€μΈκ³μμμ μμμ, λΆλͺ¨κ° μμμκ² μ¬μ°μ λ¬Όλ €μ£Όλ κ²μ μλ―Έν©λλ€. μμμ μμμ λ°μΌλ©΄ λΆλͺ¨κ° κ°μ§κ³ μλ μμμ κ·Έλλ‘ μ»κ² λ©λλ€. μμμ ν΄μ£Όλ©΄ νμ€μΈκ³μ λΆλͺ¨λ μ¬μ°μ λ¬Όλ €μ€¬κΈ° λλ¬Έμ λ¨λ μ¬μ°μ΄ μμ§λ§, μλ°μ μμμ κ·Έλ μ§ μμ΅λλ€.
μλ°μμμ μμ(Inheritance
)μ, λΆλͺ¨ ν΄λμ€μ νλμ λ©μλλ₯Ό λ¬Όλ €λ°μ΅λλ€.
class Parent{
// νλ
public String value1;
// λ©μλ
public String getValue1(){
return this.value1;
}
}
μ¦, Parent
ν΄λμ€λ₯Ό μμλ°λ Child
κ° μλ€λ©΄, ν΄λΉ Child
ν΄λμ€λ λΆλͺ¨μ value1
νλμ, getValue1
λ©μλ λͺ¨λ κ°κ² λ©λλ€.
κ·Έλ λ€κ³ μμμ ν΄μ€ Parent
λ μ무κ²λ λ¨μ§ μλ κ²μ΄ μλλΌ, Parent
ν΄λμ€ κ·Έλλ‘λ μ¬μ©μ΄ κ°λ₯ν©λλ€.
νμ€μΈκ³μ μ‘°κΈ λ λ€λ₯Έ μ μ, μμ ν΄λμ€κ° μμλ°κ³ μΆμ λΆλͺ¨ ν΄λμ€λ₯Ό μ νν΄μ λ¬Όλ €λ°λλ€λ μ μ΄ μ‘°κΈ λ€λ₯΄κ² λ€μ.
κ·Έλ λ€λ©΄ μ μ¬μ°μ λ¬Όλ €μ£Όλ κ²μ΄ μλλΌ μΌλΆλ§ λ¬Όλ €μ£Όλ κ²½μ°λ μμκΉμ?
λ¬Όλ‘ μμ΅λλ€.
class Parent{
// νλ
public String value1;
private String value2;
// λ©μλ
public String getValue1(){
return this.value1;
}
}
μμνκ³ μΆμ§ μμ νλμλ μ κ·Όμ μ΄μ private
μ λΆμ΄λ©΄, Child
μλ μμλμ§ μμ΅λλ€. (ν¨ν€μ§κ° λ€λ₯Έ κ²½μ° default
μ κ·Όμ μ΄μλ μμ λΆκ°.)
μ΄μ²λΌ, μμμ λΆλͺ¨ ν΄λμ€μ νλμ λ©μλλ₯Ό λ¬Όλ €λ°μ μ μλ λ°©λ²μ μλ―Έν©λλ€.
π‘ 2. μμμ μ¬μ©νλ λ°©λ²
2-1. μμμ μ μΈ
μμμ μ μΈμ extends
ν€μλλ₯Ό ν΅ν΄ μμ κ΄κ³λ₯Ό μ μΈν μ μμ΅λλ€.
class Child extends Parent{
... μλ΅
}
Javaμμλ λ€μ€ μμμ΄ λΆκ°λ₯ν©λλ€. μ¦ νλμ μμ ν΄λμ€λ λ κ° μ΄μμ λΆλͺ¨ ν΄λμ€λ₯Ό κ°μ§ μ μμ΅λλ€. μ€λ‘μ§ ν κ°μ λΆλͺ¨ ν΄λμ€λ§ κ°μ§ μ μμ΅λλ€.
λΆλͺ¨ ν΄λμ€μ κ²½μ°, μ¬λ¬ μμ ν΄λμ€μκ² μμμ΄ κ°λ₯νκ³ λΆλͺ¨ ν΄λμ€ μμ μ‘°λΆλͺ¨ ν΄λμ€μκ² μμμ λ°μ μ μμ΅λλ€.
class Son extends Parent{
// κ°λ₯
}
class Daughter extends Parent{
// κ°λ₯
}
class Parent extends GrandParent{
// κ°λ₯
}
class Dumb extends Parent, OtherParent{
// λΆκ°λ₯!!!
}
2-2. λΆλͺ¨ μμ±μμ νΈμΆ : super()
μλ°μμ μμ κ°μ²΄λ₯Ό μμ±νλ©΄ λΆλͺ¨ κ°μ²΄λ₯Ό λ¨Όμ μμ±ν ν, μμ κ°μ²΄κ° λμ€μ μμ±λ©λλ€.
λ§μ½ μ½λ μμμ λΆλͺ¨ κ°μ²΄λ₯Ό μμ±νλ κ³Όμ μ΄ μλλΌλ, λ΄λΆμ μΌλ‘ λΆλͺ¨ κ°μ²΄λ₯Ό μμ±ν ν, μμ κ°μ²΄κ° μμ±λ©λλ€.
κ°μ²΄κ° μμ±λ λ, κ°μ²΄μ μμ±μκ° μλμΌλ‘ νΈμΆλ©λλ€. λ°λΌμ μμ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνλ©΄, μ°μ μ μΌλ‘ λΆλͺ¨ ν΄λμ€μ μμ±μκ° νΈμΆλ©λλ€.
λ§μ½, λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό λ°λ‘ λͺ μνμ§ μμΌλ©΄, λΆλͺ¨ ν΄λμ€λ κΈ°λ³Έ μμ±μ(νλΌλ―Έν°κ° νλλ μλ)λ₯Ό κ°κ² λκ³ μ΄λ₯Ό μ»΄νμΌλ¬κ° μμμ νΈμΆνκ² λ©λλ€.
μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆν΄μΌ νλ―λ‘, λ΄λΆμ μΌλ‘ super();
λ₯Ό νΈμΆνκ² λ©λλ€.
λ°λ©΄μ, λΆλͺ¨ ν΄λμ€μ μμ±μκ° λͺ μλμ΄μλ€λ©΄, μμ ν΄λμ€λ ν΄λΉ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό ν΅ν΄μ λΆλͺ¨ ν΄λμ€λ₯Ό μ°μ λ§λ€μ΄μΌ ν©λλ€.
μ΄λ μμ ν΄λμ€ λ΄λΆμ μ§μ super(xx, xx ...);
λ‘ μ μΈμ ν΄μ£Όμ΄μΌ ν©λλ€. (μ»΄νμΌλ¬κ° μμμ νΈμΆ κ°λ₯ν μμμ κΈ°λ³Έ μμ±μλΏμ
λλ€.)
class NoConstructorParent{
String v1;
String v2;
}
class ConstructorParent{
String v1;
String v2;
ConstructorParent(String _v1, String _v2){
this.v1 = _v1;
this.v2 = _v2;
}
}
class Child1 extends NoConstructorParent{
public Child1(String _v1, String _v2){
// super(); μλ νΈμΆ
this.v1 = _v1;
this.v2 = _v2;
}
}
class Child2 extends ConstructorParent{
public Child2(String _v1, String _v2){
super(_v1, _v2); // λ°λμ κ°λ°μκ° νΈμΆ
}
}
2-3. μμ κ΄κ³μμ Lombok
μ @Builder
μ¬μ©
Lombok
λΌμ΄λΈλ¬λ¦¬μλ @Builder
κ° μμ΅λλ€.
μ΄ @Builder
μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ νλΌλ―Έν°λ₯Ό νμ©ν΄ λΉλ ν¨ν΄μ μλμΌλ‘ μμ±ν΄μ€λλ€.
μ΄ λ λΆλͺ¨μ μμ ν΄λμ€ λͺ¨λ @Builder
μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄, μ»΄νμΌ μλ¬κ° λ°μν©λλ€!
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ, Lombok
μμ μ 곡νλ @SuperBuilder
μ΄λ
Έν
μ΄μ
μ μ¬μ©ν΄μΌ ν©λλ€.
μμ ν΄λμ€ μΈμ€ν΄μ€λ₯Ό Lombok
λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©ν΄ λΉλ ν¨ν΄μΌλ‘ μμ±νκ³ μΆλ€λ©΄, μμκ³Ό λΆλͺ¨ ν΄λμ€ λͺ¨λ @SuperBuilder
μ΄λ
Έν
μ΄μ
μ λΆμ¬μ£Όλ©΄ λ©λλ€.
@SuperBuilder
class Child extends Parent{
... μλ΅
}
@SuperBuilder
class Parent{
... μλ΅
}
// Child.builder()λ₯Ό ν΅ν΄ λΆλͺ¨ ν΄λμ€μ νλλ λΉλ ν¨ν΄μΌλ‘ μμ± κ°λ₯!
μμΈν λ΄μ©μ λ€λ₯Έ κΈλ‘ ν¬μ€ν νλλ‘ νκ² μ΅λλ€.
2-4. λ©μλ μ€λ²λΌμ΄λ©κ³Ό @Override
λ©μλ μ€λ²λΌμ΄λ©μ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ μ‘΄μ¬νλ λ©μλμ λμΌν νλΌλ―Έν°λ₯Ό κ°λ λ©μλλ₯Ό μ¬μ μν΄μ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό κ°μΆλ κΈ°μ μ λλ€.
λ©μλ μ€λ²λΌμ΄λ©κ³Ό μ€λ²λ‘λ©μ΄ μλ°μμ μ΄λ€ μμΌλ‘ μ΄λ€μ§λμ§ μ λνλΈ κΈμ΄ μμΌλ, μ°Έκ³ νμλ©΄ λ§μ λμμ μ»μΌμ€ κ²λλ€.
μ€λ²λΌμ΄λ©μ λ¨μν μμ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€κ° κ°μ§κ³ μλ λ©μλμ κ°μ νμ(λ¦¬ν΄ νμ , λ©μλ λͺ , νλΌλ―Έν°)μΌλ‘ μμ±νλ©΄ μλμΌλ‘ μ€λ²λΌμ΄λ© μ μ©μ΄ λ©λλ€.
@Override
μ΄λ
Έν
μ΄μ
μ, μ€μ λ‘ ν΄λΉ μ΄λ
Έν
μ΄μ
μ λ¬μμΌ μ€λ²λΌμ΄λ©μ΄ λλ κ²μ΄ μλλΌ ν΄λΉ λ©μλκ° μ€λ²λΌμ΄λ νλ€λ κ²μ λͺ
μν΄μ£Όλ μ΄λ
Έν
μ΄μ
μ΄κ³ μ»΄νμΌλ¬μκ² λ¬Έλ²μ²΄ν¬λ₯Ό μ λνλ κΈ°λ₯μ κ°μ΅λλ€. (λΆλͺ¨μ μλ νμμ λ©μλλ₯Ό μμ ν΄λμ€μ λ©μλ μμ @Override
λ₯Ό λ¬λ©΄ μ»΄νμΌ μ€λ₯κ° λ°μν©λλ€.)
class Parent{
public void greet(){
System.out.println("μλ
νμΈμ");
}
}
class Child extends Parent{
@Override
public void greet(){
System.out.println("μλ
?");
}
}
Child child = new Child();
child.greet() // "μλ
?"
2-5. μμκ³Ό λ€νμ±(polymorphism
)
λ€νμ±μ, νλμ κ°μ²΄κ° μ¬λ¬κ°μ§ νμ μ κ°μ§ μ μλ κ²μ μλ―Έν©λλ€.
μλ°μμλ λΆλͺ¨ ν΄λμ€ νμ μ μ°Έμ‘° λ³μλ‘ μμ ν΄λμ€ νμ μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν μ μλλ‘ ν΄ λ€νμ±μ ꡬνν μ μμ΅λλ€.
μ½λλ‘ λ³΄λ©΄ λ€μκ³Ό κ°μ΅λλ€.
class Parent {...}
class Child extends Parent {...}
// λΉμ°ν νμ©
Parent pa = new Parent();
Child ch = new Child();
// νμ© (λΆλͺ¨ ν΄λμ€ νμ
μ μ°Έμ‘° λ³μ pcλ‘ μμ ν΄λμ€ νμ
μ μΈμ€ν΄μ€ new Child()λ₯Ό μ°Έμ‘°νλλ‘ ν¨.)
Parent pc = new Child();
// μ€λ₯ λ°μ.
Child cp = new Parent();
2-6. μμκ³Ό instanceof
λ€νμ±μΌλ‘ μΈν΄, λ°νμ μ€μ μ°Έμ‘° λ³μκ° μ€μ λ‘ μ°Έμ‘°νκ³ μλ μΈμ€ν΄μ€μ νμ μ νμΈν νμμ±μ΄ μμ΅λλ€.
μ΄λ, instanceof
μ°μ°μλ₯Ό ν΅ν΄μ μΈμ€ν΄μ€μ μ€μ νμ
μ νμΈνλλ‘ λμμ€λλ€.
class Parent{...}
class Child extends Parent{...}
Parent p = new Parent();
p instanceof Parent; // true
p instanceof Child; // false
π§ 3. νν μλ €μ§ μμμ νλ μ΄μ
μμμ νλ©΄, 곡ν΅μ μΈ λΆλΆμ κ°μ§κ³ μλ μμ ν΄λμ€λ₯Ό νμ©νλ©΄μλ, νμ ν΄λμ€λ λ³ΈμΈ κ³ μ μ μνμ νλμ μ μν μ μμ΅λλ€.
λν μμμ ν΅ν΄μ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ νΉμ§μΈ λ€νμ±μ λ§μ‘±ν μ μμ΅λλ€.
μ½λμ νμ₯μ±, μ¬μ¬μ©μ±μ΄ μ©μ΄νκ³ μ€λ³΅λ μ½λλ₯Ό μμ ν΄λμ€λ‘ λͺ°μ λ£μ μ μμΌλ―λ‘ μ½λκ° κ°κ²°ν΄μ§λλ€. κ²°κ³Όμ μΌλ‘λ μ μ§λ³΄μμ μ©μ΄μ±μ μν΄μ νμν κ²μ΄ λ°λ‘ μμμ΄μ£ .
κ·Έλ μ§λ§ μμμ μ₯μ λ§ μμ§ μμ΅λλ€.
μμμ μ¬μ©νμ λμ λ¨μ μ΄ μΉλͺ μ μΌ μ μκΈ° λλ¬Έμ, κΌ μ¬μ©ν΄μΌ νλ κ²μΈμ§ κΌΌκΌΌν λ°μ Έκ°λ©° μ¬μ©ν΄μΌν©λλ€.
μμμ μ₯λ¨μ κ³Ό, κ·ΈλΌ μ΄λ€ κ²½μ°μ μμμ μ¬μ©ν΄μΌ νλμ§ λ€μ κΈμμ λ°μ Έλ³΄λλ‘ νκ² μ΅λλ€.
π μΆμ²/μΈμ©
https://blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220960019390
https://chanhuiseok.github.io/posts/java-1/
https://mangkyu.tistory.com/193
https://velog.io/@pearl0725/Override-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%9D%98-%EC%9D%98%EB%AF%B8%EC%99%80-%EC%82%AC%EC%9A%A9-%EC%9D%B4%EC%9C%A0%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
http://www.tcpschool.com/java/java\_polymorphism\_concept
'β μλ° : JAVA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Effective Java] μμ±μ λμ μ μ ν©ν°λ¦¬ λ©μλ μ¬μ©νκΈ° (0) | 2023.01.06 |
---|---|
[Java] μλ° μ§λ ¬ν (Serialization) (1) | 2023.01.06 |
[Java] μμλμ ꡬμ±(Composition)μ μ¬μ©νμ (0) | 2022.12.08 |
[Java] μμμ μ₯λ¨μ , μμμ μΈμ μ¨μΌ νλκ°? (1) | 2022.12.07 |