forked from depromeet/effective-java-study
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'depromeet:main' into main
- Loading branch information
Showing
3 changed files
with
366 additions
and
0 deletions.
There are no files selected for viewing
91 changes: 91 additions & 0 deletions
91
Ch04/item25/ํฑ๋ ๋ฒจ_ํด๋์ค๋_ํ_ํ์ผ์_ํ๋๋ง_๋ด์ผ๋ผ.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# Item. 25 ํฑ๋ ๋ฒจ ํด๋์ค๋ ํ ํ์ผ์ ํ๋๋ง ๋ด์ผ๋ผ | ||
|
||
> ์์ค ํ์ผ ํ๋์๋ ๋ฐ๋์ ํฑ๋ ๋ฒจ ํด๋์ค(ํน์ ํฑ๋ ๋ฒจ ์ธํฐํ์ด์ค)๋ฅผ ํ๋๋ง ๋ด์ | ||
> ์ด ๊ท์น๋ง ๋ฐ๋ฅธ๋ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ํ ํด๋์ค์ ๋ํ ์ ์๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด ๋ด๋ ์ผ์ ์ฌ๋ผ์ง๋ค. | ||
> ์์ค ํ์ผ์ ์ด๋ค ์์๋ก ์ปดํ์ผํ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด๋ ํ๋ก๊ทธ๋จ์ ๋์์ด ์ฌ๋ผ์ง์ง ์๋๋ค. | ||
--- | ||
|
||
### ํฑ๋ ๋ฒจ ํด๋์ค๋? | ||
|
||
- ์์ค ํ์ผ์ ๊ฐ์ฅ ๋ฐ๊นฅ์ ์ ์ธ๋ ํด๋์ค๋ฅผ ๋งํ๋ค. | ||
- ์ค์ฒฉ ํด๋์ค๊ฐ ์๋ ํด๋์ค๋ฅผ ๋งํ๋ค. | ||
|
||
<br/> | ||
|
||
### ์์ (๋ฐ๋ผ ํ์ง ๋ง ๊ฒ!) | ||
|
||
```java | ||
# Song.java | ||
class Genre { | ||
static final String NAME = "POP"; | ||
} | ||
|
||
class Song { | ||
static final String NAME = "SONG"; | ||
} | ||
``` | ||
|
||
```java | ||
# Genre.java | ||
Genre.java | ||
class Genre { | ||
static final String NAME = "K-POP"; | ||
} | ||
|
||
class Song { | ||
static final String NAME = "SONG"; | ||
} | ||
``` | ||
|
||
```java | ||
# main.java | ||
# ์ปดํ์ผ ์๋ฌ ๋ฐ์ | ||
public class Test { | ||
public static void main(String[] args) { | ||
System.out.println(Genre.NAME + Song.NAME); | ||
} | ||
} | ||
``` | ||
|
||
<br/> | ||
|
||
### ํด๊ฒฐ ๋ฐฉ๋ฒ | ||
|
||
- ์ฌ๋ฌ ํฑ๋ ๋ฒจ ํด๋์ค๋ฅผ ํ ํ์ผ์ ๋ด๊ณ ์ถ๋ค๋ฉด ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. | ||
|
||
```java | ||
public class AB { | ||
private static class A { | ||
|
||
} | ||
|
||
private static class B { | ||
|
||
} | ||
} | ||
``` | ||
|
||
<br/> | ||
|
||
--- | ||
|
||
### Appendix | ||
|
||
**์ปดํ์ผ๋ฌ์ ๋์:** | ||
|
||
- ์์ค ์ฝ๋๋ฅผ ์ ์ฒด์ ์ผ๋ก ๋ถ์ํ์ฌ ์ค๊ฐ ์ฝ๋(Intermediate code) ๋๋ ๋ชฉ์ ์ฝ๋(Object code)๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ด๋ค. | ||
- ์ ์ฒด ์์ค ์ฝ๋๋ฅผ ํ ๋ฒ์ ๋ฒ์ญํ๋ฏ๋ก ์คํ ์๋๊ฐ ๋น ๋ฅด๋ค. | ||
- ๋ฒ์ญ๋ ๊ฒฐ๊ณผ๋ฌผ์ CPU๊ฐ ์ง์ ์คํํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ๋ณํ๋๋ค. | ||
|
||
**์ธํฐํ๋ฆฌํฐ์ ๋์:** | ||
|
||
- ์์ค ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ฝ์ด๋ค์ด๊ณ , ํด๋น ์ฝ๋๋ฅผ ์ฆ์ ์คํํ๋ ๊ณผ์ ์ด๋ค. | ||
- ์์ค ์ฝ๋๋ฅผ ํ ์ค์ฉ ํด์ํ๊ณ ์คํํ๊ธฐ ๋๋ฌธ์ ๋ฒ์ญ๊ณผ ์คํ์ด ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์ด๋ฃจ์ด์ง๋ค. | ||
- ์คํ ์๋๊ฐ ์๋์ ์ผ๋ก ๋๋ฆฌ์ง๋ง, ๊ฐ๋ฐ ๊ณผ์ ์์ ์์ ๋ฐ ๋๋ฒ๊น ์ด ์ฉ์ดํ๋ค. | ||
|
||
**์๋ฐ์ ๋น๋ ๊ณผ์ :** | ||
|
||
- ์๋ฐ์ ๋น๋ ๊ณผ์ ์ ์ปดํ์ผ๊ณผ ์คํ์ ๊ณผ์ ์ด ์์ฌ ์์ | ||
- ์ปดํ์ผ ๋จ๊ณ์์ ์์ค ์ฝ๋๋ฅผ ์ค๊ฐ ํํ์ธ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํํ๊ณ , ์คํ ๋จ๊ณ์์ JVM์ ํตํด ํด๋น ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ธํฐํ๋ฆฌํฐ๋ก - ํด์ํ์ฌ ์คํํ๋ ๋ฐฉ์ | ||
- ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๋ฐ ์ธ์ด๋ ์ด์์ฒด์ ์ ์ข ๋ฅ์ ์๊ด์์ด ๋์ผํ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํ์ฌ ํ๋ซํผ ํธํ์ฑ์ ์ ๊ณต |
173 changes: 173 additions & 0 deletions
173
Ch06/item38/ํ์ฅํ _์_์๋_์ด๊ฑฐ_ํ์
์ด_ํ์ํ๋ฉด_์ธํฐํ์ด์ค๋ฅผ_์ฌ์ฉํ๋ผ.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
# Item 38. ํ์ฅํ ์ ์๋ ์ด๊ฑฐ ํ์ ์ด ํ์ํ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ผ | ||
|
||
- ์ด๊ฑฐํ์ ์์ฒด๋ ํ์ฅํ ์ ์์ง๋ง, `์ธํฐํ์ด์ค์ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ธฐ๋ณธ ์ด๊ฑฐ ํ์ ์ ํจ๊ป ์ฌ์ฉํด ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.` | ||
- ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด ์์ ๋ง์ ์ด๊ฑฐ ํ์ (ํน์ ๋ค๋ฅธ ํ์ )์ ๋ง๋ค ์ ์๋ค. | ||
- API๊ฐ (๊ธฐ๋ณธ ์ด๊ฑฐ ํ์ ์ ์ง์ ๋ช ์ํ์ง ์๊ณ ) ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์๋ค๋ฉด ๊ธฐ๋ณธ ์ด๊ฑฐ ํ์ ์ ์ธ์คํด์ค๊ฐ ์ฐ์ด๋ ๋ชจ๋ ๊ณณ์ ์๋ก ํ์ฅํ ์ด๊ฑฐ ํ์ ์ ์ธ์คํด์ค๋ก ๋์ฒดํด ์ฌ์ฉํ ์ ์๋ค. | ||
|
||
--- | ||
|
||
### ํ์ ์์ ์ด๊ฑฐ ํ์ | ||
|
||
```java | ||
public final class Direction { | ||
|
||
public static final Direction NORTH = new Direction("N"); | ||
public static final Direction SOUTH = new Direction("S"); | ||
public static final Direction EAST = new Direction("E"); | ||
public static final Direction WEST = new Direction("W"); | ||
|
||
private Direction() { | ||
... | ||
} | ||
} | ||
``` | ||
|
||
- jdk1.5 ์ด์ ์ enum์ด ์์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์ | ||
|
||
<br/> | ||
|
||
### ์ด๊ฑฐ ํ์ | ||
|
||
```java | ||
enum Direction { | ||
NORTH, SOUTH, EAST, WEST; | ||
} | ||
``` | ||
|
||
- `์ด๊ฑฐ ํ์ ์ ๊ฑฐ์ ๋ชจ๋ ์ํฉ์์ ํ์ ์์ ์ด๊ฑฐ ํจํด(typesafe enum pattern) ๋ณด๋ค ์ฐ์`ํ๋ค. | ||
- ๋จ, ์์ธ๊ฐ ํ๋ ์์ผ๋, ํ์ ์์ ์ด๊ฑฐ ํจํด์ ํ์ฅํ ์ ์์ผ๋ `์ด๊ฑฐ ํ์ ์ ํ์ฅํ ์ ์๋ค`. | ||
|
||
- `์ฐ์ฐ ์ฝ๋(operation code)`์์ ์ด๋ฐ๊ธ API๊ฐ ์ ๊ณตํ๋ `๊ธฐ๋ณธ ์ฐ์ฐ ์ธ ์ฌ์ฉ์ ํ์ฅ ์ฐ์ฐ์ ์ถ๊ฐํ ์ ์๋๋ก ์ด์ด์ค์ผ ํ ๋`์ธ์๋ ๋๋ถ๋ถ์ ์ํฉ์์ ์ด๊ฑฐ ํ์ ์ ํ์ฅํ๋ ๊ฒ์ ์ข์ง ์์ ์๊ฐ์ด๋ค. | ||
- ์ด๊ฑฐ ํ์ ์ ํ์ฅํ๋ฉด, ํ์ฅํ ํ์ ์ ์์๋ ๊ธฐ๋ฐ ํ์ ์ ์์๋ก ์ทจ๊ธํ์ง๋ง ๊ทธ ๋ฐ๋๋ ์ฑ๋ฆฝํ์ง ์์ ์ ์๋ค. | ||
- ์ด๊ฑฐ ํ์ ์ ํ์ฅํ๋ฉด ๊ธฐ๋ฐ ํ์ ๊ณผ ํ์ฅ ํ์ ๋ค์ ์์ ๋ชจ๋๋ฅผ ์ํํ ๋ฐฉ๋ฒ๋ ๋ง๋ ํ์ง ์๋ค. | ||
- ๋๋ถ๋ถ์ ์ํฉ์์ enum์ ํ์ฅํ๋ ๊ฒ์ ์ข์ง ์๋ค. | ||
- ์ด๊ฑฐ ํ์ ์ ํ์ฅํ๋ ค๋ฉด `์ด๊ฑฐ ํ์ ์ด ์์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค๋ ์ฌ์ค์ ์ด์ฉ`ํ๋ฉด ๋๋ค. | ||
- `์ฐ์ฐ ์ฝ๋์ฉ ์ธํฐํ์ด์ค๋ฅผ ์ ์`ํ๊ณ `์ด๊ฑฐ ํ์ ์ด ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ`ํ๊ฒ ํ๋ฉด ๋๋ค. ์ด ๋ `์ด๊ฑฐ ํ์ ์ด ๊ทธ ์ธํฐํ์ด์ค์ ํ์ค ๊ตฌํ์ฒด ์ญํ `์ ํ๋ค. | ||
|
||
๋ค์์ Operation ํ์ ์ ํ์ฅํ ์ ์๊ฒ ๋ง๋ ์ฝ๋์ด๋ค. | ||
|
||
**์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด ํ์ฅ ๊ฐ๋ฅ ์ด๊ฑฐ ํ์ ์ ํ๋ด ๋ธ ์ฝ๋** | ||
|
||
```java | ||
public interface Operation { | ||
double apply(double x, double y); | ||
} | ||
``` | ||
|
||
```java | ||
public enum BasicOperation implements Operation { | ||
PLUS("+") { | ||
public double apply(double x, double y) { return x + y; } | ||
}, | ||
MINUS("-") { | ||
public double apply(double x, double y) { return x - y; } | ||
}, | ||
TIMES("*") { | ||
public double apply(double x, double y) { return x * y; } | ||
}, | ||
DIVIDE("/") { | ||
public double apply(double x, double y) { return x / y; } | ||
}; | ||
|
||
private final String symbol; | ||
|
||
BasicOperation(String symbol) { | ||
this.symbol = symbol; | ||
} | ||
|
||
@Override public String toString() { | ||
return symbol; | ||
} | ||
} | ||
``` | ||
|
||
- ์ด๊ฑฐ ํ์ ์ธ BasicOperation์ ํ์ฅํ ์ ์์ง๋ง ์ธํฐํ์ด์ค์ธ Operation์ ํ์ฅํ ์ ์๊ณ , ์ด ์ธํฐํ์ด์ค๋ฅผ ์ฐ์ฐ์ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค. | ||
|
||
- ์๋ฅผ ๋ค์ด ์์ ์ฐ์ฐ ํ์ ์ ํ์ฅํด ์ง์ ์ฐ์ฐ(EXP)์ ๋๋จธ์ง ์ฐ์ฐ(REMAINDER)์ ์ถ๊ฐํด๋ณด์. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ Operation ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ด๊ฑฐ ํ์ ์ ์์ฑํ๋ ๊ฒ ๋ฟ์ด๋ค. | ||
|
||
**ํ์ฅ ๊ฐ๋ฅ ์ด๊ฑฐ ํ์ ** | ||
|
||
```java | ||
public enum ExtendedOperation implements Operation { | ||
EXP("^") { | ||
public double apply(double x, double y) { | ||
return Math.pow(x, y); | ||
} | ||
}, | ||
REMAINDER("%") { | ||
public double apply(double x, double y) { | ||
return x % y; | ||
} | ||
}; | ||
private final String symbol; | ||
ExtendedOperation(String symbol) { | ||
this.symbol = symbol; | ||
} | ||
@Override public String toString() { | ||
return symbol; | ||
} | ||
} | ||
``` | ||
|
||
- ์๋ก ์์ฑํ ์ฐ์ฐ์ ๊ธฐ์กด ์ฐ์ฐ์ ์ฐ๋ ๊ณณ์ด๋ฉด ์ด๋๋ ์ธ ์ ์๋ค. | ||
- Operation ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์์ฑ๋์ด ์๊ธฐ๋ง ํ๋ฉด ๋๋ค. | ||
|
||
๊ฐ๋ณ ์ธ์คํด์ค ์์ค์์ ๋ฟ ์๋๋ผ ํ์ ์์ค์์๋, ๊ธฐ๋ณธ ์ด๊ฑฐ ํ์ ๋์ ํ์ฅ๋ ์ด๊ฑฐ ํ์ ์ ๋๊ฒจ ํ์ฅ๋ ์ด๊ฑฐ ํ์ ์ ์์ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ฒ ํ ์๋ ์๋ค. | ||
|
||
### ์ฒซ๋ฒ์งธ ๋์) ExtendedOperation์ ๋ชจ๋ ์์ ํ ์คํธํ๊ธฐ | ||
|
||
```java | ||
public static void main(String[] args) { | ||
double x = Double.parseDouble(args[0]); | ||
double y = Double.parseDouble(args[1]); | ||
test(ExtendedOperation.class, x, y); | ||
} | ||
private static <T extends Enum<T> & Operation> void test( | ||
Class<T> opEnumType, double x, double y) { | ||
for (Operation op : opEnumType.getEnumConstants()) | ||
System.out.printf("%f %s %f = %f%n", | ||
x, op, y, op.apply(x, y)); | ||
} | ||
``` | ||
|
||
- main ๋ฉ์๋๋ test ๋ฉ์๋์ ExtendedOperation์ class ๋ฆฌํฐ๋ด์ ๋๊ฒจ ํ์ฅ๋ ์ฐ์ฐ๋ค์ด ๋ฌด์์ธ์ง ์๋ ค์ค๋ค. ์ฌ๊ธฐ์ class ๋ฆฌํฐ๋ด์ ํ์ ์ ํ์ ํ ํฐ ์ญํ ์ ํ๋ค. | ||
|
||
- opEnumType ๋งค๊ฐ๋ณ์์ ์ ์ธ(`<T extends Enum<T> & Operation> Class <T>`)์ ์์งํ ๋ณต์กํ๋ฐ, `Class ๊ฐ์ฒด๊ฐ ์ด๊ฑฐ ํ์ ์ธ ๋์์ Oepration์ ํ์ ํ์ ์ด์ด์ผ ํ๋ค`๋ ๋ป์ด๋ค. | ||
|
||
- ์ด๊ฑฐ ํ์ ์ด์ด์ผ ์์๋ฅผ ์ํํ ์ ์๊ณ , Operation์ด์ด์ผ ์์๊ฐ ๋ปํ๋ ์ฐ์ฐ์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. | ||
|
||
### ๋๋ฒ์จฐ ๋์) Class ๊ฐ์ฒด ๋์ ํ์ ์ ์์ผ๋์นด๋ ํ์ ์ธ Collection<? extends Operation>์ ๋๊ธฐ๋ ๋ฐฉ๋ฒ | ||
|
||
```java | ||
public static void main(String[] args) { | ||
double x = Double.parseDouble(args[0]); | ||
double y = Double.parseDouble(args[1]); | ||
test(Arrays.asList(ExtendedOperation.values()), x, y); | ||
} | ||
private static void test(Collection<? extends Operation> opSet, | ||
double x, double y) { | ||
for (Operation op : opSet) | ||
System.out.printf("%f %s %f = %f%n", | ||
x, op, y, op.apply(x, y)); | ||
} | ||
``` | ||
|
||
- ๋๋ฒ์งธ ์ฝ๋๋ ๊ทธ๋๋ง ๋ ๋ณต์กํ๊ณ ์ฌ๋ฌ ๊ตฌํ ํ์ ์ ์ฐ์ฐ์ ์กฐํฉํด ํธ์ถํ ์ ์๊ฒ ๋์๋ค. | ||
- ๋ฐ๋ฉด, ํน์ ์ฐ์ฐ์์๋ EnumSet๊ณผ EnumMap์ ์ฌ์ฉํ์ง ๋ชปํ๋ค. | ||
|
||
๋ ๋์ ํ๋ก๊ทธ๋จ ๋ชจ๋ ๋ช ๋ น์ค ์ธ์๋ก 4์ 2๋ฅผ ๋ฃ์ด ์คํํ๋ฉด ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. | ||
|
||
``` | ||
4.000000 ^ 2.000000 = 16.000000 | ||
4.000000 % 2.000000 = 0.000000 | ||
``` | ||
|
||
--- | ||
|
||
### ์ด๊ฑฐ ํ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด ํ์ฅ ํ๋ ๊ฒฝ์ฐ ์ฌ์ํ ๋ฌธ์ ์ | ||
|
||
- ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด ํ์ฅ ๊ฐ๋ฅํ ์ด๊ฑฐ ํ์ ์ ํ๋ด ๋ด๋ ๋ฐฉ์์๋ `์ด๊ฑฐ ํ์ ๋ผ๋ฆฌ ๊ตฌํ์ ์์ํ ์ ์๋ค`๋ ์ฌ์ํ ๋ฌธ์ ์ ์ด ์๋ค. | ||
|
||
- ์๋ฌด ์ํ์๋ ์์กดํ์ง ์๋ ๊ฒฝ์ฐ์๋ ๋ํดํธ ๊ตฌํ์ ์ด์ฉํด ์ธํฐํ์ด์ค์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฐ๋ฉด Operation ์๋ ์ฐ์ฐ ๊ธฐํธ๋ฅผ ์ ์ฅํ๊ณ ์ฐพ๋ ๋ก์ง์ด BasicOperation๊ณผ ExtendedOepration ๋ชจ๋์ ๋ค์ด๊ฐ์ผ๋ง ํ๋ค. | ||
|
||
- ์ด ๊ฒฝ์ฐ์๋ ์ค๋ณต๋์ด ์ ์ผ๋ ๋ฌธ์ ๋์ง ์์ง๋ง, ๊ณต์ ํ๋ ๊ธฐ๋ฅ์ด ๋ง๋ค๋ฉด ๊ทธ ๋ถ๋ถ์ ๋ณ๋์ ๋์ฐ๋ฏธ ํด๋์ค๋ ์ ์ ๋์ฐ๋ฏธ ๋ฉ์๋๋ก ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋ ์ค๋ณต์ ์์จ ์ ์์ ๊ฒ์ด๋ค. |
102 changes: 102 additions & 0 deletions
102
Ch08/item50/์ ์์_๋ฐฉ์ด์ _๋ณต์ฌ๋ณธ์_๋ง๋ค๋ผ.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
# Item 50. ์ ์์ ๋ฐฉ์ด์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๋ผ | ||
|
||
### ๋ฐฉ์ด์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ๊ธฐ | ||
|
||
- ์๋ฌด๋ฆฌ ์๋ฐ๋ผ๊ณ ํด๋ ๋ค๋ฅธ ํด๋์ค๋ก๋ถํฐ์ ์นจ๋ฒ์ ์๋ฌด๋ฐ ๋ ธ๋ ฅ์์ด ๋ง์ ์ ์๋ ๊ฒ์ ์๋ | ||
- ์ ์์ ์ธ ์๋๋ฅผ ๊ฐ์ง ์ฌ๋๋ค์ด ์์คํ ์ ๋ณด์์ ๋ซ์ผ๋ ค๋ ์๋๊ฐ ๋๊ณ ์์ | ||
- ํ๋ฒํ ํ๋ก๊ทธ๋๋จธ๋ ์์ ํ ์ค์๋ก ํด๋์ค๋ฅผ ์ค์๋ํ๊ฒ ๋ง๋ค ์ ์์ | ||
|
||
**ํด๋ผ์ด์ธํธ๊ฐ \*๋ถ๋ณ์์ ๊นจ๋จ๋ฆฌ๋ ค ํ์์ด ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ฐฉ์ด์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ํด์ผ ํจ** | ||
|
||
\*`๋ถ๋ณ์`์ด๋ ํ๋ก๊ทธ๋๋ฐ์์ ํน์ ์กฐ๊ฑด์ด ํญ์ ์ฐธ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฅํ๋ ์ฑ์ง์ด๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ์์ ์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ๋์ผ ์ ์๋ค. | ||
|
||
- ์์ 1: ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ํ ๋ฒ ์ ํด์ง๋ฉด ๋ณ๊ฒฝ๋์ง ์๋๋ก ํ์ฌ, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ ์ธ๋ฑ์ค๋ก์ ์ ๊ทผ์ ๋ฐฉ์งํ๋ ๊ฒ์ด๋ค. | ||
- ์์ 2: final ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฅผ ์ ์ธํจ์ผ๋ก์จ, ๊ทธ ๊ฐ์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฒ์ด๋ค. | ||
|
||
๋ฐฉ์ด์ ํ๋ก๊ทธ๋๋ฐ์ ๊ด์ ์์ ๋ถ๋ณ์์ ์งํค๋ ๊ฒ์ ์ค์ํ๋ค. | ||
|
||
ํด๋ผ์ด์ธํธ๊ฐ ๋ถ๋ณ์์ ๊นจ๋จ๋ฆฌ๋ ค ํ ๊ฒฝ์ฐ, ์ด๋ฅผ ๊ฐ์งํ๊ณ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด ์ข๋ค. | ||
|
||
<br/> | ||
|
||
### ์์ 1 | ||
|
||
```java | ||
public final class Period { | ||
private final Date start; | ||
private final Date end; | ||
|
||
public Period(Date strart, Date end) { | ||
if (start.compareTo(end) > 0) | ||
throw new IllegalArgumentException( | ||
start + "๊ฐ " + end + "๋ณด๋ค ๋ฆ๋ค."); | ||
this.start = start; | ||
this.end = end; | ||
} | ||
|
||
public Date start() { | ||
return start; | ||
} | ||
|
||
public Date end() { | ||
return end; | ||
} | ||
|
||
} | ||
``` | ||
|
||
```java | ||
Date start = new Date(); | ||
Date end = new Date(); | ||
Period p = new Period(start, end); | ||
end.setYear(78); | ||
``` | ||
|
||
์ด๋ ๊ฒ ๋ฐ๋ก end์ ๋ด๋ถ๋ฅผ ๋ถ๋ณ์์ ๊นจํธ๋ฆด ์ ์๋ค๊ณ ํ๋ค. | ||
|
||
_ํด๋น Date ์ ๋ํด์ ์ง๊ธ์ ์๋ฐ๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?_ | ||
|
||
- Date ๋์ ๋ถ๋ณ์ธ Instant๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. | ||
- Java8 ์ด์๋ถํฐ๋ LocalDateTime์ด๋ ZonedDateTime์ ์ฌ์ฉํด๋ ๋๋ค. | ||
- Date๋ ๋ก์ API์ด๋ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ๋์ด์ ์ฌ์ฉํ๋ฉด ์๋๋ค. | ||
- ์ด๋ฌํ Date ๋ง๊ณ ๋ ๋ค๋ฅธ ์ํฉ์์๋ ๋ถ๋ณ์์ ๊นจ์ง ์ ์๋ค๊ณ ๋ณธ๋ค. | ||
|
||
<br/> | ||
|
||
### ์์ 2 | ||
|
||
```java | ||
Date start = new Date(); | ||
Date end = new Date(); | ||
Period p = new Period(start, end); | ||
p.end().setYear(78) | ||
``` | ||
|
||
Period์ ๋ํ ์ธ์คํด์ค ๊ณต๊ฒฉ์ ์ด๋ฐ์์ผ๋ก๋ ๊นจํธ๋ฆด ์ ์๋ค. ํ์ง๋ง ๋ง๋ ๊ฒ์ ๊ฐ๋จํ๋ค. | ||
|
||
```java | ||
public Date start() { | ||
return new Date(start.getTime()); | ||
} | ||
public Date end() { | ||
return new Date(end.getTime()); | ||
} | ||
``` | ||
|
||
๋ฐ๋ก ์์ ๊ฐ์ด ๊ฐ๋ณ ํ๋์ ๋ฐฉ์ด์ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ฉด ๋๋ค. | ||
|
||
- ์๋ฌด๋ฆฌ ์ ์์ ์ธ ํน์ ๋ถ์ฃผ์ํ ํ๋ก๊ทธ๋๋จธ๋ผ๋ ์์ ์๊ฐ์ด ์ข ๋ฃ ์๊ฐ๋ณด๋ค ๋์ค์ผ ์ ์๋ค๋ ๋ถ๋ณ์์ ์๋ฐฐํ ๋ฐฉ๋ฒ์ด ์๋ค. | ||
- Period ์์ ๋ง๊ณ ๋ ๊ฐ๋ณ ํ๋์ ์ ๊ทผํ ๋ฐฉ๋ฒ์ด ์๋ค. | ||
- ๋ชจ๋ ํ๋๊ฐ ๊ฐ์ฒด ์์ ์๋ฒฝํ๊ฒ ์บก์ํ๋๋ค. | ||
- ํด๋น ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๋๋ ์์ฑ์์ ๋ฌ๋ฆฌ ์ ๊ทผ ๋ฉ์๋์ ๋ํด ๋ณต์ฌ๋ณธ์ ๋ง๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ clone์ ์ฌ์ฉํด๋ ๋๋ค. | ||
- Period๊ฐ ๊ฐ์ง๊ณ ์๋ Date ๊ฐ์ฒด๊ฐ java.util.Date ์์ด ํ์คํ๊ธฐ ๋๋ฌธ | ||
|
||
๋จ, ์ธ์คํด์ค๋ฅผ ๋ณต์ฌํ๋ ๋ฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ฑ์๋ ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ฐ๋ ๊ฒ์ด ์ข๋ค. | ||
|
||
<br/> | ||
|
||
### ์ ๋ฆฌ | ||
|
||
- ํด๋์ค๊ฐ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ๋ ํน์ ํด๋ผ์ด์ธํธ๋ก ๋ฐํํ๋ ๊ตฌ์ฑ์์๊ฐ ๊ฐ๋ณ์ด๋ผ๋ฉด ๊ทธ ์์๋ ๋ฐ๋์ ๋ฐฉ์ด์ ์ผ๋ก ๋ณต์ฌํด์ผ ํจ | ||
|
||
- ๋ณต์ฌ ๋น์ฉ์ด ๋๋ฌด ํฌ๊ฑฐ๋, ํด๋ผ์ด์ธํธ๊ฐ ๊ทธ ์์๋ฅผ ์๋ชป ์์ ํ ์ผ์ด ์์์ ์ ๋ขฐํ๋ค๋ฉด ๋ฐฉ์ด์ ๋ณต์ฌ๋ฅผ ์ํํ๋ ๋์ ๊ตฌ์ฑ์์๋ฅผ ์์ ํ์ ๋์ ์ฑ ์์ด ํด๋ผ์ด์ธํธ์ ์์์ ๋ฌธ์์ ๋ช ์ํด์ผ ํจ |