์์์ ์์์ด ์๋๋ค.
ํํ ์์์ด๋ผ๊ณ ํ๋ฉด ๋ถ๋ชจ์ ์ ์ฐ์ ์์๋ฐ๋๋ค๋ ์๋ฏธ๋ฅผ ์๊ฐํฉ๋๋ค.
์๋ ์ฌ์ ์ ์๋ฏธ๋ง ๋ณด์๋ ๊ฐ์กฑ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋จ์ด์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
-
2.๋ฒ๋ฅ ์ผ์ ํ ์น์กฑ ๊ด๊ณ๊ฐ ์๋ ์ฌ๋ ์ฌ์ด์์, ํ ์ฌ๋์ด ์ฌ๋งํ ํ์ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ฌ์ฐ์ ๊ดํ ๊ถ๋ฆฌ์ ์๋ฌด์ ์ผ์ฒด๋ฅผ ์ด์ด ์ฃผ๊ฑฐ๋, ๋ค๋ฅธ ์ฌ๋์ด ์ฌ๋งํ ์ฌ๋์ผ๋ก๋ถํฐ ๊ทธ ๊ถ๋ฆฌ์ ์๋ฌด์ ์ผ์ฒด๋ฅผ ์ด์ด๋ฐ๋ ์ผ.
ํ ... ๋์ฒด ๊ฐ์ฒด์งํฅ๊ณผ ์์์ด ๋ฌด์จ ์ฐ๊ด์ด ์๋ ๊ฒ์ผ๊น์?
๋ง์ต๋๋ค. ์ฐ๊ด์ด ์์ต๋๋ค.
์์ ๊ฐ์ฒด์งํฅ์ 4๋ ํน์ฑ์ด ์บก์ํ, ์์, ์ถ์ํ, ๋คํ์ฑ ์ด๋ผ๊ณ ํด๋๊ณ ๋ฌด์จ ์๋ฆฌ๋๊ตฌ์?
์ด๋ ์์ด๋ฅผ ํ๊ตญ์ด๋ก ๋ฒ์ญํ๋ค ์๊ธด ์คํด ์๋ ์คํด๋ผ๊ณ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฒด์งํฅ์์์ ์์์ ๊ณ์ธต๋(์กฐ์ง๋)๊ฐ ์๋ ๋ถ๋ฅ๋๋ก ์ดํดํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
๋ถ๋ฅ๋๋ ์์ ๊ด๊ณ๊ฐ ์๋๋๋ค.
๋ค์ ๋งํด ๋ฌด์ฒ์ถ ๋๋ฌผ์ ๋๋ฌผ์ ์์์ด ์๋๋๋ค.
์ฒ์ถ๋๋ฌผ๋ ์กฐ๋ฅ์ ๋ถ๋ชจ์ผ ์๋ ์์ง์.
๋๋ฌผ์ด๋ผ๊ณ ํ๋ ๊ฒ์ ์ธ๋ถํํด์ ๋ฌด์ฒ์ถ๋๋ฌผ๊ณผ ์ฒ์ถ๋๋ฌผ๋ก ๋๋๊ณ ,
์ฒ์ถ๋๋ฌผ์ ์ธ๋ถํํด์ ์ด๋ฅ, ์์๋ฅ, ํ์ถฉ๋ฅ, ์กฐ๋ฅ, ํฌ์ ๋ฅ๊ฐ ๋์ค๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฒด ์งํฅ์์์ ์์์ ์์ ํด๋์ค์ ํน์ฑ์ ํ์ ํด๋์ค์์ ์์ํ๊ณ ๊ฑฐ๊ธฐ์ ๋ํด ํ์ํ ํน์ฑ์ ํ์ฅ(extends)ํด์ ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ ์ ๋๋ค.
๋ฐ๋ผ์, ๋ถ๋ชจ ํด๋์ค์ ์์ ํด๋์ค๋ก ์ฐ๊ธฐ ๋ณด๋ค๋ ์์ ํด๋์ค - ํ์ํด๋์ค ํน์ ์ํผ ํด๋์ค - ์๋ธ ํด๋์ค๋ผ๊ณ ํํํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
๐ถ ์ฌ๋ด์ด์ง๋ง, ์ ๋ ๋ถ๋ชจ์ ์์ ํด๋์ค๋ก ๋ฐฐ์ดํฐ๋ผ ์์์ ์๋ฏธ๋ฅผ ์กฐ๊ธ ์คํดํ์์์ ์์ธํฉ๋๋ค.
์๋ฌดํผ ์ด๋ฌํ ๊ฒ์ ์๊ฐํด๋ณด๋ฉด ์์ ํด๋์ค๋ก ๊ฐ์๋ก ์ถ์ํ/์ผ๋ฐํ ๋๊ณ ,
ํ์ ํด๋์ค๋ก ๊ฐ์๋ก ๊ตฌ์ฒดํ/ํน์ํ ๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ์์ ๊ด๊ณ๋ โญํ์ ํด๋์ค๋ ์์ ํด๋์ค์ด๋ค. ๋ผ๋ ๋ฌธ์ฅ์ ๋ฐ๋์ ๋ง์กฑํด์ผ ํฉ๋๋ค.
์์ง ๋ฉ๋์ด ๊ฐ์ง ์๋๋ค๋ฉด ์๋ ์ฝ๋๋ฅผ ํตํด ๋น๊ตํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฒ์ง ์ํฌ = new ๋ธ();
// ๋ธ์ด ํ์ด๋ฌ์ผ๋ ์๋ฒ์ง ์ญํ ์ ํ๋ ์ํฌ๋ผ ์ด๋ฆ ์ง์๋ค(?)
์ธ๋ป ๋ด๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ง์ง ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋๋ฌผ ๋ฏธํค๋ง์ฐ์ค = new ์ฅ();
// ์ฅ๊ฐ ํ๋ง๋ฆฌ ํ์ด๋ฌ์ผ๋ ๋๋ฌผ ์ญํ ์ ํ๋ ๋ฏธํค๋ง์ฐ์ค๋ผ ์ด๋ฆ ์ง์๋ค.
๋ง์ด ์ด์ํ๊ธด ํ์ง๋ง ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ดค์ ๋ ํฌ๊ฒ ์ด์ํจ์ด ์์ต๋๋ค.
๋ง์ง๋ง ๊ฒฐ์ ์ ์ผ๋ก! ์๋ฐ์์ ์์์ ํ ๋๋ inheritance
๊ฐ ์๋ extends
๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋ฐ๋ฅผ ๋ง๋ ์ฌ๋๋งํผ ์๋ฐ ๊ฐ์ฒด ์งํฅ์ ์ ์ดํดํ ์ฌ๋์ ์๊ฒ ์ฃ . ๐
์์์ ๊ฐ๋ ฅํจ
์ด์ โญํ์ ํด๋์ค๋ ์์ ํด๋์ค์ด๋ค. ๊ฐ ๊ฐ์ ธ์ค๋ ์์์ ๊ฐ๋ ฅํจ์ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค.
public class Animal {
String name;
Animal() {
name = "๋๋ฌผ";
}
void show() {
System.out.println(name);
}
}
public class ํฌ์ ๋ฅ extends Animal {
ํฌ์ ๋ฅ() {
name = "ํฌ์ ๋ฅ";
}
}
public class ์กฐ๋ฅ extends Animal {
์กฐ๋ฅ() {
name = "์กฐ๋ฅ";
}
}
public class Dog extends ํฌ์ ๋ฅ {
Dog() {
name = "๊ฐ์์ง";
}
}
public class ์ฐธ์ extends ์กฐ๋ฅ {
์ฐธ์() {
name = "์ฐธ์";
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Animal ํฌ์ ๋ฅ = new ํฌ์ ๋ฅ();
Animal ์ฌ๋กฑ์ด = new Dog();
animal.show();
ํฌ์ ๋ฅ.show();
์ฌ๋กฑ์ด.show();
}
}
๋๋ฌผ
ํฌ์ ๋ฅ
๊ฐ์์ง
์ ์ฝ๋๋ค์ ๋ณด๋ฉด "ํ์ ํด๋์ค๋ ์์ ํด๋์ค๋ค." ๊ฒ์ด ํ ์๋ฟ์ ๊ฒ ์ ๋๋ค.
ํฌ์ ๋ฅ ํ๋ง๋ฆฌ๋ฅผ ๋๋ฌผ์ด๋ผ๊ณ ํ๋ ๊ฒ, ๊ฐ์์ง ํ๋ง๋ฆฌ๋ฅผ ๋๋ฌผ์ด๋ผ๊ณ ํ๋ ๊ฒ์ด๋ผ๊ณ ํ๋๋ฐ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ํ๋ฆผ์ด ์์์ ์ ์ ์์ต๋๋ค.
์ด์ฒ๋ผ ๊ฐ์ฒด ์งํฅ์ ์ธ๊ฐ์ ๋ ผ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์ฝ๋๋ก ์ฎ๊ธธ ์ ์๋ ํ์ด ์์ต๋๋ค.
๊ทธ๋ผ static(์ ์ ๋ฉ์๋) ๊ด๋ จ ์๊ธฐํ ๋ Math
ํด๋์ค ์์๋ฅผ ๋ค์๋ ๊ฒ์ฒ๋ผ...
์์์ ์ด๋ค ๊ฒ์ ๋ค ์ ์์๊น์?
๋ฐ๋ก ๋ชจ๋ ํด๋์ค์ ์์ ํด๋์ค์ธ Object
ํด๋์ค ์
๋๋ค.
Object
ํด๋์ค๋ ์๋ฐ์ ํด๋์ค ์์ ๊ตฌ์กฐ์์ ์ต์์ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํด๋์ค๋ Object
ํน์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค.
๊ทธ๋์ ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค์ด๊ฑด toString()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด์ง์!
๋ค์ค์์์ด ์๋๋ ์ด์
๊ทผ๋ฐ ์ฌ๊ธฐ์ ์ ๊น!
Dog ํด๋์ค๋ฅผ
public class Dog extends ํฌ์ ๋ฅ, ๋๋ฌผ {
Dog() {
name = "๊ฐ์์ง";
}
}
์์ ๊ฐ์ด ํฌ์ ๋ฅ์ ๋๋ฌผ ๋ชจ๋ ์์๋ฐ์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์์ฝ๊ฒ๋(?) ์๋ฐ์์๋ ๋ค์ค ์์์ ์ง์ํ์ง ์์ต๋๋ค.
C++์ ๋ฐ์ /๋จ์ํ ํ๋ฉด์ ๋ค์ค ์์์ ๊ณผ๊ฐํ ๋นผ๋ฒ๋ฆฐ ์ด์ ์ ๋ํด ๊ฐ๋จํ ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
์ธ์ด๊ณต์ฃผ๋ฅผ ์๋ก ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
์ธ์ด๋ ๐งโ๏ธ์ฌ๋๊ณผ ๐๋ฌผ๊ณ ๊ธฐ๋ฅผ ์์ํ๋ค๊ณ ์๊ฐํด ๋ด ์๋ค.
๋ง์ฝ ์ธ์ด์๊ฒ ์์ํด! ๋ผ๊ณ ํ๋ค๋ฉด ์ธ์ด๋ ์ด๋ป๊ฒ ๋์ํด์ผ ํ ๊น์?
์ฌ๋์ฒ๋ผ? ์๋๋ฉด ๋ฌผ๊ณ ๊ธฐ์ฒ๋ผ? ์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ค์ค ์์์ ๋ค์ด์๋ชฌ๋ ๋ฌธ์ ๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ์๋ฐ๋ ๋ค์ค ์์์ ๊ณผ๊ฐํ ๋ฒ๋ฆฌ๊ณ , ๋์ ์ธํฐํ์ด์ค
๋ฅผ ๋์
ํ์ฌ ๋์ฒดํ์์ต๋๋ค.
์ธํฐํ์ด์ค
ํน์ ์ธํฐํ์ด์ค๋ ์์์ฒ๋ผ ํ ๋ฌธ์ฅ์ผ๋ก ๋ํ๋ผ ์ ์์๊น์?
๊ฐ๋ฅํฉ๋๋ค.
๐ก ๊ตฌํ ํด๋์ค is able to ์ธํฐํ์ด์ค
โก๏ธ ๊ตฌํ ํด๋์ค๋ ์ธํฐํ์ด์ค ํ ์ ์๋ค!
โก๏ธ ์ฐธ์๋ ๋ ์ ์๋ค.
์ธํฐํ์ด์ค๋ be able to, ์ฆ "๋ฌด์์ ํ ์ ์๋" ์ด๋ผ๋ ํํ ํํ๋ก ๋ง๋๋ ๊ฒ์ด ๋ฐ๋์ง ํฉ๋๋ค.
- Serializable ์ธํฐํ์ด์ค : ์ง๋ ฌํํ ์ ์๋
- Comparable ์ธํฐํ์ด์ค : ๋น๊ตํ ์ ์๋
- Runnable ์ธํฐํ์ด์ค : ์คํํ ์ ์๋
์ ๋ฆฌ
์ง๋ฌธ ํ๋ ํ๋ฉฐ ์ด์ ๋ง๋ฌด๋ฆฌ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ ํด๋์ค๋ ํ์ ํด๋์ค์๊ฒ ๋ฌผ๋ ค์ค ํน์ฑ์ด ๋ง์ ์๋ก ์ข์๊น์? ์ ์ ์๋ก ์ข์๊น์?
์ธํฐํ์ด์ค๋ ๊ตฌํ์ ๊ฐ์ ํ ๋ฉ์๋๊ฐ ๋ง์ ์๋ก ์ข์๊น์? ์ ์ ์๋ก ์ข์๊น์?
์๊ฐํด๋ณด๋ฉด โญ์์ ํด๋์ค๋ ํ์ฑํ ์๋ก ์ข๊ณ , ์ธํฐํ์ด์ค๋ ๊ฐ์ ํ ๋ฉ์๋๊ฐ ์ ์ ์๋ก ์ข๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ฐ๊ฐ์ ์ด์ ๋ ์ฌ๊ธฐ์ ์ดํด๋ณด๋ฉด ์ข์ํ
๋ฐ ๊ทธ๋ผ ๊ธ์ ๋ณธ์ง์ด ํ๋ ค์ง๋ ์ด๊ฑด ๋ค์ ์๊ฐ์ ์ด์ด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ก์ด ๊ธ๋ก ์์ฑํ๋ ค ํ๋๋ฐ ๊ทธ๋ฌ๋ฉด ์ ๊ฐ ๋์ค์ ๋ณผ ๋ ๋งํฌ ์ด๋ํ๊ธฐ ๊ท์ฐฎ์ ๊ฒ ๊ฐ์์ ์ฌ๊ธฐ๋ค ๋ถ์ด๊ฒ ์ต๋๋ค. ใ
(3.1 LSP, 3.2 ISP ์ฐธ๊ณ )
ํ์ ํด๋์ค is a kind of ์์ ํด๋์ค
๊ฐ์ฒด ์งํฅ์์์ ์์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ํ ๋ฌธ์ฅ์ ๋ฌด์์ผ๊น์?
โญํ์ ํด๋์ค๋ ์์ ํด๋์ค์ด๋ค.
๋ผ๊ณ ํ์ผ๋ ํ์ ํด๋์ค is a ์์ ํด๋์ค ์๋?!
์ด๊ฒ ๋ง์์ผ๋ฉด ์ ๊ฐ ์ด ๊ธ์ ์ฐ๊ณ ์์ง ์์๊ฒ ์ฃ !? ๐
๋ฌผ๋ก ์์ฃผ ํ๋ฆฐ ๋ง์ ์๋๋๋ค๋ง, ์ข ๋ ์๋ง์ ๋ฌธ์ฅ์ด ์์ผ๋ ๊ทธ๊ฒ์ผ๋ก ๊ธฐ์ตํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
โญ ํ์ ํด๋์ค is a kind of ์์ ํด๋์ค
์ด๋ ๋ง์ดํฌ๋ก์ํํธ ๊ฐ๋ฐ์ ์ฌ์ดํธ์ธ MSDN์์๋ a kind of๋ผ๊ณ ๋ช ์ํ๊ณ ์์ผ๋ ์์ฃผ ์ด์ํ ์๋ฆฌ๋ ์๋๋๋ค.
์ค์ ์์ ๋ฅผ ํ๋ฒ ๋ค์ด๋ณด๋ฉด ํ ์ดํด๊ฐ ๋์ค๊ฒ๋๋ค.
ํญ๊ท is a kind of ์กฐ๋ฅ => ํญ๊ท์ ์กฐ๋ฅ์ ํ ๋ถ๋ฅ๋ค.
ํญ๊ท is a kind of ๋๋ฌผ => ํญ๊ท์ ๋๋ฌผ์ ํ ๋ถ๋ฅ๋ค.
LSP (๋ฆฌ์ค์ฝํ ์นํ ์์น)
๋ฆฌ์ค..์ฝํ ๋ญ์? ๋ง์ด ์กฐ๊ธ ์ด๋ ต๊ณ , ๋ฑ ๋ค์์ ๋ ๋ฌด์จ ์๋ฏธ์ธ์ง ํ์ ์ด ์ข ํ๋ญ๋๋ค.(์ ๋ง ๊ทธ๋ด์ง๋
๋ฆฌ์ค์ฝํ ์นํ ์์น์ ๊ฐ์ฒด์งํฅ 5์์น ์ค ํ๋ ์ ๋๋ค.
๊ฐ์ฒด์งํฅ 5์์น์ ์ถํ์ ๊ฐ์ฒด์งํฅ ๊ธฐ๋ณธ์ด ๋๋๋ฉด ์์๋ณผํ ๋ฐ์! ์์๊ณผ ์ฐ๊ด์ด ๊น๋ค๋ณด๋ ๋จผ์ ๋์๋ค์.ใ ใ
์๋ฌดํผ ๋ฆฌ์ค์ฝํ ์งํ ์์น์
"ํ์ ํด๋์ค๋ ์ธ์ ๋ ์์ ํด๋์ค๋ฅผ ๋์ฒดํ ์ ์๋ค๋ ์์น" ์ ๋๋ค.
์์น์ด๋ผ๊ณ ํด์ ํญ์ ์ด๋ฐ ์ฌํญ๋ค์ ๊ณ ๋ คํด์ ์ฝ๋๋ฅผ ์์ฑํ ํ์๋ ์์ต๋๋ค.
์์ ๋ฐฐ์ด "ํ์ ํด๋์ค is a kind of ์์ ํด๋์ค" ๋๋ก ๊ตฌํํ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด ์ด๋ฏธ LSP๋ฅผ ์ ์งํค๊ณ ์๋๊ฑฐ๋๊น์. ๐
๋ํ LSP๋ก ์์ฑํ ์ฝ๋๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ดํดํ ๋ ๋งํ์ด ์์ด์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ์ข์ต๋๋ค.
public class Person {
String name;
int age;
char gender;
public void walk() {
System.out.println(name + "์ด ๊ฑท๋๋ค.");
}
}
public class Student extends Person {
int studentID;
public Student(int studentID, String name, int age, char gender) {
this.studentID = studentID;
this.name = name;
this.age = age;
this.gender = gender;
}
public void study() {
System.out.println(name + "์ด ๊ณต๋ถํ๋ค." );
}
}
public class Soldier extends Person {
int serialNum;
public Soldier(int serialNum, String name, int age, char gender) {
this.serialNum = serialNum;
this.name = name;
this.age = age;
this.gender = gender;
}
public void shoot() {
System.out.println(name + "์ด ์ฌ๊ฒฉํ๋ค.");
}
}
public class Main {
public static void main(String[] args) {
Person kim = new Student(202301, "๊นํ์", 18, 'F');
Person lee = new Soldier(160320, "์ด๊ตฐ์ธ", 22, 'M');
Student park = new Student(2,"๋ฐ๊ฒฝ๋ฆผ", 32, 'F');
Student s = (Student)kim;
Soldier m = (Soldier)lee;
s.study();
m.shoot();
park.walk();
}
}
๊นํ์์ด ๊ณต๋ถํ๋ค.
์ด๊ตฐ์ธ์ด ์ฌ๊ฒฉํ๋ค.
๋ฐ๊ฒฝ๋ฆผ์ด ๊ฑท๋๋ค.
๊ตฟ!
๋ฐ๋๋ก ๊ณ์ธต๋/์กฐ์ง๋๋ฅผ ๊ณ ๋ คํด์ ์์ฑํ ์ฝ๋์๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํฉ๋๋ค.
// 1. ๊ณ์ธต๋๋ฅผ ๊ณ ๋ คํ ์ฝ๋
์๋ฒ์ง ์ํฌ = new ๋ธ();
๋ธ ์ํฌ2 = (๋ธ)์ํฌ;
์ํฌ2.๊พธ์ง๋๋ค();
// 2. ๋ถ๋ฅ๋๋ฅผ ๊ณ ๋ คํ ์ฝ๋
์ฌ๋ ์ํฌ = new ํ์();
ํ์ ์ํฌ2 = (ํ์)์ํฌ;
์ํฌ2.๊ณต๋ถํ๋ค();
์์ข์ ์์ ๋ณด์ฌ๋๋ฆฌ๊ธฐ ์ํด ๊ธด ์ฝ๋๋ฅผ ๋ ๋ณด์ฌ๋๋ฆฌ๊ธด ์ข ๊ทธ๋์ ์ฝ์์ผ๋ก ์์ฑํด๋ณด์์ต๋๋ค.
์ธ๋ป ๋ด๋ ๊ณ์ธต๋๋ฅผ ๊ณ ๋ คํ ์ฝ๋๋ ๊ฐ์๊ธฐ ์ํฌ๊ฐ ์๋ฒ์ง ์ญํ ์ ํ๋๊ฒ ๊ธฐ๊ดดํด ๋ณด์ ๋๋ค.
๋ฐ๋ฉด์ ๋ถ๋ฅ๋๋ฅผ ๊ณ ๋ คํ ์ฝ๋๋ ๋ ผ๋ฆฌ์ ๋งํ์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด์ฒ๋ผ ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์ด์ฉํ๋ฉด ํ์ ๊ฐ์ฒด๋ ์์ ๊ฐ์ฒด์ธ ์ฒ ํ ์ ์์ต๋๋ค.
์) ๊ณ ๋๋ ๋๋ฌผ ์ญํ ๋ ํ ์ ์๋ค.
ISP (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)
๊ฐ์ฒด ์งํฅ ์ค๊ณ 5์์น ์ค SRP(๋จ์ผ ์ฑ ์ ์์น)๊ฐ ์์ต๋๋ค.
๊ฐ๋จํ ์ค๋ช ๋๋ฆฌ๋ฉด ํ๋์ ํด๋์ค์๋ ํ๋์ ์ญํ ๋ง ๋ด๋๋ก ์ค๊ณํ๋ ๊ฒ์ธ๋ฐ์.
ํ๋์ ์ญํ (์ฑ ์)๋ง ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ SRP ๋ฟ์ด ์๋๋๋ค!
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น๋ ๊ฐ๋ฅํฉ๋๋ค. ๐
๋จ์ผ ์ฑ ์ ์์น์ ํด๋์ค๋ฅผ ํ ๋ง(?)๋ด๋ ๊ฒ์ด๋ผ๋ฉด ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ๋ค์ค ์ธ๊ฒฉํ(?) ํ๋ ๊ฒ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ์๊ตฌ์ฌํญ๊ณผ ์ค๊ณ์์ ์ทจํฅ์ ๋ฐ๋ผ SRP ํน์ ISP ๋ ์ค ํ๋๋ฅผ ์ ํํด์ ์ค๊ณํ ์ ์์ต๋๋ค.
ํ์ง๋ง ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด SRP๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์ธํฐํ์ด์ค๊ฐ ์ฃผ์ ๋ก ๋์ค๋ฉด ํญ์ ๋์ค๋ ์๊ธฐ๊ฐ ์์ต๋๋ค.
๋ฐ๋ก ์ธํฐํ์ด์ค ์ต์์ฃผ์ ์์น ์ ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ฉ์๋๋ฅผ ์ธ๋ถ์ ์ ๊ณตํ ๋๋ ์ต์ํ์ ๋ฉ์๋๋ง ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ ์ ์๊ฐํด๋ณด๋ฉด ๋น์ฐํ ์๊ธฐ ์ ๋๋ค.
'ํ์' ์ธํฐํ์ด์ค์ '์ฌ๊ฒฉํ๋ค()' ๋ฉ์๋๋ฅผ ์ ๊ณตํ ํ์๋ ์๊ณ ์ ๊ณตํด์๋ ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์ ์ฝ๋ ๋ณด์ฌ๋๋ฆฌ๋ฉฐ ๋ง๋ฌด๋ฆฌ ํ๊ฒ ์ต๋๋ค.
public interface Studiable {
void study();
}
public interface Shootable {
void shoot();
}
public class Person {
String name;
int age;
char gender;
public void walk() {
System.out.println(name + "์ด ๊ฑท๋๋ค.");
}
}
public class Student extends Person implements Studiable{
int studentID;
public Student(int studentID, String name, int age, char gender) {
this.studentID = studentID;
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public void study() {
System.out.println(name + "์ด ๊ณต๋ถํ๋ค.");
}
}
public class Main {
public static void main(String[] args) {
Student kim = new Student(2023, "๊นํ์", 18, 'F');
kim.study();
}
}
// ๊นํ์์ด ๊ณต๋ถํ๋ค.
์ ๋ฆฌํ์๋ฉด!
์ธํฐํ์ด์ค๋ "~ ํ ์ ์๋(is able to)" ์ด๋ผ๋ ๊ธฐ์ค์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์ ์ ์ ๋๋ค.
์ ๋ฆฌ
- ๊ฐ์ฒด ์งํฅ์ ์์์ ์์ ํด๋์ค์ ํน์ฑ์ '์ฌ์ฌ์ฉ' ํ๋ ๊ฒ์ด๋ค.
- ๊ฐ์ฒด ์งํฅ์ ์์์ ์์ ํด๋์ค์ ํน์ฑ์ 'ํ์ฅ' ํ๋ ๊ฒ์ด๋ค.
- ๊ฐ์ฒด ์งํฅ์ ์์์ is a kind of ๊ด๊ณ๋ฅผ ๋ง์กฑํด์ผ ํ๋ค.
๊ฐ์ฌํฉ๋๋ค!
'๐ Study > OOP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
OOP(2) static vs instance (0) | 2023.02.22 |
---|---|
OOP(1) ์ถ์ํ๋ ๋ชจ๋ธ๋ง (0) | 2023.02.22 |