2μž₯ 객체의 생성과 파괴 - item1. μƒμ„±μž λŒ€μ‹  정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ

μƒμ„±μž(constructor)와 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œ(static factory method)

λ‹€μ‹œ μƒμ„±μžλΆ€ν„°

μƒμ„±μžλž€ 클래슀의 객체λ₯Ό μƒμ„±ν•˜κ³  μ΄λŸ¬ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•˜λŠ” νŠΉλ³„ν•œ λ©”μ„œλ“œμ΄λ‹€.

일반적으둜 객체λ₯Ό μƒμ„±ν•˜κ³ μž ν•  λ•Œ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λŠ”λ°, κΈ°λ³Έ μƒμ„±μžλ₯Ό ν•„μš”μ— 따라 μ˜€λ²„λ‘œλ”©ν•˜μ—¬ λ‹€μ–‘ν•œ ν˜•νƒœμ˜ μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ ν™œμš©ν•  수 μžˆλ‹€.

Java
// μƒμ„±μž(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. λ©”μ„œλ“œλͺ…을 톡해 객체 생성 의미λ₯Ό λΆ„λͺ…νžˆν•œλ‹€.

μƒμ„±μžλŠ” λͺ¨λ‘ 클래슀λͺ…κ³Ό λ™μΌν•΄μ•Όν•œλ‹€. 이 κ·œμΉ™λ•Œλ¬Έμ— μƒκΈ°λŠ” 단점이 μžˆλŠ”λ°, ν•˜λ‚˜λŠ” 객체λ₯Ό 생성할 λ•Œ λ§€κ°œλ³€μˆ˜λ₯Ό λ‹¬λ¦¬ν•˜μ—¬ μ„œλ‘œ λ‹€λ₯Έ νŠΉμ§•μ˜ 객체λ₯Ό λ§Œλ“€λ”λΌλ„ ꡬ별이 잘 μ•ˆκ°„λ‹€λŠ” 것이닀. 즉, μ˜λ―Έκ°€ λΆˆλΆ„λͺ…해진닀. λ‘λ²ˆμ§ΈλŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” μž…μž₯(ν΄λΌμ΄μ–ΈνŠΈ)μ—μ„œ μƒμ„±μžμ˜ λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜ μˆœμ„œλ₯Ό λͺ¨λ‘ μ•Œμ•„μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ‹€μˆ˜ν•˜κΈ°κ°€ μ‰¬μ›Œμ§„λ‹€.

Java
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)λ₯Ό μœ μ§€ν•΄μ•Όν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 미리 생성해두고 이λ₯Ό μΊμ‹±ν•˜μ—¬ μž¬ν™œμš©ν•˜λŠ” ν˜•νƒœλ₯Ό μ·¨ν•΄μ•Όν•˜λŠ”λ° μ΄λ•Œ μ ν•©ν•œ 것이 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œμ΄λ‹€.

μΈμŠ€ν„΄μŠ€λ₯Ό ν†΅μ œν•˜μ—¬ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ„ 보μž₯ν•˜κ³ , μΈμŠ€ν„΄μŠ€ν™”κ°€ λΆˆκ°€λŠ₯ν•œ 상황을 μœ μ§€ν•  μˆ˜λ„ 있으며, λ™μΌν•œ μΈμŠ€ν„΄μŠ€λŠ” 단 ν•˜λ‚˜κ°€ λ˜λ„λ‘ 보μž₯ν•  수 μžˆλ‹€.

Java
public class Product() {
    private static Product productInstance;

    private Product() {}

    public static Product getInstance() {
        if (productInstance == null) {
            productInstance = new Product();
        }
        return productInstance;
    }
}

3. 클래슀(μΈν„°νŽ˜μ΄μŠ€)의 ν•˜μœ„ 클래슀 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.

객체지ν–₯ μ–Έμ–΄ μžλ°”μ˜ κ°€μž₯ 큰 νŠΉμ§• 쀑 ν•˜λ‚˜μΈ λ‹€ν˜•μ„±μ˜ 이점을 ν™œμš©ν•˜λ©΄ μ–Όλ§ˆλ“ μ§€ μ›ν•˜λŠ” νƒ€μž…μ˜ 객체λ₯Ό 생성할 수 μžˆλ‹€. μƒμœ„ νƒ€μž…μ„ 상속받은 λ‹€μ–‘ν•œ ν•˜μœ„ νƒ€μž… ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•  경우 같은 λ©”μ„œλ“œλ‘œ μ„œλ‘œ λ‹€λ₯Έ 객체λ₯Ό 생성할 수 μžˆλ‹€. λ˜ν•œ κ΅¬ν˜„ 클래슀λ₯Ό κ³΅κ°œν•˜μ§€ μ•Šκ³ λ„ λ°˜ν™˜ νƒ€μž…μ„ λ‹€μ–‘ν•˜κ²Œ ν•˜μ—¬ 객체λ₯Ό μƒμ„±ν•˜λŠ” μž…μž₯(ν΄λΌμ΄μ–ΈνŠΈ)μ—μ„œ 클래슀 μ‚¬μš©μ΄ 훨씬 μ‰¬μ›Œμ§„λ‹€.

Java
// μΈν„°νŽ˜μ΄μŠ€
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λ²ˆμ—μ„œ μ„€λͺ…ν•œ 이점과 λΉ„μŠ·ν•œ 결이닀. μ—­μ‹œ λ‹€ν˜•μ„± νŠΉμ§•μ„ ν™œμš©ν•œ κ΅¬ν˜„ λ°©λ²•μœΌλ‘œ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλŠ” 전달받은 λ§€κ°œλ³€μˆ˜μ— 따라 μ μ ˆν•œ ν•˜μœ„ νƒ€μž…μ˜ 객체λ₯Ό λ§Œλ“€μ–΄ λ°˜ν™˜ν•  수 μžˆλ‹€. ν•œνŽΈ 객체λ₯Ό μƒμ„±ν•˜λŠ” μž…μž₯(ν΄λΌμ΄μ–ΈνŠΈ)μ—μ„œλŠ” νŒ©ν„°λ¦¬κ°€ μ •ν™•νžˆ μ–΄λ–€ 객체λ₯Ό μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ”μ§€ μ•Œ ν•„μš” 없이 μ›ν•˜λŠ” 객체λ₯Ό 생성할 수 μžˆλ‹€.

μ΄λŠ” μ½”λ“œ ν™•μž₯성을 효과적으둜 높일 수 μžˆλ‹€. ν”„λ‘œκ·Έλž¨ 버전이 λ°”λ€Œμ–΄ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ—†μ–΄μ§€κ±°λ‚˜ μƒˆλ‘œ 생기더라도 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법은 λ˜‘κ°™λ‹€.(마치 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ)

Java
// μƒμœ„ 클래슀
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의 κ°„κ²°ν•œ 버전