โ ํ๋์จ์ด : ์ฌ๋์ด ๋ฐ๋ก ๊ฑท์ด์ฐฐ ์ ์๋ ์ปดํจํฐ์ ๋ถ๋ถ โ
- Jeff Pesis
ํ๋ก๊ทธ๋๋จธ

์บก์ํ (Encapsulation)
์บก์ํ๋ ์ฝ๊ฒ ๋งํ๋ฉด ๋ณ์๋ ๋ฉ์๋๋ค์ ์บก์๋ก ๊ฐ์ธ์ ์๋ณด์ด๊ฒ ํ๋ ์ ๋ณด ์๋ ๊ฐ๋ ์ค ํ๋์ด๋ค.
์ฐ๋ฆฌ๊ฐ ๋จน๋ ์์ฝ์ ์๊ฐํด๋ณด๋ฉด ๋๋ค.
์์ฝ์ ์ค์ ์ฝ ๋ด์ฉ์ ๊ฐ๋ฃจ์ฝ์ด์ง๋ง, ์ด๊ฒ์ ์บก์๋ก ๊ฐ์ธ๋ฉด์ ๋ง์ ์๋ํ์ฌ ์ฌ๋์ด ๋จน๊ธฐ ํธํ๊ฒ ํ์์ผ๋ฉฐ, ๋ํ ๋ณต์กํ ์ฌ๋ฃ๋ค์ ๋ฐฐํฉ์ ์บก์๋ก ํฌ์ฅํ์ฌ ๋ค๋ฃจ๊ธฐ ํธํ๊ฒ ํ์๋ค.

์ด์ฒ๋ผ ์บก์ํ๋ ๊ฐ์ฒด์ ์์ฑ(Field)๊ณผ ํ์(Method)๋ฅผ ํ๋๋ก ๋ฌถ๊ณ , ์ธ๋ถ๋ก ๋ถํฐ ๋ด๋ถ๋ฅผ ๊ฐ์ธ ์จ๊ฒจ ์๋ํ๋ค. ๋ํ ์ธ๋ถ์ ์๋ชป๋ ์ ๊ทผ์ผ๋ก ๊ฐ์ด ๋ณํ๋ ์๋์น ์๋ ๋์์ ๋ฐฉ์งํ๋ ๋ณดํธ ํจ๊ณผ๋ ๋๋ฆด ์ ์๋ค.
์๋ฐ์์๋ ๋ํ์ ์ผ๋ก protected , default , private์ ์ ๊ทผ์ ์ด์๋ฅผ ํตํด ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
class Time {
private int hour; // hour๋ ์ธ๋ถ์์ ์ ๊ทผํ์ง ๋ชปํ๊ฒprivate์ผ๋ก ์ ์ธํ๋ค.
// Setter
public void setHour(int hour) {
if (hour < 0 || hour > 24) { // hour์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ
return;
} else {
this.hour = hour;
}
}
// Getter
public int getHour() {
return hour;
}
}
public class Main {
public static void main(String[] args) {
MyTime time = new MyTime();
// ์ ํจํ์ง ์์ parameter ์
๋ ฅ
time.setHour(25);
System.out.println("Hour: " + time.getHour()); // 0
// ์ ํจํ parameter ์
๋ ฅ
time.setHour(13);
System.out.println("Hour: " + time.getHour()); // 13
}
}
์์ ์ฝ๋๋ ์๊ฐ์ ๋ฉ์๋๋ก ์ ๋ ฅ๋ฐ๊ณ , ์ถ๋ ฅํ๋ ์์ฃผ ๊ฐ๋จํ ์บก์ํ ์์ ์ด๋ค.
์ฌ๊ธฐ์ ํด๋์ค์ hour ๋ฉค๋ฒ๋ณ์๋ private์ผ๋ก ์ ์ธํจ์ผ๋ก์จ ๋ค๋ฅธ ํด๋์ค์์์ ์ ๊ทผ์ ์ ํํด ๋์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด private hour ๋ณ์๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์๋ setter method์ธ setHour(int hour)์ getter method์ธ getHour()์ ํธ์ถ์ ํตํด์๋ง ๊ฐ๋ฅํ๋ค.
ํนํ ์ด๋ฌํ ๋ฉ์๋๋ก ํตํ ์ ๊ทผ ๊ธฐ๋ฒ์ ์ข์ ์ ์ ์ ํจํ์ง ์์ ์ซ์๋ก ์ง์ ๋ณ์ hour๋ฅผ ์
ํ
ํ๋ ค๋ ์๋๋ฅผ ๋ฉ์๋ ๋ด๋ถ์์ ์ ํจ์ฑ ์ฒดํฌ ๋ก์ง์ ํตํด ๊ฑฐ๋ฅผ ์ ์๋ค๋ ์ ์ด๋ค
String ํด๋์ค์ ์บก์ํ
์ค์ ์๋ฐ์์์ ์บก์ํ์ ๋ํ์ ์ธ ํ๋ณธ์ผ๋ก๋ ์ ๋ง ์์ฃผ ์ฌ์ฉ๋๋ String ํด๋์ค๋ฅผ ๋ค ์ ์๋ค.
์๋ ์ฌ์ง์ ์ค์ ๋ก ์๋ฐ ์ฝ๋์ ๊ตฌํ๋์ด ์๋ String ํด๋์ค์ ๋ด๋ถ ๋ชจ์ต์ด๋ค.

๋ณด๋ค ์ํผ String ํด๋์ค ์์ฒด๋ public์ผ๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋์๋ ์ ๊ทผ์ ํ ์ ์์ด ๊ฐํธํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฐ๋ฐ final๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ์์์ ๋ถ๊ฐ๋ฅํ๋ค. (String ํด๋์ค๋ฅผ ์์ํ์ฌ ์ฌ์ฉํด๋ณธ ์ ์ ์์ ๊ฒ์ด๋ค)
String ํด๋์ค ๋ด๋ถ์ ํ๋๋ค์ ๋ณด๋ฉด ๋ค๋ค private ์ ์ด์๋ก ์ ์ธ ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ, ์ง์ ์ ์ผ๋ก ๋ฌธ์์ด๊ฐ์ ์ ๊ทผํด์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ด๋ค.
์ค์ ๋ก ์คํธ๋ง ๋ฐ์ดํฐ๋ ๋ถ๋ณ์ ๋ฐ์ดํฐ๋ผ๊ณ ๋ถ๋ฆฌ์ฐ๋๋ฐ ๊ทธ ์ด์ ๊ฐ ๋ฐ๋ก ์์ ๊ฐ์ด ์บก์ํ๊ฐ ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ String ํด๋์ค๋ฅผ ํตํด ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ข password ๋ฐ encoding/decoding ์์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ผ๋ก ๊ต์ฅํ ๋ฏผ๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ข๋ String ํด๋์ค์ ๋ํด ์ ๋ฌธ์์ด ๋ฐ์ดํฐ๊ฐ ๋ถ๋ณ์ธ์ง ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[JAVA] โ String ํ์ ํน์ง ์ดํดํ๊ธฐ (String Pool & ๋ฌธ์์ด ๋น๊ต)
์ฌํ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ฌธ์์ด ์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด string ์ด๋ผ๋ ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉํ๋ค. ์ด string ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋๋ฐ ์์ด ํน๋ณํ ์ ์ํด์ผ ํ ์ ์ ์์ด๋ณด์ด์ง๋ง, ์๋ฐ
inpa.tistory.com
์ ๋ณด ์๋ (OOP์ ํต์ฌ)
์ ๋ณด ์๋์ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ๋ฉด, ๊ฐ์ฒด์งํฅ ์ธ์ด์ ์์๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ฒด์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ๋ ธ์ถ์ํค์ง ์๋๋ก ํ๋ ๊ธฐ๋ฒ์ ์นญํ๋ค.
์ฌ์ค ๋ง์ ์๋ด๊ธฐ ๊ฐ๋ฐ ๊ต์ก์๋ค์ ๊ฐ์ฒด ์งํฅ ํํธ์ ๋ค์ด์๋ฉด ๋๊ฒ ์บก์ํ == ์ ๋ณด ์๋ ์ผ๋ก ์ฃผ์ ์ ์๊ธฐ๋ฅผ ํ๋ค. ์ด๋ ํ๋ฆฐ ์๋ฆฌ๋ ์๋์ง๋ง ์ ๋ณด ์๋ ๊ฐ๋ ์ ๋ฐ๊ฐ๋ฝ๋ง ๋ด๊ตฌ๊ณ ๋์ด๊ฐ๋ ๊ผด๊ณผ ๋ค๋ฆ์ด ์๋ค.
์ข๋ ์์ธํ ๋ค์ด๊ฐ์๋ฉด, ์๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ณด ์๋ ๊ธฐ๋ฒ์ ๋ํ์ ์ผ๋ก 3๊ฐ์ง ์ ๋๊ฐ ์๋ค.
- ๊ฐ์ฒด์ ๊ตฌ์ฒด์ ์ธ ํ์ ์๋ ( = ์ ์บ์คํ )
- ๊ฐ์ฒด์ ํ๋ ๋ฐ ๋ฉ์๋ ์๋ ( = ์บก์ํ)
- ๊ตฌํ ์๋ ( = ์ธํฐํ์ด์ค & ์ถ์ ํด๋์ค)
์ฆ, ์บก์ํ == ์ ๋ณด ์๋์ด ์๋๋ผ, ์ ๋ณด ์๋ ๊ธฐ๋ฒ์ค ํ๋๊ฐ ์บก์ํ ๋ผ๋ ๊ฒ์ด๋ค.
์ด๋ฐ์๋ ์ ์บ์คํ ๊ณผ ์ธํฐํ์ด์ค ๊ตฌํ ์ญ์ ์ ๋ณด ์๋ ์ธก๋ฉด์ ํฌํจ ๋๋ค. ๋ถ๋ชจ ํด๋์ค ํ์ ์ผ๋ก ํตํฉ์ ํ๊ฑฐ๋ ์ธํฐํ์ด์ค ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ ์ญ์ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์ ์ ์๋ ํจ์ผ๋ก์จ ๋ณด๋ค ๋คํํ๊ฒ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ณด ์๋ ์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ณด์๋ฉด ๋ฌด์ธ๊ฐ ์ ๋ณด๋ฅผ ์๋ํ์ฌ ๋ณด์์ ์ธ ํจ๊ณผ๋ฅผ ์ป๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฌ๋ ๋ณด์์ ์ธ ์ธก๋ฉด ๋ฟ๋ง ์๋๋ผ, ์๋๋์ด ์ํ์๊ฐ ์์ด ๋ ์์๋ ๋์ด ๋ ๊ณต๋ถํ์ฌ๋ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์๋ฏธ๋ ๋ดํฌํ๋ค.
์ฐ๋ฆฌ๊ฐ ์๋์ฐจ๋ฅผ ๋ชฐ๋ ์์ง์ด ์ด๋ป๊ฒ ๊ตฌ๋๋์ด ๋ฐํด๊ฐ ๊ตด๋ฌ๊ฐ๋์ง ์ง์ ํ์์์ด ํ๋ฌ๋ง ๋ฐ์ผ๋ฉด ์๋์ฐจ๊ฐ ๊ตด๋ฌ๊ฐ๋ค.
์ด๊ฒ์ด ์๋์ฐจ ์๋ฆฌ ์ค๊ณ ์ ๋ณด๋ฅผ ์๋ํจ์ผ๋ก์ ๊ฒฝ์์ฌ๋ก๋ถํฐ ์ ํ๋ด๋ถ๋ฅผ ์์ง๋ชปํ๊ฒ ๋ณด์ํ๋ ํจ๊ณผ๋ ์์ง๋ง ์๋น์๊ฐ ํ๋ฌ๋ง ๋ฐ์ผ๋ฉด ์๋ํ๋๋ก ๋จ์ํ ํ๊ฒ๋ ํฌํจํ๋ค. ์ด๋ ์ถ์ํ ๊ฐ๋ ๋ ์ฐ๊ฒฐ๋๋ ๋๋ชฉ์ด๊ธฐ๋ ํ๋ค.
๊ฐ์ฒด ์งํฅ ์ธ์ด๋ฅผ ํตํด ๋ง๋ค์ด์ง ๋์์ธ ํจํด๊ณผ ๊ฐ์ด ์ข์ ์ค๊ณ๋ฅผ ๋ํ ํ ๋งํ ๊ฒ๋ค์, ์ฌ์ค ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ธฐ์๋ฉด ์ ๋ณด ์๋ ๊ธฐ๋ฒ์ ํตํด ์ป๋ ์ด๋์ ๊ทน๋ํ ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฒ๋ค์ด๋ค.
๊ฐ์ฒด์งํฅ์ ์ค๊ณ ์์น(SOLID) ๊ณผ ๊ฐ์ข ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๊ด๋ จ๋ ๊ฒฉ์ธ๋ค๋ ์ญ์ ์ ๋ณด ์๋์ ๊ธฐ๋ฐ์ ๋์๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๋ค.
๋ฐ๋ผ์ ์ ๋ณด ์๋ ๊ฐ๋ ์ ์ ์๊ณ ์๋ค๋ฉด, ๊ทธ์ ํ์๋ oop ํจํด ๊ธฐ๋ฒ๋ค์ ๋ํด ์ ์ด๋ฐ ํจํด์ด ์๊ฒจ๋ฌ๋์ง ๊ทธ๋ก ์ธํด ์ด๋ ํ ์ด๋์ ์ป์ ์ ์๋์ง ์์ฐ์ค๋ฝ๊ฒ ์ดํดํ ์ ์๊ฒ ๋๋ค.
๊ฐ์ฒด์ ํ์ ์๋ (์ ์บ์คํ )
์ฌ์ค ์์ ๊ฐ์ฒด์ ํ์ ์ ๋ถ๋ชจ ๊ฐ์ฒด์ ํ์ ์ผ๋ก ํ๋ณํ ํ๋ UpCasting๋ ์ผ์ข ์ ์ ๋ณด ์๋์ด๋ค.
์๋ํ๋ฉด ๊ตฌ์ฒด์ ์ธ ์์ ๊ฐ์ฒด์ ํ์ ์ ์๋ํจ์ผ๋ก์จ ์ป๋ ํจ๊ณผ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. (๋คํ์ฑ)
์๋ฅผ๋ค์ด ์๋์ ๊ฐ์ด Rectangle ํด๋์ค๋ฅผ ์ง์ ์ ์ํ์ฌ ๋ฉ์ธ ๋ฉ์๋์์ ์ฌ์ฉํ๋ค๋ฉด, ๊ฒฐ๊ตญ ์ด๊ฒ์ Rectangle ์ด๋ผ๋ ๊ฐ์ฒด์ ์ ์ ์ผ๋ก ์์กดํ๋ ์ฝ๋๊ฐ ๋๊ฒ ๋๋ค.
๋ง์ผ Rectangle ํด๋์ค ๊ตฌ์ฑ์ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์๊ธดํ๋ฉด ๋ฉ์ธ ๋ฉ์๋๋ ์ํฅ์ ๋ฐ๊ฒ ๋๋ค.
class Rectangle{
public void rectangle(){
System.out.println("rectangle");
}
}
class Myclass {
// ...
public void method() {
Rectangle rectangle = new Rectangle(); // Rectangle ๊ฐ์ฒด ์์ฑ
rectangle.rectangle(); // Myclass ํด๋์ค๋ Rectangle ํด๋์ค์ ์์กด์ ์ธ ์ฝ๋
}
}
๋ง์ฝ Rectangle๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ํ๋ ๊ฐ์ฒด Square ๋ Triangle์ ์ถ๊ฐ๋ก ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํ์.
๊ทธ๋ฆฌ๊ณ ๊ธฐํ์ด ๋ฐ๋์ด Rectangle ๋์ Triangle์ ์ฌ์ฉํ๋๋ก ์ค๊ณ์๊ฐ ๋ฐ๋์๋ค๊ณ ํ์.
ํ์ฌ ์ํ๋ก์๋ ๋ฉ์ธ ๋ฉ์๋์ ์๋ ์ด๊ธฐํ ์ฝ๋๋ถํฐ ๋ฉ์๋ ์ฌ์ฉ ์ฝ๋๋ฅผ ํต์งธ๋ก ๋ฐ๊พธ์ด ์ฃผ์ด์ผ ํ๋ค.
๋ฐ๋ผ์ Rectangle, Triangle .. ๋ฑ ํด๋์ค ํ์ ์ ํ๋์ ํ์ ์ผ๋ก ํตํฉ ํ ์ ์๋ Shape ๋ผ๋ ์ถ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋คํ์ฑ์ ํจ๊ณผ๋ฅผ ์ด์ฉํด ๊ตฌํํด์ค๋ค.
์ด๋ ๋์ฌ๊ฒจ ๋ณด์์ผ ํ ๊ฒ์ด ๊ฐ์ฒด์ ํธํ์ฑ์ ์ํด ๋ฐ๋ก ์ถ์ ๋ฉ์๋ draw()๋ฅผ ๊ตฌํํ๋ ค๊ณ ๋ช
์ํ ๊ฒ์ด๋ค.
๊ณต๊ฐ ๋ฉ์๋ draw() ๋ฅผ ํตํด ๊ฐ ์์ ๊ฐ์ฒด์ ๋ด๋ถ ๋ฉ์๋ rectangle() , trinagle() ์ ์คํํ๋๋ก ํ๋ฉด ๋ง์น ๊ณตํต ๋ถ๋ชจ๋ฅผ ๋ฌถ์ด ํธํ์ด ๋๊ฒ ๋๋ค.
abstract class Shape{
abstract public void draw(); // ํ๋์ ๊ณตํต ๋ฉ์๋๋ก ๊ฐ ์์ ํด๋์ค ๊ณ ์ ์ ๋ฉ์๋ ๋์์ด ์คํ๋๋๋ก ์ถ์ํ
}
class Rectangle extends Shape{
public void draw(){
rectangle();
}
private void rectangle(){
System.out.println("rectangle");
}
}
class Triangle extends Shape{
public void draw(){
triangle();
}
private void triangle(){
System.out.println("triangle");
}
}
public class Myclass {
// ...
public void method() {
Shape shape = new Rectangle(); // ๋คํ์ฑ
shape.draw(); // "rectangle" - ๊ตฌ์ฒด์ ์ธ Rectangle ๊ฐ์ฒด ํ์
์ ์์กด์ ์ด์ง ์๊ฒ ๋๊ณ ์ถ์ ํตํฉ ํ์
์ธ Shape ํด๋์ค์ ์์กด์ ์ด๊ฒ ๋์๋ค
}
}
์ฒ์ ์ฝ๋์ ๊ฐ์ด new Rectangle() ํตํด ์์ฑํ์ง๋ง, ์์ ํ์
์ธ Shape ํด๋์ค ์ฐธ์กฐ ๋ณ์์ธ shape์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์๋ค.
์ฆ, ๋ฉค๋ฒ ๊ฐ์๊ฐ ์ผ์ด๋ ์ดํ์ shape ์ฐธ์กฐ ๋ณ์๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๋ Shape ํด๋์ค์ ์ถ์ ๋ฉ์๋๋ก๋ง ์ ํ๋๊ฒ ๋๋ค.
๊ทธ๋์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์์ฑ ์ดํ์๋ Shape ํด๋์ค์ draw() ๋ฉ์๋๋ง์ ํธ์ถํจ์ผ๋ก์จ, Rectangle ํด๋์ค์ ๊ด๋ จ๋ ๋ฉ์๋ private void rectangle() ๊ฐ ์ง์ ์ ์ผ๋ก ํธ์ถ๋์ง ์๊ฒ ๋๋ค.
๊ฒฐ๊ตญ ๊ฐ์ฒด ํ์ ๊ณผ ๋ฉ์๋๋ฅผ ์๋ํ ๊ฒ์ด๋ค.
์ด๋ฌํ ์ ๋ณด ์๋์ ํตํด์ ์ป์ ์ ์๋ ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
Rectangle์ ์์ฑ ์ฝ๋ ์ดํ์๋ ์ด๋ค ์ฝ๋๋ Rectangle ํด๋์ค์ ์์กดํ์ง ์๋๋ค. (Shape ํด๋์ค๋ก ๋ฌถ์์ผ๋๊น Shape ํด๋์ค๋ง ์ ๊ฒฝ ์ฐ๋ฉด ๋๋ค)
๋ฐ๋ผ์ Rectangle ๋์ ์ Triangle์ ์ฌ์ฉํ๊ณ ์ถ์ด์ก์ ๋์๋ new Rectangle() ๋์ new Triangle()์ ์์ฑํ๋๋ก ๋ณ์ ํ ๋น๋ฌธ์ ์์ ํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ๊ทธ ์ดํ์ ์ฝ๋๋ค์ ์ ํ ์์ ๋ ํ์๊ฐ ์๋ค. (๊ฒฐ๊ตญ ์ ๋ณด ์๋์ ํจ๊ณผ๋ก ๋คํ์ฑ์ ํจ๊ณผ๋ฅผ ๋๋ฆฌ๊ฒ ๋๋ ๊ฒ๊ณผ ๊ฐ๋ค)
public class Myclass {
// ...
public void method() {
// Shape shape = new Rectangle();
Shape shape = new Triangle(); // ๋ณ์ ํ ๋น๋ฌธ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด draw() ํธ์ถ ๋ถ๋ถ ์ฝ๋๋ ๋ฐ๊พธ์ง ์์๋ ์์์ ๋์
shape.draw(); // "triangle"
}
}
๋ง์ฝ์ ์์ ํ ๊ฐ์ฒด๋ฅผ Triangle๋ก ๋ณ๊ฒฝํ๋๊ฒ ์๋ Rectangle์ ์ฌ์ฉํ๋ค๊ฐ ์์ฃผ ์ ์ ๋ฉ์๋๋ฅผ ์คํํ๊ธฐ ์ํด Triangle์ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ๋ ๋ฐ์ํ ์ ์๋ค.
์ด๋๋ ๋ค์ด์บ์คํ (downcasting)์ ํตํด ๋์ ์ผ๋ก ๊ธฐ๋ฅ์ ๊ต์ฒดํ๋ฉด๋๋ค.
์ฆ, ์ด๋ฏธ ์ ์ธ๋์ด ์๋ shape ์ฐธ์กฐ ๋ณ์์ (Triangle) ์บ์คํ
๋ง ํด์ฃผ๋ฉด ๊ธฐ๋ฅ ์ ํ๋ ๋์ ์ผ๋ก ์ฝ๊ฒ ํ ์ ์๋ค.
public class Myclass {
// ...
public void method() {
Shape shape = new Rectangle();
shape.draw(); // "rectangle"
// ๋ค์ด์บ์คํ
์ ํ๊ณ ๋ฉ์๋ ์คํ
((Triangle) shape).draw(); // "triangle"
}
}
์ด์ฒ๋ผ ์ ์บ์คํ / ๋ค์ด์บ์คํ ์ด ๋จ์ํ ๊ฐ์ฒด ํ๋ณํ ์๋ฏธ๋ฅผ ๋ ๋์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ค๊ณ์ ๊ต์ฅํ ์ค์ํ๋ค๋ผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋์ฑ ๊ฐ์ฒด๋ฅผ ์๋ํ๋ผ (๋์์ธ ํจํด)
ํ์ง๋ง ์์ ์ฝ๋๋ ์๋ฒฝํ ๊ฒ์ ์๋๋ค.
์ฌ์ค ์์ํ ๋ฌธ์ ๊ฐ ๋ช๋ช ์๊ธฐ ๋๋ฌธ์ ์ข๋ ๋ฆฌํฉํ ๋ง์ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ๊ทธ๋์ ๋์จ๊ฒ ํ๋ฒ์ฏค์ ๋ค์ด๋ณธ ๋์์ธ ํจํด๋ค์ด ๊ทธ๊ฒ์ด๋ค.
๋ค์ ์ฝ๋๋ ๊ฐ๋ตํ๊ฒ ๋ฆฌํฉํ ๋ง ํด๋ณธ ๋์์ธ ํจํด(ํฉํ ๋ฆฌ ํจํด) ์ฝ๋์ ๊ฐ๋จํ ์์ ์ด๋ค.
abstract class Shape{
abstract public void draw();
}
class Rectangle extends Shape{
public void draw(){
rectangle();
}
private void rectangle(){
System.out.println("rectangle");
}
}
class Triangle extends Shape{
public void draw(){
triangle();
}
private void triangle(){
System.out.println("triangle");
}
}
// Shape์ ์ฐ๊ด๋ ์์ ๊ฐ์ฒด๋ค์ ์ฐ์ด๋ด๋ ํฉํ ๋ฆฌ๋ผ๋ ํด๋์ค๋ฅผ ์๋ก ๋ง๋ ๋ค.
class ShapeFactory{
public Shape create_R() { // ๋ฆฌํด ํ์
์ด Shape
return new Rectangle();
}
public Shape create_T() { // ๋ฆฌํด ํ์
์ด Shape
return new Triangle();
}
}
public class Myclass {
// ...
public void method() {
ShapeFactory factory = new ShapeFactory(); // ํฉํ ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ
Shape shape = factory.create_T(); // ํฉํ ๋ฆฌ ๋ฉ์๋๋ก Shape์ ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋๋ก ์ฐํํด์ค๋ค. ๋ฆฌํด ํ์
์ด Shape ์ด๋ฏ๋ก ๋ณ์์ ํ์
๋ Shape๋ก ํด์ค๋ค.
shape.draw(); // "triangle"
}
}
Shape์ ๊ตฌ์ฒด์ ์ธ ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฑ ์์ ๋ด๋นํ๋ ShapeFactory ํด๋์ค๋ฅผ ์๋ก ๋ง๋ค์ด ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ShapeFactory ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ณด๋ฉด ๊ฐ์ฒด์ ์์ฑ๊ณผ ํจ๊ป Shape ํ์ ์ผ๋ก ๋ฐํ ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ค๋ก์ง Shape ํด๋์ค์ ShapeFactory ํด๋์ค๋ง์ผ๋ก Rectangle, Triangle ํด๋์ค๋ฅผ ์์ฑํ ์ ์๊ฒ ๋๋ค.
์ฆ, ์๋ฒฝํ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด์ ๋ํ ์ ๋ณด ์๋์ ํ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ ์ ๋ณด ์๋์ด ๋๋ฉด ๋ ์๋ก, ๊ฐ์ฒด์ ๊ต์ฒด๋ ๋ณ๊ฒฝ์ด ์ฌ์์ง๊ฒ ๋์ด ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋ฐ ์์ฐ์ฑ์ด ํฅ์ ๋๊ฒ ๋๋ค.
๊ฐ์ฒด์ ํ๋ & ๋ฉ์๋ ์๋ (์บก์ํ)
์บก์ํ์ ์์ ๋ ์์์ ๋ค๋ค์ผ๋ ํด๋์ค ํ๋์ private ํ๋ ๋์ด๊ฐ๊ฒ ๋ค.
๋ค๋ง private ๋ณ์์ ๋๋ถ์ด ์บก์ํ์ ์์ด์ ์ค์ํ ์ ์ด ๋ฐ๋ก private ๋ฉ์๋ ์ด๋ค.
์๋ ๋ฉ์๋์ ๋ํด์๋ ์๋์ ์ผ๋ก ๊ฐ์กฐ๊ฐ ์ ์ ํธ์ด๋ผ ๋ค์ด๋ณธ์ ์ด ์์ํ ๋ฐ ๋ค์ ์ฝ๋๋ฅผ ๋ด๋ณด์.
class Process{
public void init(){}
public void process(){}
public void release(){}
}
์์ Process ํด๋์ค๋ฅผ ๋ณด๋ฉด ๋์ ๋ฉ์๋๊ฐ ๋ชจ๋ public ์ผ๋ก ์ง์ ๋์ด ์๋ค.
์ด๋ง์ ์ธ๋ถ์์ ์ด ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์ ๋ํด์๋ ๋ชจ๋ 3๊ฐ์ ๋ฉ์๋์ ์์กดํ๊ฒ ๋๋ค๋ ๋ง์ด๋ค.
๋ค์ ํ๋ฒ ๋งํ์๋ฉด, ์ด๋ ํน์๋ผ๋ ์์กด ๋์ด์๋ Process ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฑฐ๋ ์ ๊ฑฐ๋ฅผ ํ๋ ๋ฑ์ ์์ ์ด ๋ฐ์ํ์ ๋, Process ํด๋์ค ์์์ ์ฌ์ฉํ๋ ํด๋์ค์์ ๋ฐฉ๋ํ ์ฝ๋ ์์ ์ ํด์ผ ํ๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค.
๋ํ ๋ถํ์ํ๊ฒ ๋ง์ ์์ ๋ฉ์๋๋ฅผ ๋ ธ์ถ์ํค๋๋ฉด, ํธ์ถ ์์์ ๋ํด ์ฐ๊ด๊ด๊ณ๋ฅผ ์ ์ถํ๋๋ฐ ์ด๋ ค์์ด ์๊ธฐ๊ณ ,์ด๋ ๋ฉ์๋๊ฐ ์ค์ํ์ง ์ค์๋๋ฅผ ์ ์ถํ๋๋ฐ ์์ด ์ด๋ ค์์ด ์๊ธด๋ค.
๊ทธ๋์ ํ๋ก์ธ์ค์ ๋์์ ๊ดํ ๋ฉ์๋๋ค์ ๋ชจ๋ privateํ ํ์ฌ ์๋์ํค๊ณ work() ๋ผ๋ ํผ๋ธ๋ฆญ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ์์๋ค ๋ฉ์๋ ์คํ์ ํด์ค์ผ๋ก์จ ๊ทน๋ณต ํ ์ ์๋ค.
class Process{
private void init(){} // ์๋ ๋ฉ์๋
private void process(){} // ์๋ ๋ฉ์๋
private void release(){} // ์๋ ๋ฉ์๋
public void work(){ // ๊ณต๊ฐ ๋ฉ์๋
init(); // ์๋ํ ๋ฉ์๋ ์คํ
process();
release();
}
}
์ด๋ฅผ ํตํด ์ ์ ํ ์์ค์์ ๋ฉ์๋๋ค์ด ๊ณต๊ฐ์ ๋น๊ณต๊ฐ๋ก ๋๋์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ๋ฉ์๋๋ฅผ ์ฐ์ ์ดํด์ผ ํ ์ง๋ฅผ ์ ์ ์์ผ๋ฉฐ, ๋ํ ๊ฐ๋ณ ๋ฉ์๋๋ค์ ํธ์ถ ์์๋ฅผ work() ๋ฉ์๋์์ ์ ํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ Process ๊ฐ์ฒด ์ฌ์ฉ์ ๋ํ ์ฌ์ฉ๋ฒ์ ์ ์ ํ์ต๋์ผ๋ก ์ฝ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํด ์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ์๋๋ค์ ์๋ ํจ์ผ๋ก์จ ๊ฐ์ฒด์ ์ธ๋ถ ๋ด์ฉ์ ๋ ๋ ธ์ถ์ํค๊ฒ ๋์ด ๋ณด์์๋ ํจ๊ณผ๊ฐ ์๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๊ณต๊ฐ ๋ฉ์๋์ ์๋ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํ๊ณ ๊ณต๊ฐ ๋ฉ์๋์ ๊ฐฏ์๋ฅผ ์ต์ํ ์ํค๋ ์ด์ ๊ฐ ๋ฐ๋ก ๋ค์์ ์ด์ด์ง ๊ตฌํ ์๋์ ์ํ ์ค๊ณ์ด๋ฉฐ ์๋ฐ์์ ์ธํฐํ์ด์ค ๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค.
๊ตฌํ ์๋ (์ธํฐํ์ด์ค)
์์ ์ ๋ณด ์๋ ๋ฉํ ๋ฅผ ์ ๋ฐ์๋ค์ฌ, ๋ณ์๋ฅผ private์ผ๋ก ์ ์ธํ๊ณ ๊ผญ ํ์ํ ๊ณต๊ฐ ๋ฉ์๋๋ฅผ ์ ๊ตฌ์ถํ ์ข์ ํด๋์ค๋ฅผ ๊ตฌ์ฑํ๋ค๊ณ ๊ฐ์ ํ์.
์ด๋ ๊ฒ ํด๋์ค ๊ตฌ์ฑ์ ํด ๋์ผ๋ฉด ๊ฐ์ฒด๊ฐ์ ์์กด์ฑ์ ์ค์ง ๊ณต๊ฐ ๋ฉ์๋์ ์ํด์๋ง ๋ฐ์ํ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๊ณต๊ฐ ๋ฉ์๋๋ฅผ ์๋ ๋ฉ์๋๋ค๊ณผ ๊ตฌ๋ถํ๊ณ ํตํฉ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด์, ์๋ฐ์์๋ ํด๋์ค์ ์ ์ฌํ๊ฒ ์์ ๊ฐ๋ฅํ ํ์ ์ด๋ฉด์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๋ฒ ์ ํ ์ธํฐํ์ด์ค(Interface)๋ฅผ ๋ง๋ค์ด ๋ฉ์๋ ์ถ์ํ๋ฅผ ํตํด ์์ ์ํฌ ๊ณต๊ฐ ๋ฉ์๋๋ฅผ ํตํฉ์ ์ผ๋ก ๊ด๋ฆฌํ๊ฒ ํ์๋ค.
์ด๊ฒ์ด ์ ์ธํฐํ์ด์ค(Interface)๋ฅผ ๊ตฌํํ์ฌ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ํ์ฌ implements๋ฅผ ํตํด ์ฌ์ ์ ๊ท์ฝ์ ์ค์ ํ๋, ์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ๋ฐฐ์ฐ๊ณ ์จ๋จน์๋ ๊ฐ์ฒด ์งํฅ์ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฒ์ด๋ค.
interface InterProcess {
public void work(); // ์ถ์ ๋ฉ์๋
}
class Process implements InterProcess {
private void init(){} // ์๋ ๋ฉ์๋
private void process(){} // ์๋ ๋ฉ์๋
private void release(){} // ์๋ ๋ฉ์๋
public void work(){ // ๊ณต๊ฐ ๋ฉ์๋ + ๋ฉ์๋ ๊ตฌ์ฒดํ
init();
process();
release();
}
}
public class Main {
public static void main(String[] args) {
InterProcess c = new Process(); // ์ธํฐํ์ด์ค ์ญ์ ์์ ํด๋์ค ํ์
์ฒ๋ผ ์ด์ฉ๋ ์ ์๋ค
c.work();
}
}
์ธํฐํ์ด์ค ์ญ์ ์๋ฐ ์ฐธ์กฐ ํ์ ์ ๋คํ์ฑ์ ์๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์ด์ฉํ ์ ์๋ค.
๊ทธ๋์ Process ํ์ ์ ๊ฐ์ฒด๋ฅผ InterProcess ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ํ ๋น ํ ์ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์บก์ํ๋ฅผ ํตํด ์ต์ํ์ผ๋ก ์ค์ธ ๊ณต๊ฐ ๋ฉ์๋๋ฅผ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋์ ์ฐ๋์ด ๋๋ฉด์, Process ํด๋์ค์ ๊ธฐ๋ฅ ๋์์ ํ๋๋ฐ ์์ด ์ ์บ์คํ ์ผ๋ก ์ธํ ๋ฉค๋ฒ ์ ํ๊ณผ ๊ฐ์ ์ ํ ์์๋ ์์ด์ง๋ค.
์ด๋ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ๋ฉด ์ค์ง์ ํด๋์ค ๊ฐ์ ์์กด ๊ด๊ณ๊ฐ ์์ด์ง๋ฉด์ ๊ธฐ๋ฅ ํ์ฅ์ ์์ด ์ ์ฝ์ด ์ค์ด๋ค๊ฒ ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์๋ฐ์ ์ธํฐํ์ด์ค์ ๋ํด ์์ธํ๊ณ ํ์คํ๊ฒ ์๊ณ ์ถ๋ค๋ฉด ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[JAVA] โ ์ธํฐํ์ด์ค(Interface)์ ์ ์ - ํํํ๊ฒ ๊ฐ๋ ์ ๋ฆฌ
์ธํฐํ์ด์ค ์ ์ (์น์ํ๊ฒ ์ค๋ช ) ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ถ์ํ๋ฅผ ๋ฐฐ์ฐ๊ณ ์ถ์ ํด๋์ค๋ฅผ ์ ํด๋ดค๋ค๋ฉด ๊ทธ ๋ค์ ์ ํด๋ณด๋ ๊ฒ์ด ์ธํฐํ์ด์ค(Interface) ์ผ ๊ฒ์ด๋ค. ์ธํฐํ์ด์ค๋ ๊ฐ๋จํ ๋งํ์๋ฉด ํ
inpa.tistory.com
# ์ฐธ๊ณ ์๋ฃ
https://effectiveprogramming.tistory.com/entry/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%A0%95%EB%B3%B4-%EC%9D%80%EB%8B%89information-hiding%EC%97%90-%EB%8C%80%ED%95%9C-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%9D%B4%ED%95%B4?category=660012
https://peterdrinker.tistory.com/353
https://mangkyu.tistory.com/195?category=761303
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.