๋ธ๋ก๊ทธ ์ฎ๊ฒผ์ต๋๋ค! ๐ก integer.blog
Java์ ์ ์
์ผ๋ก Java์ ๊ฐ๋ ๋ค์ ๊ณต๋ถํ ๋๋ ์ถ์ํด๋์ค๊ฐ ์ธ์ ๋ ์ฐ์ฐํ๋ค.
๊ฐ๋ฐ์ ๊ณต๋ถํ๊ธฐ ์์ํ์ง ์ผ๋ง ์๋์ด ํ์ตํ ๋ด์ฉ์ด์๊ธฐ ๋๋ฌธ์ ์ ๋นํ ์์ค์ผ๋ก ์ดํดํ๊ณ ๋์ด๊ฐ๋ ๊ฒ์ด๋ค.
์ฐ์ฐํ ์ํ๋ก ๋จ์์๋ ๊ฐ๋ ๋ค์ ํ๋์ฉ ๋ฐ๋ก ์ก์ ๊ณํ์ด์๋๋ฐ, ์ถ์ํด๋์ค์ ๋ํด ์กฐ๊ธ ๋ ์ดํด ํ ๊ธฐํ๊ฐ ์๊ฒจ ์ ๋ฆฌํด๋ณธ๋ค.
Java์ ์ ์
์์๋ ์ถ์ํด๋์ค์ ์ถ์๋ฉ์๋๊ฐ ํ์ํ ์ด์ ๋ฅผ ๋ช
ํํ๊ฒ ์ค๋ช
ํ์ง ์์๋ค.
๋๋ฌธ์ ๋๋ ์ง๊ธ๊น์ง ์ถ์ํด๋์ค(๋ฉ์๋)๊ฐ ํ์ํ ์ด์ ๋ฅผ
์์ ํด๋์ค์์ ์ถ์๋ฉ์๋๋ฅผ ๋ฐ๋์ ๊ตฌํํ๋๋ก ๊ฐ์ํ๊ธฐ ์ํด์
๋ผ๊ณ ๋ง ์ดํดํ๊ณ ์์๋ค.
๊ทธ๋ฆฌ๊ณ ์์ง ์ค๋ฌด์์ ์ถ์ํด๋์ค(๋ฉ์๋)๋ฅผ ์์ฑํ ์ผ์ด ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ ์ด ์๋ ์ํ์๋ค.
ํ์ง๋ง Java๋ก ๋ฐฐ์ฐ๋ ์๋ฃ๊ตฌ์กฐ ๊ฐ์์์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์ค๋ช ํ๊ณ , ๋ ์ด ์์ ์ ์ค๋ช ์ด ๋ ์๋ฟ์๋ค.
์์ ๋ฅผ ๋จ์ํ ํด๋ณด๋ฉด,
Event ๋ผ๋ ๋ถ๋ชจํด๋์ค๊ฐ ์๊ณ ,
public class Event { ... }
Event๋ฅผ ์์๋ฐ์ ์์ํด๋์ค aEvent, bEvent, cEvent๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ฐ isRelevant() ๋ฉ์๋๋ฅผ ๊ตฌํํ์๋ค.
public class aEvent extends Event { ... public boolean isRelevant(Data data) { return logic.a; } }
public class bEvent extends Event { ... public boolean isRelevant(Data data) { return logic.b; } }
public class cEvent extends Event { ... public boolean isRelevant(Data data) { return logic.c; } }
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํด๋์ค์ ์ด๋ ๋ฉ์๋์์ Event ํ์ ์ผ๋ก ์ ์ธ๋ ๋ฐฐ์ด events[]์ ๊ฐ ์์๋ฅผ isRelevant()๋ฉ์๋๋ก ๊ฒ์ฆํ๋ ๋ก์ง์ ์์ฑํ๋ค. (events[] ๋ฐฐ์ด์ ๊ฐ ์์๋ aEvent, bEvent, cEvent ํ์ ์ ์์๋ค์ด๋ค.)
public class someClass() { ... Event events[] = new Event[100]; ... public void someMethod() { for(int i=0; i<n; i++) if(events[i].isRelevant(someData)) // ์ปดํ์ผ ์๋ฌ!!! system.out.println( events[i].toString()); }
๊ทธ๋ฐ๋ฐ isRelevant()๋ฉ์๋์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์๋ํ๋ฉด events[] ๋ฐฐ์ด์ Event ํ์ ์ผ๋ก ์ ์ธ๋์๋๋ฐ, Event ํด๋์ค์๋ isRelevant() ๋ฉ์๋๊ฐ ์ ์๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.๋ฐฐ์ด์ ๊ฐ ์์๊ฐ Event ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค์ ๊ฐ์ฒด์ด๊ณ , ๊ฐ ํด๋์ค๋ isRelevant() ๋ฉ์๋๊ฐ ๊ตฌํ๋์ด ์์ง๋ง,
์ปดํ์ผ๋ฌ๋ Event ํด๋์ค์ isRelevant() ๋ฉ์๋๊ฐ ์๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๊ฒ์ด๋ค.(
events[i].toString()
์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋์ง ์๋ ์ด์ ๋ toString() ๋ฉ์๋๋ ๋ชจ๋ ํด๋์ค์ ์กฐ์ ํด๋์ค์ธ Object ํด๋์ค์ ์ ์๋ ๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ด๋ค.)์ด ๋, ๋จ์ํ ์ปดํ์ผ ์๋ฌ๋ง ํผํ๊ณ ์ ํ๋ค๋ฉด,
์๋์ ๊ฐ์ด Event ๊ฐ์ฒด์ ์ฌ์ฉ๋ ์ผ ์๋ isRelevant() ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ ๊ฒ์ด๋ค.public class Event { ... public boolean isRelevant(Data data) { return false; } }
์์ ๊ฐ์ด ๋ฉ์๋๋ฅผ ์ ์ํ๋ฉด ์ปดํ์ผ ์๋ฌ๋ ์ฌ๋ผ์ง๊ณ ์ ์์ ์ผ๋ก ๋์ํ๋ค.
ํ์ง๋ง ์ฌ์ฉ๋์ง ์์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅธ ํด๊ฒฐ์ฑ ์ด ์๋๋ค.์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด isRelevant()๋ฉ์๋๋ฅผ ์ถ์ ๋ฉ์๋๋ก ๋ง๋ค๋ฉด ๋๋ค.
(๊ทธ๋ฆฌ๊ณ ์๋ ์ฝ๋์ ๊ฐ์ด ์ถ์ ๋ฉ์๋๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ๊ทธ ํด๋์ค๋ ์ถ์ ํด๋์ค๊ฐ ๋๋ค.)public abstract class Event { ... public abstract boolean isRelevant(Data data); }
์ด ์์ ๊ฐ ์ดํดํ๊ธฐ ์ฌ์ ๋ ์ด์ ๋ ๋๊ฐ์ ์ด๋ณด์๊ฐ ์ฝ๋๋ฅผ ์ง๋ฉด์ ๋ง์ดํ๋ ์ํฉ๊ณผ ๋น์ทํ ํ๋ฆ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋์ ๊ฒฝ์ฐ์๋, ํฐ ๊ทธ๋ฆผ์ ๋ณด์ง ๋ชปํ๊ณ ์ฐ์ ๋์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฌ๋ค ๋ณด๋ฉด ์ฝ๋ ์ค๋ณต์ด ๋ฐ๊ฒฌ๋๊ณ , ๊ทธ ์ค๋ณต์ ํด๊ฒฐํ๊ธฐ ์ํด ๊ทธ์ ์์ผ ์ถ์ํ์ ์์์ ๊ณ ๋ฏผํ๋ค.
๋๋ฌธ์ ๋ถ๋ชจํด๋์ค์ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ธํ์ฌ ์ถ์ํด๋์ค๋ก ๋ง๋ค๊ณ , ๊ทธ ํด๋์ค๋ฅผ ์์๋ฐ์ ์๋ธํด๋์ค๋ค์์ ์ถ์๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ์ค๋ช
ํ๋ Java์ ์ ์
์ ์์ ๋ ์ด๋ณด๊ฐ๋ฐ์ ์
์ฅ์์ ์ ๋๋ก ์ดํดํ ์ ์์๋ ๊ฒ์ด๋ค.
๋ฌผ๋ก ์ถ์ ๋ฉ์๋์ ์ถ์ ํด๋์ค์ ์ญํ ๊ณผ ํ์ฉ์ ๋ํด์๋ ๋ ๊น์ ์ด์ผ๊ธฐ๋ค์ด ์๊ฒ ์ง๋ง,
์ค๋ฌด์์ ๋ง์ฃผํ๊ฒ ๋๊ธธ ๋ฐ๋ผ๋ฉด์ ์ฐ์ ์ ์ด ์ ๋๋ก ์ ๋ฆฌํด๋ณธ๋ค.