μ΄μ κΈ
μ΄λ² κΈμμλ λΆλ³ ν΄λμ€μ μ₯μ , λ¨μ , κ·Έλ¦¬κ³ λ¨μ λμ² λ°©λ²μ λν΄μ μμ보μ.
1. μ₯μ π
π μ₯μ 1. ν¨μν νλ‘κ·Έλλ°μ μ ν©νλ€.
public final class Complex {
private final double re;
private final double im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
public double realPart() { return re;}
public double imaginaryPart() {return im;}
public Complex plus(Complex c){
return new Complex(re + c.re, im + c.im);
}
public Complex minus(Complex c){
return new Complex(re - c.re, im - c.im);
}
public Complex times(Complex c){
return new Complex(re * c.re - im * c.im, re*c.im + im * c.re);
}
public Complex dividedBy(Complex c){
double tmp = c.re*c.re + c.im * c.im;
return new Complex((re * c.re + im * c.im) / tmp, (im * c.re - re * c.im) / tmp);
}
@Override
public boolean equals(Object o){
if(o == this)
return true;
if(!(o instanceof Complex))
return false;
Complex c = (Complex) o;
return Double.compare(c.re, re) == 0
&& Double.compare(c.im, im) == 0;
}
@Override
public int hashCode() {
return 31 * Double.hashCode(re) + Double.hashCode(im);
}
@Override
public String toString() {
return "(" + re + " + " + im + "i)";
}
}
plus, minus, times, dividedByλ₯Ό μ΄ν΄λ³΄λ©΄ μΈμ€ν΄μ€ μμ μ μμ νμ§ μκ³ μλ‘μ΄ Compelx μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ λ°ννλ€λ κ²μ μ μ μλ€. μ¦, νΌμ°μ°μλ₯Ό μμ νμ§ μκ³ κ²°κ³Όλ₯Ό λ°ννλ ν¨μν νλ‘κ·Έλλ°μ λ°λ₯΄κ³ μλ€. μ΄λ κ² λλ©΄ μ½λμμ λΆλ³μ΄ λλ μμμ λΉμ¨μ΄ λμμ§λ μ₯μ μ λ릴 μ μλ€.
π μ₯μ 2. λΆλ³ κ°μ²΄λ λ¨μνλ€.
κ°μ΄ λ°κΏ κ±°λΌκ³ μμνμ§ μμλ λλ―λ‘ νλ‘κ·Έλλ°μ΄ λ κ°λ¨ν΄μ§λ€. λ§μ½ κ°μ΄ λ°λλ€κ³ νλ©΄, 볡μ¬λ₯Ό ν΄μ μ¬μ©νκ±°λ λ°λμλ€λ κ°μ νμ νλ‘κ·Έλλ°μ ν΄μΌ νλ―λ‘ ν¨μ¬ 볡μ‘ν μνμ λμΌ μ μλ€.
π μ₯μ 3. λΆλ³ κ°μ²΄λ κ·Όλ³Έμ μΌλ‘ μ€λ λ μμ νμ¬ λ°λ‘ λκΈ°νν νμ μλ€.
μ¬λ¬ μ€λ λκ° λμμ μ¬μ©ν΄λ μ λ νΌμλμ§ μλλ€. μ¬μ€ ν΄λμ€λ₯Ό μ€λ λ μμ νκ² λ§λλ κ°μ₯ μ¬μ΄ λ°©λ²μ΄κΈ°λ νλ€.
π μ₯μ 4. λΆλ³ κ°μ²΄λ μμ¬νκ³ κ³΅μ ν μ μλ€.
λΆλ³ ν΄λμ€λΌλ©΄ νλ² λ§λ μΈμ€ν΄μ€λ₯Ό μ΅λν μ¬νμ©νκΈ°λ₯Ό κΆνκ³ μλ€. μμ μ½λμμ ZERO, ONE, Iμ²λΌ μμλ‘ μ μΈνμ¬ μΈμ€ν΄μ€λ₯Ό μ¬νμ©ν μ μλ€.
λν, λΆλ³ ν΄λμ€λ μμ£Ό μ¬μ©λλ μΈμ€ν΄μ€λ₯Ό μΊμ±νμ¬ κ°μ μΈμ€ν΄μ€λ₯Ό μ€λ³΅ μμ±νμ§ μκ² ν΄μ£Όλ μ μ ν©ν°λ¦¬λ₯Ό μ 곡ν μ μλ€. μ΄λ° μ μ ν©ν°λ¦¬λ₯Ό μ¬μ©νλ©΄ μ¬λ¬ ν΄λΌμ΄μΈνΈκ° μΈμ€ν΄μ€λ₯Ό 곡μ νμ¬ λ©λͺ¨λ¦¬ μ¬μ©λκ³Ό κ°λΉμ§ 컬λ μ λΉμ©μ΄ μ€μ΄λ λ€λ μ₯μ μ΄ μλ€. κ·Έλ¦¬κ³ μλ‘μ΄ ν΄λμ€λ₯Ό μ€κ³ν λ public μμ±μ λμ μ μ ν©ν°λ¦¬λ₯Ό λ§λ€μ΄λλ©΄, ν΄λΌμ΄μΈνΈλ₯Ό μμ νμ§ μκ³ λ νμμ λ°λΌ μΊμ κΈ°λ₯μ λμ€μ λ§λΆμΌ μ μλ€.
λΆλ³ κ°μ²΄λ₯Ό μμ λ‘κ² κ³΅μ ν μ μλ€λ μ μ λ°©μ΄μ 볡μ¬λ νμ μλ€λ κ²°λ‘ μΌλ‘ μ΄μ΄μ§λ€. μ무리 볡μ¬λ₯Ό ν΄λ μλ³Έκ³Ό λκ°μΌλ λ³΅μ¬ μμ²΄κ° μλ―Έκ° μλ€. κ·Έλ¬λ―λ‘ λΆλ³ ν΄λμ€λ clone λ©μλλ λ³΅μ¬ μμ±μλ₯Ό μ 곡νμ§ μλ κ² μ’λ€.
π μ₯μ 5. λΆλ³ κ°μ²΄λ μμ λ‘κ² κ³΅μ ν μ μμμ λ¬Όλ‘ , λΆλ³ κ°μ²΄λΌλ¦¬λ λ΄λΆ λ°μ΄ν°λ₯Ό 곡μ ν μ μλ€.
public class BigInteger extends Number implements Comparable<BigInteger> {
final int signum;
final int[] mag;
public BigInteger negate() {
return new BigInteger(this.mag, -this.signum);
}
}
----------
public static void main(String[] args) {
BigInteger ten = BigInteger.TEN;
BigInteger minusTen = ten.negate();
}
BigInteger ν΄λμ€λ λ΄λΆμμ κ°μ λΆνΈ(sign)μ ν¬κΈ°(mag)λ₯Ό λ°λ‘ νννλ€. negate λ©μλλ₯Ό μ¬μ©νλ©΄ ν¬κΈ°λ κ°κ³ λΆνΈλ§ λ°λμΈ μλ‘μ΄ BigIntegerλ₯Ό μμ±νλλ°, λ΄λΆ λ°μ΄ν°λ₯Ό 곡μ νμ¬ μμ±νλ€.
μ΄λ, λ°°μ΄μ΄λΌλ κ²μ΄ κ°λ³μ΄λΌμ μννλ€κ³ μκ°ν μ μλλ° μμ κ°μ΄ finalμ μ΄μ©νμ¬ λΆλ³μΌλ‘ μ²λ¦¬ν΄ μ£ΌμκΈ° λλ¬Έμ λ΄λΆ λ°μ΄ν°λ₯Ό 곡μ ν΄λ μμ νκ² λλ€.
λΆλ³ κ°μ²΄ λΌλ¦¬ νλ€λ κ²μ νλ² λ μΈμ§νκ³ λμ΄κ°λλ‘ νμ.
π μ₯μ 6. κ°μ²΄λ₯Ό λ§λ€ λ λΆλ³ κ°μ²΄λ‘ ꡬμ±νλ©΄ μ΄μ μ΄ λ§λ€.
κ°μ΄ λ°λμ§ μλ ꡬμ±μμλ€λ‘ μ΄λ€μ§ κ°μ²΄λΌλ©΄ κ·Έ κ΅¬μ‘°κ° μ무리 볡μ‘νλλΌλ λΆλ³μμ μ μ§νκΈ° ν¨μ¬ μμν΄μ§λ€.
public class Point {
public int y, x;
public Point(int y, int x) {
this.y = y;
this.x = x;
}
}
----------
public static void main(String[] args) {
Set<Point> points = new HashSet<>();
Point firstPoint = new Point(1, 2);
points.add(firstPoint);
firstPoint.y = 2;
}
μμ κ°μ΄ Setμ΄ κ°λ³ κ°μ²΄λ€λ‘ ꡬμ±λλ€λ©΄ λΆλ³μμ΄ λ무λ μ½κ² νλ¬Όμ΄μ§λ€.
public class Point {
private final int y, x;
public Point(int y, int x) {
this.y = y;
this.x = x;
}
}
----------
public static void main(String[] args) {
Set<Point> points = new HashSet<>();
Point firstPoint = new Point(1, 2);
points.add(firstPoint);
}
νμ§λ§ λΆλ³ κ°μ²΄λ₯Ό μμλ‘ κ°μ§λ€λ©΄ λΆλ³μμ μ μ§νκΈ°κ° ν¨μ¬ μμν΄μ§λ€.
π μ₯μ 7. μ€ν¨ μμμ±μ μ 곡νλ€.
λΆλ³ κ°μ²΄λ₯Ό λ§λ€λ©΄ μνκ° μ λ λ³νμ§ μμΌλ μ κΉμ΄λΌλ λΆμΌμΉ μνμ λΉ μ§ κ°λ₯μ±μ΄ μλ€. κ·Όλ³Έμ μΌλ‘ μ€ν¨μμμ±μ μ 곡νκ² λλ€.
λ¬Όλ‘ κ°λ³ κ°μ²΄λ₯Ό μ¬μ©νλλΌλ μ€ν¨ μμμ±μ μ 곡ν μ μκΈ°λ νλ€.
2. λ¨μ π
π λ¨μ 1. κ°μ΄ λ€λ₯΄λ©΄ λ°λμ λ 립λ κ°μ²΄λ‘ λ§λ€μ΄μΌ νλ€.
κ°μ κ°μ§μκ° λ§λ€λ©΄ μ΄λ€μ λͺ¨λ λ§λλ λ° ν° λΉμ©μ μΉλ¬μΌ νλ€.
BigInteger moby = ...;
moby = moby.flipBit(0);
μμ κ°μ΄ λ°±λ§ λΉνΈμ§λ¦¬ BigIntegerμμ λΉνΈ νλλ§ λ°κΏμ£Όλ κ²½μ°λ₯Ό μ΄ν΄λ³΄μ. filpBit λ©μλλ μλ‘μ΄ BigInteger μΈμ€ν΄μ€λ₯Ό μμ±νλ€. μλ³Έκ³Ό λ¨μ§ ν λΉνΈλ§ λ€λ₯Έ λ°±λ§ λΉνΈμ§λ¦¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ€λ κ²μ΄λ€. μ΄λ κ² λλ©΄ BigIntegerμ ν¬κΈ°μ λΉλ‘νμ¬ μκ°κ³Ό 곡κ°μ μ‘μλ¨Ήκ² λλ€.
BigSet moby = ...;
moby.flip(0);
BigSetμ BigIntegerμ λ¬λ¦¬ κ°λ³ ν΄λμ€μ΄λ€. μ΄λ₯Ό μ΄μ©νλ©΄ μνλ λΉνΈ νλλ§ μμ μκ°(O(1))μμ λ°κΏμ£Όλ λ©μλλ₯Ό μ¬μ©ν μ μλ€.
3. λ¨μ λμ² λ°©λ² π
μνλ κ°μ²΄λ₯Ό μμ±νκΈ°κΉμ§μ λ¨κ³κ° λ§κ³ , κ·Έ μ€κ° λ¨κ³μμ λ§λ€μ΄μ§ κ°μ²΄λ€μ΄ λͺ¨λ λ²λ €μ§λ€λ©΄ μ±λ₯ λ¬Έμ κ° λμ± λΆκ±°μ§λ€. μ΄ λ¬Έμ λ₯Ό λμ²νλ 2κ°μ§ λ°©λ²μ λν΄μ μμ보μ.
π λ°©λ² 1. νν μ°μΌ 'λ€λ¨κ³ μ°μ°(multistep operation)λ€μ μμΈ‘νμ¬ κΈ°λ³Έ κΈ°λ₯μΌλ‘ μ 곡νλ λ°©λ²
κ°μ²΄λ₯Ό νλ μμ±νκΈ° μν΄ Complexμ plus, minus, times, dividedByλ₯Ό μ¬μ©νλ€κ³ νμ. μ΄λ κ² μ΄ 4κ°μ μ°μ°μ μ°λ κ² μλ 'plusMinusTimesAndDividedBy'λΌλ λ©μλλ₯Ό λ§λ€μ΄μ νλμ μ°μ°μ μ¬μ©νλλ‘ ν μ μλ€.
κΈ°μ‘΄μλ 4κ°μ Complex μΈμ€ν΄μ€λ₯Ό λ§λ€μλλ° μμ κ°μ λ°©λ²μ μ¬μ©νλ©΄ 1κ°μ Complex μΈμ€ν΄μ€λ§ λ§λ€λ©΄ λλ€.
π λ°©λ² 2. package-privateμ κ°λ³ λλ° ν΄λμ€λ₯Ό μ 곡νλ λ°©λ² (ν΄λΌμ΄μΈνΈλ€μ΄ μνλ 볡μ‘ν μ°μ°λ€μ μ νν μμΈ‘ν μ μλ κ²½μ°)
public static void main(String[] args) {
String name = "amenable";
StringBuilder nameBuilder = new StringBuilder(name);
nameBuilder.append("choi");
}
String μ체λ λΆλ³ ν΄λμ€μ΄λ€. νμ§λ§ Stringμ κ°λ³ λλ° ν΄λμ€μΈ StringBuilderλ₯Ό μ΄μ©νλ©΄ κ°μ λ³κ²½ν μ μλ€.
μ΄μμΌλ‘ λΆλ³ ν΄λμ€μ μ₯μ , λ¨μ κ·Έλ¦¬κ³ λ¨μ λμ² λ°©λ²μ λν΄μ μμ보μλ€.
λ€μ κΈμ ν΅ν΄
λν΄μ μμ보μ.
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μ°Έκ³ νμμ΅λλ€.