:: ์์ฑ์์ ๋๊ธฐ๋ ๋งค๊ฐ๋ณ์์ ์์ฑ์ ์์ฒด ๋ง์ผ๋ก๋ ๋ฐํ๋ ๊ฐ์ฒด์ ๋ํ ํน์ฑ์ ์ ๋๋ก ์ค๋ช
ํ ์ ์๋ค.
ํ์ง๋ง ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ ์ด๋ฆ๋ง ์ ์ง๋๋ค๋ฉด ๊ฐ์ฒด์ ํน์ฑ์ ์ ๋ฌ์ฌํ ์ ์๋ค.
public static People student(String name, String number){
People people =new People(name);
people.number = number;
return people;
}ex) BigInteger.probablePrime -> ๊ฐ์ด ์์์ธ BIgInteger๋ฅผ ๋ฐํ.
:: ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ ์ธ์คํด์ค๋ ์๋ก ์์ฑํ ์ธ์คํด์ค๋ฅผ ์บ์ฑํ์ฌ ์ฌํ์ฉ ํ๋์์ผ๋ก ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ ์ ์๋ค.
:: ๋ฐ๋ณต๋๋ ์์ฒญ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์์ผ๋ก ์ธ์คํด์ค๋ฅด ํต์ ํ ์ ์๋ค -> ์ฑ๊ธํด, ์ธ์คํด์คํ ๋ถ๊ฐ๋ก ๋ง๋ค ์ ์๋ค.
:: ๋ถ๋ณ ๊ฐ ํด๋์ค์์ ๋์น์ธ ์ธ์คํด์ค๊ฐ ํ๋์์ ๋ณด์ฅ. ์ธ์คํด์ค ํต์ ๋ ํ๋ผ์ด์จ์ดํธ ํจํด์ ๊ทผ๊ฐ์ด ๋๋ค.
private static final People staticPeople = new People("kim");
public static People getStaticPeople(){
return staticPeople;
}:: ์ ์ฐ์ฑ์ด ์๊ธด๋ค. API๋ฅผ ๋ง๋ค ๋ ์ด๋ฌํ ์ ์ฐ์ฑ์ ์์ฉํ๋ฉด ๊ตฌํ ํด๋์ค๋ฅผ ๊ณต๊ฐํ์ง ์๊ณ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ด API๋ฅผ ์๊ฒ ์ ์งํ ์ ์๋ค.
public interface PeopleInterface {
public static People getPeople(){
return new People();
}
}:: java 8๋ถํฐ interface์์์ public static method ์ ์ธ์ , java 9๋ถํฐ private static method์ ์ธ์ ํ์ฉํ๋ค. ๊ทธ๋ฌ๋ ์ ์ ํ๋์ ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ public์ด์ด์ผ ํ๋ค.
:: ๊ตฌํ ํด๋์ค๋ฅผ ์จ๊ธฐ๋ ๊ฒ ๊ฐ๋
์ ๋ฌด๊ฒ ์ฆ, ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๊ฐ๋
์ ์์ ๋์ด๋๋ฅผ ๋ฎ์ถฐ์ค๋ค.
โ๏ธ ์ฅ์ 4. ์ ๋ ฅ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ๋งค๋ฒ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์๋ค.
:: ๋ฐํ ํ์
์ ํ์ ํ์
์ด๊ธฐ๋ง ํ๋ฉด ์ด๋ค ํด๋์ค ๊ฐ์ฒด๋ ๋ฐํํ ์ ์๋ค.
:: Man ๊ณผ Girl class๊ฐ People class ๋ฅผ ์์ํ ๋. ์๋์ ๊ฐ์ ๋ฐํ์ด ๊ฐ๋ฅํ๋ค.
public static People isMan(Boolean flag){
return flag ? new Man(): new Girl();
}:: ex) Enumset ํด๋์ค์์๋ ์์๊ฐ 64๊ฐ ์ดํ๋ฉด RegularEnumSet์ ,๊ทธ๋ณด๋ค ๋ง๋ค๋ฉด JumboEnumSet์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
โ๏ธ ์ฅ์ 5. ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ์์ ์๋ ๋ฐํํ ๊ฐ์ฒด์ ํด๋์ค๊ฐ ์กด์ฌํ์ง ์์๋ ๋๋ค.
:: ์ด๋ฌํ ์ ์ฐ์ฑ์ ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ๋ฅผ ๋ง๋๋ ๊ทผ๊ฐ์ด๋ค.
:: ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ๋ ๊ตฌํ์ฒด์ ๋์์ ์ ์ํ๋ ์๋น์ค ์ธํฐํ์ด์ค, ๊ตฌํ์ฒด๋ฅผ ๋ฑ๋กํ ๋ ์ฌ์ฉํ๋ ์ ๊ณต์ ๋ฑ๋ก API, ํด๋ผ์ด์ธํธ๊ฐ ์๋น์ค์ ์ธ์คํด์ค๋ฅผ ์ป์ ๋ ์ฌ์ฉํ๋ ์๋น์ค ์ ๊ทผ API๊ฐ ์๋ค.
ex) JDBC์์๋ Connection์ด ์๋น์ค ์ธํฐํ์ด์ค, registerDirver๊ฐ ์ ๊ณต์ ๋ฑ๋ก API, getConnection์ด ์๋น์ค ์ ๊ทผ API์ญํ ์ ํ๋ค.
public static People getPeople(){
People people = new People();
// TODO people = ํ ํจํค์ง ๊ฒฝ๋ก๋ก๋ถํฐ ํ ํด๋์ค์ ํ์ํด๋์ค๋ฅผ ์ฝ์ด์ด.
return people;
}:: ํด๋ผ์ด์ธํธ๋ ์๋น์ค ์ ๊ทผ API๋ฅผ ์ฌ์ฉํ ๋ ์ํ๋ ๊ตฌํ์ฒด์ ์กฐ๊ฑด์ ๋ช
์ํ ์ ์๋ค.
์๋ฅผ๋ค์ด JDBCํ๋ ์ ์ํฌ์์ DriverManager.getConnection์ ์ํํ ๋ Mysql ๋ฑ ๋ค์ํ driver๋ง๋ค ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๋ฐํํด์ค๋ค.
๐ ๋จ์ 1. ์์์ ํ๋ ค๋ฉด public์ด๋ protected ์์ฑ์ ์์ด, ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ง ์ ๊ณตํ๋ฉด ํ์ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
:: ๊ทธ๋ฌ๋ ์์๋ณด๋ค ์ปดํฌ์ง์
(item18)์ ์ฌ์ฉํ๋๋ก ์ ๋ํ๊ณ ๋ถ๋ณ ํ์
(item17)์ผ๋ก ๋ง๋ค๋ ค๋ฉด ์ด ์ ์ฝ์ ์ง์ผํ ํ๋ค๋ ์ ์์ ๋จ์ ์ด๋ผ๊ณ ๋ณด๊ธฐ์ ์ด๋ ต๋ค.
:: ์์ฑ์์ฒ๋ผ API์ค๋ช
์ ๋ช
ํ์ด ๋๋ฌ๋์ง ์์ผ๋ฏ๋ก ๋ฌธ์์ ์๋จ์ ์ ์จ๋๊ฑฐ๋ ๋ฉ์๋์ ์ด๋ฆ์ ๋๋ฆฌ ์๋ ค์ง ๊ท์ฝ์ ๋ฐ๋ผ ์ง์ด ๋ฌธ์ ๋ฅผ ์ํํด์ค์ผ ํ๋ค.
- from : ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฐ์ ํด๋น ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ํ๋ณํ ๋ฉ์๋
- of : ์ฌ๋ฌ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ํฉํ ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ฐํ.
- instance, getInstance : ๋งค๊ฐ๋ณ์๋ก ๋ช ์ํ ์ธ์คํด์ค ๋ฐํ, ๊ฐ์ ์ธ์คํด์ค์์ ๋ณด์ฅํ์ง ์์.
- creat, newInstance : ๋งค๋ฒ ์๋ก์ด ์ธ์คํด์ค ์์ ๋ณด์ฅ.
- getType : ์์ฑํ ํด๋์ค๊ฐ ์๋ ๋ค๋ฅธ ํด๋์ค์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ์. Type์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ๋ฐํํ ๊ฐ์ฒด์ ํ์ .
์ ํ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง์ ๋ ์ ์ ํ ๋์ํ๊ธฐ ์ด๋ ต๋ค.
:: ์ ์ธต์ ์์ฑ์๋ฅผ ์ด์ฉํ์ฌ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ์์ฑ์๋ฅผ ์ ์ ๋๋ ค๊ฐ๋ฉฐ ์์ฑ์๋ฅผ ๊ตฌ์ฑํ๊ณ , ์ํ๋ ๋งค๊ฐ๋ณ์๊ฐ ๋ชจ๋ ํฌํจ๋ ์์ฑ์์ค ๊ฐ์ฅ ์์๊ฒ์ ๊ณจ๋ผ ํธ์ถํ๊ฒ ๋๋ค.
ex)A,B,C,D์ ๋งค๊ฐ๋ณ์๊ฐ ์กด์ฌํ ๋ A,B๋ฅผ ๋งค๊ฐ๋ณ์๋ก, A,C๋ฅผ ๋งค๊ฐ๋ณ์๋ก, A,D๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฑ...
- ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ง๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ค์์ง๊ณ , ์ฝ๊ธฐ๋ ํ๋ค์ด์ง๋ค. ๊ฐ์ ์๋ฏธ์, ๋งค๊ฐ๋ณ์์ ๊ฐฏ์์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ฉฐ,
๋งค๊ฐ ๋ณ์ ๊ฐ์ ์๋ชป ๋๊ฒจ์ฃผ์ด๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
:: ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ์์ฑ์๋ฅผ ๋ง๋ค๊ณ , Setter ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ํ๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ค์ ํ๋ค.
- ์ฝ๋๋ ๊ธธ์ด์ง์ง๋ง ์ธ์คํด์ค์ ์์ฑ์ด ์ฝ๊ณ , ๋ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋ค.
- ํ์ง๋ง ๊ฐ์ฒด ํ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ง์ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผํ๊ณ , ๊ฐ์ฒด๊ฐ ์์ ํ ์์ฑ๋๊ธฐ ์ ๊น์ง ์ผ๊ด์ฑ์ด ๋ฌด๋์ง ์ํ์ ๋์ธ๋ค.(์ค๊ฐ์ ํธ์ถ๋ ๊ฒฝ์ฐ ์๋ชป ์ฌ์ฉ๋ ์ ์์.)
- Setter๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ ํด๋์ค๋ก ๋ง๋ค ์ ์๊ณ , ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณ๊ฒฝ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ ๋ ์์ ์ฑ์ ์ป์ผ๋ ค๋ฉด ์ถ๊ฐ ์์
์ด ํ์ํ๋ค(lock)
:: ์ ์ธต์ ์์ฑ์ ํจํด์ ์์ ์ฑ๊ณผ ์๋ฐ ๋น์ฆ ํจํด์ ๊ฐ๋
์ฑ์ ๊ฒธ๋น.
:: ํ์ ๋งค๊ฐ๋ณ์ ๋ง์ผ๋ก ์์ฑ์๋ฅผ ํธ์ถํด ๋น๋ ๊ฐ์ฒด๋ฅผ ์ป๊ณ , ๋น๋ ๊ฐ์ฒด๊ฐ ์ ๊ณตํ๋ ์ธํฐ ๋ฉ์๋๋ค๋ก ์ ํ ๋งค๊ฐ๋ณ์๋ค์ ๊ฐ์ ์ค์ ํ๋ค.
๋ง์ง๋ง์ผ๋ก build()๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ป๋๋ค. ๋น๋๋ ์์ฑํ ํด๋์ค ์์ ์ ์ ๋ฉค๋ฒํด๋์ค๋ก ๋ง๋ค์ด ๋๋๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
public class NutritionFacts {
private final int servings;
private final int servingSize;
private final int sodium;
private final int fat;
private final int carbohydrate;
public static class Builder {
private final int servings;
private final int servingSize;
private int sodium = 0;
private int fat = 0;
private int carbohydrate = 0;
public Builder(int servings, int servingSize) {
this.servings = servings;
this.servingSize = servingSize;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public Builder fat(int val) {
sodium = val;
return this;
}
public Builder carbohydrate(int val) {
sodium = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
public NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}public static void main(String[] args) {
NutritionFacts nutritionFacts = new Builder(10,100)
.fat(200)
.carbohydrate(300)
.sodium(150)
.build();
}:: ๊ฐ ๋ฉ์๋์์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์๋ค.
:: ์ฌ๋ฌ ๋งค๊ฐ๋ณ์๋ฅผ ํผํฉํ์ฌ ๊ฒ์ฌํด์ผํ ๊ฒฝ์ฐ build ๋ฉ์๋์์ ํธ์ถํ๋ ์์ฑ์์์ ์ด๋ฅผ ๊ฒ์ฌํ ์ ์๋ค.
:: ์ธํฐ ๋ฉ์๋๋ ๋น๋ ์์ ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฐ์์ ์ผ๋ก ํธ์ถ์ด ๊ฐ๋ฅํ๋ค. ์ฝ๋๋ฅผ ์ฐ๊ณ ์ฝ๊ธฐ ์ฝ๋ค.
:: ๊ฐ ๊ณ์ธต์ ํด๋์ค์ ๊ด๋ จ ๋น๋๋ฅผ ๋ฉค๋ฒ๋ก ์ ์, ์ถ์ ํด๋์ค๋ ์ถ์ ๋น๋๋ฅผ, ๊ตฌ์ฒด ํด๋์ค๋ ๊ตฌ์ฒด ๋น๋๋ฅผ ๊ฐ๊ฒ ํ๋ค.
public class Pizza {
public enum Topping {HAM, MUSHROOM, ONION;}
final Set<Topping> toppings;
abstract static class Builder<T extends Builder<T>>{
EnumSet<Topping> toppings = EnumSet.noneOf(Topping.class);
public T addTopping(Topping topping){
toppings.add(Objects.requireNonNull(topping));
return self();
}
abstract Pizza build();
protected abstract T self();
}
Pizza(Builder<?> builder) {
toppings = builder.toppings.clone();
}
}import java.util.Objects;
public class Calzone extends Pizza {
private final boolean sauceInside;
public static class Builder extends Pizza.Builder<Builder> {
private boolean sauceInside = false;
public Builder sauceInside() {
sauceInside = true;
return this;
}
@Override
public Calzone build() {
return new Calzone(this);
}
@Override
protected Builder self() {
return this;
}
}
private Calzone(Builder builder) {
super(builder);
sauceInside = builder.sauceInside;
}
}- Objects.requireNonNull(obj) : obj๊ฐ null์ธ์ง ํ์ธ. ๋๋ฒ์งธ ์ธ์๋ก ๋ฉ์ธ์ง๋ฅผ ์ค์ ํ ์๋ ์์.
- Objects.requireNonNullElse(obj, obj2) : obj๊ฐ null์ด๋ผ๋ฉด obj2๋ก ๋์ฒด ๊ฐ๋ฅ.
:: ์ถ์ ๋ฉ์๋ self๋ฅผ ์ด์ฉํ์ฌ ํ์ ํด๋์ค์์ ํ๋ณํ์ ๊ฑฐ์น์น ์๊ณ ๋ ๋ฉ์๋ ์ฐ์๋ฅผ ์ง์ํ ์ ์๋ค.(simulated self-type) :: ํ์ ํด๋์ค์ ๋น๋๊ฐ ์ ์ํ build() ๋ฉ์๋๋ ํด๋นํ๋ ๊ตฌ์ฒด ํ์ํด๋์ค๋ฅผ ๋ฐํํ๋ค. ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๋ ํ๋ณํ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋น๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค (๊ณต๋ณ๋ฐํ ํ์ดํ)
์ ์ธต์ ์์ฑ์ ํจํด๋ณด๋ค๋ ์ฝ๋๊ฐ ์ฅํํด ๋งค๊ฐ๋ณ์๊ฐ 4๊ฐ ์ด์์ ๋์ด์ผ ๊ฐ์ด์น๋ฅผ ํ๋ค. ๊ทธ๋ฌ๋ API๋ ์๊ฐ์ด ์ง๋ ์๋ก ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ง๋ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ด์ ๋น๋๋ก ์์ํ๋ ํธ์ด ๋์๋๊ฐ ๋ง๋ค.
์ฑ๊ธํด(singleton) : ์ธ์คํด์ค๋ฅผ ์ค์ง ํ๋๋ง ์์ฑํ ์ ์๋ ํด๋์ค. ํจ์์ ๊ฐ์ ๋ฌด์ํ ๊ฐ์ฒด๋ ์ค๊ณ์ ์ ์ผํด์ผ ํ๋ ์์คํ ์ปดํฌ๋ํธ๊ฐ ๊ทธ ์์ด๋ค.
์ฑ๊ธํด ํด๋์ค๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ํ ์คํธํ๊ธฐ๊ฐ ์ด๋ ค์์ง ์ ์๋ค.
ํ์ ์ ์ธํฐํ์ด์ค๋ก ์ ์ํ ๋ค์ ์ด๋ฅผ ๊ตฌํํด์ ๋ง๋ ์ฑ๊ธํด์ด ์๋๋ผ๋ฉด ์ฑ๊ธํด ์ธ์คํด์ค๋ฅผ ๊ฐ์ง(mock) ๊ตฌํ์ผ๋ก ๋์ฒดํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1();
private Singleton1(){}
}//์์ฑ ๋ถ๊ฐ๋ฅ
Singleton1 singleton1 = new Singleton1(); (x)
//์ธ์คํด์ค ๊ฐ์ ธ์ด.
Singleton1 singleton1 = Singleton1.INSTANCE;:: ์์ฑ์๊ฐ private๋ก ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค, ๋ฐ๋ผ์ ์ธ์คํด์ค๊ฐ ์ ์ฒด ์์คํ
์์ ํ๋๋ฟ์์ด ๋ณด์ฅ๋๋ค.
:: ์์ฑ์ด ๊ฐ๊ฒฐํ๊ณ , ์ฑ๊ธํด์์ด ๋ช
๋ฐฑํ๊ฒ ๋๋ฌ๋๋ค.
:: ํ์ง๋ง ์์ธ๋ก ๋ฆฌํ๋ ์ API์ AccessibleObject.setAccesible(true)๋ฅผ ์ฌ์ฉํด private ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋ ์ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ๊ฐ์ ์์ฑ์ด ํ์ํ๋ค.
int count =0;
private Singleton1() {
count++;
if(count != 1){
throw new IllegalStateException("this Object should be Singleton");
}
}public class Singleton2 {
private static final Singleton2 INSTANCE = new Singleton2();
private Singleton2(){};
public static Singleton2 getInstance(){
return INSTANCE;
}
}Singleton2 singleton2 = Singleton2.getInstance();:: INSTANCE ํ๋๋ private๋ก ์ฒ๋ฆฌํ๊ณ ์ธ์คํด์ค๋ฅผ ์ป๊ธฐ์ํ ์ ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์ป๋๋ค.
-
1. API๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๋ ์ฑ๊ธํด์ด ์๋๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.(๋ฉ์๋์์ new๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๋ฐํํ๋ฉด ๋๋ค.) 2. ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ ๋ค๋ฆญ ์ฑ๊ธํด ํฉํฐ๋ฆฌ๋ก ๋ง๋ค ์ ์๋ค.(์์ดํ 30) 3. ์ ์ ํฉํฐ๋ฆฌ์ ๋ฉ์๋๋ฅผ ์ฐธ์กฐ๋ฅผ ๊ณต๊ธ์(supplier)๋ก ํ ์ ์๋ค.
Supplier<Singleton2> singleton2Supplier= Singleton2::getInstance;๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ๋ ์ฑ๊ธํด ํด๋์ค๋ ์ง๋ ฌํ, ์ญ ์ง๋ ฌํ ๊ณผ์ ์์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ฒ ๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
1. ๋ชจ๋ ์ธ์คํด์ค ํ๋์ transient ์ ์ธ.
2. readResolve ๋ฉ์๋์ ์ ๊ณต.
- ๋ฐฉ๋ฒ 2์์์ ๋ณ๊ฒฝ.(Serializable)
private static final transient Singleton2 INSTANCE = new Singleton2();
private Object readResolve(){
return INSTANCE;
}public enum Singleton3 implements Serializable {
INSTANCE;
}Singleton3 singleton3 =Singleton3.INSTANCE;:: ๋ฐฉ๋ฒ1๊ณผ ์ ์ฌํ์ง๋ง ๊ฐ๊ฒฐํ๊ณ , ๋ฆฌํ๋์
์ ๋ฐฉ์ด์ ์ง๋ ฌํํ๋๋ฐ ์์ด ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์๋ค.
:: ๊ทธ๋ฌ๋ ์ฑ๊ธํด ํด๋์ค๊ฐ ํด๋์ค๋ฅผ ์์ํด์ผ ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. (์ธํฐํ์ด์ค ๊ตฌํ๋ง ๊ฐ๋ฅ.)
Utility ํด๋์ค๋ค๊ณผ ๊ฐ์ด ์ ์ ๋ฉ์๋์ ์ ์ ํ๋๋ง์ ๋ด์ ํด๋์ค๋ฅผ ๋ง๋ค ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋๋ก ์ค๊ณํ์ง ์๋๋ค. ๊ทธ๋ ๋ค๊ณ ์์ฑ์๋ฅผ ์์ฑํ์ง ์๋๋ค๊ณ ํด๋, ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ค๋ค.
public abstract class UtilityClass {
public static String getName(){
return "kim";
}
public static void main(String[] args) {
UtilityClass.getName();
// ์ถ์ ํด๋์ค ์ธ์คํด์ค ์์ฑ ๋ถ๊ฐ๋ฅ
UtilityClass utilityClass = new UtilityClass(); (x)
}
}:: abstract Class ๋ก ๋ง๋ค๋ฉด ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ๋ชปํ๊ฒ ํ ์ ์๋ค.
public class AnotherClass extends UtilityClass{
public static void main(String[] args) {
AnotherClass anotherClass = new AnotherClass();
// ๋ฉ์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ.
// anotherClass.getName() (x);
}
}:: ํ์ง๋ง ํด๋น ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค์ ์ธ์คํด์ค๋ ์์ฑ๋ ์ ์๋ค, ๊ทธ๋ฌ๋ ๋ฉ์๋์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ์๋ฌด์๋ฏธ ์๋ ์ธ์คํด์ค๊ฐ ๋๋ค.
:: ๋๋ฌธ์ ๋ฐฉ๋ฒ 2๋ฅผ ์ ์ํ๋ค.
public class UtilityClass {
public static String getName(){
return "kim";
}
//์ธ์คํด์ค ์์ฑ ๋ฐฉ์ง.
private UtilityClass(){
throw new AssertionError();
}
}:: ์์ฑ์๋ฅผ private๋ก ์์ฑํ๊ฒ ๋๋ฉด ์ธ๋ถ์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์๋ ์๊ณ , ์ปดํ์ผ๋ฌ ๋ํ public ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์์ฑํ์ง ์๋๋ค.
:: ์์ ๋ํ private ์์ฑ์์ด๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ๋ฅํ๋.
:: ์์ฑ์๊ฐ ์กด์ฌํ๋๋ฐ ํธ์ถ์ ํ ์ ์์ด ์ง๊ด์ ์ด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์ฃผ์์ด ํ์ํ๋ค.
๋ง์ ํด๋์ค๊ฐ ํ๋ ์ด์์ ์์์ ์์กดํจ. ์๋ฅผ ๋ค์ด ๋ง์ถค๋ฒ ๊ฒ์ฌ๊ธฐ๋ ์ฌ์ ์ ์์กดํ๊ฒ ๋๊ณ ์ด๋ฐ ํด๋์ค๋ฅผ ์๋ชป๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๊ฒ์ ํํ ๋ณผ ์ ์๋ค.
public class SpellChecker1 {
private static final Lexicon dictionary = new KoreanDictionary();
//๊ฐ์ฒด ์์ฑ ๋ฐฉ์ง
private SpellChecker1() {
}
public static boolean isValid(String word) {
// check
return true;
}
}:: ์ ์ฐํ์ง ๋ชปํ๋ค. ์ฌ์ ์ ๊ต์ฒด๊ฐ ์ด๋ ค์.
public class SpellChecker2 {
private final Lexicon dictionary =new KoreanDictionary();
private SpellChecker2(){}
public static final SpellChecker2 INSTANCE = new SpellChecker2();
public boolean isValid(String word){
// check
return true;
}
}:: ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฐํ์ง ๋ชปํ๊ณ , ์ฌ์ ์ ๊ต์ฒด๊ฐ ์ด๋ ต๋ค.
-์์ ๋๊ฐ์ง ๋ฐฉ์์์๋ ์๋ก์ด ์ฌ์ ์๋ก ๊ต์ฑํ๊ธฐ ์ํด์๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ ์ค๋ฅ๋ฅผ ๋ด๊ธฐ ์ฌ์ฐ๋ฉฐ,
๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ์ง์๋ค.
public class SpellChecker3 {
private final Lexicon dictionary;
public SpellChecker3(Lexicon dictionary) {
this.dictionary = Objects.requireNonNull(dictionary);
}
public boolean isValid(String word){
//check
return true;
}
}:: ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์์ฑ์์ ํ์ํ ์์(์ฌ์ ์ ๋๊ฒจ์ค๋ค.) ์ด๋ ์์กด ๊ฐ์ฒด ์ฃผ์
์ ํ ํํ์ด๋ค.
:: ์ ์ ํฉํฐ๋ฆฌ, ๋น๋์๋ ์ ์ฉ ๊ฐ๋ฅํ๋ค.
public class SpellChecker4 {
private final Lexicon dictionary;
public SpellChecker4(Supplier<Lexicon> dictionary) {
this.dictionary = Objects.requireNonNull(dictionary.get());
}
public boolean isValid(String word){
//check
return true;
}
}Lexicon lexicon = new KoreanDictionary();
SpellChecker4 spellChecker4 = new SpellChecker4(new Supplier<Lexicon>() {
@Override
public Lexicon get() {
return lexicon;
}
});
- ํด๋์ค๊ฐ ๋ด๋ถ์ ์ผ๋ก ํ๋ ์ด์์ ์์์ ์์กดํ๊ณ , ๊ทธ ์์์ด ํด๋์ค ๋์์ ์ํฅ์ ์ค๋ค๋ฉด ํด๋น ์์๋ค์ ํด๋์ค๊ฐ ์ง์ ๋ง๋ค๊ฒ ํด์๋ ์๋๋ค.
- ๋์ ํ์ํ ์์(๋๋ ํฉํฐ๋ฆฌ)์ ์์ฑ์(๋๋ ์ ์ ํฉํฐ๋ฆฌ, ๋น๋)์ ๋๊ฒจ์ค๋ค.
- ์ด๋ฐ ์์กด๊ฐ์ฒด ์ฃผ์ ์ ํด๋์ค์ ์ ์ฐ์ฑ, ์ฌ์ฌ์ฉ์ฑ, ํ ์คํธ ์ฉ์ด์ฑ์ ๊ฐ์ ํด์ค๋ค
๋๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ์์ฑํ๊ธฐ ๋ณด๋ค๋ ํ๋์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ๋ ํธ์ด ๋์๋๊ฐ ๋ง๋ค. ์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ์ํฉ์ด๋ค.
String s = new String("test");
String s = "test";:: ์์ฑ์์ ๋๊ฒจ์ง "test"์์ฒด๊ฐ ์์ฑ์๋ก ๋ง๋ค์ด ๋ด๋ ๊ฐ์ฒด์ ์ญํ ๊ณผ ์์ ํ ๋์ผํ๋ค.
:: 1๋ฒ์ ์ฝ๋์์๋ ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง๋ง 2๋ฒ์์๋ ํ๋์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ๋ถํ์ํ ์์ฑ์ ํ์ง ์๋๋ค.
String s1 = new String("test");
String s2 = new String("test");
System.out.println(s1 == s2 ); //falseboolean b1 = Boolean.valueOf("true");
boolean b2 = Boolean.valueOf("true");
System.out.println(b1 == b2); //true
System.out.println(b1 == Boolean.TRUE); //true:: Boolean(String) ์์ฑ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ๋์ผํ ๊ฐ์ฒด๊ฐ ๋ฐํ๋จ์ ํ์ธํ ์ ์๋ค. ๋ฐํ๋๋ ๊ฐ์ฒด๋ static field์ธ Boolean.TRUE์ด๋ค.
:: ๋น์ผ ๊ฐ์ฒด๊ฐ ๋ฐ๋ณตํด์ ํ์ํ๋ค๋ฉด ์บ์ฑํ์ฌ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
๋ค์์ ๋ฌธ์์ด์ด ์ ํจํ ๋ก๋ง์ซ์์ธ์ง ํ์ธํ๋ ๋ฉ์๋์ด๋ค
static boolean isRomanNumeral(String s){
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}:: ๋ฉ์๋์ ๋ด๋ถ์์ ์์ฑ๋๋ ์ ๊ทํํ์์ฉ Pattern ์ธ์คํด์ค๋ ํ๋ฒ ์ฌ์ฉํ๊ณ ๋ฒ๋ ค์ง๋๋ฐ, Pattern์ ์ ๋ ฅ๋ฐ์ ์ ๊ทํํ์์ ํด๋นํ๋ ์ ํ ์ํ ๋จธ์ ์ ๊ทธ๋ฆฌ๊ธฐ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์์ฑ ๋น์ฉ์ด ๋๋ค. :: ๋๋ฌธ์ ํด๋์ค๋ฅผ ์ด๊ธฐํํ๋ ๊ณผ์ ์์ ์ง์ ์์ฑํด ์บ์ฑํด๋๊ณ ํธ์ถ๋ ๋ ํด๋น ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค.
static boolean isRomanNumeral(String s){
return ROMAN.matcher(s).matches();
}:: ์ฑ๋ฅ์ ๊ฐ์ ๋ฟ๋ง ์๋๋ผ ์ฝ๋์ ์๋ฏธ๋ํ ๋ช ํํด์ก๋ค. (Pattern ์ธ์คํด์ค๊ฐ ๋๋ฌ๋จ.)
:: ๊ฐ์ฒด๊ฐ ๋ถ๋ณ์ด๋ผ๋ฉด ์ฌ์ฌ์ฉํด๋ ์์ ํจ์ด ๋ช
๋ฐฑํ๋ค. ๊ทธ๋ฌ๋ ๋ ๋ช
ํํ๊ฑฐ๋, ์ฌ์ง์ด ์ง๊ด์ ๋ฐ๋๋๋ ์ํฉ๋ ์๋ค.
:: ์ด๋ํฐ๋ ์ค์ ์์
์ ๋ท๋จ ๊ฐ์ฒด์ ์์ํ๊ณ ์์ ์ ์ธํฐํ์ด์ค์ ์ญํ ์ ์ํํ๋ค. ๋๋ฌธ์ ๋ท๋จ ๊ฐ์ฒด ํ๋๋น ํ๋์ ์ด๋ํฐ๋ง ์์ฑํ๋ฉด ์ถฉ๋ถํ๋ค.
Map<String, Integer> students = new HashMap<>();
students.put("kim",23);
students.put("park",25);
Set<String> names = students.keySet();
Set<String> names2 = students.keySet();
names.remove("kim");
System.out.println(names.size()); // 1
System.out.println(names2.size()); // 1:: Map ์ keySet()๋ฉ์๋๋ ํค๋ฅผ ๋ด์ Set์ ๋ฐํํ๊ณ ์ด๋ค์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค. ๋ฐ๋ผ์ ํ๋์ ๋ด์ฉ์ด ๋ณํ๋ฉด ๋ชจ๋ Set๊ณผ Map์ด ๋ณ๊ฒฝ๋๋ค.
Long sum =0l;
for(long i =0l; i<Integer.MAX_VALUE; i++)
sum+= i;:: sum ๋ณ์๋ Long์ผ๋ก ์ ์ธ๋์ด ์๊ณ , ์ฌ๊ธฐ์ long ํ์
์ i ๋ฅผ ๋ํ๋ค. ์ด๋ i๊ฐ sum์ ๋ํด์ง๋ ๋ง๋ค Long ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ฒ ๋๊ณ ,
์ฌ๊ธฐ์๋ ์ฝ 2^31๊ฐ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
:: Long ํ์
์ long์ ๋ํ ๋ ๊ฑธ๋ฆฐ ์๊ฐ์ 3229ms ์๊ณ , longํ์
์ longํ์
์ ๋ํ ๋ ๊ฑธ๋ฆฐ ์๊ฐ์ 729ms๋ก ์ฝ 4๋ฐฐ ์ด์์ ์ฑ๋ฅ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
- ๋ถํ์ํ ๊ฐ์ฒด์ ์์ฑ์ ํผํ์ (์ฌ์ฌ์ฉ)
- "๊ฐ์ฒด์ ์์ฑ์ ๋น์ธ๋ ํผํ์" ๋ผ๋ ๋ง์ด ์๋๋ค. ๋น์ธ๊ณ , ์ฌ์ฌ์ฉ์ด ์์ ํ ๊ฐ์ฒด์ ์์ฑ์ ์ค์ด์๋ ๊ฒ์ด๋ค.
- ๋ฌด๋ถ๋ณํ ๊ฐ์ฒด ์ฌ์ฌ์ฉ์ ์คํ๋ ค ๋ฒ๊ทธ์ ๋ณด์์์ ๋ฌธ์ ๋ก ์ด์ด์ง๋ค.
์๋ฐ์ GC๊ฐ ๋ชจ๋ ๊ฒ์ ํด๊ฒฐํด์ฃผ์ง๋ ์๋๋ค.
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INTTIAL_CAPACITY = 16;
public Stack(){
elements = new Object[DEFAULT_INTTIAL_CAPACITY];
}
public void push(Object e){
ensureCapacity();
elements[size++] = e;
}
public Object pop(){
if(size == 0)
throw new EmptyStackException();
return elements[--size];
}
public void ensureCapacity(){
if(elements.length ==size)
elements = Arrays.copyOf(elements, size*2 +1);
}
}:: ์คํ์ด ์ปค์ก๋ค ์์์ง ๋, ์คํ์์ ๊บผ๋ด์ง ๊ฐ์ฒด๋ค์ GC๊ฐ ํ์ํ์ง ์๊ธฐ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋์๊ฐ ๋ฐ์ํ๋ค. :: ๊ฐ์ฒด ์ฐธ์กฐ ํ๋๋ฅผ ์ด๋ ค๋๋ฉด GC๋ ๊ทธ ๊ฐ์ฒด๋ฟ๋ง ์๋๋ผ ๊ทธ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด, ๊ทธ ๊ฐ์ฒด๊ฐ ๋ ์ฐธ์กฐํ๋ ๊ฐ์ฒด.. ๋ชจ๋ ํ์ํ ์ ์๋ค.
public Object pop(){
if(size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] =null;
return result;
}:: ๋ฉ๋ชจ๋ฆฌ์ ๋์๋ pop๋ฉ์๋์์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ํ์์์ด์ง ์์์ ์ฐธ์กฐ๋ฅผ null์ฒ๋ฆฌํ๋ค. ์๋ชป๋ ์ฐธ์กฐ์์ ์ค๋ ์ค๋ฅ๋ํ ๋ค์ผ๋ก ์ก์์ค๋ค.
:: ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ํ null์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋์งํ์ง ์๋ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ณ์์ ๋ฒ์๋ฅผ ์ต์๊ฐ ๋๊ฒ ์ ์ํ๋ ๊ฒ์ด๋ค.
:: Stack ํด๋์ค๋ ์๊ธฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ null์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค. GC์ ์ ์ฅ์์๋ ๋๊ฐ์ด ์ ํจํ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
:: ์บ์ ์ญ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํค๋ ์ฃผ๋ฒ์ด๋ค. :: ์บ์ ์ธ๋ถ์์ ํค๋ฅผ ์ฐธ์กฐํ๋ ๋์๋ง ์ํธ๋ฆฌ๊ฐ ์ด์์๋ ์บ์๊ฐ ํ์ํ ์ํฉ์ด๋ผ๋ฉด WeakHashMap์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
String key = "key1";
Object value = new Object();
Map<String, Object> cache = new WeakHashMap<>();
cache.put(key,value);:: StrongReference์ธ key๊ฐ ํ์ ์์ด์ง๋ฉด ํด๋น ์ํธ๋ฆฌ๋ฅผ ํด์์์๋ ์๋์ผ๋ก ๋น์์ค๋ค. ์ฆ StrongReference์ธ key๊ฐ GC์ ๋์์ด ๋๋ฉด ์ด๋ฅผ ์ฐธ์กฐํ๋ WeakReference์ธ ๊ฐ์ฒด ๋ํ GC์ ๋์์ด ๋ ์ ์๋ค.
:: ๋ณดํต์ ์บ์์ ์ ํจ๊ธฐ๊ฐ์ ์ ํํ ์ ์ํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์๊ฐ๋ง๋ค ๋น์์ค๋ค.
:: ์ฝ๋ฐฑ๋ ์บ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฝ๋ฐฑ์ ์ง์ธ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์๋๋ค๋ฉด ๊ณ์ ์์ด๊ธฐ๋ง ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค.
:: ๋ง์ฐฌ๊ฐ์ง๋ก WeakHashMap์ ์ฌ์ฉํ์ฌ ํด๊ฒฐ ํ ์ ์๋ค.
- ํด๋์ค ์์ ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ null ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ์ด ํ์ํ๋ค.
- WeakReference๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง์ ์ ์๋ค.
- ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ colse ๋ฉ์๋๋ก ์ง์ ๋ซ์์ค์ผํ๋ ์์์ด ๋ง๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ๋์น ์์ ๋ซ๊ธฐ๋ ์์ธกํ ์ ์๋ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์๋ค.
public void doSomething(){
System.out.println("Do something");
throw new FirstException();
}
@Override
public void close() {
throw new SecondException();
}:: ๊ฐ ๋ฉ์๋์์ ์์ธ๋ฅผ ๋์ง๋๋ก ์์ฑํ๋ค.
MyResource myResource1 = new MyResource();
MyResource myResource2 = null;
try{
myResource1.doSomething();
try {
myResource2 = new MyResource();
myResource2.doSomething();
}finally {
myResource2.close();
}
}finally {
myResource1.close();
}:: ์ค์ฒฉ์ด ์๊ธฐ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค.

:: doSomething์์ FirstException์ด ๋ฐ์ํ์ง๋ง ๋ค์์ ๋ฐ์ํ๋ SecondException์ ๊ฐ๋ ค์ง๊ฒ ๋๋ค.
try (MyResource myResource1 = new MyResource();
MyResource myResource2 = new MyResource()) {
myResource1.doSomething();
myResource2.doSomething();
}
:: FirstException ๋ํ ์ ๋ณผ ์ ์๊ณ , myResource2์ close๋ํ ์ ์คํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- try-with-Resources๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ ์์ธ๊ฐ ๊ฐ๋ ค์ง์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ์์ ํฐ ์ฅ์ ์ ๊ฐ์ง๋ค.
- ์ฝ๋๊ฐ ๋ ์งง๊ณ ๋ถ๋ช ํด์ง๊ณ ์ ํํ๊ณ ์ฝ๊ฒ ์์์ ํ์ํ ์ ์๋ค.
equals๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ ์ ํ์ง ์์ผ๋ฉด ๊ทธ ํด๋์ค์ ์ธ์คํด์ค๋ ์ค์ง ์๊ธฐ ์์ ๊ณผ๋ง ๊ฐ๋ค.
-
- ๊ฐ์ ํํํ๋ ๊ฒ์ด ์๋๋ผ ๋์ํ๋ ๊ฐ์ฒด๋ฅผ ํํํ๋ ํด๋์ค ex)Thread -
- java.util.regex.Pattern ์์ equals๋ฅผ ์ฌ์ ์ ํ์ฌ ์ ๊ท์์ด ๊ฐ์์ง ๋ ผ๋ฆฌ์ ๋์น์ฑ์ ๊ฒ์ฌํ ์ ์๋ค. ํ์ง๋ง ์ด๋ฌํ ๊ฒ์ฌ๊ฐ ํ์์๋ค๊ณ ํ๋จ๋๋ฉด ๊ธฐ๋ณธ equals๋ง์ผ๋ก ์ถฉ๋ถํ๋ค. -
- Set,List, Map ๊ตฌํ์ฒด๋ค์ Abstํด๋์ค๋ก๋ถํฐ ๊ตฌํํ equals๋ฅผ ์์๋ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Map)) return false; Map<?,?> m = (Map<?,?>) o; if (m.size() != size()) return false; try { for (Entry<K, V> e : entrySet()) { K key = e.getKey(); V value = e.getValue(); if (value == null) { if (!(m.get(key) == null && m.containsKey(key))) return false; } else { if (!value.equals(m.get(key))) return false; } } } catch (ClassCastException unused) { return false; } catch (NullPointerException unused) { return false; } return true; }
:: AbstractMap์์ ๊ตฌํํ equals, ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋๋๋ผ๋ <key,value> ์์ด ๋ชจ๋ ๋์ผํ๋ค๋ฉด ture,
๊ตฌํ์ฒด์ธ HashMap๋ฑ์์๋ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ์ํ์ง ์๋๋ค. -
- ํธ์ถํ ์ผ์ด ์์ผ๋ฉด ๋น์ฐํ ์ฌ์ ์ํ ํ์๋ ์๋ค. ํน์ equals๊ฐ ์ค์๋ก๋ผ๋ ํธ์ถ๋๋๊ฑธ ๋ง๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํด๋๋ค.@Override public boolean equals(Object o ){ throw new AssertionError(); }
๊ฐ์ฒด ์๋ณ์ฑ(๋ ๊ฐ์ฒด๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์๊ฐ)์ด ์๋๋ผ ๋ ผ๋ฆฌ์ ๋์น์ฑ์ ํ์ธํด์ผ ํ๊ณ , ์์ํด๋์ค์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ๋๋ก ์ฌ์ ์๋์ง ์์์ ๋. (์ฃผ๋ก ๊ฐ ํด๋์ค)
- ๊ทธ๋ฌ๋ ๊ฐ์ด ๊ฐ์ ์ธ์คํด์ค๊ฐ ๋ ์ด์ ๋ง๋ค์ด์ง์ง ์์์ ๋ณด์ฅํ๋ ํด๋์ค๋ผ๋ฉด equlas๋ฅผ ์ฌ์ ์ ํ์ง ์์๋ ๋ ผ๋ฆฌ์ ๋์น์ฑ๊ณผ ๊ฐ์ฒด ์๋ณ์ฑ์ด ์ฌ์ค์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
- ์๋ ๊ท์ฝ์ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ์ด null์ด ์๋์ ์ ์ ๋ก ํ๋ค.
- ๋ฐ์ฌ์ฑ(reflexivity): x.equals(x)๋ true.
- ๋์นญ์ฑ(symmentry) : x.equals(y) ์ y.equals(x)์ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
- ์ถ์ด์ฑ(transitivity) : x.equals(y) =true, y.equals(z) =true์ด๋ฉด, x.equals(z) =true.
- ์ผ๊ด์ฑ(consistency) : x.equals(y)๋ฅผ ๋ฐ๋ณตํด์ ํธ์ถํด๋ ํญ์ ๊ฐ์ ๊ฐ์ ๋ฐํํ๋ค.
- null-์๋ : x.equals(null)์ false์ด๋ค.
-
- ์๊ธฐ ์์ ์ด๋ผ๋ฉด true๋ฅผ ๋ฐํํ๋ค.if (o == this) return true;
-
- ๊ทธ๋ ์ง ์๋ค๋ฉด false๋ฅผ ๋ฐํํ๋ค. ๋ณดํต equasl๊ฐ ์ ์๋ ํด๋์ค ํ์ ์ธ์ง ํ์ธํ์ง๋ง ๊ฐ๋์ ๊ทธ ํด๋์ค๊ฐ ๊ตฌํํ ํน์ ์ธํฐํ์ด์ค๊ฐ ๋ ์๋ ์๋ค. - ์์ ์ ๊ตฌํํ ์๋ก๋ค๋ฅธ ํด๋์ค ๋ผ๋ฆฌ๋ ๋น๊ตํ ์ ์๋๋ก ์์ ํ๊ธฐ๋ ํ๋ค. (Set, List, Map ...)if (!(o instanceof Map)) return false;
-
- ์์ instanceof๋ก ๊ฒ์ฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.Map<?,?> m = (Map<?,?>) o;
-
4. ์ ๋ ฅ ๊ฐ์ฒด์ ์๊ธฐ ์์ ์ด ๋์๋๋ 'ํต์ฌ'ํ๋๋ค์ด ๋ชจ๋ ์ผ์นํ๋์ง ํ๋์ฉ ๊ฒ์ฌํ๋ค.
- ํ๋๋ผ๋ ๋ค๋ฅด๋ค๋ฉด false๋ฅผ ๋ฐํํ๋ค. 2๋จ๊ณ์์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํ๋๊ฐ์ ๊ฐ์ ธ์ฌ ๋๋ ํด๋น ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.try { for (Entry<K, V> e : entrySet()) { K key = e.getKey(); V value = e.getValue(); if (value == null) { if (!(m.get(key) == null && m.containsKey(key))) return false; } else { if (!value.equals(m.get(key))) return false; } }
- float ,double์ ์ ์ธํ ๊ธฐ๋ณธ ํ์ ํ๋๋ '==' ์ฐ์ฐ์๋ก ๋น๊ต.
- ์ฐธ์กฐ ํ์ ํ๋๋ equals ๋ฉ์๋๋ก.
- float์ double์ ๊ฐ๊ฐ ์ ์ ๋ฉ์๋์ธ Float.compare, Double.compare๋ก ๋น๊ตํ๋ค. (ํน์ํ ๋ถ๋ ์์๊ฐ ๋ฑ์ ๋ค๋ค์ผ ํจ.)equals๋ ๊ฐ๋ฅํ๋ ์คํ ๋ฐ์ฑ์ ์๋ฐํ ์ ์์ด ์ฑ๋ฅ์ด ์ข์ง์๋ค.
- null ๊ฐ์ ์ ์ ๊ฐ์ผ๋ก ์ทจ๊ธํ๋ ์ฐธ์กฐ ํ์ ํ๋๋ Object.equlas(Object, Object)์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์.(NullPointException ๋ฐ์ ๋ฐฉ์ง.)
- equals๋ฅผ ์ฌ์ ์ ํ ๋ hashCode๋ ๋ฐ๋์ ์ฌ์ ์ ํ์.(์์ดํ
11)
- ๋๋ฌด ๋ณต์กํ๊ฒ ํด๊ฒฐํ๋ ค ํ์ง ๋ง์, ํ๋์ ๋์น์ฑ๋ง ๊ฒ์ฌํด๋ ๊ท์ฝ์ ์ด๋ ต์ง ์๊ฒ ์งํฌ ์ ์๋ค.
- Objectํ์
์ด์ธ์ ํ์
์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ equals ๋ฉ์๋๋ ์ ์ธํ์ง ๋ง์ ->์ค๋ฒ๋ผ์ด๋ฉ์ด ์๋ ์ค๋ฒ๋ก๋ฉ.
- ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด equals๋ฅผ ์ฌ์ ์ ํ์ง ์์๋ ์ํ๋ ๋น๊ต๋ฅผ ์ ํํ ์ํํ๋ค.
- ์ฌ์ ์ํด์ผ ํ ๋๋ ํด๋น ํด๋์ค์ ํต์ฌ ํ๋๋ฅผ ๋ชจ๋ ๋น ์ง์์ด ๊ท์ฝ์ ์ง์ผ๊ฐ๋ฉฐ ๋น๊ตํ๋ค.
๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํ ํ๋ผ๋ ๊ฒ์ ๋ค์ ๋งํด ๋ถ๋ณ ๊ฐ์ฒด๋ก ์ค๊ณํ๋ผ๋ ๊ฒ์ด๋ค.
์ธ์คํด์ค ๋ด๋ถ์ ๊ฐ์ ์์ ํ์ง ๋ชปํ๊ฒ ํ๊ณ ํด๋์ค์ ์์์ ๋ง์ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋ ์๊ฐ๊น์ง ์ฒ์๊ณผ ๋์ผํ ๊ฐ์ ๊ฐ์ง๊ณ ์์์ ๋ณด์ฅํ๋ค.
์ด๋ฌํ ๋ถ๋ณ ๊ฐ์ฒด๋ ์ฌ์ฉ์ ์ฝ๊ฒํ๊ณ , ์ค๋ฅ ๋ฐ์์ ์ฌ์ง๋ฅผ ์ค์ฌ์ค๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ถ๋ณ ๊ฐ์ฒด๋ ์ด๋ป๊ฒ ๋ง๋ค์ด์ผ ํ ๊น?
-
๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํ๋ค.
- ํ์ ํด๋์ค์์ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
- final ํด๋์ค๋ก ๋ง๋ค์ด ์์์ ๋ฐฉ์งํ๋ค.
- ๋ชจ๋ ์์ฑ์๋ฅผ private ๋๋ package-private(default)๋ก ๋ง๋ค๊ณ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
final ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ์ ์ด๊ธฐํ ๋ ํ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ๋ชปํ๋๋ก ์์คํ ์ ์ผ๋ก ๋ง๋๋ค.
ํด๋ผ์ด์ธํธ์์ ์ง์ ์ ๊ทผํด ์์ ํ๋ ์ผ์ ๋ฐฉ์งํ๋ค.
- ํด๋ผ์ด์ธํธ์์ ํด๋น ์ปดํฌ๋ํธ์ ์ฐธ์กฐ๋ฅผ ์ป์ด์๋ ์๋๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๋๋ก ํด๋ ์๋๋ค.
- ํ๋๋ฅผ ๋ฐํํ ๋๋ ๊ทธ๋๋ก ๋ฐํํ๋ ๊ฒ์ด ์๋ ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ์ํํ๋ค
-
๊ฐ์ ๋ณ๊ฒฝํ์ง ์๋๋ค๋ฉด ๊ฐ์ ๋ณํ๋ฅผ ์ด๋ค์์ผ๋ก ์ํํด์ผ ํ๋์ง ๊ถ๊ธ์ ์ด ์๊ธธ๊ฒ์ด๋ค. ์๋๋ ์์ ์ฝ๋์ด๋ค.
public final class Point { private final int x; private final int y; public Point(final int x, final int y){ this.x = x; this.y = y; } public Point move(final int x, final int y){ return new Point(this.x + x, this.y + y); } }
๊ฐ์ ๋ณํ๋ ๊ณง ์๋ก์ด ๊ฐ์ฒด์ ๋ฐํ์ ์๋ฏธํ๋ค. ๊ธฐ๋ณธ ํ์ ์ Wrapper ํด๋์ค์ธ BigInteger ๋ฑ์ด ์ด์ ๊ฐ์ด ๊ตฌํ๋์ด ์๋ค. ์ด๋ฌํ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํ๋ค. ์์ ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์๋ค. ์์์์๋ ๋์ฌ๋ฅผ ์ฌ์ฉํ์์ง๋ง, ๋์ฌ ๋์ ์ ์น์ฌ๋ฅผ ์ฌ์ฉํ๋ ๋ช ๋ช ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข๋ค(add ๋์ plus์ ๊ฐ์ด)
-
-
๊ฐ์ด ํญ์ ๋์ผํ๊ณ , ๋ณ๊ฒฝ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋์์ ์ ๊ทผ์ด ์ด๋ฃจ์ด์ง๋๋ผ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๋๋ค
-
๋ถ๋ณ์ฑ์ด ํ๋ฌผ์ด์ง ๊ฑฑ์ ์ ํ์ง ์์๋ ๋๋ค.
-
์ํ๊ฐ ์ ๋ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ์ผ์น ์ํ์ ๋น ์ง ์ผ์ด ์๋ค.
-
-
-
- ์์ฑ๋น์ฉ์ด ๊ต์ฅํ ํฐ ๊ฐ์ฒด๋ผ๋ฉด ๋งค๋ฒ ๋ณ๊ฒฝ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ํฐ ๋น์ฉ์ ์น๋ฌ์ผํ ์ ์๋ค.
-
-
- ํด๋์ค๋ ๋๋๋ก ๋ถ๋ณ์ผ๋ก ์ค๊ณํ๋ค. - ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์๋ ์๋ค. ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฐ์ฒด๋ผ๋ฉด ๋ณ๊ฒฝํ ์ ์๋ ๋ถ๋ถ์ ์ต์ํํ๋ค. - ํฉ๋นํ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ชจ๋ ํ๋๋ private final ์ด๋ค.
์์์ ๊ฐ์ฒด ์งํฅ์์ ๊ต์ฅํ ์ค์ํ ๊ฐ๋ ์ด์ง๋ง ์๋ชป ์ฌ์ฉํ๋ค๋ฉด ๋ง์ ๋ถ์์ฉ(์บก์ํ ํ๊ดด ๋ฑ)์ ์๊ฒจ์ค ์ ์๋ค. ์์์ ์๋ฒฝํ IS-A ๊ด๊ณ์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.(IS-A ๊ด๊ณ๋ผ๋ ์๋ก ๋ค๋ฅธ ํจํค์ง์์์ ์์์ ํผํ์)
-
-
- ์์ ํด๋์ค์ ๊ตฌํ์ ๋ฐ๋ผ ํ์ ํด๋์ค์ ๋์์ ์ด์์ด ๋ฐ์ํ ์ ์๋ค.(์ฌ์ฉ์๊ฐ ์๊ฐํ์ง ๋ชปํ ์์ ํด๋์ค์ ์ฌ์ฉ ๋ฐฉ์)
- HashSet์ ์์๋ก ๋ค์ด๋ณด์. ๋ค์์ ์ด๊ธฐ ์์ฑ ์ดํ์ ๋ช๊ฐ์ ์์๊ฐ ๋ํด์ก๋์ง ๊ตฌํ๋ myHashSet์ ์์์ด๋ค.
ํด๋น ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด์ addAll๋ก 3๊ฐ์ ์์๋ฅผ ๋ํ๋ฉด addCount๋ 3์ด ๋ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ๋ฉด์ ๊ตฌํํ์์ ๊ฒ์ด๋ค.
public class myHashSet<E> implements HashSet<E> { ... @Override public boolean add(E e){ addCount ++; return super.add(e); } @Override public boolean addAll(Collection<? extends E> c) { addCount += c.size(); return super.addAll(c); } }
ํ์ง๋ง ํด๋น ์ฝ๋์ ๊ฒฐ๊ณผ๋ 6์ด ๋์จ๋ค(3 + 1 + 1 + 1) HashSet์ addAll์ ๋ด๋ถ์ ์ผ๋ก add๋ฅผ ํธ์ถํ๋๋ก ๊ตฌํ๋์ด ์๋ค.
๋๋ฌธ์ size์ธ 3์ ๋ํ๊ณ add ๋ฉ์๋์์ ๊ฐ๊ฐ 1์ฉ 3๋ฒ์ ๋ํด addCount์ ๊ฐ์ 6์ด ๋๋ค.์์์ ์ฌ์ฉ์ ์์ ํด๋์ค์ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ง ๋ชปํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
-
- ์ปฌ๋ ์ ์ ๋ณด์์ ์ํด ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ฐ๋ฆฌ๋ ์ปฌ๋ ์ ์ ์์๋ฐ์ ํ์ ํด๋์ค์์ ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ฌ์ ์ํด ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ ๋ก์ง์ ์ถ๊ฐํ ๊ฒ์ด๋ค.
- ํ์ง๋ง ์์ ํด๋์ค(์ปฌ๋ ์ )์ ์๋ก์ด ๋ฉ์๋๊ฐ ์ถ๊ฐ ๋์์ ๋, ํ์ ํด๋์ค์์ ์ด๋ฅผ ์ฌ์ ์ํ์ง ์๋๋ค๋ฉด, ๋ณด์์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ ์ ์๋ค.
- ๐ค ์ฌ์ ์ ๋ง๊ณ ํ์ ํด๋์ค์์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด ์๋๋์?
๋ณด๋ค ์์ ํ์ง๋ง ์ฐ์ฐํ ์์ ํด๋์ค์ ๋ด๊ฐ ์ ์ํ ๋ฉ์๋์ ์ผ์นํ๋ ์๊ทธ๋์ฒ์ ๋ค๋ฅธ ๋ฐํํ์ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋๋ค๋ฉด? ์ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
-
-
์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ ์ ์๋ ์ค๊ณ๊ฐ ์ปดํฌ์ง์ (composition) ์ด๋ค. ์ปดํฌ์ง์ ์์๋ ๊ธฐ์กด ํด๋์ค๊ฐ ์๋ก์ด ํด๋์ค์ ๊ตฌ์ฑ์์๋ก ์ฌ์ฉ๋๋ค.
์๋ก์ด ์ปดํฌ์ง์ ํด๋์ค๋ ๊ธฐ์กด์ ํด๋์ค(์ ์์์์์ HashSet๊ณผ ๊ฐ์)์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ค.
์ด๋ฌํ ๋ฐฉ์์ ๋ฉ์๋๋ฅผ ์ ๋ฌ ๋ฉ์๋(Forwarding method) ๋ผ๊ณ ํ๋ค. -
public class ForwardingSet<E> implements Set<E> { private final Set<E> set; // Set์ ๋ฉ์๋๋ค ๊ตฌํ, set ์ธ์คํด์ค ์๊ฒ ์์ํ๋ค. ๋ค๋ฅธ ๋ฉ์๋๋ค๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌํ๋๋ค. public boolean add(E e){ return s.add(e); } }
-
public class mySet<E> implements ForwardingSet<E> { public mySet(Set<E> e){ super(e); } @Override public boolean add(E e){ addCount ++; return super.add(e); } @Override public boolean addAll(Collection<? extends E> c) { addCount += c.size(); return super.addAll(c); } }
์์ ๊ฐ์ ๊ตฌํ์์๋ mySet์ ์์ ํด๋์ค์ธ ForwardingSet์ addAll์ ํธ์ถํ๊ฒ ๋๊ณ , ForwardingSet์ addAll์ ์์ ์ด ์ธ์คํด์ค๋ก ๊ฐ์ง๊ณ ์๋ set์ addAll์ ํธ์ถํ๊ธฐ ๋๋ฌธ์ mySet์ addCount์ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ํด๋์ค์์ ์๋ก์ด ๋ฉ์๋๊ฐ ์์ฑ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง๋ ์๋๋ค.
๋ํ, Set ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ HashSet, TreeSet ๋ฑ ๋ค์ํ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ํด๋์ค๋ฅผ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๊ฐ์ธ๊ณ ์๋ค๊ณ ํ์ฌ ๋ํผ ํด๋์ค ๋ผ๊ณ ํ๊ณ , ๊ธฐ์กด ํด๋์ค์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ง ๋ถ์ธ๋ค๊ณ ํ์ฌ ๋ฐ์ฝ๋ ์ดํฐ ํจํด ์ด๋ผ๊ณ ํ๋ค.
Wrapper ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๋ฐฑ ํ๋ ์ ์ํฌ์ ์ ๋ง์ง ์๋๋ค. ์์ ์ ์ฐธ์กฐ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋๊ฒจ์ฃผ์ด ์ฌ์ฉํ๋๋ก ํ๋๋ฐ, ๋ด๋ถ์์๋ ์ด๋ฅผ ๊ฐ์ธ๊ณ ์๋ Wrapper ํด๋์ค์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๋ ์์ ์ ์ฐธ์กฐ๋ฅผ ๋๊ธฐ๊ฒ ๋ ์ ์๋ค.
์ปดํฌ์ง์ ํด๋์ค๊ฐ ์๋ ์ปดํฌ์ง์ ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฌ์ฉํ ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ ๊ฒฝ์ฐ. ๋ํผ๊ฐ ์๋ ๋ด๋ถ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
๐ ํ์ํด๋์ค ๋ฐฐ์ด์ ์์ํด๋์ค ๋ฐฐ์ด๊ณผ๋ ์,ํ์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.(๊ณต๋ณ) ๊ทธ๋ฌ๋ ๋ฆฌ์คํธ๋ ์์, ํ์ ํ์
์ ๊ด๊ณ๊ฐ ์๋๋ค(๋ถ๊ณต๋ณ).
๋ถ๊ณต๋ณ์ด ์ ์ฅ์ ์ธ์ง ์์๋ณด์.
์๋ฅผ ๋ค์ด Object[] ์ Long[] ์ด ๋ค์๊ณผ ๊ฐ์ด ์๋ค.
Object[] objectArray = new Long[1]; // Long์ Object์ ํ์ํ์
์ด๋ฏ๋ก ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
objectArray[0] = "String~" // Long[] ์๋ String ์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ArrayStoreException์ด ๋ฐ์ํ๋ค.์์ ์ํฉ์์์ ๋ฌธ์ ์ ์ ์ปดํ์ผ ํ์์ด ์๋ ๋ฐํ์ ์์ ์ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.
๋ค์์ผ๋ก List๋ฅผ ์ฌ์ฉํ์ ๋์ ์ํฉ์ ์ดํด๋ณด์.
List<Object> objects = new ArrayList<Long>(); // ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.๋ฆฌ์คํธ์์๋ ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ์์๋ฅผ ๋ฃ์ ๋(๋ฐํ์)๊ฐ ์๋ ์ปดํ์ผ ์์ ์ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ ์ ์๋ค.
๋น์ฐํ ์ปดํ์ผ ์์ ์ ์ด๋ฅผ ์์์ฑ ์ ์๋ค๋ ๊ฒ์ ํฐ ์ด์ ์ ๊ฐ์ง๋ค.
๐ ๋ ๋ฒ์จฐ๋ก ๋ฐฐ์ด์ ์ค์ฒดํ(reify) ๋๊ธฐ ๋๋ฌธ์ ์ ๋ค๋ฆญ๊ณผ ์ ์ด์ฐ๋ฌ์ง์ง ๋ชปํ๋ค.
์ค์ฒดํ ๋๋ค๋ ๊ฒ์ ๋ฐํ์ ์์ ์๋ ์์ ์ด ๋ด๊ธฐ๋ก ํ ์์์ ํ์
์ ํ์ธํ ์ ์๋ค๋ ๊ฒ์ด๋ค.(Long[] ์์ Long์ด๋ผ๋ ํ์
์ ๋ฐ์ ๊ฒ์ ๋ฐํ์์๋ ์๊ณ ์์)
๊ทธ๋ฌ๋, ์ ๋ค๋ฆญ์ ์ปดํ์ผ ์์ ์ ํ์
์ ๊ฒ์ฌํ๊ณ , ๋ฐํ์์๋ ์ด๋ฅผ ์๊ฑฐํ์ฌ ์ ์ ์๊ฒ ๋๋ค. ์ด๋ฌํ ํน์ง ๋๋ฌธ์ ๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ์ ์ ๋ง์ง ์๋๋ค.
๋ฐฐ์ด์ new List[], new List[], new E[] ์ ๊ฐ์ ์์ ์์ฑ์ ํ์ฉํ์ง ์๋๋ค.(์ปดํ์ผ ์๋ฌ) ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์์ฑํ ํ๋ณํ ์ฝ๋์์ ClassCastException์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.(ํ์ ์ธ์ดํ ํ์ง ์๋ค)
์๋ ์ฝ๋๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด์ ์์ฑ์ด ๊ฐ๋ฅํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ฑํ ์ฝ๋์ด๋ค.
List<String>[] strings = new List<String>[1];
List<Integer> ints = List.of(10);
Object[] objects = strings // ๋ฐฐ์ด์ ๊ณต๋ณ์ด๊ณ , String์ Object์ ํ์ ํด๋์ค์ด๋ฏ๋ก ๊ฐ๋ฅํ๋ค.
Object[0] = ints // ์ ๋ค๋ฆญ์ ํ์
์ด ์๊ฑฐ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค.
String s = strings[0].get(0) // ClassCastException ๋ฐ์strings[0] ์๋ 4๋ฒ์งธ ์ค์ ์ํด Integer ํ์
์ ๊ฐ์ด ์ ์ฅ๋์ด ์๋ ์ํ๋ค. ๋๋ฌธ์ ๊ฐ์ ๊บผ๋ด String ํ์
์ผ๋ก ๋ณํ ํ ๋ ClassCastException์ด ๋ฐ์ํ๋ค.
์ด๋ฌํ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๋ค๋ฆญ ๋ฐฐ์ด์ด ์์ฑ๋์ง ๋ชปํ๋๋ก ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด๋ค.
E[] ๋ฐฐ์ด๋ก ํ๋ณํํ ๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด ์์ฑ ์ค๋ฅ๋ ๋น๊ฒ์ฌ ํ๋ณํ ๊ฒฝ๊ณ ๊ฐ ๋จ๋ ๊ฒฝ์ฐ๋ List๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ํด๊ฒฐ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ฝ๋์์๋ ๋น๊ฒ์ฌ ํ๋ณํ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ค.(@SafeVarargs๋ก ๊ฒฝ๊ณ ๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.)
public class Chooser<T> {
private final T[] choices;
public Chooser(Collection<T> choices) {
this.choices = (T[]) choices.toArray(); // Object[]์ด๊ธฐ ๋๋ฌธ์ T[]๋ก ํ๋ณํ์ ํด์ฃผ์ด์ผํ๋ค.
}
...
}์์ ์ฝ๋์์๋ Object[] -> T[] ๋ก์ ํ๋ณํ์ด ์ด๋ฃจ์ด์ง๊ฒ ๋๊ณ , T๊ฐ ๋ฌด์จํ์
์ธ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฐํฐ์์์ ์์ ์ ๋ณด์ฅํ ์ ์๋ค๋
๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค.
(warning: [unchecked] unchecked cast ...)
๊ฒฝ๊ณ ์ ์์ธ์ ์ ๊ฑฐํ๊ธฐ ์ํด์๋ T[]๋ฅผ List๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค. ์ฑ๋ฅ์์๋ ์กฐ๊ธ ๋ ๋๋ฆด ์ ์์ง๋ง ๋ฐํ์์์ ClassCastException์ด ๋ฐ์ํ๋ ๊ฒ์
๋ฐฉ์ง ํ ์ ์์ผ๋ฏ๋ก ์ถฉ๋ถํ ์ด์ ์ ๊ฐ์ง๋ค๊ณ ๋ณผ ์ ์๋ค.
๊ฐ๋ณ์ธ์๋ ๋ฉ์๋์ ์ธ์์ ๊ฐ์๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์กฐ์ ํ ์ ์๊ฒ ํด์ค๋ค. ํ์ง๋ง ์ธ์๋ค์ ๋ด๊ธฐ ์ํด ๋ฐฐ์ด์ด ๋ง๋ค์ด์ง๊ณ , ์ด ๋๋ฌธ์ ํ์ ์ด ์๊ธฐ๊ฒ ๋๋ค.
varargs ๋งค๊ฐ๋ณ์์ ์ ๋ค๋ฆญ์ด๋, ๋งค๊ฐ ๋ณ์ํ ํ์
(List๊ณผ ๊ฐ์)์ด ํฌํจ๋๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋๋ฐ, ์ด๋ฅผ ํ์
ํ๊ธฐ๋ ์ฝ์ง ์๋ค.
๋จผ์ ๋ฐฐ์ด์ ์กฐ์์ ๊ฐํ๋ ๊ฒฝ์ฐ์ด๋ค.
void method(List<String>... stringLists) {
Object[] objects = stringLists
List<Integer> intList = List.of(10);
objects[0] = intList;
String s = stringLists[0].get(0) // ClassCastException ๋ฐ์.
}์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ํ๋ณํ์ ์๋ํ๊ธฐ ๋๋ฌธ์ ์์ธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด์ฒ๋ผ ํ์
์์ ์ฑ์ ๋ณด์ฅํ ์ ์์์๋ ๊ฐ๋ณ์ธ์์์ ์ ๋ค๋ฆญ์ ๋ฐ์ ์ ์๊ฒ ํ์ฉํ ์ด์ ๋ ์ค๋ฌด์์ ์ ์ฉํ๊ฒ ์ธ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Arrays.asList(T... a), Collections.addAll() ๋ฑ์ ๋ฉ์๋๋ค์ด ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฉ์๋๋ค์ด ์ด์ ํด๋นํ๋ค.
์ ๋ค๋ฆญ ๊ฐ๋ณ์ธ์๋ ํ์
์์ ์ฑ์ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ ์ธก์์๋ ์ด๋ฌํ ๊ฒฝ๊ณ ๋ฅผ ๋ณผ ์ ์๋๋ฐ, ์ด๋ฅผ ์จ๊ธธ ์ ์๋๋ก Java7 ์์๋ถํฐ๋ @SafeVarargs๋ผ๋
์ ๋
ธํ
์ด์
์ ์ง์ํ๋ค. ํ์ง๋ง ํด๋น ์ ๋
ธํ
์ด์
์ ๋ฉ์๋๊ฐ ์์ ํ๋ค๋ ๊ฒ์ด ํ์คํ ๋๋ง ์ ์ธํด์ผํ๋ค.
๋ฉ์๋๊ฐ ์์ ํ์ง ์ด๋ป๊ฒ ํ์ธํด๋ณผ ์ ์์๊น?
๊ฐ๋ณ์ธ์๋ฅผ ๋ด์ ๋ฐฐ์ด์ด ๋ง๋ค์ด์ง๊ณ , ํด๋น ๋ฐฐ์ด์ ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์๊ณ , ๋ฐฐ์ด์ ์ฐธ์กฐ๊ฐ ๋ฐ์ผ๋ก ๋
ธ์ถ๋์ง ์๋๋ค๋ฉด ์์ ํ๋ค๊ณ ํ ์ ์๋ค.
์ฆ ๋งค๊ฐ๋ณ์์ ์๋์ ๋ชฉ์ ๋๋ก ์ธ์๋ค์ ์ ๋ฌํ๋ ์ญํ ๋ง ํ๋ค๋ ์ด์ผ๊ธฐ์ด๋ค.
์๋ฅผ ์ด์ ์ ๋ค์๋ ์์์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ์ํฉ ๋ํ ์์ ํ์ง ์๋ค.
static <T> T[] convertToArray(T a, T b) {
return toArray(a, b);
}
static <T> T[] toArray(T... args) {
return args;
}๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์ปดํ์ผ๋ฌ๋ toArray์ ๋งค๊ฐ๋ณ์๋ค์ ๋ด์ ๋ฐฐ์ด์ Object[]๋ก ์์ฑํ๋ค. ๋ชจ๋ ํ์
์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ ์๋ ๊ฐ์ฅ ์ต์ํ์ ํ์
์ด Object ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ฌธ์, ์ด๋ฅผ ์ฌ์ฉํ ๋ String ์ด ๋ฐํ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๊ณ String[] strs = convertToArray("aaa", "bbb")์ ๊ฐ์ด ์ฌ์ฉํ๋ค๋ฉด ClassCastException ์ด ๋ฐ์ํ๋ค.
์์ ์์๋ ํ๋ผ๋ฏธํฐ ๋ฐฐ์ด์ ์กฐ์ํ์ง ์์์ง๋ง, ํด๋น ๋ฐฐ์ด์ ์ฐธ์กฐ๊ฐ ๋
ธ์ถ๋์ด ๋ค๋ฅธ ๋ฉ์๋๊ฐ ์ด๋ฅผ ์ ๊ทผํ๋๋ก ํ์ฉํ์ฌ ๋ฐ์ํ ๋ฌธ์ ์ ์ด๋ค.
์ด๋ฌํ ๋ฐฐ์ด์ ์ฐธ์กฐ์์ @SafeVarargs๋ก ์์ ์ฑ์ด ๋ณด์ฅ๋ ๋ฉ์๋๋, ๋ฐฐ์ด์ ์กฐ์์ ๊ฐํ์ง ์๋ ์ผ๋ฐ ๋ฉ์๋์ ๋๊ธฐ๋ ๊ฒ์ ์์ ํ๋ค.(varargs๋ฅผ ๋ฐ์ง ์๋)
๋ฉ์๋์ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ ์ด์ธ์ ๋ฐฉ๋ฒ์ด ํ๊ฐ์ง ๋ ์๋ค.
Varargs๋ฅผ List๋ก ๋์ฒดํ๋ ๋ฐฉ๋ฒ์ด๋ค.
static <T> List<T> flatten(List<List<? extends T>> lists) {
List<T> result = new ArrayList<>();
for(List<? extends T> list : lists){
result.addAll(list);
}
return result;
}๋งค๊ฐ๋ณ์ํ ํ์
๋ ๋ฐ์ ์ ์๋๋ก List<List<>> ๋ก ์ธ์๋ฅผ ๋ฐ๋๋ค.
์ฝ๋๋ ์กฐ๊ธ ์ง์ ๋ถํด์ง์ง๋ง @SafeVarargs ์์ด๋ ํ์
์์ ํ ๋ฉ์๋๊ฐ ๋๋ค. ์ด์ ์ ๋ณด์๋ toArray() ๋ฉ์๋ ๋ํ List ์์ ์ ๊ณตํ๋ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์ธ
List.of()๋ฅผ ์ฌ์ฉํ๋ฉด ํ์
์ธ์ ํ๊ฒ ๋ง๋ค ์ ์๋ค.(@SafeVarargs ๋ฉ์๋์ด๋ค)
์๋ฐ์์ ๋๋ค๋ฅผ ์ง์ํ๊ธฐ ์ ์๋ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด ์ํ๋ ๋์์ผ๋ก ์ฌ๊ตฌ์ฑํ๋ ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด์ด ๋ง์ด ์ฌ์ฉ๋์๋ค.
์๋ฅผ ๋ค์ด LinkedHashMap์ removeEldestEntry๋ฅผ ์๊ฐํด๋ณด์.
LinkedHashMap์ LRU ์บ์์๋ ์ฌ์ฉ๋๋ ์๋ฃ ๊ตฌ์กฐ๋ก, removeEledestEntry ๋ฅผ ์ฌ์ ์ํ์ฌ
์ต๋ ์ ์ฅํ ์๋ฅผ ์ ํ ์ ์๋ค.
protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
return size() > 100;
}ํด๋น ๋ฉ์๋๋ ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก false๋ฅผ ๋ฐํํ๊ฒ ์ ์๋์ด ์์ผ๋ฉฐ, ์ด๋ฅผ ์ฌ์ ์ํ์ฌ ์์ ์ ์ํฉ์ ๋ง๊ฒ ๋ฐํ๊ฐ์ ์ ํด์ฃผ๋ฉด ๋๋ค. true๋ฅผ ๋ฐํํ๊ฒ ๋๋ฉด
๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ(HEAD)๋ฅผ ์ ๊ฑฐํ๋ค.(put ๋ฉ์๋์์ ์ด๋ฅผ ํธ์ถํจ)
์์ ๊ธฐ๋ฅ์ ํ๋์ ์ผ๋ก ํ์ด๋ด๋ฉด ๋์ผํ ํจ๊ณผ์ ํจ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ ์ ์ ํฉํฐ๋ฆฌ๋, ์์ฑ์๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ค.
๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ๋ฉ์๋๋ฅผ ๋๋ค๋ก ์ฌ์ฉํ๊ธฐ ์ํด ํจ์ํ ์ธํฐํ์ด์ค๋ก ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
@FunctionalInterface
public interface EldestEntryRemovalFunction<K,V> {
boolean remove(Map<K,V> map, Map.Entry<K,V> eldest);
}ํด๋น ํจ์ํ ๊ฐ์ฒด๋ฅผ LinkedHashMap์ ์์ฑ์๋, ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ํ ์ ์์ ๊ฒ์ด๋ค.
ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์ดํด๋ณด๋ฉด, boolean ํ์
์ ๋ฐํํ๊ณ , ํ๋ผ๋ฏธํฐ๋ก Map<K,V>, Map.Entry<K,V>๋ฅผ ๋ฐ๋ ์ธํฐํ์ด์ค์ด๋ค.
์๋ฐ์์๋ ํด๋น ํ์์ ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ์ด๋ฏธ ์ค๋น๋์ด ์๋ค.(BiPredicate<Map<K,V>,Map.Entry<K,V>>)
์ด๋ ๋ฏ ์๋ฐ์๋ ๋๋ถ๋ถ์ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋งํ ๋๋ค์์ ์ง์ ๋ง๋ค์ง ์๊ณ ์ฌ์ฉํ ์ ์๋ค.
java.util.function ํจํค์ง์ ์๋ ์ธํฐํ์ด์ค๋ ์ด 43๊ฐ์ด๋ค. ํ์ง๋ง ์ด๋ฅผ ๋ชจ๋ ์ธ์ธ ํ์๋ ํ๋ค๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์ธ
๋ช๊ฐ์ง๋ง์ ๊ธฐ์ตํ๋ฉด, ๋๋จธ์ง๋ ์ด๋ก๋ถํฐ ํ์๋๋ ์ธํฐํ์ด์ค๋ค์ด๋ค.
| ์ธํฐํ์ด์ค | ์๊ทธ๋์ฒ | ์์ | ์ค๋ช |
|---|---|---|---|
| UnaryOperator<T> | T apply(T t) | String::toLowerCase | ์ธ์ 1๊ฐ๋ฅผ ๋ฐ์ ๋์ผ ํ์ ์ ๊ฐ์ ๋ฐํํ๋ค. |
| BinaryOperator<T> | T apply(T t) | BigInteger::add | ๋์ผ ํ์ ์ ์ธ์ 2๊ฐ๋ฅผ ๋ฐ์ ๋์ผ ํ์ ์ ๊ฐ์ ๋ฐํํ๋ค. |
| Predicate<T> | boolean test(T t) | Collection::isEmpty | ์ธ์ 1๊ฐ๋ฅผ ๋ฐ์ boolean ๊ฐ์ ๋ฐํํ๋ค. |
| Function<T,R> | R apply(T t) | Array::asList | ์ธ์ 1๊ฐ(T)๋ฅผ ๋ฐ์ ๋ค๋ฅธ ํ์ (R)์ ๊ฐ์ ๋ฐํํ๋ค. |
| Supplier<T> | T get() | Instant::now | ์ธ์๋ฅผ ๋ฐ์ง ์๊ณ ๊ฐ์ ๋ฐํํ๋ค.(์ ๊ณตํ๋ค) |
| Consumer<T> | void accept(T t) | System.out::println | ์ธ์ 1๊ฐ๋ฅผ ๋ฐ์ง๋ง ๊ฐ์ ๋ฐํํ์ง ์๋๋ค.(void, ์๋นํ๋ค) |
| Runnable | void run() | ์ธ์๋ ๋ฐ์ง์๊ณ ๋ฐํ๊ฐ๋ ์๋ค. ๋ง ๊ทธ๋๋ก ์คํ. | |
| Callable | V call() | ์ธ์๋ฅผ ๋ฐ์ง ์๊ณ ๋ฐํ๋ง ํ๋ค. Supplier์ ๋์ผ, ๊ทธ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ์์ ์๋ฏธ๋ฅผ ๋ช ํํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฐ๋ . |
๋๋จธ์ง ์ธํฐํ์ด์ค๋ค์ ์์ ์ธํฐํ์ด์ค์์ ์กฐ๊ธ ๋ ํนํ๋ ์ธํฐํ์ด์ค๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
BiFunction, BiPredicate, BiConsumer ์ฒ๋ผ ์ธ์๋ฅผ 2๊ฐ ๋ฐ๋ ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ๊ณ ,
IntPredicate, LongPredicate, DoublePredicate ... ์ฒ๋ผ Int, Long, Double ํ์
์ ์ธ์๋ก ๋ฐ์์ ๋ ๋ช
ํํ ํ๊ฑฐ๋,
IntToDoubleFunction, IntFunction<R>, toIntFunction<T> ์ ๊ฐ์ด ์ธ์, ๋ฆฌํด ํ์
์ ๋ช
ํํ ํ๋ ์ธํฐํ์ด์ค๋ค์ด ์กด์ฌํ๋ค.
๋๋ฌธ์ ํน์ ํ์
์ ๋ฐ๋๊ฒ์ด ํ์คํ๋ค๋ฉด ๊ธฐ๋ณธํ ํนํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์๋ฐ์์ ๋ฏธ๋ฆฌ ์ค๋นํด๋ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค ๋ง๊ณ ์ง์ ๋ง๋ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฌํญ์ ํด๋นํ๋์ง ํ์ธํด ๋ณด์.
- ์์ฃผ ์ฐ์ด๋ฉฐ, ์ด๋ฆ ์์ฒด๊ฐ ์ฉ๋๋ฅผ ๋ช ํํ๊ฒ ์ค๋ช .
- ๋ฐ๋์ ๋ฐ๋ผ์ผํ๋ ๊ท์ฝ์ด ์กด์ฌํ๋ค.
- ์ ์ฉํ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
์ปค์คํ ํ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๋์๋ ํญ์ @FunctionalInterface ์ ๋ํ ์ด์ ์ ์ฌ์ฉํด ์ค์๋ก ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ์ผ์ด ๋ฐ์ํ์ง ์๋๋ก ํ์.
๋ง์ง๋ง์ผ๋ก ์๋ก ๋ค๋ฅธ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ ์์น์ ์ธ์๋ก ๋ฐ๋ ๋ฉ์๋๋ค์ ๋ค์ค ์ ์ํ๋ ๊ฒ์ ์ฃผ์ํ์.
(ExecutorService์ submit ์ฒ๋ผ, Callable<T>, Runnable์ด ๋ค์ค ์ ์ ๋์ด์๋ค.) ์ด๋ ์ฌ์ฉํ๋ ์ด๋ก ํ์ฌ๊ธ ๋ชจํธํจ์ ์๊ฒจ์ค๋ค.
์คํธ๋ฆผ์ ํธ์ถ์ ์ฐ๊ฒฐํ์ฌ ๋จ ํ๋์ ํํ์์ผ๋ก ๋ก์ง์ ์์ฑํ ์ ์๊ฒ ํด์ค๋ค.
ํ์ง๋ง ์๋ชป ์ฌ์ฉํ๋ค๋ฉด ์คํ๋ ค ์ฝ๊ธฐ ์ด๋ ต๊ณ , ์ ์ง ๋ณด์๊ฐ ๊น๋ค๋ก์ด ์ฝ๋๊ฐ ๋๋ค. ๋๋ฌธ์ ๋ชจ๋ ๋ฐ๋ณต๋ฌธ์ ์คํธ๋ฆผ์ผ๋ก ๋ฐ๊พธ๊ธฐ ๋ณด๋ค๋ ๋์ ์ ์ ํ๊ฒ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด
ํ์ํ๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ Stream ์ ์ฌ์ฉํ๋ฉด ์ข๋ค.
- ์์๋ค์ ํํฐ๋งํ๋ค.
- ์์๋ค์ ์ผ๊ด๋๊ฒ ๋ณํํ๋ค.
- ์์๋ค์ ํ๋์ ์ฐ์ฐ์ ์ด์ฉํด ๊ฒฐํฉํ๋ค.
- ์์๋ค์ ์ปฌ๋ ์
์ผ๋ก ๋ชจ์๋ค
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ Stream์ด ์ ์ ํ์ง ์๋ค.
- ์ง์ญ๋ณ์์ ์ ๊ทผํ์ฌ ๊ฐ์ ๋ณ๊ฒฝํ ๋.
- return ์ ์ด์ฉํ ์ผ๋ฆฌ๋ฆฌํด์ด๋, break, continue๋ฌธ ๋ฑ์ ์ฌ์ฉํ ๋.
- ๋ฉ์๋์ ๋ช
์๋ ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง ๋.
๋๋ค์์๋ final ๋๋ ์ฌ์ค์ final ์ธ ๋ณ์๋ง ์ฝ์ ์ ์๊ณ , ์ง์ญ๋ณ์์ ๊ฐ์ ์์ ํ ์ ์๋ค.
์ ์ ํ ์ํฉ์ ๋๋ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด์ ๋ ๊ฐ์ธ์ ์ทจํฅ, ๋๋ ๋๋ค์ ์๋ จ๋์ ์ฐจ์ด์ด๋ค.
๊ฐ๋ฐ์์ ์๋ จ๋๋ ์ทจํฅ์ ๋ฐ๋ผ ์ ํธ๋๋ ๋ฐฉ์์ด ์๊ธฐ ๋๋ฌธ์, ์์ ์ด ์ ํธํ๋ ๋ฐฉ์, ๋๋ ๋๋ฃ๋ค๋ ์ด๋ ต์ง ์๊ฒ ์ฝ์ ์ ์๋ ๋ฐฉ์์ ํํ์.
์ด๋ค ๊ฐ์ฒด๋ ๊ทธ ๊ฐ์ฒด์ ํ๋ฝ ์์ด๋ ๊ฐ์ฒด์ ์์ ์ด ๋ถ๊ฐ๋ฅ ํด์ผํ๋ค. ํ์ง๋ง ํ ๊ฐ์ง๋ฅผ ๊ณ ๋ คํ์ง ์์ผ๋ฉด ์์ ๋ ๋ชจ๋ฅด๊ฒ ๋ด๋ถ๋ฅผ ์์ ํ๋๋ก ํ๋ฝํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณด์.
public class Point {
private final int x;
private final int y;
public Point(final int x, final int y) {
this.x = x;
this.y = y;
}
}์๊ธฐ์ ์ฝ๋๋ ์ธ๋ถ์ ๋ณ๊ฒฝ์ผ๋ก ๋ถํฐ ์์ ํ ๊น?
๋ค๋ค ์ฝ๊ฒ ์๊ฐํ ์ ์๋ฏ์ด int์ ๊ฐ์ ์์ ํ์
์ ๊ฐ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ ์ ๋ฌํด์ค ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋ ๋ด๋ถ ๊ฐ์ฒด์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ์ด๋จ๊น?
public class Period{
private final Date start;
private final Date end;
public Period(final Date start, final Date end) {
this.start = start;
this.end = end;
}
}Date ๊ฐ์ฒด๋ ์์ int ์๋ ๋ฌ๋ฆฌ ์ฐธ์กฐ๊ฐ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๊ฒ ๋๊ณ , ์ธ๋ถ์์ ํด๋น Date ๊ฐ์ฒด์ ๋ด๋ถ ๊ฐ์ด ๋ณ๊ฒฝ ๋๋ค๋ฉด, Period ๊ฐ์ฒด ๋ํ ๊ฐ์ ๋ณ๊ฒฝ์์ ์์ ํ์ง ์๋ค.
final ํค์๋๋ฅผ ์ฌ์ฉํ์์ง๋ง ์ด๋ Date ์ธ์คํด์ค ์์ฒด๊ฐ ๊ต์ฒด๋๋ ๊ฒ ๋ง์ ๋ฐฉ์งํ ๋ฟ, ์ธ์คํด์ค์ ๋ด๋ถ ๊ฐ์ ๋ณ๊ฒฝ๊น์ง ๋ง์ง๋ ๋ชปํ๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ ์
์ ์ ์ธ ํ๋ก๊ทธ๋๋จธ๋, ์ด๋ฐ ์ฌ์ค์ ๋ชจ๋ฅด๋ ํ๋ก๊ทธ๋๋จธ๋ก๋ถํฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํ๋ฝํ๊ฒ ๋๊ณ , ์์์น ๋ชปํ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
(ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ํ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๋ฌด์ํ ์ ์๋ค.)
์ด๋ป๊ฒ ์ด๋ฐ ์ฐธ์กฐ๋ฅผ ๋์ด๋ผ ์ ์์๊น? ์ฐธ์กฐ๋ฅผ ๋์ด ๋ด๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ์์์ ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ๋ค.
public class Period{
private final Date start;
private final Date end;
public Period(final Date start, final Date end) {
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
}
}์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฉค๋ฒ ๋ณ์์ ํ ๋นํ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ์์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด ๊ฐ์ฒด์ ๋ด๋ถ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋ ์์ ํ๋ค.
์ฌ๊ธฐ์ Data์๋ clone ๋ฉ์๋๊ฐ ์์์๋ ์ฌ์ฉํ์ง ์์๋๋ฐ, ์ด๋ Data ํด๋์ค๋ฅผ ์์๋ฐ์ ํ์ ํด๋์ค์์ ์
์์ ์ผ๋ก clone ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๊ฒ ์์ฑ์๋ฉด ๋ฐฉ์ด์ ๋ณต์ฌ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์ ๊ทผ์์ ์์ ํ๋? ์์ง ํ ๊ฐ์ง๊ฐ ๋จ์๋ค.
getter ์์ ๋ฐํํด์ฃผ๋ ๊ฐ ๋ํ ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ๊ฐ์ ์ป์ ๋ค ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋๋ ์์ฑ์์์์ ๋ฐฉ์ด์ ๋ณต์ฌ์๋ ๋ฌ๋ฆฌ clone์ ์ฌ์ฉํ์ฌ๋ ๋ฌธ์ ๊ฐ ์๋ค. ๋ฉค๋ฒ ๋ณ์์ธ Date ๊ฐ์ฒด๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ํ Date ํด๋์ค์์ด ํ์คํ๊ฒ ๋ณด์ฅ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐฉ์ด์ ๋ณต์ฌ๋๊ธฐ๋ณธ์ ์ผ๋ก ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ ํ๊ฐ ๋ฐ์ํ๋ค. ๋ํ ๊ฐ์ ํจํค์ง์ ์กด์ฌํ๋ ๋ฑ์ ์ด์ ๋ก ์ฌ์ฉํ ์ ์์์๋ ์๋ค.
๋๋ฌธ์ ๋ถ๋ณ์ ์ด์ฉํ์ฌ ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ํด์ผํ ์ผ์ ์ต๋ํ ์ค์ด์.
๋ง์ฝ ๋๋ค ๋ถ๊ฐ๋ฅํ ์ํฉ์ด๋ผ๋ฉด ๋ฌธ์์ ์ ๋ช
์ํ์ฌ ๋๊ตฐ๊ฐ ์ค์๋ก ๋ณ๊ฒฝํ์ง ์๋๋ก ๋ฐฉ์งํ๋ค.
-
์ ์ด๋ ๊ฐ์ ํจํค์ง์ ์ํ ์ฝ๋๋ผ๋ฆฌ๋ ์ผ๊ด๋ ๊ท์น์ผ๋ก ์ด๋ฆ์ ์ง๋ ๊ฒ์ด ๊ฐ์ฅ ์ฐ์ ์ ๋์ด์ผ ํ๋ค.
๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ๋๋ฆฌ ๋ฐ์๋ค์ฌ์ง๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.๐ก ๊ทธ๋ฌ๋ ๋๋ฌด ๊ธด ์ด๋ฆ์ ํผํ์๊ณ ๋์ด์๋ค. (๊ธธ๋ค์ ๊ธฐ์ค์ ์ด๋์ ๋ ์ผ๊น, ๋๋ ์ข ๊ธธ๋๋ผ๋ ์ญํ ์ ์ ์ค๋ช ํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค.)
-
ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ์์ ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ผ ํ๋ค, ํธ์ ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์์ง๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ ๊ดด๋กญ๊ณ , ๊ตฌํํ๋ ์ฌ๋๋ ๊ดด๋กญ๋ค.
๊ต์ฅํ ์์ฃผ ์ฐ์ฌ ๊ผญ ํ์ํ๋ค๊ณ ํ์ ์ด ๊ฐ๋ ๊ฒฝ์ฐ์๋ง ๋ง๋ค๋๋ก ํ์. -
๋งค๊ฐ ๋ณ์๊ฐ ๋๋ฌด ๋์ด๋๋ฉด ๊ธฐ์ตํ๊ธฐ ์ด๋ ต๋ค. ํนํ ์ ๋๋ก ๊ธฐ์ตํ์ง ๋ชปํ๋ ๋์ผํ ํ์ ์ ๋ณ์๊ฐ ์ฌ๋ฌ๊ฐ ์๋ค๋ฉด, ๊ฐ๋ฐ์์ ์ค์์ ์ํด ์๋ชป๋ ๋ก์ง์ผ๋ก ๋์ํ ์ ์๋ค.
(๋ฌผ๋ก , ์ปดํ์ผ ์ค๋ฅ๋ ๋์ง ์๋๋ค..)ํ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๊ฐ ๋๋ฌด ๋ง๋ค๋ฉด ํด๋น ๋ฉ์๋๋ฅผ ์ฌ๋ฌ๊ฐ๋ก ์ชผ๊ฐ๊ฑฐ๋, ์๋ก๋ฅผ ์กฐํฉํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌ์ฑํ๋ฉด ์ข๋ค.
๋ง์ฝ ์์น(x,y) ์ ๊ฐ์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค๋ฉด ์ด๋ฅผ ๋ฌถ์ด๋๋ ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค. -
์๋ฅผ๋ค์ด HashMap์ ํ์ ์ผ๋ก ๋ฐ๊ธฐ๋ณด๋ค๋ Map์ผ๋ก ๋ฐ๋ ๊ฒ์ด ์ข๋ค.
ํด๋์ค ํ์ ์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๊ฒ ๋๋ค๋ฉด ํน์ ๊ตฌํ์ฒด๋ง์ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
(ํน์ ๊ตฌํ ํด๋์ค๋ก์ ๊ฐ์ , ๋ฉ์๋๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ํด๋น ํด๋์ค๋ก์ ๋ณํ์ด ํ์ํ๋ค.) -
๋ฉ์๋ ์ด๋ฆ์ boolean์ ๋ฐ์์ผ ์์ฐ์ค๋ฌ์ธ ๋์๋ boolean ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ๋ ๋ช ํํ ๋๊ฐ ์๋๋ผ๋ฉด Enum ํ์ ์ ๊ณ ๋ คํด๋ณด์.
์ ํ์ง๊ฐ ๋๊ฐ๋ฐ์ ์๋ ์ํฉ์ด๋ผ๊ณ ํ๋๋ผ๋ ์ธ์๋ก ๋ฐ์ ๊ฒ์ ๋ํ ๋๋ต์ด ์๋ก ์ ๋ฐ๋๋ผ๊ณ ํํํ ๋ ์ด์ํ๋ค๋ฉด Enum ํ์ ์ผ๋ก ๋์ฑ ๋ช ํํ๊ฒ ํํํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค.
์๋ฅผ ๋ค์ด ํ์ฌ ์์ ์ ํ์ง๊ฐ ๊ฒ์ , ํฐ์ ๋๊ฐ์ง๊ฐ ์๋ค๊ณ ํ์ ๋ Color.newInstance(true | false) ๋ณด๋ค๋
Color.newInstance(ColorList.WHITE | ColorList.BLACK)์ด ๋์ ๊ฒ์ด๋ค. ๋ํ ๋์ค์ ์์ด ์ถ๊ฐ๋๋ค๊ณ ํ ๋ boolean ๋ณด๋ค ์์ ํ ๋ถ๋ถ์ด ํจ์ฌ ์ ๋ค.(์ถ๊ฐ๋ง ํ๋ฉด ๋จ)
ํํ ๋ฆฌ์คํธ์ ๊ฐ์ ์ปฌ๋ ์ ์ด๋ ๋ฐฐ์ด์ ๊ฐ์ ๋ด์์ ๋ฐํํ๋ค๊ณ ํ ๋ ํด๋น ๊ฐ์ด ์กด์ฌํ์ง ์์ ๋๋ null์ ๋ฐํํ๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค.
private fianl List<User> users = ...;
public List<User> getUsers() {
if(users.isEmpty){
return null;
}
return new ArrayList<>(users);
}ํ์ง๋ง ์ด๋ฐ์์ผ๋ก ๊ฐ์ด ์์ ๋ null์ ๋ฐํํ๋ค๋ฉด, ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ๋งค๋ฒ null์ ๊ฒ์ฌํ๋ ๋ฐฉ์ด ์ฝ๋๋ฅผ ์์ฑํด์ค์ผ ํ๋ค.
null์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋ ๋ณต์กํด์ง๋ ์ํฉ์ด ์๊ธธ์๋ ์๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด๋ค.
List<User> users = ...getUsers();
users.forEach(System.out::println);์๊ธฐ์ ๊ฐ์ ์ฝ๋์์ getUsers๊ฐ null์ ๋ฐํํ๋ค๋ฉด NPE๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฐฉ์ด์ฝ๋๊ฐ ์์ฑ๋์ด์ผ ํ๋ค. ํ์ง๋ง ๋น ๋ฆฌ์คํธ๋ฅผ ๋๊ฒจ์ค๋ค๋ฉด, ๋ฐํ์ ์๋ฌ๋ ๋ฐ์ํ์ง ์๋๋ค.
๋น ์ปฌ๋ ์ ์ ๋ฐํํ๊ธฐ ์ํด์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค. ๋๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ๋น ์ปฌ๋ ์ ์ ๋ฐํํ๊ฒ ๋ ๊ฒ์ด๋ค.
return new ArrayList<>(users);๋งค๋ฒ ๋น ์ปฌ๋ ์
์ ์์ฑํ๋ ๋น์ฉ์ด ์๊น๋ค๋ฉด Collections.emptyList(emptySet,emptyMap) ์ ์ฌ์ฉํ์ฌ ๋งค๋ฒ ๋๊ฐ์ ๋น ๋ถ๋ณ ์ปฌ๋ ์
์ ๋ฐํํ๋ฉด ๋๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋ ๊ณต์ ํด๋ ์์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐฐ์ด์ ๊ฒฝ์ฐ์๋ ๊ธธ์ด๊ฐ 0์ธ ๋ฐฐ์ดnew int[0]์ ๋ฐํํ๋ฉด ๋๋ค. ๋ฐฐ์ด๊ฐ์ ๊ฒฝ์ฐ๋ ๊ธธ์ด๊ฐ 0์ด๋ฉด ํญ์ ๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ ์ฌ์ฉํด๋ ๋๋ค.
๋ฏธ๋ฆฌ ์์ฑํด๋ ์ปฌ๋ ์ , ๋ฐฐ์ด์ด ์ฑ๋ฅ์ ๊ฐ์ ํด์ค๋ค๊ณ ๋ ์ฅ๋ดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํญ์ ์ฌ์ฉํ ๋์๋ ์ ํ์ ์ฑ๋ฅ์ ์ธก์ ํด๋ณผ ํ์๊ฐ ์๋ค.
๋ฉ์๋๊ฐ ํน์ ๊ฐ์ ๋ฐํํ ์ ์์ ๋ ์ทจํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง ์ด๋ค. ์์ธ๋ฅผ ๋์ง๊ฑฐ๋, null์ ๋ฐํํ๊ฑฐ๋.
๊ทธ๋ฌ๋ ์ง์ง ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ํฉ์ด ์๋๋ผ๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ์ ํฉํ์ง ์๊ณ , null์ ๋ฐํ๋ํ null ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํ๋ฉฐ, ์ค๋ฅ์ ๊ฐ๋ฅ์ฑ์ ๋ง๋ ๋ค.
์๋ฐ 8 ๋ถํฐ๋ Optional๋ก ์ด๋ฅผ ๋์ฒดํ ์ ์๋ค.
์ต์
๋์ ์์ธ๋ฅผ ๋์ง๋ ๋ฉ์๋๋ณด๋ค ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๊ณ , NPE์ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ฌ์ค๋ค.
if(list.isEmpty()) {
return Optional.empty();
}
// doSomething
return Optional.of(result);empty() ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น ๊ฐ์์ ๋๊ฒจ์ค ์ ์๊ณ , of() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ด ๋ Optional ์ ๋ฐํํ ์ ์๋ค.
์ต์
๋์์ ๊ฐ์ ๊บผ๋ผ ๋์๋
orElse("๊ฐ์ด ๋น์ด์์."); ๋ orElseGet(Supplier<T>) ๊ฐ์ด ๊ฐ์ด ๋น์ด์์ ๋ ๋์ฒดํ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ์ ์๊ณ , orElseThrow(Exception::new); ๋ก ์์ธ๋ฅผ ๋ฐ์์ํฌ ์๋ ์๋ค.
๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ๋ orElseGet(Supplier<T>)๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ด ํ์ํ ๋ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ์ค์ ๋น์ฉ์ ์๋ ์ ์๋ค.
isPresent()๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ด ์กด์ฌํ๋์ง์ ์ฌ๋ถ๋ฅผ boolean ๊ฐ์ผ๋ก ํ์ธํ ์ ์๊ณ , ๊ฐ์ด ํญ์ ์กด์ฌํ๋ค๋ ํ์ ์ด ์๋ค๋ฉด get()์ผ๋ก ๊ฐ์ ๊บผ๋ผ ์ ์๋ค.
Stream ๋ ์ง์ํ๊ธฐ ๋๋ฌธ์ map, flatMap, filter๋ ์ง์ํ๋ค.
์๋ฐ 9 ๋ถํฐ๋ Optional.stream() ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์๋๋ฐ, ์ด ๋ฉ์๋๋ Optional์ Stream์ผ๋ก ๋ฐํํด์ค๋ค. ๊ฐ์ด ์๋ค๋ฉด ๊ทธ ๊ฐ์ ์์๋ก ๊ฐ์ง๋ Stream์,
์๋ค๋ฉด ๋น ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ค.
์ต์
๋๋ก ๋ฐํํ๋ ๊ฒ์ด ํญ์ ์ข์ ๊ฒ์ ์๋๋ฐ, ๊ธฐ๋ณธํ ํ์
์ ๋น์ด์๋ค๋ผ๋ ํํ์ด ์์ด ์ต์
๋์ ์ฌ์ฉํ๋ฉด ์ข์ ์ ์์ง๋ง,
๊ฐ์ด List ํ์
๊ณผ ๊ฐ์ ์ปฌ๋ ์
์ด๋ Stream, ๋ฐฐ์ด, ์ต์
๋ ์ด๋ผ๋ฉด ๊ทธ๋ฅ ๋น List ์ ๊ฐ์ด ๋น์ด์๋ ์ปฌ๋ ์
์ ๋ฐํํ๋ ๊ฒ์ด ๋ ์ข๋ค. (์ถ๊ฐ์ ์ธ Optional ์ฒ๋ฆฌ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ค.)
๊ธฐ๋ณธ ํ์ ์ ์ต์ ๋๋ก ๊ฐ์ผ๋ค๋ฉด Optional ์ ๊ฐ์ด ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ OptionalInt ์ ๊ฐ์ ์ ์ฉ ์ต์ ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ์.
์ต์ ๋์ Map ์์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ๋งต ์์ ํค๊ฐ ์์์ ๋ํ๋ด๋ ๊ฒ์ด ๋๊ฐ์ง๊ฐ ๋๋ค.
- ์ง์ง ํค๊ฐ ์์ ๋
- ์์ง๋ง ๋น์ด์๋ ์ต์ ๋
๋ณต์ก์ฑ๋ง ์ฆ๊ฐํ ๋ฟ, ์ด์ ์ด ์๋ค. ์ต์ ๋์ ์ปฌ๋ ์ ์ ํค, ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ฑฐ๋ ๋ฐฐ์ด์ ์์๋ก ์ฌ์ฉํ ๋์๋ ๋ค์ํ๋ฒ ๊ณ ๋ฏผ์ ํด๋ณด์.
์ต์
๋์ ์ธ์คํด์ค์ ํ๋๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ด๋จ๊น?
์ด๋ฐ ๊ฒฝ์ฐ๋ ๋๋ถ๋ถ ํ์ ํ๋๋ฅผ ๊ฐ์ง ํด๋์ค์ ์ ํํ๋๋ฅผ ๊ฐ์ง ํ์ฅ ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด ๋์ ๊ฒฝ์ฐ์ด๋ค.
๊ทธ๋ฌ๋ ๋ง์ฝ ํ๋๊ฐ ๊ธฐ๋ณธํ์
์ด๊ณ , ๋๋ถ๋ถ์ด ์ ํ์ ํ๋๋ผ๋ฉด Getter๊ฐ ์ต์
๋์ ๋ฐํํ๋ ๊ฒ์ด ๊ด์ฐฎ์ ์ ์๋ค.
์ง์ญ๋ณ์์ ์ ํจ๋ฒ์๋ฅผ ์ต์ํ(์ต๋ํ ์ฌ์ฉํ๋ ๋ฒ์๊น์ง๋งํ๋ฉด) ๊ฐ๋ ์ฑ์ด ์ข์์ง๊ณ , ์ค๋ฅ์ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค.
์ง์ญ๋ณ์์ ๋ฒ์๋ฅผ ์ค์ด๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ์ฒ์ ์ฌ์ฉ๋ ๋ ์ ์ธํ๋ ๊ฒ์ด๋ค.
์ฝ๋์ ๋งจ ์๋ถ๋ถ์ ๋ฏธ๋ฆฌ ์ ์ธํด๋๋ฉด, ๊ฐ๋
์ฑ๋ ๋จ์ด์ง๊ณ , ์ค์ ์ฌ์ฉํ ๋ ์ด๊ธฐํํด๋ ๊ฐ์ด ์๊ฐ์ด ๋์ง ์๋๋ค๊ฑฐ๋, ์๊ฐ๋ณด๋ค ๋ฒ์๋ฅผ ๋๊ฒ ์ก์๋ฌ
๊ทธ๊ฒ์ ๋ค์ ์ฌ์ฉํ๊ฒ ๋๋ ์ค์๋ฅผ ๋ฒํ๊ฒ ๋ ์ ์๋ค.
์ด๋ฌํ ์์๋ for ๊ณผ while์ ์ฐจ์ด์์ ๋ฐ๊ฒฌ๋๋ค.
int i = 0;
while(i < 10) {
// Do Something ..
i++;
int i2 = 0;
while(i < 10) {
// Do Something ..
i2++;
}ํด๋น ์ฝ๋์์ ์ค๋ฅ๊ฐ ๋ณด์ด๋๊ฐ? ์ฒซ ๋ฐ๋ณต๋ฌธ์์ i๋ฅผ ์ด์ฉํด ๋ฐ๋ณต์ ์งํํ๊ณ , ๋ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ์์ ํ๋ก๊ทธ๋๋จธ์ ์ค์๋ก ๋ฐ๋ณต๋ฌธ์ ์กฐ๊ฑด์์ ๋ค์ i๋ฅผ ๊ฐ์ง๊ณ ํ์ธํ๋ค.
์ปดํ์ผ ์ค๋ฅ๋ ๋ฐ์ํ์ง ์๊ณ , ๊ทธ์ ๋๋ฒ์งธ ๋ฐ๋ณต๋ฌธ์ด ์คํ๋์ง ์์ ๊ฒ์ด๋ค.
for๋ฌธ์ ์ด์ฉํ ๋ฐ๋ณต๋ฌธ์์๋ ์ด๋ฐ ์ํฉ์ด ์ผ์ด๋ ์ ์๋ค.(๋ณ์์ ์ค์ฝํ๊ฐ ๋ฐ๋ณต๋ฌธ)
for(int i=0; i<10; i++){
// Do Something ..
}
for(int i=0; i<10; i++){
// Do Something ..
}์๊ธฐ์ ์ฝ๋๋ ์ปดํ์ผ ์๋ฌ๋, ๋
ผ๋ฆฌ์ ์ค๋ฅ๋ ์์ด ์ ๋์๊ฐ ๊ฒ์ด๋ค. for ๋ฌธ์์ ์ ์ํ ๋ฐ๋ณต ์กฐ๊ฑด ๋ณ์๋ ํด๋น ๋ฐ๋ณต๋ฌธ ์์์๋ง ์ ํจํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ฌธ์ ๋์ผํ ๋ณ์๋ช
์ ์ฌ์ฉํ ์๋ ์๊ณ , ๋ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ์์ i2๋ก ์ ์ธํ๊ณ ์ค์๋ก ์กฐ๊ฑด์์ i๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
๋ฐ๋ณต์์ ์ธ๋ฑ์ค๋ ๋ฐ๋ณต์๋ ํ์์๊ณ ๋จ์ง ์์๋ง์ ํ์๋ก ํ๋ค๋ฉด for-each๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. for-each๋ ์ปฌ๋ ์ ๊ณผ ๋ฐฐ์ด์ ๋ชจ๋ ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ปจํ ์ด๋๋ฅผ ๋ค๋ฃจ๋์ง ์ ๊ฒฝ์ฐ์ง์๊ณ ๊ตฌํํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณด์.
List<String> alphabets = new ArrayList<>(List.of("A", "B", "C"));
List<String> numbers = new ArrayList<>(List.of("1", "2", "3", "4", "5"));
List<String> comb = new ArrayList<>();
for (Iterator<String> aIt = alphabets.iterator(); aIt.hasNext(); ) {
for(Iterator<String> nIt = numbers.iterator(); nIt.hasNext(); ) {
comb.add(aIt.next() + nIt.next());
}
}์ํ๋ฒณ๊ณผ ์ซ์์ ๋ชจ๋ ์กฐํฉ์ ๊ธฐ๋ํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ์๋ค๊ณ ํด๋ณด์. ๊ทธ๋ฌ๋ ์์ ์ฝ๋์์๋ ์ซ์๋ง๋ค aIt.next()๋ ๊ฐ์ด ํธ์ถ ํ๊ธฐ ๋๋ฌธ์ 4๋ฒ์งธ ๋ฐ๋ณต์์
์ํ๋ฒณ์ ์์๊ฐ ๋ฐ๋ฅ๋ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
์์ ์ํฉ์์๋ ๋ ์ค์ฒฉ for๋ฌธ ์ฌ์ด์ aIt.next()๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ฅผ ๋์ด ํด๊ฒฐํ ์ ์๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ for-each ๋ฌธ์ ์ฌ์ฉํ๋ค๋ฉด ๋ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
for(String alphabet : alphabets) {
for(String number : numbers) {
comb.add(alphabet + number);
}
}๊ทธ๋ฌ๋ for-each๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ค์ด ์๋ค.
- ์ปฌ๋ ์ ์ ์ํํ๋ฉฐ ์ ํ๋ ์์๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋, ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ์ฌ๋ฌ๊ฐ์ ์ปฌ๋ ์ ๋๋ ๋ฐฐ์ด์ ๋ณ๋ ฌ๋ก ์ํํด์ผ ํ๋ค. ์ ์ ๋๊ฐ์ง ์ํฉ์์๋ ์ธ๋ฑ์ค ๋๋ ๋ฐ๋ณต์๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ for-each ๋ฌธ์ผ๋ก ์์ฑํ๊ธฐ์ ์ ํฉํ์ง ์๋ค.
์ฌ์ฉํ ์ ์๋ค๋ฉด for-each๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋
์ฑ, ์ค๋ฅ ๋ฐ์๋ฅ ๋ฉด์์๋ ํฐ ์ฅ์ ์ ๊ฐ์ง๋ค.
๋ง์ฝ ํด๋์ค๋ฅผ ์ค๊ณํ๋๋ฐ ๋ด๋ถ์ ๊ฐ์ ์ํํด์ผ ํ๋ค๋ฉด Iterable<E> ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
์๋ฐ์๋ int, double, boolean ๊ฐ์ ๊ธฐ๋ณธ ํ์
์ด ์๊ณ , ์ด์ ๋์ํ๋ ์ฐธ์กฐ ํ์
์ธ Integer, Double, Boolean ์ด ์กด์ฌํ๋ค.
์๋ฐ์์๋ ์คํ ๋ฐ์ฑ๊ณผ, ์ธ๋ฐ์ฑ์ ์ง์ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด ๋์ ํฌ๊ฒ ๊ตฌ๋ถํ์ง ์๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ทธ๋ฌ๋ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ณ์ฑ(identity)๋ฅผ ๊ฐ์ง๋ ์ฐธ์กฐํ ๊ฐ์ฒด์ด๋ค. ๋๋ฌธ์ ์์ํ ํ์ ๊ณผ ๊ตฌ๋ถํ์ง ์์ผ๋ฉด ๋ช๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ฒซ ๋ฒ์งธ๋ก ๊ฐ์ ๋น๊ตํ๋ ๊ฒฝ์ฐ์ด๋ค.
Comparator<Integer> order = (i, j) -> i < j ? -1 : (i == j ? 0 : 1)ํด๋น ์ฝ๋์์ ์ฒซ ๋ฒ์งธ ์์๊ฐ ๋ ๋ฒ์งธ ์์๋ณด๋ค ์์ผ๋ฉด -1, ๊ฐ์ผ๋ฉด 0, ํฌ๋ค๋ฉด 1์ ๋ฐํํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ํ๊ฐ์ง ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด new Integer(10) ๊ณผ new Integer(10)์ ๊ฐ์ ๋น๊ตํ๋ค๊ณ ํด๋ณด์.
์ฒ์ i < j ์์๋ false ๊ฐ ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ฝ๊ฒ ์์ธกํ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ค์์ผ๋ก ์คํ๋๋ i == j ์์๋ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น?
๋ ๊ฐ์ฒด๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๊ธฐ ๋๋ฌธ ๋์ผ์ฑ ๋น๊ต์ธ == ๋น๊ต์์๋ false๊ฐ ๋์ฌ ๊ฒ์ด๊ณ , ๊ฒฐ๊ณผ ๊ฐ์ 1์ด ๋์ด ์ฒซ ๋ฒ์งธ ์์์ ๊ฐ์ด ๋ ์๋ค๋ ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ์ด๋ค.
๋ ๋ฒ์งธ๋ก๋ Null ๊ฐ์ด๋ค.
์์ ํ์
์ ๊ฐ๊ณผ ๋น๊ต๊ฐ ๋ฐ์ํ๋ ์ํฉ์์ ๋ฐ์ฑ๋ ํ์
์ ์ฌ์ฉํ๋ค๋ฉด NullPointExeception์ด ๋ฐ์ํ ์ ์๋ค.
๋ฐ์ฑ๋ ํ์
์ ๊ธฐ๋ณธ์ ์ผ๋ก Null ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ์ ๋น๊ตํ๊ธฐ์ํด ๋ฐ์ฑ ํ์
์ด ์๋์ผ๋ก ์ธ๋ฐ์ฑ ๋๋ฉฐ ์์ธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ธ ๋ฒ์งธ๋ก๋ ๋ฐ์ฑ, ์ธ๋ฐ์ฑ์ ๋๋ฌธ์ ๋ฐ์ํ๋ ์ฑ๋ฅ์ ํ์ด๋ค.
๋ฌผ๋ก ๋ช๋ฒ์ ๋ฐ์ฑ, ์ธ๋ฐ์ฑ์ผ๋ก ์ฑ๋ฅ์ ํ๊ฐ ๋ฐ์ํ์ง๋ ์๋๋ค. ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด๋ผ๋ฉด?
Integer sum = 0;
for (int i = 0; i < Integer.MAX_VALUES; i++) {
sum += i;
}1๋ถํฐ Integer์ ์ต๋๊ฐ๊น์ง์ ์๋ฅผ ๋ํ๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ด๋ค.
ํ์ง๋ง sum์ด Integer ํ์
์ผ๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ณ์ฐ์ ์ํด ์ธ๋ฐ์ฑ ๋๊ณ , ๋ค์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ๋ฐ์ฑ์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ ๊ฒ์ด๋ค.
์ด๋ฐ ๊ณผ์ ์ด ๋ฌด์ํ ๋ง์ด ๋ฐ๋ณต๋๋ค๋ฉด ์ด๋ ์ฑ๋ฅ์ ํ์ ์์ธ์ด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฐ์ฑ ํ์
์ ์ธ์ ์ฌ์ฉํด์ผํ ๊น?
๋จผ์ DB์ ๋งคํ๋๋ ์ํฐํฐ์ ๊ฐ์ ๊ฐ์ฒด์์๋ ์ผ๋ถ๋ฌ ๋ฐ์ฑ ํ์
์ ์ฌ์ฉํ๋ค. DB์ ์ ์ฅ๋ ๋ ๊ฐ์ด ์์์ ๋ํ๋ด๊ธฐ์ํด Null ๊ฐ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ์๋ฐ์ Collection ์ ์์ ํ์
์ ๋ด์ ์ ์์ผ๋ฏ๋ก ๋ฐ์ฑ๋ ํ์
์ ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด๋ ๋ฆฌํ๋ ์
์ ์ฌ์ฉํ ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.