๋ถ๋ณ๊ฐ์ฒด๋ก ๋ง๋๋ ๊ฒ์ด ํญ์ ์ข์๊น? - Value Object vs Reference Object
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์
์ด๋ฒ ์๋์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์ ์ ์งํํ๋ฉด์ ๋ ๋ฒจ 1 ๋ ํ๋ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋ง์ ํ๋ค ๋ณด๋ ํ์ด์ '๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋๋ ๊ฒ ์ด๋ ๋๋ ์๊ฒฌ์ ๋ฐ์๋ค.
๋น์ ๋ ๋ฒจ 1 ๋ฏธ์ ์ ์งํํ ๋๋ ๋ถ๋ณ ๊ฐ์ฒด์ ์ ์์ ๋ํด์ ์ ์์ง ๋ชปํ์๊ณ , ๋ฏธ์ ์ ์งํํ๋ฉด์ ๋ถ๋ณ์ผ๋ก ๋ง๋๋ ๊ฒ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ด ์๋ค๋ ๊ฑธ ๊ณต๋ถํ์๊ธฐ ๋๋ฌธ์ ๋ณ ์๊ฐ ์์ด ๊ทธ๋ ๊ฒ ์งํํ๊ณ ์ ํ๋ค.
public class Car {
private static final int CAR_FORWARD_NUMBER = 4;
private final CarName name;
private final CarPosition position;
...
public Car move(final int power) {
if (power >= CAR_FORWARD_NUMBER) {
final CarPosition newPosition = position.addPosition();
return new Car(name, newPosition);
}
return new Car(name, position);
}
...
}
๊ทธ๋์ move์ ๋ฐํ๊ฐ๋ ์๋ก์ด Car๋ฅผ ์์ฑํด์ ๋ฐํํ๊ฒ ๋๋ค. (Cars, CarName, CarPosition ๋ชจ๋ ๋ถ๋ณ์ผ๋ก ๋ง๋ค์์๋ค.)
ํ์ง๋ง, ๋ฆฌ๋ทฐ์ด๋์ ๋ค์๊ณผ ๊ฐ์ ํผ๋๋ฐฑ์ ์ฃผ์ จ๋ค.
Car๋ฅผ ์ํ์ ์ธ ๊ฐ์ ๋ํ๋ด๋ ์ค๋ธ์ ํธ๋ก ํํํ๊ณ ์ ํ๋ค...?
์ฒ์์๋ ์ด ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ณ ์ ๋๋ก ์ดํดํ์ง ๋ชปํด์ ๊ณ ์ํ๋ค.
ํ์ง๋ง Value Object์ Reference Object์ ๋ํด ๊ณต๋ถํ๋ค ๋ณด๋ ์ด๊ฒ ์ด๋ค ๋ฆฌ๋ทฐ์ธ์ง ์๊ฒ ๋์๋๋ฐ, ์ด์ ๋ํด์ ๊ฐ๋จํ๊ฒ ํฌ์คํ ์ ํด๋ณด๊ณ ์ ํ๋ค.
โ๏ธ Value Object & Reference Object
ํ๋ก๊ทธ๋จ์ ๊ฐ์ฅ ํ๋ฅญํ๊ฒ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ์ค๋ธ์ ํธ๋ค๊ณผ ์ํ์ ์ธ ๊ฐ์ ๋ํ๋ด๋ ์ค๋ธ์ ํธ๋ค์ ์กฐํฉ์ผ๋ก ํํํ๋ ๊ฒ์ด๋ค. - ์นธํธ ๋ฐฑ
์ง๊ธ๋ถํฐ ์ฐ๋ฆฌ๋ '์๋์ฐจ'๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ค๊ณํ๊ณ ์ ํ๋ค.
์๋์ฐจ๋ผ๋ ๊ฐ์ฒด๋ '์ด๋ฆ', '์์น'๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ , ๊ฐ๊ฐ ์ญ์ CarName, CarPosition์ด๋ผ๋ ๊ฐ์ฒด๋ก ํํํ๊ณ ์๋ค.
์์ ๊ฐ์ด ๊ฝค๋ ๊ท์ฌ์ด ์๋์ฐจ๋ฅผ ์์ฑํ์๋ค. ํด๋น ์๋์ฐจ์ ์ด๋ฆ (CarName)์ '์ ธ๋', ์์น (CarPosition)์ 0์ด๋ค.
๋ฏธ์ ์ ์๊ตฌ์ฌํญ์ฒ๋ผ ์๋์ฐจ ๊ฒฝ์ฃผ๋ฅผ ์ด๊ณ ์ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฌ๋ฌ ๊ฐ์ ์๋์ฐจ๊ฐ ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
์ ธ๋, ์ ธ๋B, ์ ธ๋C๋ผ๋ ์๋์ฐจ๊ฐ ์๊ฒผ๋ค.
์ฐ๋ฆฌ์ ์์คํ ์์ '์ ธ๋'๋ผ๋ ์๋์ฐจ๋ 3๊ฐ๊ฐ ๋๋ ๊ฒ์ผ๊น? ์๋๋ค.
'์ ธ๋'๋ผ๋ ์๋์ฐจ๋ ์ค์ง ์ฐ๋ฆฌ์ ์์คํ ์์ ์ ์ผํ๊ฒ ์๋ณ ๊ฐ๋ฅํ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ด๋ฉฐ, ๋๋ ์ด๋ฌํ ๋๋ฉ์ธ์ 'Car'๋ฅผ ํตํด ํํํ๊ณ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฐ๋ฆฌ๋ ์ด์ ๋ถํฐ ์ด๊ฒ์ 'Reference Object'๋ผ๊ณ ํํํ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, ์๋์ฐจ '์ ธ๋'๋ฅผ ์์ง์ฌ๋ณด์.
์๋์ฐจ '์ ธ๋'์ ์์น๋ ๋ณํ๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ทธ์ ํด๋นํ๋ ์์น๊ฐ์ด 0์์ 10์ผ๋ก ์ฆ๊ฐํ์๋ค.
ํ์ง๋ง ์์น๊ฐ 10๋งํผ ์ด๋ํ๋ค๊ณ ํด์ ๊ทธ ์๋์ฐจ๋ '์ ธ๋'๋ผ๋ ์๋์ฐจ๊ฐ ์๋๊ฒ ๋๋ ๊ฒ์ผ๊น?
์๋์ฐจ๋ก ๋น์ ํ์ง ์์๋, ์ค์ธ๊ณ์์ ์ฌ๋์ ์์๋ก ๋ค์ด๋ณด์.
๋ด ๋์ด๊ฐ 23์ด์์ 24์ด์ผ๋ก ๋ณํ๋๋ผ๋, ๋๋ ๊ทธ์ ๋์ผ๋ฟ์ด๋ค.
๋ด๊ฐ 23์ด์ธ์ง 24์ด์ธ์ง๋ ๋๋ฅผ ๊ฒฐ์ ํ๋๋ฐ ์๋ฌด๋ฐ ์ํฅ๋ ์ฃผ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ์ ์๋์ฐจ ์์คํ ์์๋ ์์น ๊ฐ์ ๊ณ์ ์ถ์ ํ ํ์๊ฐ ์๋ค. ๊ทธ์ ์์น๋ฅผ ํํํ '๊ฐ'์ผ๋ฟ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ฒ์ 'Value Object'๋ผ๊ณ ๋งํ ๊ฒ์ด๋ค.
โ๏ธ ๋์ผ์ฑ (Identity)์ ๋๋ฑ์ฑ (Equality)
Reference Object์ Value Object์ ๋์ผ์ฑ๊ณผ ๋๋ฑ์ฑ์ ๋ํด์ ์๊ฐํด๋ณด์.
์ฐ์ , ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผ์ฑ์ ๋ ๋ณ์๊ฐ ์์ ํ ๋์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ทธ๋ฆฌ๊ณ , ์์ ํ ๋์ผํ๋ค๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์์์ ๊ณง ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ์ด๋ค.
์์ ํ ๋์ผํ๊ธฐ ๋๋ฌธ์ ==์ ํตํด์ ๋น๊ต ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋ฉด์ ๋๋ฑ์ฑ์ ๊ฒฝ์ฐ, ๋ ๊ฐ์ ๋ณ์๊ฐ ๋์ผํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ฉ๋ชจ๋ฆฌ์์์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ง ์๋๋ผ๋, ๊ฐ ๊ฐ์ฒด์ ๋ด์ฉ์ด ๋์ผํ๋ค๋ฉด ๋๋ฑํ๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋๋ฑ์ฑ์ equals๋ฅผ ํตํด์ ๋น๊ตํ ์ ์๋ค.
๊ฐ์ฒด์งํฅ ์์คํ ์์ ๊ฐ์ฒด์๊ฒ ๊ณ ์ ํ ์๋ณ์๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์๋ณ์๋ก ๋ฉ๋ชจ๋ฆฌ ์์ ์ฃผ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฆ, ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๋ ์กฐ๊ฑด์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์์ ์ฃผ์๋ฅผ ์ฌ์ฉํ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์์์ Reference Object์ ๊ฒฝ์ฐ ์์คํ ์์ ์ ์ผํ๊ฒ ์กด์ฌํ๊ณ ์๋ค๊ณ ํ๋ค.
์ ์ผํ๊ฒ ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ์์์๋ ์ค์ง 1๊ฐ๋ง ์กด์ฌํ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋น๊ตํ๋, ๋์ผ์ฑ์ ๋น๊ตํ ์ ์๋, ==์ ํตํด ๋น๊ต๋ฅผ ํ ์ ์๋ค.
์ฒ์ ์ธ๊ธํ๋ Car ๋๋ฉ์ธ์ด ์ฌ๊ธฐ์ ํด๋นํ๋ค. '์ ธ๋' ์๋์ฐจ๋ ์ ์ผํ๊ธฐ ๋๋ฌธ์, Car๋ ๊ณง ==์ ํตํด ๋น๊ต๊ฐ ๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ฉด์, Value Object์ ๊ฒฝ์ฐ ์ ์ผํ๊ฒ ์กด์ฌํ ํ์๊ฐ ์๋ค.
'์์น 0'์ ๋ํ๋ด๋ CarPosition๋ง ์๊ฐํ๋๋ผ๋ '์ ธ๋', '์ ธ๋B', '์ ธ๋C'๊ฐ ๊ฐ์ง๊ณ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ CarPosition์ ๊ฒฝ์ฐ ๋์ผํ ๊ฐ์ ๊ฐ์ ธ ๋๋ฑํ ์ ์์ง๋ง, ๋์ผํ ํ์๋ ์์ด์ง๋ค.
๊ทธ๋์ ==์ ํตํด ๋น๊ตํ๋ ๊ฒ ์๋, equals๋ฅผ ์ฌ์ ์ํ์ฌ ํ ์คํธํด์ผ ํ๋ค.
์, ์ด์ ๋ฆฌ๋ทฐ๋ฅผ ๋ค์ ๋ณด์.
Car๋ฅผ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฃผ์๋, ์ด์ ๋๋ฑ์ฑ์ผ๋ก ๋น๊ตํด์ผ ํ๋ ๊ฐ์ฒด์ฒ๋ผ ๋ณด์ด๋ค์.
๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ์์น๊ฐ ๋ณํ ๋๋ง๋ค ์๋ก์ด Car ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์๋ค.
๊ทธ๋์ Car๋ Reference Object๊ฐ ์๋, Value Object์๊ณ , ๋ฑ์ฑ์ผ๋ก ๋น๊ตํ๋ ๊ฐ์ฒด์ฒ๋ผ ๋ณด์ธ๋ค๊ณ ๋ง์ํด ์ฃผ์ ๊ฑฐ์๋ค.
โ๏ธ ๋ถ๋ณ ๊ฐ์ฒด์ Value, Reference Object
Value Object๋ ๋ถ๋ณ์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์์ผ๊น?
๋ถ๋ณ์ผ๋ก ๋ง๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ๊ฐ์ฒด์์๋ ๋ค๋ฅธ ๋ณ์๋ก ์ฐธ์กฐํ์ ๋, ๋ค๋ฅธ ๋ณ์๊ฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ๋ง๋ค์ด์ง๋ ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์๋ค. (๋ค๋ฅธ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์์ ์์ง ๋ชปํ๋ ์ํ - ๋ฒ๊ทธ๋ฅผ ์ก๊ธฐ ์ด๋ ค์์ง๋ค.)
Value Object๋ ๋ง์ฝ ๋ด๋ถ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด, ๊ธฐ์กด ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค.
์ผ์ชฝ์ฒ๋ผ ๋ด๋ถ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ ์๋๋ผ, ์ค๋ฅธ์ชฝ์ฒ๋ผ ์์ ํ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ผ๋ ๊ฒ์ด๋ค.
๋ด๋ถ์ ๊ฐ์ด ๋ณํ์ ๋ ๊ตณ์ด ๊ธฐ์กด์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํด์ผ ํ ๊น? ์๋ฌด ์๋ฏธ๊ฐ ์๋ค.
๊ตณ์ด ์์์ ์ธ๊ธํ ๋ฒ๊ทธ (๋ณดํต aliasing ๋ฌธ์ ๋ผ๊ณ ํ๋ค)์ ์ํ์ฑ์ ์๊ณ ๊ฐ ๋งํผ ๋์ผํ๊ฒ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๋ ๊ฒ์ด๋ค.
๋ํ, ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ค๋ฉด ์ด์ฐจํผ GC ๋์์ด ๋ ๊ฒ์ด๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์ผ๋ก ์๊ฐํด๋ดค์ ๋๋ ๋ถ๋ด์ด ์๋ ๊ฒ์ด๋ค.
Value Object์ ๊ฒฝ์ฐ ์ํ๋ฅผ ์ถ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ๋ณ์๋ฅผ ์ ๊ทผํ ๋ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋ค.
๋ํ, ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ์์ด ๋ด๋ถ์ ๊ฐ์ด ๋์ผํ ๋๊น์ง๋ง ์ ํจํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ์ ์ํ์ฑ๋ ์๋ค.
ํ์ง๋ง, Reference Object๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ์๋๋ค.
'Car'๋ ์์น๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค. Car๋ ์์ง์ผ ์ ์๊ธฐ ๋๋ฌธ์, ๊ณ์ํด์ ์ํ๋ ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ด๋ค.
๋ํ, ์๋์ฐจ '์ ธ๋'์ ๋ํด ์ถ์ ํ๊ธฐ ์ํด์, ํญ์ ๋์ผํ '์ ธ๋' ๊ฐ์ฒด๊ฐ ์์คํ ์์ ์ ๋ฌ๋์ด์ผ ํ๋ค.
์์คํ ์ด ํญ์ ๋์ผํ ์๋์ฐจ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์, ๋ณ์นญ ๋ฌธ์ ๋ ํผํ ์๊ฐ ์๋ค.
์ด๋ฅผ ์ํด์ ํญ์ Reference Object์ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํด์ผ ํ๋ค.
๋ฌผ๋ก ! Reference Object๋ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค ์ ์๋ค๋ฉด ๋ง๋ค์ด๋ ์ข๋ค. (์๊ตฌ์ฌํญ์ ๋ฌ๋ ค์๋ ๊ฒ์ด๋ค)
๋ค๋ง, ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ํด๋น ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๊ฐ ๊ณ์ํด์ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ์ ํ๋๋ก ํ์.
๋ฏธ์ ์๊ตฌ์ฌํญ์ฒ๋ผ ์๋์ฐจ '์ ธ๋'์ ์์น๊ฐ ๊ณ์ ๋ฐ๋๋ค๋ฉด, ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ ์ ์ผ๋ก ์ด์ํ๋ค. (์ผ๊ด์ฑ๋ ๊นจ์ง๋ค)
์ฌ์ค, ์ด๋ผ์๋ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ๋ ์ข๋ค๋ ์๊ฒฌ์ด ์์ ๊ฒ์ด๋ค.
๋ถ๋ณ ๊ฐ์ฒด๊ฐ ์ฃผ๋ ์ฅ์ ์ด ์๋นํ ๋ช ํํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง, ๊ฐ์ฒด์ ์๋ฏธ๋ก ์ ์ค๊ณ๋ก ๋ดค์ ๋๋ ๊ณผ์ฐ ์ข์์ง... ํ์ค์ธ๊ณ๋ฅผ ์ ๋ชจ๋ธ๋งํ ๊ฒ์ธ๊ฐ?์ ๊ด์ ์ด๋ผ๋ฉด ์๋๋ผ๊ณ ์๊ฐ๋๋ค.
์์ผ๋ก ๋ฏธ์ ํ๋ฉด์ ๋ฌด์์ ๋ถ๋ณ์ผ๋ก ๋ง๋ค์ง ๋ง๊ณ , ํ ๋ฒ ์ด๋ฌํ ์ ๋ค์ ๋ํด์ ์ ๋ฐ์ ธ๋ด์ผ๊ฒ ๋ค...
Reference Object๋ฅผ ์๋ณํจ์ผ๋ก์ ์์คํ ์ ํต์ฌ ๊ฐ๋ ๋ค์ ์๋ช ์ฃผ๊ธฐ์ ์ด์ ์ ๋ง์ถ ์ ์๋ค.
Value Object๋ฅผ ์๋ณํจ์ผ๋ก์ ๋๋ฉ์ธ์ ์ผ๋ถ์ง๋ง ์ค์ํ์ง ์์ ๊ฐ๋ ๋ค์ ๊ฑธ๋ฌ๋ผ ์ ์๋ค.