2023. 3. 3. 13:48γJAVA/Effective JAVA
[μ΄νν°λΈ μλ°] Item20. μΆμν΄λμ€λ³΄λ€ μΈν°νμ΄μ€λ₯Ό μ°μ νλΌ.
μλ°κ° μ 곡νλ λ€μ€ ꡬν λ©μ»€λμ¦μΌλ‘λ μΆμν΄λμ€μ μΈν°νμ΄μ€ μ΄λ κ² λκ°μ§κ° μλ€.
μλ° 8λΆν° μΈν°νμ΄μ€λ λν΄νΈ λ©μλ default method λ₯Ό μ 곡ν μ μκ² λλ©΄μ μ΄μ λ λ λ©μ»€λμ¦ λͺ¨λ μΈμ€ν΄μ€ λ©μλλ₯Ό ꡬν ννλ‘ μ 곡ν μ μλ€.
μΆμν΄λμ€μ μΈν°νμ΄μ€μ ν° μ°¨μ΄μ μΌλ‘λ μΆμν΄λμ€κ° μ μν νμ μ ꡬννλ ν΄λμ€λ λ°λμ μΆμν΄λμ€μ νμ ν΄λμ€κ° λμ΄μΌ νλ€λ μ μ΄λ€. μλ°λ λ¨μΌ μμλ§ μ§μνκΈ° λλ¬Έμ μΆμ ν΄λμ€ λ°©μμ μλ‘μ΄ νμ μ μ μνλλ° μ»€λ€λ μ μ½μ μ»κ² λλ€.
λ°λ©΄ μΈν°νμ΄μ€κ° μ μΈν λ©μλλ₯Ό λͺ¨λ μ μνκ³ κ·Έ μΌλ° κ·μ½μ μ μ§ν¨ ν΄λμ€λΌλ©΄ λ€λ₯Έ μ΄λ€ ν΄λμ€λ₯Ό μμνλ κ°μ νμ μΌλ‘ μ·¨κΈλλ€.
μΈν°νμ΄μ€ μ₯μ
1οΈβ£ μλ° 8λΆν°λ μΈν°νμ΄μ€μμλ λν΄νΈ λ©μλλ₯Ό μ 곡ν μ μλ€.
public interface TimeClient
{
void setTime(int hour, int minute, int second);
void setDate(int day, int month, int year);
void setDateAndTime(int day, int month, int year, int hour, int minute, int second);
LocalDateTime getLocalDateTime();
static ZoneId getZoneId(String zoneString)
{
try
{
return ZoneId.of(zoneString);
}
catch (DateTimeException e) {
System.err.println("Invalid time zone: " + zoneString + "; using default time zone instead");
return ZoneId.systemDefault();
}
}
// μλ° 8λΆν° μΈν°νμ΄μ€λ λν΄νΈ λ©μλλ₯Ό μ 곡ν μ μλ€.
default ZonedDateTime getZoneDateTime(String zoneString)
{
return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
}
}
public class SimpleTimeClient implements TimeClient
{
private LocalDateTime localDateTime;
public SimpleTimeClient()
{
localDateTime = LocalDateTime.now();
}
@Override
public void setTime(int hour, int minute, int second)
{
LocalDate currentDate = LocalDate.from(localDateTime);
LocalTime timeToSet = LocalTime.of(hour, minute, second);
localDateTime = LocalDateTime.of(currentDate, timeToSet);
}
@Override
public void setDate(int day, int month, int year)
{
LocalDate dateToSet = LocalDate.of(day, month, year);
LocalTime currentTime = LocalTime.from(localDateTime);
localDateTime = LocalDateTime.of(dateToSet, currentTime);
}
@Override
public void setDateAndTime(int day, int month, int year, int hour,
int minute, int second)
{
LocalDate dateToSet = LocalDate.of(day, month, year);
LocalTime timeToSet = LocalTime.of(hour, minute, second);
localDateTime = LocalDateTime.of(dateToSet, timeToSet);
}
@Override
public LocalDateTime getLocalDateTime()
{
return localDateTime;
}
public String toString()
{
return localDateTime.toString();
}
public static void main(String[] args)
{
TimeClient myTimeClient = new SimpleTimeClient();
System.out.println("myTimeClient = " + myTimeClient);
System.out.println(
"myTimeClient.getZoneDateTime = " + myTimeClient.getZoneDateTime("America/Los_Angeles"));
}
}
2οΈβ£ κΈ°μ‘΄ ν΄λμ€μλ μμ½κ² μλ‘μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν΄λ£μ μ μλ€.
μΈν°νμ΄μ€κ° μꡬνλ λ©μλλ₯Ό μμ§ μλ€λ©΄ μΆκ°νκ³ ν΄λμ€ μ μΈμ implements κ΅¬λ¬Έλ§ μΆκ°ν΄μ£Όλ©΄ λλ€!
3οΈβ£ μΈν°νμ΄μ€λ λ―Ήμ€μΈ mixin μ μμ μμ±λ§μΆ€μ΄λ€. (μ νμ μΈ κΈ°λ₯ μΆκ°)
λ―Ήμ€μΈμ΄λ ν΄λμ€κ° ꡬνν μ μλ νμ μΌλ‘, λ―Ήμ€μΈμ ꡬνν ν΄λμ€μ μλμ 'μ£Όλ νμ ' μΈμλ νΉμ μ νμ νμλ₯Ό μ 곡νλ€κ³ μ μΈνλ ν¨κ³Όλ₯Ό μ€λ€.
ex) Comparableμ μμ μ ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ€λΌλ¦¬λ μμλ₯Ό μ ν μ μλ€κ³ μ μΈνλ λ―Ήμ€μΈ μΈν°νμ΄μ€μ΄λ€.
μ΄μ²λΌ λμ νμ μ μ£Όλ κΈ°λ₯μ μ νμ κΈ°λ₯μ νΌν©(mixed in) νλ€κ³ ν΄μ λ―Ήμ€μΈμ΄λΌκ³ λΆλ₯Έλ€.
μΆμν΄λμ€λ‘λ λ―Ήμ€μΈμ μ μν μ μλλ° μλνλ©΄ κΈ°μ‘΄ ν΄λμ€μ λ§μμΈ μ μκΈ° λλ¬Έμ΄λ©°, ν΄λμ€λ λκ° μ΄μμ ν΄λμ€λ₯Ό μμλ°μ μ μκΈ° λλ¬Έμ΄λ€.
4οΈβ£ μΈν°νμ΄μ€λ‘λ κ³μΈ΅κ΅¬μ‘°κ° μλ νμ νλ μμν¬λ₯Ό λ§λ€ μ μλ€.
νμ μ κ³μΈ΅μ μΌλ‘ μ μ μνλ©΄ μλ§μ κ°λ μ ꡬ쑰μ μΌλ‘ μ ννν μ μμ§λ§, νμ€μμλ κ³μΈ΅μ μ격ν ꡬλΆνκΈ° μ΄λ €μ΄ κ°λ λ μλ€.
μ± μ λμ¨ μλ‘λ κ°μ(Singer) μΈν°νμ΄μ€μ μ곑κ°(SongWriter) μΈν°νμ΄μ€κ° μλ€κ³ νλ©΄..
public interface Singer
{
AudioClip sing(Song song);
}
public interface SongWriter
{
Song compose(int shartPosition);
}
κ·Όλ° μ£Όλ³μλ μ곑λ κ°μ΄ νλ κ°μλ€λ λ§λ€.
public interface SingerSongwriter extends Singer, SongWriter
{
AudioClip strum();
void actSensitive();
}
μ΄λ κ² νμ μ μΈν°νμ΄μ€λ‘ μ μνλ©΄ κ°μ ν΄λμ€κ° singerμ songWriterλ₯Ό λͺ¨λ ꡬνν΄λ μ ν λ¬Έμ κ° λμ§ μλλ€.
μ¬μ§μ΄ Singerμ Songwriterλ₯Ό λͺ¨λ νμ₯νκ³ μλ‘μ΄ λ©μλκΉμ§ μΆκ°ν΄ μ 3μ μΈν°νμ΄μ€λ₯Ό μ μν μλ μλ€.
5οΈβ£ λνΌ ν΄λμ€ κ΄μ©κ΅¬μ ν¨κ» μ¬μ©νλ©΄ μΈν°νμ΄μ€λ κΈ°λ₯μ ν₯μμν€λ μμ νκ³ κ°λ ₯ν μλ¨μ΄ λλ€.
νμ μ μΆμ ν΄λμ€λ‘ μ μν΄λλ©΄ νμ μ κΈ°λ₯μ μΆκ°νλ λ°©λ²μ μμλΏμ΄μ§λ§ μμν΄μ λ§λ ν΄λμ€λ λνΌ ν΄λμ€λ³΄λ€ νμ©λκ° λ¨μ΄μ§κ³ κΉ¨μ§κΈ° μ½λ€.
[μ΄νν°λΈ μλ°] Item18. μμ보λ€λ μ»΄ν¬μ§μ μ μ¬μ©νλΌ. (tistory.com)
6οΈβ£ μΈν°νμ΄μ€ λ©μλ μ€ κ΅¬νμ΄ λͺ λ°±ν κ²μ΄ μλ€λ©΄ λν΄λ λ©μλλ‘ μ 곡ν΄μ νλ‘κ·Έλλ¨Έμ μΌκ°μ λμ΄μ€ μ μλ€.
λν΄νΈ λ©μλλ₯Ό μ 곡ν λμλ μμνλ €λ μ¬λμ μν΄ @implSpec μλ°λ νκ·Έλ₯Ό λΆμ¬ λ¬Έμνν΄μΌ νλ€.