μλ°μ ν΄λμ€μ κ°μ²΄λ₯Ό μ¬λ°λ₯΄κ² κΈ°λ₯λ§ λμνκ² νλ κ²μ λΆμ‘±νλ€!
보기 μ’μμΌ νκ³ μ¬μ©νκΈ°λ νΈν΄μΌλ§ νλ€!!
7μ₯μμλ λ κ°μ²΄ μ§ν₯μ μ΄κ³ κ°λ ₯ν μ½λλ₯Ό λ§λλλ° μ μ©νκ² μ°μΌ μλ°μ 보νΈμ μΈ λμμΈ μ리λ₯Ό κ°μ‘°νκ² λ€.
7.1 λΆ λ§€κ°λ³μλ‘ λ©μλ λΆν
λ¬Έμ μ½λ
void log(String message, boolean classified) throws IOException {
if (classified) {
writeMessage(message, CAPTAIN_LOG);
} else {
writeMessage(message, CREW_LOG);
}
}
μ μ½λλ booleanμ μνμ λ°λΌ μλ‘ λ€λ₯Έ μμ μ μννλ€.
μ΄λ λμμ λ¬Έμ κ° μμ§λ§ μ½κΈ° λΆνΈνκ³ λ©μλλ₯Ό μ¬μ©νλ μ¬λμ΄ Trueμ Falseκ° κ°κ° λ¬΄μ¨ μλ―ΈμΈμ§ μκ³ μμ΄μΌλ§ νλ€.
μ΄ μ½λλ₯Ό μ’ λ ν₯μ μν€λ €λ©΄ boolean 맀κ°λ³μκ° μ€μ λ‘ μ΄λ€ μν μ νλμ§ μμ보기 μ½κ² λ§λ€μ΄μΌ νλ€. (νΌλμ μ€μ)
κ°μ μ½λ
void writeToCaptainLog(String message) throws IOException {
writeMessage(message, CAPTAIN_LOG);
}
void writeToCrewLog(String message) throws IOException {
writeMessage(message, CREW_LOG);
}
μ μ½λμ²λΌ booleanμ΄ μ°μΈ λ©μλλ₯Ό μ¬λ¬ κ°λ‘ λΆλ¦¬ν¨μΌλ‘μ¨ μ½λκ° ν₯μλ μ μλ€.
*κ°μ λ°©λ²*
1. 맀κ°λ³μλ‘ κ΅¬λΆνλ μ μ΄ νλ¦ κ²½λ‘λ§λ€ μ λ©μλλ₯Ό μΆκ°
2. λ©μλμ μλ―Έ μλ μ΄λ¦μ μ§μ΄μ£Όμ΄ μ½λ κ°λ μ± λμ
λ©μλκ° μ΄λμ μνλ©° 무μμ νλμ§ λ©μλλͺ λ§ λ΄λ νμ€ν μ μ μμ΄μ§.
7.2 μ΅μ 맀κ°λ³μλ‘ λ©μλ λΆν
μ΅μ 맀κ°λ³μλ λΆ λ§€κ°λ³μ μ²λΌ λ©μλ λΆν μ ν΅ν΄ μ½λλ₯Ό κ°μ ν μ μλ€.
λ¬Έμ μ½λ
class Logbook {
static final Path CREW_LOG = Paths.get("/var/log/crew.log");
List<String> readEntries(LocalDate date) throws IOException {
final List<String> entries = Files.readAllLines(CREW_LOG,
StandardCharsets.UTF_8);
if (date == null) {
return entries;
}
List<String> result = new LinkedList<>();
for (String entry : entries) {
if (entry.startsWith(date.toString())) {
result.add(entry);
}
}
return result;
}
}
μΈμλ‘ null μΈ κ²κ³Ό nullμ΄ μλ κ²μ΄ λμ΄μ¬ μ μλλ° μ΄λ μλ‘ λ€λ₯Έ μμ μ΄ μ€νλλ€.
νΈμΆμ μ μ₯μμ nullλ‘ μΈμλ‘ λκΈΈ λ μ΄λ€ κ²°κ³Όκ° λμ¬μ§ μμνκΈ° μ΄λ ΅λ€..
κ·Έλ κΈ° λλ¬Έμ μ΄ λΆλΆμ 리ν©ν λ§ ν μ μλ€.
κ°μ μ½λ
class Logbook {
static final Path CREW_LOG = Paths.get("/var/log/crew.log");
List<String> readEntries(LocalDate date) throws IOException {
Objects.requireNonNull(date);
List<String> result = new LinkedList<>();
for (String entry : readAllEntries()) {
if (entry.startsWith(date.toString())) {
result.add(entry);
}
}
return result;
}
List<String> readAllEntries() throws IOException {
return Files.readAllLines(CREW_LOG, StandardCharsets.UTF_8);
}
}
'λΆ λ§€κ°λ³μ'λ₯Ό κ°μ ν κ²μ²λΌ 'μ΅μ 맀κ°λ³μ' λν λ©μλλ₯Ό μ¬λ¬ κ°λ‘ λΆν ν΄μ£Όλ©΄ λλ€.
*κ°μ λ°©λ²*
1. κ°κ°μ μ μ΄ νλ¦μ νλμ λ©μλλ‘ νν.
2. λ©μλλͺ μ ν΅ν΄ 무μμ ν κ²μΈμ§ λͺ νν μ λ¬.
readAllEntriles()λ 'λͺ¨λ μνΈλ¦¬λ₯Ό μ½μ΄μ¨λ€'λΌλ μλ―Έλ₯Ό νλμ μ μ μκ³ λ μ΄μ nullμ μ¬μ©νμ§ μμλ λλ€.
7.3 ꡬ체 νμ λ³΄λ€ μΆμ νμ
λ³μμ μΆμμ μΈ νμ μ μ¬μ©ν μλ‘ μ½λλ λ μ μ°ν΄μ§λ€!
λ¬Έμ μ½λ
class Inventory {
LinkedList<Supply> supplies = new LinkedList();
void stockUp(ArrayList<Supply> delivery) {
supplies.addAll(delivery);
}
LinkedList<Supply> getContaminatedSupplies() {
LinkedList<Supply> contaminatedSupplies = new LinkedList<>();
for (Supply supply : supplies) {
if (supply.isContaminated()) {
contaminatedSupplies.add(supply);
}
}
return contaminatedSupplies;
}
}
class Usage {
static void main(String[] args) {
CargoShip cargoShip = null;
Inventory inventory = null;
Stack<Supply> delivery = cargoShip.unload();
ArrayList<Supply> loadableDelivery = new ArrayList<>(delivery);
inventory.stockUp(loadableDelivery);
}
}
μ μ½λλ LinkenList<>, ArraryList<> λ±μ ꡬ체 νμ μΌλ‘ νλΌλ―Έν° νμ μ΄λ, λ³μ νμ μ μ§μ νκ³ μλ€. μ΄λ κ² νλ©΄ μ¬λ¬ μλ£ κ΅¬μ‘° κ° νμ κ° λ³νμ΄ μ¦μμ§κ³ Inventoryν΄λμ€λ₯Ό λ³κ²½ν κ²½μ° λ€λ₯Έ λΆλΆμλ μν₯μ λ―ΈμΉκ² λλ€....(κ°μ²΄ μ§ν₯μ μμ’μ)
μΆμ νμ μ μ°λ©΄ μ΄ λ¬Έμ λ₯Ό κ°μ ν μ μλ€.
κ°μ μ½λ
class Inventory {
List<Supply> supplies = new LinkedList();
void stockUp(Collection<Supply> delivery) {
supplies.addAll(delivery);
}
List<Supply> getContaminatedSupplies() {
List<Supply> contaminatedSupplies = new LinkedList<>();
for (Supply supply : supplies) {
if (supply.isContaminated()) {
contaminatedSupplies.add(supply);
}
}
return contaminatedSupplies;
}
}
μ½λκ° κ°μ λ 3κ°μ§ μΈ‘λ©΄μ μ΄ν΄λ³΄μ.
- supplies νλμ List μΈν°νμ΄μ€ μ¬μ© -> μΈλ²€ν 리μ μ νμ΄ μ΄λ»κ² μ μ₯λλμ§ μ μ μμ΄μ§ (λ€μν κ°μ²΄ λ£μ μ μμ΄μ§)
- stockUp() λ©μλκ° νλΌλ―Έν°λ‘ μ΄λ€ Collectionμ΄λ νμ© -> μ¦, μ΄λ€ νμ νμ μ΄λ λ©μλλ‘ μ λ¬ κ°λ₯ν΄μ§.
- getConataminatedSupplies() ꡬ체μ μΈ νμ
μ΄ μλ μΆμμ μΈ List<> νμ
μ λ°νν¨.
-> μ νμ λ°νμ Listννμ΄μ§λ§ λ΄λΆμ μΌλ‘ μ΄λ»κ² μ μ₯νλ μ§λ μΈλΆμ μλ¦¬μ§ μμ
class Usage {
static void main(String[] args) {
CargoShip cargoShip = null;
Inventory inventory = null;
Stack<Supply> delivery = cargoShip.unload();
inventory.stockUp(delivery);
}
}
stockUp μ¬μ© μ νμ λ³ν μμ΄ Stack νμ μ λ°λ‘ CollectionμΌλ‘ λ°μμ μ¬μ©ν μ μλ€.
7.4 κ°λ³ μνλ³΄λ€ λΆλ³ μν μ¬μ©νκΈ°
κΈ°λ³Έμ μΌλ‘ κ°μ²΄μ μνλ λΆλ³μ΄λ€. κ°λ₯νλ©΄ κ°μ²΄λ₯Ό λΆλ³μΌλ‘ λ§λ€μ΄μΌ μλͺ» μ¬μ©ν κ²½μ°κ° μ λ€.
λ¬Έμ μ½λ
class Distance {
DistanceUnit unit;
double value;
Distance(DistanceUnit unit, double value) {
this.unit = unit;
this.value = value;
}
static Distance km(double value) {
return new Distance(DistanceUnit.KILOMETERS, value);
}
void add(Distance distance) {
distance.convertTo(unit);
value += distance.value;
}
void convertTo(DistanceUnit otherUnit) {
double conversionRate = unit.getConversionRate(otherUnit);
unit = otherUnit;
value = conversionRate * value;
}
}
class Main {
static void usage() {
Distance toMars = new Distance(DistanceUnit.KILOMETERS, 56_000_000);
Distance marsToVenus = new Distance(DistanceUnit.LIGHTYEARS, 0.000012656528);
Distance toVenusViaMars = toMars;
toVenusViaMars.add(marsToVenus);
}
}
toMarsμ toVenusViaMarsλ κ°μ κ°μ²΄λ₯Ό κ°λ₯΄ν¨λ€. λ°λΌμ, toVenusViaMars.add(marsToVenus)λ₯Ό μ€ννλ©΄ toMarsκ°μ²΄λ λ³κ²½μ΄ μΌμ΄λκ² λλ€. (value κ°μ λ³λ)
κ°μ μ½λ
final class Distance {
final DistanceUnit unit;
final double value;
Distance(DistanceUnit unit, double value) {
this.unit = unit;
this.value = value;
}
Distance add(Distance distance) {
return new Distance(unit, value + distance.convertTo(unit).value);
}
Distance convertTo(DistanceUnit otherUnit) {
double conversionRate = unit.getConversionRate(otherUnit);
return new Distance(otherUnit, conversionRate * value);
}
}
class Main {
static void usage() {
Distance toMars = new Distance(DistanceUnit.KILOMETERS, 56_000_000);
Distance marsToVenus = new Distance(DistanceUnit.LIGHTYEARS, 0.000012656528);
Distance toVenusViaMars = toMars.add(marsToVenus)
.convertTo(DistanceUnit.MILES);
}
}
κ°μ²΄λ μ ν¨νμ§ μμ λ³κ²½μ΄ μΌμ΄λμ§ μλλ‘ κ°λ³μ±μ μ νν΄ μ€μ€λ‘λ₯Ό 보νΈν μ μλ€.
μμ±μμ valueμ unitνλμ final ν€μλλ₯Ό μ¬μ©νλ©΄ μ΄νλ‘λ λ³κ²½ν μ μλ€.
λ°λΌμ, 거리λ₯Ό κ³μ°νλ €λ©΄ λ§€λ² μλ‘μ΄ μΈμ€ν΄μ€κ° νμνλ€.
add() μ convertTo() ν¨μλ μν ν μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ λ°ννλ€.
μ΄λ κ² νλ©΄ Distanceμ λΆλ³ μνλ₯Ό μ μ§ν μ μλ€.
ν΄λμ€ μ μ μμ final ν€μλλ₯Ό λΆμ΄λ κ²½μ°λ ν΄λμ€λ₯Ό λ μ΄μ νμ₯ν μ μκ² νλ €λ μλμ΄λ€.
7.5 μνμ λμ κ²°ν©νκΈ°
λ¬Έμ μ½λ
class Hull {
int holes;
}
class HullRepairUnit {
void repairHole(Hull hull) {
if (isIntact(hull)) {
return;
}
hull.holes--;
}
boolean isIntact(Hull hull) {
return hull.holes == 0;
}
}
μνμ λμμ κ²°ν©μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ κΈ°λ³Έ ν μ€ νλμ΄λ€.
μ μ½λλ μνμ λμμ΄ λ³κ°μ ν΄λμ€λ‘ λλμ΄ μλ€.
μμ κ°μ΄ μ¬μ©νλ©΄ λ¬Έμ λ 'μ 보 μλ'μ΄ λΆκ°λ₯ν΄μ§κ³ μ½λλ₯Ό μ΄ν΄νκΈ° λ μ΄λ €μμ§λ€λ μ μ΄λ€.
Hull ν΄λμ€λ HullRepairUnit λ°κ°μ μλ ν΄λμ€μ΄λ―λ‘ μμ μ μνμ λν΄ μ½κΈ°μ μ°κΈ° μ κ·Όμ μ 곡ν΄μΌλ§ νλ€.
μνμ λμμ μ¬λ°λ₯΄κ² κ²°ν©ν΄μ μ½λλ₯Ό κ°μ ν΄λ³΄μ.
κ°μ μ½λ
class Hull {
int holes;
void repairHole() {
if (isIntact()) {
return;
}
holes--;
}
boolean isIntact() {
return holes == 0;
}
}
HullRepairUnitμ μμ ν μ§μ λ€. μ΄μ Hullμ μ€μ€λ‘ κΈ°λ₯μ μ 곡νλ€.
Hull λ©μλλ μμ μ λ΄λΆ μνλ₯Ό μ§μ μ²λ¦¬ν μ μκ³ λ©μλ 맀κ°λ³μλ‘ μ¬μ©νμ§ μμλ λλ€.
λν, κ²ν°, μΈν°λ₯Ό ν΅ν΄ μΈλΆλ‘ μνλ₯Ό λ ΈμΆνμ§ μμλ λλ€.
μμ½νλ©΄ λ©μλ λ΄μμ μ λ ₯ 맀κ°λ³μλ§ λ€λ£¨κ³ μμ μ΄ μν ν΄λμ€ μΈμ€ν΄μ€ λ³μλ λ€λ£¨μ§ μλ κ²½μ°λ μ μ¬ν λ΄μΌνλ€.
μ΄κ²μ μνμ λμμ΄ λΆλ¦¬λμλ€λ μλ―Έμ΄κ³ μ΄λ¬ν λ©μλλ‘λ 'μ 보 μλ'μ΄ λΆκ°λ₯νλ€.
7.6 μ°Έμ‘° λμ νΌνκΈ°
λ¬Έμ μ½λ
class Inventory {
private final List<Supply> supplies;
Inventory(List<Supply> supplies) {
this.supplies = supplies;
}
List<Supply> getSupplies() {
return supplies;
}
}
class Usage {
static void main(String[] args) {
List<Supply> externalSupplies = new ArrayList<>();
Inventory inventory = new Inventory(externalSupplies);
inventory.getSupplies().size(); // == 0
externalSupplies.add(new Supply("Apple"));
inventory.getSupplies().size(); // == 1
inventory.getSupplies().add(new Supply("Banana"));
inventory.getSupplies().size(); // == 2
}
}
μ μ½λλ μ΄λ λΆλΆμ΄ λ¬Έμ κ° λ κΉ?
λ¨Όμ inventoryλ λ΄λΆμ μ ν 리μ€νΈλ₯Ό μ ν 보νΈνμ§ μλλ€!
μ μ½λμμ μ¬κ³ μΆκ°λ ν΄λμ€ λ΄λΆκ° μλλλΌλ μ¬λ¬ κ³³μμ κ°λ₯νλ€....
1. μΈλΆμμ μμ±ν 리μ€νΈλ₯Ό μ΄μ©ν΄ μ¬κ³ μΆκ° -> externalSupplies.add(new Supply("Apple"));
2. ν΄λμ€μ λ©μλλ₯Ό μ΄μ©νμ¬ λ¦¬μ€νΈ μ°Έμ‘°ν΄ μΈλΆμμ μ¬κ³ μΆκ° -> inventory.getSupplies().add(new Supply("Banana"));
κ·Έλ λ€λ©΄ ν΄λμ€ λ΄λΆλ₯Ό μ΄κΈ°νν ν μ‘°μλμ§ μλλ‘ λ³΄νΈνλ €λ©΄ μ΄λ»κ² ν΄μΌν κΉ??
class Inventory {
private final List<Supply> supplies;
Inventory(List<Supply> supplies) {
this.supplies = new ArrayList<>(supplies);
}
List<Supply> getSupplies() {
return Collections.unmodifiableList(supplies);
}
}
class Usage {
static void main(String[] args) {
List<Supply> externalSupplies = new ArrayList<>();
Inventory inventory = new Inventory(externalSupplies);
inventory.getSupplies().size(); // == 0
externalSupplies.add(new Supply("Apple"));
inventory.getSupplies().size(); // == 0
// UnsupportedOperationException
inventory.getSupplies().add(new Supply("Banana"));
}
}
λ¨Όμ μ μ½λλ μ λ¬ν 리μ€νΈμ μ°Έμ‘°κ° μλλΌ λ¦¬μ€νΈ λ΄ Supplyκ°μ²΄λ‘ λ΄λΆ ArrayListλ₯Ό μ±μ΄λ€.
-> this.supplies = new ArrayList<>(supplies); (λ°©μ΄ λ³΅μ¬)
κ·Έλ¦¬κ³ getSupplies() νΈμΆ μ -> return Collections.unmodifiableList(supplies); λ‘ λνν ν λ°νν΄μ μ½κΈ° μ κ·Όλ§ κ°λ₯νκ² λ§λ λ€.
μ΄λ κ² νλ©΄ μΈλΆμμλ λ΄λΆμ 리μ€νΈλ₯Ό μ‘°μν μ μμΌλ μΈλΆμμ λ΄λΆλ‘ μν₯μ μ£Όμ§ λͺ»νλ€.
7.7 λ λ°ννμ§ μκΈ°
λ©μλ νΈμΆ μ λ°νν κ°μ΄ μμΌλ©΄ κ·Έλ₯ 'null'μ λ°ννλ νλ‘κ·Έλλ¨Έκ° μλ€. μ΄κ²μ νλ‘κ·Έλ¨μ μμ μ±μ ν΄μΉλ νλμ΄λ€.
λ¬Έμ μ½λ
class SpaceNations {
static List<SpaceNation> nations = Arrays.asList(
new SpaceNation("US", "United States"),
new SpaceNation("RU", "Russia")
);
static SpaceNation getByCode(String code) {
for (SpaceNation nation : nations) {
if (nation.getCode().equals(code)) {
return nation;
}
}
return null;
}
}
μ μ½λλ getByCode() λ©μλ μ¬μ© μ codeκ° κ°μ κ²μ΄ μλ€λ©΄ 'null'μ λ°ννλ€.
μ΄λ κ°μ κ΅κ° μ½λκ° μλ€λ©΄ λ무 μ½κ² 'NullPointerException'μ λ°μμν¨λ€.
λ¬Όλ‘ νΈμΆνλ μͺ½μμ nullμ κ²μ¦ν μ μμ§λ§ λκ΅°κ°λ μμ΄λ²λ¦¬κ³ μμΈλ₯Ό λ°μνκ² λ μ μλ€..
λ°λΌμ, nullλ§κ³ λ€λ₯Έ 무μΈκ°λ₯Ό λ°ννλ μͺ½μΌλ‘ κ°μ ν΄λ³΄μ.
κ°μ μ½λ
class SpaceNations {
/** Null object. */
static final SpaceNation UNKNOWN_NATION = new SpaceNation("", "");
static List<SpaceNation> nations = Arrays.asList(
new SpaceNation("US", "United States"),
new SpaceNation("RU", "Russia")
);
static SpaceNation getByCode(String code) {
for (SpaceNation nation : nations) {
if (nation.getCode().equals(code)) {
return nation;
}
}
return UNKNOWN_NATION;
}
}
μ μ½λλ "λ κ°μ²΄ ν¨ν΄"μ μ¬μ©νλ€. nullμ λ°ννλ λμ λ κ°μ²΄(null object), μ¦ κ°μ²΄μ μ€μ§μ μΈ κ°μ΄ μμμ λͺ μμ μΌλ‘ ννν κ°μ²΄λ₯Ό λ°ννλ λ°©μμ΄λ€.
μμ μμλ UNKOWN_NATION -> SpaceNation("", "")
μ΄λ κ² νλ©΄ νΈμΆμμͺ½μμ 'NullPointerException'μ΄ λ°μνμ§ μκΈ° λλ¬Έμ λ κ°μ²΄λ₯Ό 무μν μ§ μμΈλ₯Ό λμ§ μ§ μ νν μ μλ€.
7.8 7μ₯μμ λ°°μ΄ λ΄μ©
μ°λ¦¬λ μ½λ μμ±μκ° μ΄λ€ κ·Όκ±°λ‘ λμμΈ κ²°μ μ λ΄λ Έλμ§ μμλ΄λλ° λ§μ λ Έλ ₯μ κΈ°μΈμ¬μΌ νλ€.
μ½λ λμμΈμ νμ μ νμ μ°μμ΄λ©° κ·Έ λμ€μ λν μ± μμ κ°λ°μμ λͺ«μ΄λ€.
<κ°λ μ±>, <ν μ€νΈ κ°λ₯μ±>, <μ μ§ λ³΄μμ±>, <μ±λ₯> λ±μ νΈλ μ΄λ μ€νλ₯Ό κ³ λ €ν΄ κ°λ°μλ μ¬λ°λ₯Έ κ²°μ μ λ΄λ €μΌ νλ€.
'πμ½μ μ± μ 리 > μλ° μ½λ©μ κΈ°μ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μλ° μ½λ©μ κΈ°μ ] 8μ₯ : λ°μ΄ν° νλ¦ (0) | 2021.04.16 |
---|---|
[μλ° μ½λ©μ κΈ°μ ] 6μ₯ : μ¬λ°λ₯΄κ² λλ¬λ΄κΈ° (0) | 2021.04.15 |
[μλ° μ½λ©μ κΈ°μ ] 5μ₯ : λ¬Έμ λ°μμ λλΉνκΈ° (0) | 2021.04.14 |
[μλ° μ½λ©μ κΈ°μ ] 4μ₯ : μ¬λ°λ₯΄κ² λͺ λͺ νκΈ° (0) | 2021.04.13 |
[μλ° μ½λ©μ κΈ°μ ] 3μ₯ : μ¬κΈ°λ‘κ² μ£Όμ μ¬μ©νκΈ° (0) | 2021.04.09 |