DevLog πΆ
[μ΄ν©ν°λΈμλ°] μμ΄ν 01. μμ±μ λμ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό κ³ λ €νλΌ λ³Έλ¬Έ
[μ΄ν©ν°λΈμλ°] μμ΄ν 01. μμ±μ λμ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό κ³ λ €νλΌ
dolmeng2 2023. 2. 28. 00:44π¬ μ΄ν©ν°λΈμλ° μ±ν° 1μ μ½κ³ μ 리ν κΈμ λλ€.
βοΈ μ μ ν©ν°λ¦¬ λ©μλλ?
μ°ν μ½ λ―Έμ μ μ§ννλ©΄μ, μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μ λ§ λ§μ΄ μ¬μ©νμλ€. μ μ ν©ν°λ¦¬ λ©μλλ, ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°ννλ μ μ λ©μλμ΄λ€. μ¦, μμ±μ μν μ νλ©΄μλ κ°μ²΄λ₯Ό μμ±νκΈ° μ μ 1μ°¨μ μΌλ‘ ν΅κ³Όνλ 'λ¬Έ' κ°μ μ‘΄μ¬λΌκ³ λ λ³Ό μ μλ€. μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μ¬μ©νλ©΄ μ΄λ€ μ μ΄ μ’μκΉ?
π¬ λμΌν μκ·Έλμ²λΌλ, μ΄λ¦μ λ°λΌ μλ‘κ² μμ±ν΄μ€ μ μλ€.
μ΄λ λ , μ°ν μ½μ ν¬λ£¨ μ μ²μ νκΈ° μν΄ μ μ²μλ₯Ό μμ±νκ³ μμλ€. μ΄λ, λλ€μμ μμ§ μ νμ§ λͺ»ν ν¬λ£¨λ μ΄λ¦κ³Ό λμ΄, κ·Έλ¦¬κ³ κ³Όμ λ§μ κ°μ§κ³ ν¬λ£¨λ₯Ό μ μ²νκ³ μΆμλ€.
public class Crew {
private String name;
private String nickname;
private int age;
private Course course;
public Crew(final String name, final int age, final Course course) {
this.name = name;
this.age = age;
this.course = course;
}
}
κ·Έλ¬λ, λ κ°μΈμ 보 보νΈμ κ΅μ₯ν λ―Όκ°νλ ν ν¬λ£¨λ λμ΄λ μλ €μ£Όκ³ μΆμ§ μμμ λλ€μκ³Ό μ΄λ¦, κ·Έλ¦¬κ³ κ³Όμ λ§ λ°μμ ν¬λ£¨ μ μ²μλ₯Ό λ΄λ €κ³ νλ€.
public class Crew {
private String name;
private String nickname;
private int age;
private Course course;
public Crew(final String name, final int age, final Course course) {
this.name = name;
this.age = age;
this.course = course;
}
public Crew(final String name, final String nickname, final Course course) {
this.name = name;
this.nickname = nickname;
this.course = course;
}
}
κ·Έλ¬λ€, λ μ΄λ€ ν¬λ£¨λ λλ€μ, λμ΄, κ·Έλ¦¬κ³ κ³Όμ λ§μ κ°μ§κ³ ν¬λ£¨ μ μ²μλ₯Ό λ΄λ €κ³ νλ€. μ΄λ, ν κ°μ§ λ¬Έμ κ° λ°μνλ€.
public class Crew {
private String name;
private String nickname;
private int age;
private Course course;
// ERROR
public Crew(final String name, final int age, final Course course) {
this.name = name;
this.age = age;
this.course = course;
}
// ERROR
public Crew(final String nickname, final int age, final Course course) {
this.nickname = nickname;
this.age = age;
this.course = course;
}
public Crew(final String name, final String nickname, final Course course) {
this.name = name;
this.nickname = nickname;
this.course = course;
}
}
λ°λ‘, λμΌν μκ·Έλμ²λ₯Ό κ°μ§ μμ±μλ₯Ό λ μ μΈν μ μλ κ²μ΄λ€. κ·Έλ¬λ, μ μ ν©ν°λ¦¬ λ©μλλ₯Ό νμ©νλ©΄ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄μν μ μλ€. μ΄λ, κ°κ°μ μ°¨μ΄λ₯Ό μ λλ¬λ΄λ μ΄λ¦μ μ§μ΄μ€λ€λ©΄ λ λ² μ€νΈμ΄λ€.
public class Crew {
private String name;
private String nickname;
private int age;
private Course course;
private Crew() {
// μΈλΆμμ μΈμ€ν΄μ€ν λ§κΈ°
}
public static Crew createByName(final String name, final int age, final Course course) {
Crew crew = new Crew();
crew.name = name;
crew.age = age;
crew.course = course;
return crew;
}
public static Crew createByNickname(final String nickname, final int age, final Course course) {
Crew crew = new Crew();
crew.nickname = nickname;
crew.age = age;
crew.course = course;
return crew;
}
}
μμ κ°μ΄ λ©μλλͺ μ λ°λΌ μνλ νλλ₯Ό μ£Όμ λ°μ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν΄μ€ μ μμΌλ©°, λμΌν μκ·Έλμ²λ₯Ό κ°μ§λλΌλ μνλ νΉμ±μ κ°μ§λ κ°μ²΄λ₯Ό λ§λ€μ΄λΌ μ μκ² λλ€. (μμ±μλ₯Ό ν΅ν΄ ν΄κ²°νλ €κ³ νλ€λ©΄, μλ§ flagλ₯Ό λκ±°λ μΈμλ‘ λ€ λ°μμ μ²λ¦¬ν΄μΌ νκΈ° λλ¬Έμ μ½λκ° λ§€μ° λ³΅μ‘νκ³ λλ¬μμ‘μ κ²μ΄λ€ π₯²)
π¬ νΈμΆλ λλ§λ€ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ λλ€.
μμ±μλ₯Ό μ¬μ©νκ² λλ©΄, newλ₯Ό ν΅ν΄ κ³μ μΈμ€ν΄μ€λ₯Ό μμ±νκ² λκΈ° λλ¬Έμ κΌ μλ‘μ΄ μΈμ€ν΄μ€κ° νμν μν©μ΄ μλλΌλ©΄ λλΉκ° λ μλ μλ€. μ΄λ, μ μ ν©ν°λ¦¬ λ©μλλ₯Ό νμ©νλ©΄ μΈμ€ν΄μ€λ₯Ό 미리 λ§λ€μ΄ λκ±°λ, νΉμ μμ±ν μΈμ€ν΄μ€λ₯Ό μΊμ±νμ¬ μ¬νμ©νλ μμΌλ‘ λΆνμν κ°μ²΄ μμ±μ νΌν μ μλ€. (ex. νλΌμ΄μ¨μ΄νΈ ν¨ν΄) μ΄λ, λ°λ³΅λλ μμ²μ λν΄ κ°μ κ°μ²΄λ₯Ό λ°ννκΈ° λλ¬Έμ, μΈμ€ν΄μ€μ λν΄ ν΅μ κ° κ°λ₯ν΄μ§λ€.
π‘ νλΌμ΄μ¨μ΄νΈ ν¨ν΄μ΄λ?
: μΈμ€ν΄μ€λ₯Ό κ°λ₯νλ§νΌ 곡μ νμ¬, newλ₯Ό ν΅ν λ©λͺ¨λ¦¬ λλΉλ₯Ό μ€μ΄λ λ°©μμ΄λ€.
mapμ ν΅ν΄μ κ΄λ¦¬λ₯Ό μ§ννκ³ , νλμ νΉμ±μ keyλ‘ μ‘μ, ν΄λΉ keyκ° μ‘΄μ¬νλ€λ©΄ μ΄λ―Έ μμ±ν μΈμ€ν΄μ€λ₯Ό λ°ννκ³ , μλλΌλ©΄ μλ‘ μμ±ν΄μ£Όλ λ°©λ²μ΄λ€. λ€λ§, μ΄ λ°©λ²μ μΈμ€ν΄μ€κ° λ§€μ° λ§μ΄ νμνλ©΄μλ μ¬μ©λλ νμκ° λ§κ³ , λͺ¨λ λμΌν λ‘μ§μΌλ‘ μ μ΄κ° κ°λ₯ν λ μ¬μ©νλ κ²μ΄ μ’λ€.
μ΄λ, κ°μ²΄λ€μ 곡μ νκ³ μκΈ° λλ¬Έμ, μλ‘ λ€λ₯Έ κ°μ²΄μ΄λλΌλ λμΌμ±μ μ΄λ€ μμΌλ‘ 체ν¬νλμ§μ λ°λΌ λμΌν κ°μ²΄λΌκ³ λ°μλ€μΌ μ μκΈ° λλ¬Έμ, μ¬λ§νλ©΄ 곡μ κ°μ²΄λ€μ μ¬μ©νλλΌλ λ¬Έμ κ° μλ κ²½μ° μ¬μ©ν΄μΌ νλ€.
νλΌμ΄μ¨μ΄νΈ ν¨ν΄μ μ¬μ©ν λνμ μΈ μμλ, μλ°μ λνΌ ν΄λμ€λ€μ valueOf() λ©μλλ₯Ό μμλ‘ λ€ μ μλ€.
// Boolean.java
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
Booleanμ κ²½μ° true, falseλ§ κ°μ§κ³ μκΈ° λλ¬Έμ μΈμλ‘ λ€μ΄μ¨ κ°μ λ°λΌμ 미리 μ μΈλ TRUE, FALSE μΈμ€ν΄μ€λ₯Ό λ°ννκ² λλ€. μ¦, μμ±ν μΈμ€ν΄μ€λ₯Ό μΊμ±νμ¬ λ°νν΄μ£Όλ ννμΈ κ²μ΄λ€.
κ·Έλμ λλΆλΆμ wrapper ν΄λμ€μ κ²½μ°, newλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±νμ§ μκ³ valueOfλ‘ μμ±νλ κ²μ κΆμ₯νλ€. μλ¨μ μ£Όμμ 보면, μ΄ μμ±μλ κ΅μ₯ν λΆμ μ νκ³ 'μ μ ν©ν°λ¦¬' valueOfμ ν΅ν΄μ μμ±νλΌκ³ μ ν κ²μ λ³Ό μ μλ€ βΊοΈ
π¬ λ°ν νμ μ νμ νμ κ°μ²΄λ₯Ό λ°ννλλ‘ μ μ΄ν μ μλ€.
class Circle extends Shape {
@Override
public String hello() {
return "I'm Circle!";
}
}
Circleμ΄λΌλ μμ ν΄λμ€κ° μλ€. μ΄λ ShapeλΌλ λΆλͺ¨ ν΄λμ€λ₯Ό μμλ°μ μμ ν΄λμ€μ΄λ€.
class Shape {
public String hello() {
return "I'm Shape!";
}
public static Shape create() {
return new Circle();
}
}
μ΄λ, Shapeμ μ μ λ©μλμμ createλ₯Ό νΈμΆνμ λ λ΄λΆμ μΌλ‘ Circle()μ΄λΌλ ꡬν체λ₯Ό λ°ννκΈ° λλ¬Έμ μΈλΆμμ ν΄λΉ create() λ©μλλ₯Ό μ κ·Όνμ λ ꡬν ν΄λμ€μ λν μ λ³΄κ° μλλΌλ ν΄λΉ κ°μ²΄λ₯Ό λ°νν μ μκ² λλ€.
public static void main(String[] args) throws IOException {
Shape shape = Shape.create();
System.out.println(shape.hello()); // I'm circle!
}
μ μμ μμλ κ°λ¨νκ² ν΄λμ€ κ° μμ κ΄κ³λ₯Ό μ¬μ©νμμ§λ§, μΈν°νμ΄μ€μμλ λ§μ°¬κ°μ§μ΄λ€. μΈν°νμ΄μ€λ₯Ό λ°ννμ μΌλ‘ μ¬μ©νμ¬ κ΅¬ν κ°μ²΄μ λν΄ APIμ λ ΈμΆμ νμ§ μμλ λκ³ , λ΄λΆμ μΈ κ΅¬ν λ‘μ§μ΄ μ¨κ²¨μ§λ€λ μ₯μ λ μ‘΄μ¬νλ€. (보ν΅, μΈν°νμ΄μ€κ° λ°ν νμ μ΄λΌλ κ²μ ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό 리ν΄ν¨μ μλ―Ένλ€.)
π‘ ꡬν λ‘μ§μ΄ μ¨κ²¨μ§λ κ²μ΄ μ μ₯μ μΌκΉ?
μΆμνμ μ₯μ μ μκ°ν΄λ³΄λ©΄ μ’λ€. μΈλΆμμ μ κ·Όν λ ꡬν ν΄λμ€μ μ½λκ° λνλλ κ²μ λ³λ‘ μ’μ§ μμ ꡬ쑰μ΄λ€. λ§μ½ ꡬν ν΄λμ€κ° λ³κ²½λ κ²½μ°, ν΄λΉ μΈλΆ μ κ·Ό μ½λλ ν¨κ» μμ λμ΄μΌ νκΈ° λλ¬Έμ μν₯μ΄ μ»€μ§κΈ° λλ¬Έμ΄λ€. λ°λ©΄, μΈν°νμ΄μ€λ₯Ό 리ν΄νκ² λλ©΄ λ΄λΆμ ꡬν ν΄λμ€κ° λ³κ²½λλλΌλ μΈλΆμμλ νμ μΈν°νμ΄μ€λ§ λ°λΌλ³΄κ³ μκΈ° λλ¬Έμ λ 립μ μΌλ‘ λ΄λΆ ꡬν체μ λν΄ λ³κ²½ν μ μμΌλ©°, 볡μ‘λκ° λ¨μ΄μ§κ³ μ μ°ν μ€κ³κ° κ°λ₯νκ² λλ€!
λν, λ°νκ°μ΄ μΈν°νμ΄μ€λΌλ©΄ μ μ ν©ν°λ¦¬λ₯Ό μμ±νλ μμ μλ μ€μ§ 'μΈν°νμ΄μ€'λ§μ λ°ννλλ‘ νλ©΄ λκΈ° λλ¬Έμ, λ³λμ ꡬν ν΄λμ€λ₯Ό μμ±νμ§ μλλΌλ κ°λ°μ΄ κ³μ κ°λ₯νκ² λλ€. μ΄λ₯Ό μ΄μ©ν κ² JDBC κ°μ μλΉμ€ μ 곡μ νλ μ μν¬μ΄λ©°, ν΄λΌμ΄μΈνΈκ° ꡬνλ μλΉμ€λ₯Ό μ΄μ©νλλΌλ λ΄λΆμ μΌλ‘ μ΄λ€ ν΄λμ€κ° μλμ§ λͺ°λΌλ λλ€!
// DriverManager.java
public static Connection getConnection(String url,
java.util.Properties info) throws SQLException {
return (getConnection(url, info, Reflection.getCallerClass()));
}
μ½λκ° λ³΅μ‘νκΈ° λλ¬Έμ κΈΈκ²λ μ λ€λ£¨μ§λ§, DriverManagerλΌλ ν΄λμ€μμ Connection μ 보λ₯Ό μ»μ μ μμΌλ©°, νλ‘νΌν° μ 보μ λ°λΌ κ·Έμ λ§λ ꡬν체λ₯Ό λ°ννκ² λλ€.
βοΈ μ μ ν©ν°λ¦¬ λ©μλμ λ¨μ
λ¬Όλ‘ , λΉμ°ν μ΄λ¬ν μ μ ν©ν°λ¦¬ λ©μλμλ λ¨μ μ μ‘΄μ¬νλ€. κΈ°λ³Έμ μΌλ‘ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό λ§λ λ€λ κ²μ μμ±μλ₯Ό privateλ‘ λ§λ€κ² λ€λ μλ―Έμ΄λ€. κ·Έλ¬λ, μμμ μν΄μλ public / protected μμ±μκ° νμνκΈ° λλ¬Έμ, νμ ν΄λμ€λ₯Ό λ§λ€ μ μλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μλ protected / default μμ±μλ₯Ό ꡬννκ±°λ, νΉμ μμλ°μ§ μλ κ²λ νλμ λ°©λ²μ΄λ€. (μ€μ λ‘, μμ¦μ μμλ°μ§ μλ κ²μ΄ κ½€ νΈλ λμ΄λ€. (μ½νλ¦°μ κ²½μ° μμ κΈμ§κ° κΈ°λ³Έμ΄λκΉ)
λν, λͺ ννκ² λλ¬λμ§ μκΈ° λλ¬Έμ νλ‘κ·Έλλ¨Έκ° μ°ΎκΈ° μ΄λ ΅λ€λ λ¨μ λ μ‘΄μ¬νλ€. κ·Έλ¬λ, μ΄λ μ μ ν©ν°λ¦¬ λ©μλμ λν λ€μ΄λ°μ μ μ§ν¨λ€λ©΄ ν΄κ²°λ μ μκΈ° λλ¬Έμ λ€μ΄λ°μ μνλ κ²μ΄ μ€μνλ€! π₯Ή
컨벀μ | μ¬μ©λ² | μμ |
from | 맀κ°λ³μλ₯Ό νλ λ°μμ, ν΄λΉ νμ μ μΈμ€ν΄μ€ λ°ν | Date date = Date.from(instant) |
of | μ¬λ¬ 맀κ°λ³μλ₯Ό λ°μμ μ ν©ν© νμ μ μΈμ€ν΄μ€ λ°ν | Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING); |
valueOf | from, ofμ λΉν΄ μ‘°κΈ λ μμΈν λ²μ | BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE); |
instance getInstance |
맀κ°λ³μλ‘ λͺ μν μΈμ€ν΄μ€λ₯Ό λ°ννμ§λ§, κ°μ μΈμ€ν΄μ€μμ 보μ₯νμ§ μλλ€. | StackWalker luke = StackWalker.getInstance(options); |
create newInstance |
λ§€λ² μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ λ°νν¨μ 보μ₯νλ€. | Object newArray = Array.newInstance(classObject, arrayLen) |
getType | getInstanceμ λμΌνμ§λ§, μμ±ν ν΄λμ€κ° μλ λ€λ₯Έ ν΄λμ€μ ν©ν°λ¦¬ λ©μλλ₯Ό μ μν λ μ¬μ©νλ€. μ¬κΈ°μ λ€μ΄κ°λ Typeμ ν©ν°λ¦¬ λ©μλκ° λ°νν κ°μ²΄μ νμ μ μλ―Ένλ€. | FileStore fs = Files.getFileStore(path); |
newType | newInstanceμ κ°μ§λ§, μμ±ν ν΄λμ€κ° μλ λ€λ₯Έ ν΄λμ€μ ν©ν°λ¦¬ λ©μλ μ μ μ μ¬μ©νλ€ (getTypeκ³Ό λΉμ·) | BufferedReader br = Files.newBufferedReader(path); |
type | getType, newTypeμ κ°κ²°ν λ²μ | List<Complain> litany = Collections.list(legacyLitany) |