π Chapter 1: Birth
- κ°μ²΄λ μμ μ κ°μμ± λ²μ(scope of visibility) μμμ μ΄μκ°λ€.
if (price < 100) {
Cash extra = new Cash(5);
price.add(extra);
}
- μμ μμ
if
λΈλ‘ μμμλ§extra
λΌλ κ°μ²΄λ₯Ό λ³Ό μ μκΈ° λλ¬Έμ,if
λΈλ‘ λ΄λΆκ°extra
κ°μ²΄μ κ°μμ± λ²μκ° λλ€. μμ μμ μ«μ 5λ κ°μ²΄ λ΄λΆμ λ¨μμκ³ ,price
λ κ°μ²΄μ μΈλΆμ μ‘΄μ¬νλ€. - κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ κ°μ²΄μ κ°μ²΄μ μν μ μ΄ν΄ν¨μΌλ‘μ¨ μ½λμ μ μ§λ³΄μμ±μ ν₯μμν¬ μ μλ€. μ½λμ κΈΈμ΄λ λ 짧μμ§κ³ , μννκΈ° μ¬μμ§λ©°, λͺ¨λμ±μ΄ ν₯μλκ³ , μμ§λκ° λμμ§λ€.
π¦ -erλ‘ λλλ μ΄λ¦μ μ¬μ©νμ§ λ§μΈμβ
- ν΄λμ€λ κ°μ²΄μ ν©ν 리μ΄λ€.
- ν΄λμ€λ κ°μ²΄λ₯Ό μμ±νκ³ ν΄λμ€κ° κ°μ²΄λ₯Ό μΈμ€ν΄μ€ννλ€λΌκ³ νννλ€.
class Cash {
public Cash(int dollars) {
// ...
}
}
Cash five = new Cash(5);
new
λ κ°μ²΄μ ν©ν 리λ₯Ό μ μ΄ν μ μλ μμμ μΈ μλ¨μ΄λ€.new
λCash
ν΄λμ€μ μ μ λ©μλμ΄λ©°,new
κ° νΈμΆλλ©΄Cash
ν΄λμ€κ° μ μ΄λ₯Ό νλν νfive
κ°μ²΄λ₯Ό μμ±νλ€.new
μ°μ°μκ° μ€νλκΈ° μ μ λΆκ°μ μΈ λ‘μ§μ λν μ μκΈ° λλ¬Έμ,new
μ°μ°μλ₯Ό λ³΄λ€ μ μ°νκ² μ¬μ©ν μ μλ€.
class Shapes {
public Shape make(String name) {
if (name.equals("circle")) {
return new Circle();
}
if (name.equals("rectangle")) {
return new Rectangle();
}
throw new IllegalArgumentException("not found");
}
}
- ν΄λμ€λ₯Ό νμν λ κ°μ²΄λ₯Ό κΊΌλΌ μ μκ³ , λ μ΄μ νμνμ§ μμ κ°μ²΄λ₯Ό λ°νν μ μλ κ°μ²΄μ μ¨μ΄νμ°μ€λ‘ 보λ κ²μ΄ μ’λ€.
- ν΄λμ€λ κ°μ²΄μ ν νλ¦Ώμ΄ μλλ€ ν©ν 리μ΄λ€. (ν΄λμ€λ κ°μ²΄μ λ₯λμ μΈ κ΄λ¦¬μλΌκ³ μκ°ν΄μΌ νλ€.)
- μλμ μμ λ κ°μ²΄λ₯Ό μ΄λ¦μ μ§λλ° μλͺ»λ λ°©λ²μΌλ‘ ν΄λμ€μ κ°μ²΄λ€μ΄ 무μμ νκ³ μλμ§λ₯Ό μ΄ν΄λ³Έ ν κΈ°λ₯μ κΈ°λ°ν΄μ μ΄λ¦μ μ§λ λ°©λ²μ΄λ€.
class CashFormatter {
private int dollars;
CashFormatter(int dlr) {
this.dollars = dlr;
}
public String format() {
return String.format("$ %d", this.dollars);
}
}
- μμ κ°μ΄ ν΄λμ€μ μ΄λ¦μ κ°μ²΄κ° λ ΈμΆνκ³ μλ κΈ°λ₯μ κΈ°λ°ν΄μλ μλλ€.
- ν΄λμ€μ μ΄λ¦μ 무μμ νλμ§κ° μλλΌ λ¬΄μμΈμ§μ κΈ°λ°ν΄μΌ νλ€.
class Cash {
private int dollars;
Cash(int dlr) {
this.dollars = dlr;
}
public String usd() {
return String.format("$ %d", this.dollars);
}
}
- λ€μ λ§ν΄μ, κ°μ²΄λ κ·Έμ μλ(capability)μΌλ‘ νΉμ μ§μ΄μ ΈμΌ νλ€.
- μ¬κΈ°μ λ§νλ κ²μ²λΌ λ°λ‘ μ λ―Έμ¬ -erμ μ¬μ©νλ©΄ μλλ€. (Manager, Controller, Helper, Handler, Writer, Validator, Router etc..)
- μμΈμΈ κ·μΉλ μ‘΄μ¬νλλ° μ€λ μκ°μ΄ νλ₯΄λ©΄μ μλ―Έκ° μ μ°©λ κ²½μ°μ΄λ€. λνμ μΈ μκ° computer, userμ΄λ€.
- κ°μ²΄λ κ°μ²΄μ μΈλΆ μΈκ³μ λ΄λΆ μΈκ³λ₯Ό μ΄μ΄μ£Όλ μ°κ²°μ₯μΉκ° μλλΌ κ°μ²΄λ μΊ‘μνλ λ°μ΄ν°μ λνμμ΄λ€. μ¦, λνμλ μ€μ€λ‘ κ²°μ μ λ΄λ¦¬κ³ νλν μ μλ μ립μ μΈ μν°ν°μ΄λ€.
- λλ¬Έμ ν΄λμ€μ μ΄λ¦μ΄ -erλ‘ λλλ€λ©΄, μ΄ ν΄ λμ€μ μΈμ€ν΄μ€λ μ€μ λ‘λ κ°μ²΄κ° μλλΌ μ΄λ€ λ°μ΄ν°λ₯Ό λ€λ£¨λ μ μ°¨λ€μ μ§ν©μΌ λΏμ΄λ€.
- μ¬λ°λ₯Έ ν΄λμ€λ₯Ό μ΄λ¦μ ν΄λμ€μ κ°μ²΄λ€μ΄ 무μμ μΊ‘μνν κ²μΈμ§λ₯Ό κ΄μ°°νκ³ μ΄ μμλ€μ λΆμΌ μ ν©ν μ΄λ¦μ μ°ΎμμΌ νλ€.
class PrimeNumbers
def initialize(origin)
@origin = origin
end
def each
@origin
.select{ |i| prime? i }
.each{ |i| yield i }
end
def prime?(x)
# ...
end
end
PrimeNumbers
ν΄λμ€λ μ«μλ€μ 리μ€νΈμ²λΌ νλνμ§λ§ μ€μ§ μμλ§ λ°ννλ€.- μ΄μ²λΌ μ«μ 리μ€νΈλ₯Ό μΊ‘μννκ³ μλ λμμλ, μΈλΆμμ μ§μ κ°μ²΄ λ΄λΆμ ν¬ν¨λ μ«μ 리μ€νΈλ₯Ό μ²λ¦¬νκ±°λ μ‘°ννλλ‘ νμ©ν΄μλ μλλ€.
PrimeNumbers
λ μ«μμ 리μ€νΈμ΄λ€.(is a) 리μ€νΈ κ·Έ μ체μ΄λ€.
π¦ μμ±μ νλλ₯Ό μ£Ό μμ±μλ‘ λ§λμΈμβ
constructor
λ μλ‘μ΄ κ°μ²΄μ λν μ§μ μ μΌλ‘ λͺ κ°μ μΈμλ€μ μ λ¬λ°μ, μ΄λ€ μΌμ μνν ν, μ무λ₯Ό μνν μ μλλ‘ κ°μ²΄λ₯Ό μ€λΉμν¨λ€.
class Cash {
private int dollar;
Cash(int dlr) {
this.dollars = dlr;
}
}
- μμ λ νλμ
constructor
κ° μ‘΄μ¬νκ³ μννλ νλμ μμ μ μΈμλ‘ μ λ¬λ λ¬λ¬λ₯Όdollars
λΌλ μ΄λ¦μprivate
μ μ νλ‘νΌν°μ μΊ‘μννλ κ²μ΄λ€. - μ΄λ 2 ~ 3κ°μ λ©μλμ 5 ~ 10κ°μ
constructor
λ₯Ό ν¬ν¨νλ κ²μ΄ μ λΉνλ€. constructor
μ κ°μ κ° λ§μμ§ μλ‘ λ κ°μ λκ³ , μ¬μ©μ μ μ₯μμ ν΄λμ€λ₯Ό λ νΈνκ² μ¬μ©ν μ μλ€. νμ§λ§ λ©μλκ° λ§μμ§μλ‘ ν΄λμ€λ₯Ό μ¬μ©νκΈ°λ λ μ΄λ €μμ§λ€. λ©μλκ° λ§μμ§λ©΄ ν΄λμ€μ μ΄μ μ΄ νλ €μ§κ³ , λ¨μΌ μ± μ μμΉμ μλ°νλ€.constructor
μ μ£Όλ μμ μ μ 곡λ μΈμλ₯Ό μ¬μ©ν΄μ μΊ‘μννκ³ μλ νλ‘νΌν°λ₯Ό μ΄κΈ°ννλ μΌμ΄λ€. μ΄λ° μ΄κΈ°ν λ‘μ§μ λ¨ νλμconstructor
μλ§ μμΉμν€κ³ μ£Όconstructor
λΌκ³ λΆλ₯΄κΈ°λ₯Ό κΆμ₯νκ³ μλμ μμ μ²λΌ λΆconstructor
λΌκ³ λΆλ₯΄λ λ€λ₯Έconstructor
λ€μ΄ μ΄ μ£Όconstructor
λ₯Ό νΈμΆνλλ‘ λ§λ€μ΄μΌ νλ€.
class Cash {
private int dollars;
Cash(float dlr) { // λΆ
this((int) dlr);
}
Cash(String dlr) { // λΆ
this(Cash.parse(dlr));
}
Cash(int dlr) { // μ£Ό constructor
this.dollars = dlr;
}
}
- μ μ§λ³΄μμ±μ μν΄ μ£Ό
constructor
λ₯Ό λͺ¨λ λΆconstructor
λ€μ μμΉμν¨λ€. - νλμ μ£Ό
constructor
μ λ€μμ λΆconstructor
μμΉμ ν΅μ¬μ μ€λ³΅ μ½λλ₯Ό λ°©μ§νκ³ μ€κ³λ₯Ό λ κ°κ²°νκ² λ§λ€κΈ° λλ¬Έμ μ μ§λ³΄μμ±μ΄ ν₯μλλ€λ κ²μ΄λ€. - λ΄λΆμ νλ‘νΌν°λ μ€μ§ ν κ³³μμλ§ μ΄κΈ°νν΄μΌ νλ€λ ν΅μ¬ μμΉμ΄λ€.
π¦ μμ±μμ μ½λλ₯Ό λ£μ§ λ§μΈμβ
- μ£Ό
constructor
μλ κ°μ²΄ μ΄κΈ°ν νλ‘μΈμ€λ₯Ό μμνλ μ μΌν μ₯μμ΄κΈ° λλ¬Έμ μ 곡λλ μΈμλ€μ μμ ν΄μΌ νλ€. - μΈμλ₯Ό μ΄λ»κ² λ€λ£¨μ΄μΌ ν κΉ?
- μΌλ¨, μΈ μμ μμ λμ§λ§λΌλ κ²μ΄λ€.
class Cash {
private int dollars;
Cash(String dlr) {
this.dollars = Integer.parseInt(dlr);
}
}
- μμμ ν΄λμ€κ° λ΄λΆμ μΊ‘μννκ³ μλ κ²μ μ μνμ΄μ§λ§,
constructor
μ μ μΈλ μΈμμ νμ μ λ¬Έμμ΄μ΄λ€. λλ¬Έμ μ λ¬λ λ¬Έμμ΄μ μ μλ‘ λ³νν νμκ° μμ΄ μ΄ μμ μconstructor
λ΄λΆμμ μ²λ¦¬νκ³ μλ€. νμ§λ§ μ΄λ¬ν λ°©λ²μ μμ£Ό μλͺ»λ λ°©λ²μ΄λ€. - κ°μ²΄ μ΄κΈ°νμλ μ½λκ° μμ΄μΌνκ³ μΈμλ₯Ό 건λλ €μλ μλλ€. λμ , νμνλ€λ©΄ μΈμλ€μ λ€λ₯Έ νμ μ κ°μ²΄λ‘ κ°μΈκ±°λ κ°κ³΅νμ§ μμ νμμΌλ‘ μΊ‘μνν΄μΌ νλ€.
- λ€μμ μΈμλ₯Ό μ λ¬λ ν μ€νΈλ₯Ό 건λ리 μ§ μκ³ λμΌν μμ μ μνν μμμ΄λ€.
class Cash {
private Number dollars;
Cash(String dlr) { // λΆ constructor
this(new StringAsInteger(dlr));
}
Cash(Number dlr) { // μ£Ό constructor
this.dollars = dlr;
}
}
class StringAsInteger implements Number {
private String source;
StringAsInteger(String src) {
this.source = src;
}
int intValue() {
return Integer.parseInt(this.source);
}
}
Cash five = new Cash("5");
- 첫 λ²μ§Έ μμ μ κ°μ²΄
five
λ μ«μ 5λ₯Ό μΊ‘μννμ§λ§, λ λ²μ§Έ μμ μ κ°μ²΄five
λNumber
μ²λΌ 보μ΄λStringAsInteger
μΈμ€ν΄μ€λ₯Ό μΊ‘μννλ€. - μ§μ ν κ°μ²΄μ§ν₯μμ μΈμ€ν΄μ€νλ λ μμ κ°μ²΄λ€μ μ‘°ν©ν΄μ λ ν° κ°μ²΄λ₯Ό λ§λλ κ²μ μλ―Ένλ€. κ°μ²΄λ€μ μ‘°ν©ν΄μΌ νλ λ¨ νλμ μ΄μ λ μλ‘μ΄ κ³μ½μ μ€μνλ μλ‘μ΄ μν°ν°κ° νμνκΈ° λλ¬Έμ΄λ€.
- μ μΌ μ²μ ν μΌμ κ°μ²΄λ₯Ό μΈμ€ν΄μ€ ννλ κ²μ΄κ³ λ λ²μ§Έ ν μΌμ κ°μ²΄κ° μ°λ¦¬λ₯Ό μν΄ μμ
μ νκ² λ§λλ κ²μ΄λ€.
constructor
λ μ΄λ€ μΌμ μννλ κ³³μ΄ μλκΈ° λλ¬Έμconstructor
μμμ μΈμμκ² μ΄λ€ μμ μ μμ²ν΄μλ μλλ€. λ€μ λ§ν΄μ μμ±μλ μ½λκ° μμ΄μΌνκ³ , μ€μ§ ν λΉλ¬Έλ§ ν¬ν¨ν΄μΌ νλ€. - μ΄ μ‘°μΈμ μ§μ§νλ μ΄μ λ 첫째λ‘
constructor
μ μ½λκ° μμ κ²½μ° μ±λ₯ μ΅μ νκ° λ μ½κΈ° λλ¬Έμ μ½λμ μ€ν μλκ° λ λΉ¨λΌμ§λ€.
class StringAsInteger implements Number {
private String text;
public StringAsInteger(String txt) {
this.text = txt;
}
public int intValue() {
return Integer.parseInt(this.text);
}
}
Number num = new StringAsInteger("123");
num.intValue();
num.intValue();
- μ μ½λλ
intValue()
λ₯Ό νΈμΆν λλ§λ€ λ§€λ² ν μ€νΈλ₯Ό μ μλ‘ νμ±νλ€.
class StringAsInteger implements Number {
private int num;
public StringAsInteger(String txt) {
this.num = Integer.parseInt(txt);
}
public int intValue() {
return this.num;
}
}
- ν
μ€νΈ νμ±μ κ°μ²΄λ₯Ό μ΄κΈ°ννλ μμ μ λ¨ ν λ² μννκΈ° λλ¬Έμ μ€μ λ‘ μ΄ μ½λκ° λ ν¨μ¨μ μ΄λ€. νμ§λ§
constructor
μμ μ§μ νμ±μ μννλ λ λ²μ¬ μμ λ μ΅μ νκ° λΆκ°λ₯νλ€. μ΄ κ²½μ°μλ κ°μ²΄λ₯Ό λ§λ€ λλ§λ€ λ§€λ² νμ±μ΄ μνλκΈ° λλ¬Έμ μ€ν μ¬λΆλ₯Ό μ μ΄ν μ μλ€.intValue()
λ₯Ό νΈμΆν νμκ° μλ κ²½μ°μλ CPUλ νμ±μ μν΄ μκ°μ μλͺ¨νλ€. - λ°λλ‘ μΈμλ₯Ό μ λ¬λ μν κ·Έλλ‘ μΊ‘μννκ³ λμ€μ μμ²μ΄ μμ λ νμ±νλλ‘ νλ©΄, ν΄λμ€μ μ¬μ©μλ€μ΄ νμ± μμ μ μμ λ‘κ² κ²°μ ν μ μκ² λλ€.
- νμ±μ μ¬λ¬ λ² μνλμ§ μλλ‘ νκ³ μΆλ€λ©΄ λ°μ½λ μ΄ν°λ₯Ό μΆκ°ν΄μ μ΅μ΄μ νμ± κ²°κ³Όλ₯Ό μΊμ±ν μλ μλ€.
class CachedNumber implements Number {
private Number origin;
private Collection<Integer> cached = new ArrayList<>(1);
public CachedNumber(Number num) {
this.origin = num;
}
public int intValue() {
if (this.cached.isEmpty()) {
this.cached.add(this.origin.intValue());
}
return this.cached.get(0);
}
}
Number num = new CachedNumber(
new StringAsInteger("123");
);
num.intValue(); // 첫 λ²μ§Έ νμ±
num.intValue(); // μ¬κΈ°μλ νμ±νμ§ μμ
- κ°μ²΄λ₯Ό μΈμ€ν΄μ€ννλ λμμ κ°μ²΄λ₯Ό λ§λλ μΌ μ΄μΈμλ μ΄λ€ μΌλ μννμ§ μλλ€. μ€μ μμ μ κ°μ²΄μ λ©μλκ° μννλ€. μ΄λ‘ μΈν΄μ μ°λ¦¬κ° μ§μ μ΄ κ³Όμ μ μ μ΄ν μ μλ€.
- λ°λΌμ μμ±μμμ μ½λλ₯Ό μμ λ©΄ μ¬μ©μκ° μ½κ² μ μ΄ν μ μλ ν¬λͺ ν κ°μ²΄λ₯Ό λ§λ€ μ μμΌλ©°, κ°μ²΄λ₯Ό μ΄ν΄νκ³ μ¬μ¬μ©νκΈ°λ μ¬μμ§λ€.