์ฌ๋ฌ๋ถ๋ค์ ํ๋ก๊ทธ๋๋ฐํ ๋ ์ค์ฝํ๋ฅผ ์์ํ๊ณ ํ์๋์? ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ฝํ๋ ์ ์ง๋ณด์์ฑ์ ํฐ ์ํฅ์ ์ค๋๋ค.
1. Scope(์ค์ฝํ)๋?
์๋ฐ์์ ์ค์ฝํ(scope)๋ ๋ณ์๋ ๋ฉ์๋์ ์ ํจ ๋ฒ์๋ฅผ ๋งํ๋ค. ์ฆ, ๋ณ์๋ ๋ฉ์๋๊ฐ ์ด๋์์ ์ ๊ทผํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค. ์ค์ฝํ๋ ์ค๊ดํธ {}๋ก ๋๋ฌ์ธ์ธ ์ฝ๋ ๋ธ๋ก์ ์ํด ๊ฒฐ์ ๋๋ค. ์ด๋ ํ ๋ฒ์ ๋ฐ์ ๋ ๋ณ์ ๋ฑ์ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ ์ด๋ฆ๋ง์ผ๋ก๋ ์ฐธ์กฐํ ์ ์๋ค. ์ด ๋ ์ด๋ฐ ๋ณ์๋ '์ค์ฝํ ๋ฐ์ ์๋ค.', '์ ๋ณด์ธ๋ค.'๋ผ๊ณ ๋งํ๋ค.
'๋ณด์ธ๋ค'๋ผ๋ ๊ฒ์ ๊ทธ๊ฒ๋ค์ด ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋ ์ ์๋ค๋ ๋ป์ด๋ค. ๋ณ์๋ผ๋ฉด ๋ณ์๋ช ์ ์ง์ ํด ๊ฐ์ ์ฝ๊ณ ์ธ ์ ์๊ณ , ๋ฉ์๋๋ผ๋ฉด ํธ์ถํด ์ฌ์ฉํ ์ ์๋ค. '์ฌ์ฉํ ์ ์๋ค'๋ผ๋ ๊ฒ์ ๊ทธ๊ฒ๋ค์ '์์กดํ๋ค'๋ ๋ป์ด๋ค. ์ฝ๋๋ฅผ ํ ๊ณณ๋ง ๊ณ ์ณ ์ฐ๊ณ ์ถ์๋ฐ ์์ญ ๊ตฐ๋ฐ๋ฅผ ๊ณ ์ณ์ผ ํ๋ ๊ฒฝํ์ ํด๋ดค๋ค๋ฉด ์ค์ฝํ์ ์ค์์ฑ์ ์๊ฒ ๋๋ค. ๋ํ '์์กด๋๊ฐ ํฌ๋ค'๋ผ๋ ๊ฒ์ ๋๋ฒ๊น ํ ๋ ์กฐ์ฌํ์ง ์์ผ๋ฉด ์ ๋ ์ ๋๋ก ๋ฒ์๊ฐ ๋๋ค๋ผ๋ ์๋ฏธ์ด๋ค. ๋ณ์๋ ๋ฉ์๋๊ฐ ์ฌ์ฉ๋๊ณ ์๋๊ณ ์๋ ์๊ด ์์ด ์ค์ฝํ์ ๋ฒ์๊ฐ ๊ฒฐ๊ตญ ์กฐ์ฌ ๋์์ด ๋๋ฏ๋ก ์ค์ฝํ๋ ์์กด์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค.
๋ณ์๊ฐ ๋ฉ์๋์ ์ค์ฝํ = ๋ณด์ด๋ ๋ฒ์ = ์ฌ์ฉํ ์ ์๋ ๋ฒ์ = ์์กดํ๋ ๋ฒ์ = ์์กด์ฑ์ ์ํฅ์ ์ฃผ๋ ๋ฒ์
๋ณ์๋ ๋ฉ์๋์ ์ค์ฝํ๋ฅผ ์๊ฒ ํ๋ฉด '๋ณด์ด๋ ๋ฒ์'๊ฐ ์์์ ธ์ '์ฌ์ฉํ ์ ์๋ ๋ฒ์'๋ ์์์ง๊ณ , '์์กดํ๋ ๋ฒ์'๋ ์์์ง๊ฒ ๋๋ค. ์ค์ฝํ๋ฅผ ์๊ฒ ํจ์ผ๋ก์จ ์์กด์ฑ์ด ์ ๊ณ ๋ณ๊ฒฝ์ด ์ฌ์ด ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๊ฒ ๋๋ค.
Scope(์ค์ฝํ)์์ ์ค์ํ ๊ฒ = ์ค์ฝํ๋ฅผ ์๊ฒ ํ๋ ๊ฒ
์? ์ค์ฝํ๋ฅผ ์๊ฒ ํ๋ฉด ์์กด๋๊ฐ ์ค์ด๋ค์ด ์ ์ง๋ณด์๊ฐ ํธํ ๊ฒ์ ๋ฌผ๋ก ์ด๊ณ , ํ๋ก๊ทธ๋๋ฐ ์์ฒด์ ๋ณต์ก๋๋ ์ค์ผ ์ ์๋ค. ์ฆ, ๋ฌธ์ ์์ญ์ด ์๊ณ ์ดํด ๊ฐ๋ฅํ ์์ญ์ผ๋ก ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ๊ธฐ์ตํด์ผ ๋๋ ๊ฒ, ์ฃผ์ํ ๊ฒ๋ค์ ๋ํ ๋ฒ์๋ ์ค์ด๋ ๋ค.
2. ๋ณ์์ Scope(์ค์ฝํ)
2-1. ๋ก์ปฌ ๋ณ์์ ์ค์ฝํ
๋ก์ปฌ ๋ณ์๋ ๋ฉ์๋ ๋ฑ์ ๋ด๋ถ์์ ์ ์ธ๋ ์ผ์์ ์ธ ๋ณ์์์. Java๋ Ruby์์ ๋ก์ปฌ๋ณ์๋ ์ ์ธ๋ ์ฅ์๋ก๋ถํฐ ์ค์ฝํ๊ฐ ์์ ๋์ด, ์ ์ธ๋ ๋ธ๋ก์ด ๋๋๋ฉด ์ค์ฝํ๊ฐ ์ข ๋ฃ๋ผ์. => ๋ธ๋ก ์ค์ฝํ
[์] ์ค์ฝํ๊ฐ ๋๋ฌด ๊ธด ๋ก์ปฌ ๋ณ์
public boolean isClosing(Date now) {
Date open = null; // ๋ก์ปฌ๋ณ์ open/close์ ์ ์ธ์ ๋๋ฌด ์ผ์ฐํจ. ์ค์ฝํ ์์
Date close = null;
for(Timetable table : tables) {
open = getDate(table.openDateString()); // ์ค์ ๋ก ๋ก์ปฌ๋ณ์๊ฐ ์ฌ์ฉ๋๋ ์ค์ฝํ๋
close = getDate(table.openCloseStrin()); // for๋ฌธ ์์ชฝ ๋ฟ์
if(contains(now, open, close)) {
return false;
}
}
return true; // ์ค์ฝํ๊ฐ ๋
}
์ ์ฝ๋๋ฅผ ์งง๊ฒ ๊ณ ์ณ์ฐ๋ฉด ์๋ ์ฝ๋๊ฐ ๋ฉ๋๋ค. ๋ก์ปฌ ๋ณ์ open/close์ ์ ์ธ์ ์ค์ ๋ก ์ฌ์ฉํ๊ธฐ ์ง์ ์ ๋ฐ๋ก ํด์ค์ผ๋ก์จ ์ค์ฝํ๊ฐ ์์์ง ๋ชจ์ต์ ํ์ธ ํ ์ ์์ด์. ๋ก์ปฌ๋ณ์์ ์ค์ฝํ๊ฐ ์์์ง๋ฉด ๋ก์ปฌ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๋ฒ์๋ ์์์ง๋๋ค. ์ฆ ํด๋น ๋ก์ปฌ ๋ณ์์ ์ํฅ ๋ฒ์๊ฐ ์์์ ธ์ open/close์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ํํ๋ฅผ ๋ณ๊ฒฝํด๋ ๊ทธ ๋ณ๊ฒฝ์ ์ํฅ์ด ๋ฏธ์น๋ ๋ฒ์๊ฐ ๊ตญ์์ ์ผ๋ก ๋๋ฉ๋๋ค.
public boolean isClosing(Date now) {
for(Timetable table : tables) {
Date open = getDate(table.openDateString()); // ์ค์ฝํ ์์
Date close = getDate(table.openCloseStrin());
if(contains(now, open, close)) {
return false; // ์ค์ฝํ ๋
}
}
return true;
}
๋ ์ฒ๋ฆฌ๋ฅผ ๋ณ๋์ ๋ฉ์๋๋ก ์ถ์ถํ๋ ๋ฆฌํฉํ ๋ง์ ์ค์ํ๋ ๊ฒฝ์ฐ์๋ ๋ก์ปฌ ๋ณ์ ํต์งธ๋ก ๋ณ๋์ ๋ฉ์๋๋ก ์ด๋ํ ์ ์์ด์. ์ค์ฝํ๋ฅผ ์๊ฒ ํจ์ผ๋ก์จ ์์ ๋ฒ์๋ก ์ฒ๋ฆฌ ๋ด์ฉ์ด ์ขํ์ ธ์ ๋ฆฌํฉํ ๋ง์ด ์ฝ์ต๋๋ค.
์ค์ฝํ ์ค์ด๊ธฐ
1. ๋ณ์๋ ์ฌ์ฉํ๊ธฐ ์ง์ ์ ์ ์ธํ๋ค.
2. ๋ฉ์๋๋ก ์ถ์ถํ๋ค
3. ๋ฐ๋ณต์(Iterator)์์ ์ฌ์ฉํ๋ ์ผ์ ๋ณ์์ ์ค์ฝํ๋ฅผ ๋ฃจํ ๋ด๋ก ํ์ ํ๋ค.
4. ๋์ ๋์ง ์๋ ๋ณ์์๋ final์ ๋ถ์ธ๋ค.
2-2. ํ๋ ๋ณ์
ํ๋ ๋ณ์๋ ์ธ์คํด์ค(๊ฐ์ฒด)๋ณ๋ก ๋ณด๊ด/์ ์ง๋๋ ๋ณ์๋ฅผ ๋งํด์. ํ๋ ๋ณ์์ ์ค์ฝํ๋ ํ๋ ๋ณ์์ ์ง์ ๋ ์ ๊ทผ์ ํ์์ ์ํด ์ ํด์ ธ์.(public/private ๋ฑ) ํ๋ ๋ณ์์ ๋ํ ๊ฐ์์ฑ์ ์ค์ฝํ๊ฐ ์์ ์์๋๋ก ๋ค์ 4๊ฐ์ง๋ก ์ ๋ฆฌ ํด ๋ณผ ์ ์์ด์.
private < package private < protected < public
private ๊ฐ์ฒด ๋ด์์๋ง ์ก์ธ์ค ๊ฐ๋ฅ |
package private ๋์ผ ํจํค์ง๋ก๋ถํฐ๋ง ์ก์ธ์ค ๊ฐ๋ฅ |
protected ๋์ผ ํจํค์ง์ ํ์ ํด๋์ค์ ๊ฐ์ฒด๋ก๋ถํฐ๋ง ์ก์ธ์ค ๊ฐ๋ฅ |
public ๋ค๋ฅธ ๊ฐ์ฒด๋ก๋ถํฐ ์ก์ธ์ค ๊ฐ๋ฅ |
ํ๋ ๋ณ์๋ private์ด ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. ํ๋ ๋ณ์๋ฅผ ์ธ๋ถ๋ ํ์ ํด๋์ค๋ก๋ถํฐ ์ก์ธ์ค ํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ set/get ๋ฑ ์ก์ธ์ค์ฉ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
// ํ๋ ๋ณ์
private int count;
//set
public void setCount(int count) {
this.count = count;
}
// get
public int getCount() {
return this.count;
}
2-3. ํด๋์ค ๋ณ์
ํด๋์ค ๋ณ์๋ ํด๋์ค๊ฐ ๋ณด๊ด/์ ์งํ๋ ๋ณ์์์. ํด๋์ค ๋ณ์์ ์ค์ฝํ๋ ๊ฑฐ์ ๋๋ถ๋ถ์ ์ธ์ด์์ ํ๋๋ณ์์ ๋์ผํ ๊ฐ์์ฑ์ ์ง์ ํ ์ ์์ด์. ์๋ฐ์์ ํด๋์ค ๋ณ์๋ ํ๋ ๋ณ์์ ๊ฐ์ด 4์ข ๋ฅ๊ฐ ์์ด์.
private < package private < protected < public
private ํด๋์ค ๋ด์์๋ง ์ก์ธ์ค ๊ฐ๋ฅ |
package private ๋์ผ ํจํค์ง๋ก๋ถํฐ๋ง ์ก์ธ์ค ๊ฐ๋ฅ |
protected ๋์ผ ํจํค์ง์ ํ์ ํด๋์ค๋ก๋ถํฐ๋ง ์ก์ธ์ค ๊ฐ๋ฅ |
public ๋ค๋ฅธ ํด๋์ค๋ก๋ถํฐ ์ก์ธ์ค ๊ฐ๋ฅ |
ํด๋์ค ๋ณ์๋ private๊ฐ ๊ธฐ๋ณธ์ด์์. ํ์์ ๋ฐ๋ผ ์ธ๋ถ๋ก๋ถํฐ ์ก์ธ์ค ํ ํ์๊ฐ ์์ผ๋ฉด ์์๋๋ก package private, protected, public ํค์๋๋ฅผ ์ด์ฉํด์ ๊ฐ์์ฑ์ ๋์ฌ ๋๊ฐ ์ ์์ด์. ํด๋์ค ๋ณ์๋ ์ ์๋ก๋ ์ด์ฉํ ์ ์๋๋ฐ์. final ํค์๋๋ฅผ ๋ถ์ด๋ฉด ๋ฉ๋๋ค. final์ ๋ถ์ด๋ฉด ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ ๋ณ๊ฒฝํ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ public์ผ๋ก ๊ณต๊ฐํด๋ ๋น๊ต์ ์์ ํ ํธ์ด์์.
public class DateUtils {
// 1๋
์ time ๊ฐ์ ๋ํ๋ด๋ ์ ์, ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ
public static final long TIME_1YEAR = 60 * 60 * 24 * 365;
// ํ ๋ฌ์ time ๊ฐ์ ๋ํ๋ด๋ ์ ์, ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ
public static final long TIME_1MONTH = 60 * 60 * 24 * 30;
}
๋์ ์ ์๊ฐ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ๋ ๋ด๋ถ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํด์ผ ํฉ๋๋ค. ๋ค์ ์ฝ๋์์ ์ปฌ๋ฌ ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ ์ฝ๋์์ ์ก์ธ์ค ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ๊ฐ์ ์์๋ก ๋ณ๊ฒฝํ๊ธฐ๊ฐ ์ฝ์ต๋๋ค.
public class Colors {
public static final List<Stirng> BASIC_COLORS =
Arrays.asList(new String[] { "blue", "red", "green" });
}
public class Client {
public static void main(String[] args) {
// ๋๊ตฌ๋ผ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ค.
Colors.BASIC_COLORS.add("yellow");
}
}
์์ ์ฝ๋์์ ์๋ฌด๋ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋๋ก ํ๊ธฐ ์ํด์๋ ์ปฌ๋ ์ ์ ์จ ์ฃผ๋ฉด ๋ฉ๋๋ค.
public class Colors {
// Collections#unmodifiableList ๋ฉ์๋ ์ฌ์ฉ
// ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ List ์์ฑ
public static final List<String> BASIC_COLORS =
Collections.unmodifableList(
Arrays.asList(new String[] {"blue", "red", "green"}));
}
public class Client {
public static void main(String[] args) {
// ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ฉด UnsupportedOperationException ์ด ๋ฐ์(์์ )
Colors.BASIC_COLORS.add("yellow");
}
}
3. ๋ฉ์๋์ ์ค์ฝํ
3-1. ์ธ์คํด์ค ๋ฉ์๋
์ธ์คํด์ค ๋ฉ์๋๋ ์ธ์คํด์ค(๊ฐ์ฒด)์ ๊ฒฐ๋ถ๋์ด ํธ์ถํ ์ ์๋ ๋ฉ์๋๋ฅผ ๋งํด์. ์ธ์คํด์ค ๋ฉ์๋๊ฐ public์ธ ๊ฒฝ์ฐ, ๋ฉ์๋๋ ์ธ๋ถ๋ก ๊ณต๊ฐ๋์ด ์์ด ์์ ๋กญ๊ฒ ํธ์ถ๋์ด์ ธ ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํด์๋ผ๋ฉด ๊ผญ ํ์ํ ๊ฒ๋ง public์ผ๋ก ํด์ผ ํฉ๋๋ค.
3-2. ํด๋์ค ๋ฉ์๋
ํด๋์ค ๋ฉ์๋(static ๋ฉ์๋)๋ ํด๋์ค์ ์ํด ์๋ ๋ฉ์๋์ ๋๋ค. ์๋ฐ์์๋ ํด๋์ค ๋ฉ์๋๋ฅผ static ํค์๋๋ฅผ ๋ถ์ฌ์ ์ ์ธํด์. ํด๋์ค ๋ฉ์๋๋ ํ๋ ๋ณ์๋ฅผ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. ํ๋ ๋ณ์์ ๊ด์ ์์ ๋ณด๋ฉด, ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ํด๋์ค ๋ฉ์๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์๋ ์ํฅ ๋ฐ๋ ๋ฉ์๋๊ฐ ์ค์ด๋ค๊ฒ ๋์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค์ฝํ๊ฐ ์์์ง๊ฒ ๋ฉ๋๋ค. ํ๋ ๋ณ์์ ์ก์ธ์ค ํ ํ์๊ฐ ์๊ณ ์ค๋ฒ๋ผ์ด๋ ๋ฑ์ด ํ์๊ฐ ์๋ ๋ฉ์๋๋ ํด๋์ค ๋ฉ์๋๋ก ํ๋ ํธ์ด ์ข์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ธ์คํดํธ ๋ฉ์๋
private int count; // ๋ณ์ count์ ์ค์ฝํ ์์
private String regexGroup(String regex) {
// ํ๋ ๋ณ์์ ์ก์ธ์ค ๊ฐ๋ฅ
return "(" + regex + ")";
} // ๋ณ์ count์ ์ค์ฝํ ๋
์ ์ฝ๋๋ฅผ static ๋ฉ์๋๋ก ๋ณ๊ฒฝ
private int count; // ๋ณ์ count์ ์ค์ฝํ ์์
.
.
.
// ๋ณ์ count์ ์ค์ฝํ ๋
private static String regexGroup(String regex) {
// ํ๋ ๋ณ์์ ์ก์ธ์ค ๋ถ๊ฐ
return "(" + regex + ")";
}
.
.
.
// ๋ณ์ count์ ์ค์ฝํ
4. ํด๋์ค์ ์ค์ฝํ
4-1. ํด๋์ค์ ์ค์ฝํ
์๋ฐ์์ ํด๋์ค์ ์ค์ฝํ๋ private, package private, protected, public 4์ข ๋ฅ์ด๋ค. ํด๋์ค์ ์ ์ธ์์๋ ์ฃผ๋ก public์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๋ ์ํฉ์์ package private๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ์์๊ฒ ์๋ฆฌ๊ณ ์ถ์ง ์์ ํด๋์ค๋ package privateํด ๋๋ฉด ๋์ค์ ํด๋์ค๋ฅผ ๋ณ๊ฒฝ ํ ๋์๋ ๊ทธ ๋ณ๊ฒฝ์ ์ํฅ์ ์ด์ฉ์์๊ฒ ์ฃผ์ง ์๊ฒ ํ ์ ์์ต๋๋ค. ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ์๊ฐ ์ ํ์ ์๋ ํด๋์ค๋ package private๋ก ์ ๋ฆฌํด ๋๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ private๋ ๋ ๊ฐ์ง์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋๋ฐ, 1. ์ธ์คํด์ค์ ์์ฑ์ ํด๋น ํด๋์ค์์๋ง ์ค์ํ๊ฒ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ(๋์์ธ ํจํด์ ์ฑ๊ธํค ํจํด ๋ฑ)์ ๋๋ค. ํ์ง๋ง ๋ฉ์ธ ํด๋์ค๋ private๋ก ์ ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฑ์(constructor)์ private๋ก ์ ์ธํด์ ๋ค๋ฅธ ํด๋์ค ์์์๋ ์ธ์คํด์ค์ ์์ฑ์ ํ ์ ์๊ฒ ํด์ค๋๋ค.
ํฌ์คํ ์ ์ฐธ๊ณ ํ ์๋ฃ : ์ข์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ธฐ์ /์๊ฐํ ํ ์ํ์นด, ์ ์ธ์