2μ₯ κ°μ²΄μ μμ±κ³Ό νκ΄΄ - item1. μμ±μ λμ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό κ³ λ €νλΌ
μμ±μ(constructor)μ μ μ ν©ν°λ¦¬ λ©μλ(static factory method)
λ€μ μμ±μλΆν°
μμ±μλ ν΄λμ€μ κ°μ²΄λ₯Ό μμ±νκ³ μ΄λ¬ν μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ μν μ λ΄λΉνλ νΉλ³ν λ©μλμ΄λ€.
μΌλ°μ μΌλ‘ κ°μ²΄λ₯Ό μμ±νκ³ μ ν λ μμ±μλ₯Ό μ¬μ©νλλ°, κΈ°λ³Έ μμ±μλ₯Ό νμμ λ°λΌ μ€λ²λ‘λ©νμ¬ λ€μν ννμ μμ±μλ₯Ό λ§λ€μ΄ νμ©ν μ μλ€.
// μμ±μ(constructor)
class Blog {
String user;
int postNumber;
List<String> visitorList;
public Blog(String user, int postNumber) {
this.user = user;
this.postNumber = postNumber;
}
public Blog(String user, int postNumber, List<String> visitorList) {
this(user, postNumber);
this.visitorList = visitorList;
}
}
μ μ ν©ν°λ¦¬ λ©μλ
κ·ΈλΌ μ μ ν©ν°λ¦¬ λ©μλ(static factory method)λ λκΉ? μ΄λ¦μ νλμ© λ―μ΄λ³΄λ©΄ μ μ μλ―μ΄, μ μ ν©ν°λ¦¬ λ©μλλ κ°μ²΄ μμ± μν μ νλ ν΄λμ€ λ©μλλΌκ³ μ΄ν΄νλ©΄ μ½λ€.
ν΄λμ€λ λ³μμ λ©μλ λ± λ€μν λ©€λ²λ₯Ό κ°μ§ μ μκ³ , κ·Έ μ€ λ©μλλ μΈμ€ν΄μ€ λ©μλμ ν΄λμ€ λ©μλλ‘ λλ μ μλ€. μΈμ€ν΄μ€ λ©μλλ λ§ κ·Έλλ‘ κ°μ²΄κ° μ‘΄μ¬ν΄μΌμ§λ§ μ¬μ©ν μ μλ κΈ°λ₯μ λͺ μν λ©μλμ΄λ€. λ°λλ‘ ν΄λμ€ λ©μλλ κ°μ²΄κ° μ‘΄μ¬νμ§ μμλ μ€νν μ μλ μμ μ λͺ μν λ©μλλ‘ ν΄λμ€ κ΄μ μμμ νμλ₯Ό νννλ€. ν΄λμ€ λ©μλλ λ°λμ λ©μλ μκ·Έλμ² μμ
static
(μ μ ) μμ½μ΄λ₯Ό λΆμ¬μ€μΌνλ€.
μ μ λ©μλ(static method)λ κ°μ²΄κ° μμ±λμ§ μμλ μ¬μ©ν μ μλ ν΄λμ€ λ©μλμ΄λ―λ‘ μ μ λ©μλλ‘ κ°μ²΄ μμ± μν μ νκ³ μ νλ κ²μ΄ μ μ ν©ν°λ¦¬ λ©μλμ μμμ΄λ€.
κ·Έλ λ€λ©΄ κ°μ²΄λ₯Ό μμ±ν΄μ£Όλ μμ±μλΌλ νΉλ³ν λ©μλκ° μ΄λ―Έ μλλ° μ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μ¬μ©νλΌλ κ²μΌκΉ?
κ°λ¨νκ² λ§νμλ©΄ 1) μ‘°κΈ λ λ€μν κ°μ²΄λ₯Ό μ μ°νκ² μμ±νκ³ μ, 2) μ½λμ νμ₯μ±μ λμ΄κ³ μ λΌκ³ λ§ν μ μμ κ² κ°λ€.
μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μ¨μΌνλ μ΄μ
1. λ©μλλͺ μ ν΅ν΄ κ°μ²΄ μμ± μλ―Έλ₯Ό λΆλͺ ννλ€.
μμ±μλ λͺ¨λ ν΄λμ€λͺ κ³Ό λμΌν΄μΌνλ€. μ΄ κ·μΉλλ¬Έμ μκΈ°λ λ¨μ μ΄ μλλ°, νλλ κ°μ²΄λ₯Ό μμ±ν λ 맀κ°λ³μλ₯Ό λ¬λ¦¬νμ¬ μλ‘ λ€λ₯Έ νΉμ§μ κ°μ²΄λ₯Ό λ§λ€λλΌλ ꡬλ³μ΄ μ μκ°λ€λ κ²μ΄λ€. μ¦, μλ―Έκ° λΆλΆλͺ ν΄μ§λ€. λλ²μ§Έλ κ°μ²΄λ₯Ό μμ±νλ μ μ₯(ν΄λΌμ΄μΈνΈ)μμ μμ±μμ λ©μλ μκ·Έλμ² μμλ₯Ό λͺ¨λ μμμΌνκΈ° λλ¬Έμ μ€μνκΈ°κ° μ¬μμ§λ€.
public class Shake {
int ice;
int shot;
String milk;
// μμ±μμ μν κ°μ²΄ μμ±
private Shake(int ice, int shot) {
this.ice = ice;
this.shot = shot;
}
private Shake(int ice, String milk) {
this.ice = ice;
this.milk = milk;
}
// μ μ ν©ν°λ¦¬ λ©μλμ μν κ°μ²΄ μμ±
public static Shake getCoffeeShake(int ice, int shot) {
return new Shake(ice, shot);
}
public static Shake getMilkShake(int ice, String milk) {
return new Shake(ice, milk);
}
}
μμ κ°μ μμλ₯Ό 보면 new Shake()
μμ±μλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±ν λλ³΄λ€ getCoffeeshake()
λ getMilkshake()
λ©μλλ₯Ό μ΄μ©νλ κ²μ΄ μλ―Έλ λΆλͺ
νκ³ μ€μν κ°λ₯μ±λ μ λ€.
2. μΈμ€ν΄μ€λ₯Ό λ§€λ² μλ‘κ² μμ±νλ κ²μ λ§μ μ μλ€.
νλ‘κ·Έλ¨ μμμ κΌ λΆλ³ ν΄λμ€(immutable class)λ₯Ό μ μ§ν΄μΌνλ κ²½μ°κ° μλ€. μ΄λ₯Ό μν΄μλ μΈμ€ν΄μ€λ₯Ό 미리 μμ±ν΄λκ³ μ΄λ₯Ό μΊμ±νμ¬ μ¬νμ©νλ ννλ₯Ό μ·¨ν΄μΌνλλ° μ΄λ μ ν©ν κ²μ΄ μ μ ν©ν°λ¦¬ λ©μλμ΄λ€.
μΈμ€ν΄μ€λ₯Ό ν΅μ νμ¬ μ±κΈν΄ ν¨ν΄μ 보μ₯νκ³ , μΈμ€ν΄μ€νκ° λΆκ°λ₯ν μν©μ μ μ§ν μλ μμΌλ©°, λμΌν μΈμ€ν΄μ€λ λ¨ νλκ° λλλ‘ λ³΄μ₯ν μ μλ€.
public class Product() {
private static Product productInstance;
private Product() {}
public static Product getInstance() {
if (productInstance == null) {
productInstance = new Product();
}
return productInstance;
}
}
3. ν΄λμ€(μΈν°νμ΄μ€)μ νμ ν΄λμ€ κ°μ²΄λ₯Ό λ°νν μ μλ€.
κ°μ²΄μ§ν₯ μΈμ΄ μλ°μ κ°μ₯ ν° νΉμ§ μ€ νλμΈ λ€νμ±μ μ΄μ μ νμ©νλ©΄ μΌλ§λ μ§ μνλ νμ μ κ°μ²΄λ₯Ό μμ±ν μ μλ€. μμ νμ μ μμλ°μ λ€μν νμ νμ ν΄λμ€κ° μ‘΄μ¬ν κ²½μ° κ°μ λ©μλλ‘ μλ‘ λ€λ₯Έ κ°μ²΄λ₯Ό μμ±ν μ μλ€. λν ꡬν ν΄λμ€λ₯Ό 곡κ°νμ§ μκ³ λ λ°ν νμ μ λ€μνκ² νμ¬ κ°μ²΄λ₯Ό μμ±νλ μ μ₯(ν΄λΌμ΄μΈνΈ)μμ ν΄λμ€ μ¬μ©μ΄ ν¨μ¬ μ¬μμ§λ€.
// μΈν°νμ΄μ€
public interface Shake {
static Shake getCoffeeShake() {
return new CoffeeShake();
}
static Shake getMilkShake() {
return new getMilkShake();
}
}
// μΈν°νμ΄μ€ ꡬν체1
class CoffeeShake implements Shake {
}
// μΈν°νμ΄μ€ ꡬν체2
class MilkShake implements Shake {
}
4. μ λ ₯ 맀κ°λ³μμ λ°λΌ λ€λ₯Έ νμ ν΄λμ€ κ°μ²΄λ₯Ό λ°νν μ μλ€.
3λ²μμ μ€λͺ ν μ΄μ κ³Ό λΉμ·ν κ²°μ΄λ€. μμ λ€νμ± νΉμ§μ νμ©ν ꡬν λ°©λ²μΌλ‘ μ μ ν©ν°λ¦¬ λ©μλλ μ λ¬λ°μ 맀κ°λ³μμ λ°λΌ μ μ ν νμ νμ μ κ°μ²΄λ₯Ό λ§λ€μ΄ λ°νν μ μλ€. ννΈ κ°μ²΄λ₯Ό μμ±νλ μ μ₯(ν΄λΌμ΄μΈνΈ)μμλ ν©ν°λ¦¬κ° μ νν μ΄λ€ κ°μ²΄λ₯Ό μ΄λ»κ² ꡬννμ¬ λ°ννλμ§ μ νμ μμ΄ μνλ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
μ΄λ μ½λ νμ₯μ±μ ν¨κ³Όμ μΌλ‘ λμΌ μ μλ€. νλ‘κ·Έλ¨ λ²μ μ΄ λ°λμ΄ νμ ν΄λμ€κ° μμ΄μ§κ±°λ μλ‘ μκΈ°λλΌλ κ°μ²΄λ₯Ό μμ±νλ λ°©λ²μ λκ°λ€.(λ§μΉ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ²μ²λΌ)
// μμ ν΄λμ€
public abstract class Shoes {
public abstract void getSize();
public static Shake getShoes(int size) {
Shoes shoes = null;
if (size <= 200) {
shoes = new KidsShoes();
} else {
shoes = new AdultShoes();
}
return shoes;
}
public static void main(String[] args) {
Shoes s = getShoes(240);
s.getSize();
}
}
// νμ ν΄λμ€1
class KidsShoes extends Shoes {
@Override
public void getSize() {
System.out.println("μλμ© μ λ°μ¬μ΄μ¦λ 150λΆν° 200κΉμ§μ
λλ€.");
}
}
// νμ ν΄λμ€2
class AdultShoes extends Shoes {
@Override
public void getSize() {
System.out.println("μ±μΈμ© μ λ°μ¬μ΄μ¦λ 205λΆν° 270κΉμ§μ
λλ€.");
}
}
5. μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μμ±νλ μμ μλ λ°νν κ°μ²΄μ ν΄λμ€κ° μ‘΄μ¬νμ§ μμλ λλ€.
μλΉμ€ μ 곡μ νλ μμν¬(service provider framework)λ₯Ό ꡬννκΈ° μν νΉμ§μ΄λΌκ³ λ³Ό μ μλ€.
μ°μ μλΉμ€ μ 곡μ νλ μμν¬λ νΉμ μλΉμ€λ₯Ό μ 곡νλ μ 곡μκ° μ¬λΏμΌ λ μ΄λ€μ΄ λͺ¨λ κ°μ λ°©μμΌλ‘ μλΉμ€λ₯Ό μ 곡νλλ‘ μΈν°νμ΄μ€ μ°¨μμΌλ‘ ꡬνν΄λ κ²μ΄λ€. μμλ‘ κ°μ₯ λ§μ΄ μΈκΈλλ κ²μ΄ JDBC(Java Database Connectivity)μ΄λ€. ν΄λΌμ΄μΈνΈλ MySQL, Oracle λ±λ± λ€μν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©ν κ²μ΄κ³ , κ°κ°μ λ°μ΄ν°λ² μ΄μ€ λ²€λμμ ꡬνν λ°©μλ λͺ¨λ μ κ°κΈ° λ€λ₯΄λ€. λ°λΌμ ν΄λΌμ΄μΈνΈκ° κ° λ°μ΄ν°λ² μ΄μ€ λ³ κ°μ²΄ μμ± λ° μ κ·Ό λ°©λ²μ λͺ¨λ μλ κ²μ λΆκ°λ₯νλ―λ‘ JDBCλΌλ κ³΅ν΅ λ°μ΄ν°λ² μ΄μ€ μ κ·Ό μλΉμ€λ₯Ό μ 곡νλ κ²μ΄λ€.
μλΉμ€ μ 곡μ νλ μμν¬ μ»΄ν¬λνΈ κ΅¬μ±
- ꡬν체μ λμμ μ μν μλΉμ€ μΈν°νμ΄μ€ ex) JDBCμ Connection
- μ 곡μκ° κ΅¬ν체λ₯Ό λ±λ‘ν λ μ¬μ©νλ μ 곡μ λ±λ‘ API ex) JDBCμ DriverManager.registerDriver()
- ν΄λΌμ΄μΈνΈκ° μλΉμ€μ μΈμ€ν΄μ€λ₯Ό μ»μ λ μ¬μ©νλ μλΉμ€ μ κ·Ό API ex) JDBCμ DriverManager.getConnection()
- μλΉμ€ μΈν°νμ΄μ€ μΈμ€ν΄μ€λ₯Ό μμ±νλ μλΉμ€ μ 곡μ μΈν°νμ΄μ€ ex) JDBCμ Driver
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class RegisterDriverExample {
public static void main(String args[]) throws SQLException {
// 맀κ°λ³μλ‘ λ€μ΄μ¨ λ¬Έμμ΄ μ΄λ¦μ κ°μ§ ν΄λμ€λ₯Ό λ©λͺ¨λ¦¬μ λ‘λνλ€.
// ν΄λμ€κ° λ©λͺ¨λ¦¬μ λ‘λλλ©΄ μλμ μΌλ‘ λλΌμ΄λ²λ₯Ό λ±λ‘νλ€.
Class.forName("com.mysql.jdbc.Driver");
// ν΄λΌμ΄μΈνΈλ λ±λ‘λ λλΌμ΄λ²λ₯Ό μ΄μ©νμ¬ dbμ μ°κ²°νλ€.
String url = "jdbc:mysql://localhost/mydatabase";
Connection con = DriverManager.getConnection(url, "root", "password");
System.out.println("Connection established: "+con);
}
}
μμ μ½λλ JDBCλ₯Ό μ¬μ©ν΄ mysql λ°μ΄ν°λ² μ΄μ€μ μ κ·Όνλ λ°©λ²μ 보μ¬μ€λ€. λ¨Όμ Class.forName()
μ ν΅ν΄ μ μ ν Driver ν΄λμ€λ₯Ό λ©λͺ¨λ¦¬μ λ‘λνλ€λ©΄ μλΉμ€ μ 곡μμΈ JDBC Driverκ° μ μ ν©ν°λ¦¬ λ©μλμΈ DriverManager.registerDriver()
λ©μλλ₯Ό ν΅ν΄ μκΈ° μμ μ λ¨ νλ² λ±λ‘νλ€. μ΄ν ν΄λΌμ΄μΈνΈλ DriverManager.getConnection()
λ©μλλ₯Ό μ΄μ©ν΄ Connection κ°μ²΄λ₯Ό λ°μ μ¬μ©νλ ꡬ쑰μ΄λ€.
μμμ μ μ μλ―μ΄ ν΄λΌμ΄μΈνΈκ° JDBCλ₯Ό μ¬μ©νμ¬ DBμ μ κ·Όνλ μ½λλ₯Ό μμ±νλ€λ©΄ μ΄λ μ»΄νμΌ μμ μ΄λ€ DB λλΌμ΄λ²λ₯Ό μ¬μ©ν μ§ κ²°μ ν μ μκ³ , main() ν¨μκ° μ€νλ λ€ λ°νμ μ λμ μΌλ‘ λ§μΆ€ν DB λλΌμ΄λ²λ₯Ό λ‘λ©ν΄μΌ νλ€. λ€μ λ§ν΄ μ μ ν©ν°λ¦¬ λ©μλμΈ DriverManager.registerDriver()
λ₯Ό μμ±ν λλ μ΄λ€ λλΌμ΄λ² ν΄λμ€μΈμ§ μ μ μκ³ μ΄ ν΄λμ€ κ°μ²΄λ μ‘΄μ¬νμ§ μλλ€. νμ§λ§ main()μ Class.forName()
λ©μλκ° μ€νλλ©΄ κ·Έμ μμΌ ν΄λμ€κ° λ‘λλκ³ λλΌμ΄λ² κ°μ²΄λ λ±λ‘λλ―λ‘ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μμ±ν λλ λ°νν κ°μ²΄ ν΄λμ€κ° μ‘΄μ¬νμ§ μμλ λλ κ²μ΄λ€.
κ·ΈλΌμλ λΆκ΅¬νκ³
μ μ ν©ν°λ¦¬ λ©μλμλ λͺκ°μ§ νκ³κ° μλ€.
1. μ μ ν©ν°λ¦¬ λ©μλλ§ μ 곡νλ ν΄λμ€λ μμμ΄ λΆκ°λ₯νλ€.
μμμ μν΄μλ μ μ ν©ν°λ¦¬ λ©μλλ§ μ‘΄μ¬ν΄μλ μλκ³ , public νΉμ protected λ²μμ μμ±μκ° νμνλ€.
νμ§λ§ μ΄ λ¨μ μ μ€νλ € λΆλ³ νμ μ ν΄λμ€λ₯Ό λ§λ€ λ μ₯μ μΌλ‘ μμ©νκΈ°λ νλ€.
2. νλ‘κ·Έλλ¨Έ κ° μ½λλ₯Ό 곡μ ν λ μμ±μμ λΉν΄ μ½λλ₯Ό μ΄ν΄νκΈ° νλ€λ€.
μ¬κΈ°μ μ΄ν΄κ° νλ€λ€λ κ²μ μ μ ν©ν°λ¦¬ λ©μλκ° μ½λκ° μ΄λ €μμ μ΄ν΄νκΈ° νλ€λ€λ κ²μ΄ μλλ€. μμ±μλ νΉλ³ν λ©μλλ‘ APIμ μ€λͺ μ΄ λΆλͺ νκ² λͺ μλμ§λ§ μ μ ν©ν°λ¦¬ λ©μλλ λ§ κ·Έλλ‘ λ©μλμ΄λ―λ‘ λ€λ₯Έ λ©μλμ λΆλ¦¬νμ¬ νννκΈ° νλ€λ€.
λ°λΌμ λ€λ₯Έ νλ‘κ·Έλλ¨Έμκ² μ μ ν©ν°λ¦¬ λ©μλ ν΄λμ€λ₯Ό λ°°ν¬νκ±°λ 곡μ ν λλ μ μ ν©ν°λ¦¬ λ©μλμ μ‘΄μ¬μ λͺ©μ μ μ μ리기 μν΄ λ리 μ¬μ©λλ λͺ λͺ λ°©μμ λ°λ₯΄λ κ²μ΄ μ’λ€.
μ μ ν©ν°λ¦¬ λ©μλ λͺ λͺ λ°©μ
- from : 맀κ°λ³μλ₯Ό νλ λ°μ ν΄λΉ νμ μ μΈμ€ν΄μ€λ₯Ό λ°ννλ νλ³ν λ©μλ
- of : μ¬λ¬ 맀κ°λ³μλ₯Ό λ°μ μ ν©ν νμ μ μΈμ€ν΄μ€λ₯Ό λ°ννλ μ§κ³ λ©μλ
- valueOf :
from
κ³Όof
μ μμΈν λ²μ - instance νΉμ getInstance : 맀κ°λ³μλ‘ λͺ μν μΈμ€ν΄μ€λ₯Ό λ°ν. λ¨, κ°μ μΈμ€ν΄μ€μμ 보μ₯νμ§λ μμ.
- create νΉμ newInstance : 맀κ°λ³μλ‘ λͺ μν μΈμ€ν΄μ€λ₯Ό λ§€λ² μλ‘κ² μμ±ν΄ λ°νν¨μ 보μ₯.
- getType : 맀κ°λ³μλ‘ λͺ μν μΈμ€ν΄μ€λ₯Ό λ°ννλ, μμ±ν ν΄λμ€κ° μλ λ€λ₯Έ ν΄λμ€μ ν©ν°λ¦¬ λ©μλλ₯Ό μ μν λ μ¬μ©. Typeμ ν©ν°λ¦¬ λ©μλκ° λ°νν κ°μ²΄μ νμ
- newType : 맀κ°λ³μλ‘ λͺ μν μΈμ€ν΄μ€λ₯Ό λ§€λ² μλ‘κ² μμ±ν΄ λ°ννλ, μμ±ν ν΄λμ€κ° μλ λ€λ₯Έ ν΄λμ€μ ν©ν°λ¦¬ λ©μλλ₯Ό μ μν λ μ¬μ©. Typeμ ν©ν°λ¦¬ λ©μλκ° λ°νν κ°μ²΄μ νμ
- type :
getType
κ³ΌnewType
μ κ°κ²°ν λ²μ
-
2μ₯ κ°μ²΄μ μμ±κ³Ό νκ΄΄ - item1. μμ±μ λμ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό κ³ λ €νλΌ
-
μμ±μ(constructor)μ μ μ ν©ν°λ¦¬ λ©μλ(static factory method)
-
μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μ¨μΌνλ μ΄μ
- 1. λ©μλλͺ μ ν΅ν΄ κ°μ²΄ μμ± μλ―Έλ₯Ό λΆλͺ ννλ€.
- 2. μΈμ€ν΄μ€λ₯Ό λ§€λ² μλ‘κ² μμ±νλ κ²μ λ§μ μ μλ€.
- 3. ν΄λμ€(μΈν°νμ΄μ€)μ νμ ν΄λμ€ κ°μ²΄λ₯Ό λ°νν μ μλ€.
- 4. μ λ ₯ 맀κ°λ³μμ λ°λΌ λ€λ₯Έ νμ ν΄λμ€ κ°μ²΄λ₯Ό λ°νν μ μλ€.
- 5. μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μμ±νλ μμ μλ λ°νν κ°μ²΄μ ν΄λμ€κ° μ‘΄μ¬νμ§ μμλ λλ€.
- μ μ ν©ν°λ¦¬ λ©μλ λͺ λͺ λ°©μ
-