์์์ด๋
- ๊ฐ์ฒด์งํฅ์ธ์ด์ ํน์ฑ์ด์ ์ํํธ์จ์ด์ ์ฌ์ฌ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค.
- ์ค์ํ์ ์๋ฅผ ๋ค๋ฉด ๋ถ๋ชจ ์ ์ ์๋ฅผ ์์์ด ๋ฌผ๋ ค๋ฐ๋ ์ ์ ์ ์ธ ์์๊ณผ ์ ์ฌํ๋ค.
C++์ธ์ด์์์ ์์์ ๊ฐ๋ ๊ณผ ์ ์ฌํ๋ค.- ์ฐจ์ด์ ์ด๋ผ๋ฉด ์๋ฐ์์์ ์์์ ๋ค์ค ์์(multiple inheritance)์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ์๋ฐ์์๋ ๋ ํด๋์ค(class) ์ฌ์ด์์์ ๋ถ๋ชจ-์์์ ์์ ๊ด๊ณ๋ฅผ ์ ์ธํ๋ค.
- ์ด๋, ๋ถ๋ชจ ํด๋์ค๋ฅผ ์ํผ ํด๋์ค(super class), ์์ ํด๋์ค๋ฅผ ์๋ธ ํด๋์ค(sub class)๋ผ๊ณ ํ๋ค.
- ์๋ธ ํด๋์ค๋ ์์ ์ ๋ฉค๋ฒ๋ฟ๋ง ์๋๋ผ ์ํผ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ํฌํจํ๊ฒ ๋๋ค.
๊ธฐ๋ณธ ํด๋์ค? ๋ถ๋ชจ ํด๋์ค?
์์ ๊ด๊ณ์ ์๋ ๋ ํด๋์ค๋ฅผ ๋ถ๋ฅด๋ ์ด๋ฆ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ง๋ค ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค. C++์์๋ ์์์ ํด์ฃผ๋ ํด๋์ค๋ฅผ ๊ธฐ๋ณธ ํด๋์ค(base class), ์ด์ ๋ฐ๋๋ก ์์์ ๋ฐ๋ ํด๋์ค๋ฅผ ํ์ ํด๋์ค(derived class)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ํ C#์์๋ ๊ฐ๊ฐ ๋ถ๋ชจ ํด๋์ค(parent class), ์์ ํด๋์ค(child class)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์์ ์ฅ์ (advantange)
์๋์ ์์ ์ฝ๋๋ฅผ ํตํด ์์์ด ์ฃผ๋ ์ฅ์ ์ ์ดํด๋ณด์.
class Student {
void eat() {} // ๋ฐฅ๋จน๊ธฐ
void sleep() {} // ์ ์๊ธฐ
void study() {} // ๊ณต๋ถํ๊ธฐ
}
class StudentDeveloper {
void eat() {} // ๋ฐฅ๋จน๊ธฐ
void sleep() {} // ์ ์๊ธฐ
void study() {} // ๊ณต๋ถํ๊ธฐ
void develop() {} // ๊ฐ๋ฐํ๊ธฐ
}
class Professor {
void eat() {} // ๋ฐฅ๋จน๊ธฐ
void sleep() {} // ์ ์๊ธฐ
void research() {} // ์ฐ๊ตฌํ๊ธฐ
}
- ํ์(Student)๊ณผ ํ์๊ฐ๋ฐ์(StudentDeveloper) ๊ทธ๋ฆฌ๊ณ ๊ต์(Professor)๊ฐ ์๋ค.
- ์ด๋ค์ ๊ณตํต์ ์ผ๋ก ๋ฐฅ๋จน๊ธฐ(eat)์ ์ ์๊ธฐ(sleep) ๋ผ๋ ๊ณตํต์ ์ธ ํ์(์ฝ๋)๊ฐ ์๋ค.
- ๋ํ ํ์๊ณผ ํ์๊ฐ๋ฐ์๋ ๊ณตํต์ ์ผ๋ก ๊ณต๋ถ(study)๋ผ๋ ๊ณตํต์ ์ธ ํ์(์ฝ๋)๊ฐ ์กด์ฌํ๋ค.
- ๋ง์ผ, ๋ฐฅ๋จน๊ธฐ์ ์ ์๊ธฐ์ ๋ฐฉ์์ด ๋ค๋ฅด์ง ์๊ณ ๋์ผํ ์ญํ ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ํ๋์ ํ์๋ฅผ ์์ ํ๊ธฐ ์ํด์ ์์ 3๊ฐ ํด๋์ค ๋ชจ๋๋ฅผ ์์ ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธด๋ค.

- ์์์ ์ด์ฉํ๋ฉด ์๋์ ๊ฐ์ด ๊ฐ๊ฒฐํ๊ฒ ์์ ํ ์ ์๋ค.
class Person {
void eat() {} // ๋ฐฅ๋จน๊ธฐ
void sleep() {} // ์ ์๊ธฐ
}
class Student extends Person {
void study() {} // ๊ณต๋ถํ๊ธฐ
}
class StudentDeveloper extends Student {
void develop() {} // ๊ฐ๋ฐํ๊ธฐ
}
- ๊ณตํต์ ์ธ ํน์ฑ์ ๋ฌถ์ด์ ์ฌ๋(Person) ํด๋์ค๋ก ์ ์ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ณตํต ํน์ฑ์ด ํ์ํ ํด๋์ค๋ค์ด ์ด๋ฅผ ์์ํ์ฌ ์ฌ์ฉํ๋๋ก ํ๋ค.

- ์ด์ฒ๋ผ ์์์ ํด๋์ค ์ฌ์ด์ ๋ฉค๋ฒ๋ฅผ ์ค๋ณต ์ ์ธํ์ง ์์๋ ๋๋ ์ฅ์ ์ด ์๋ค.
- ๋ํ ํด๋์ค๋ฅผ ๊ณ์ธต์ ์ผ๋ก ๋ถ๋ฅํ ์ ์์ด ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ํด๋์ค์ ์ฌ์ฌ์ฉ๊ณผ ํ์ฅ์ ํตํ ์ํํธ์จ์ด์ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
์์ ์ฌ์ฉ ๋ฐฉ๋ฒ
์ ์ธ ๋ฐฉ๋ฒ
- ์๋ฐ์์๋
extendsํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ ์ธํ๋ค. class ์๋ธ ํด๋์ค extends ์ํผ ํด๋์ค์ฒ๋ผ ์์ฑํ๋ฉด ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
class Point {
private int xPos, yPos;
void setPoint(int xPos, int yPos) {
this.xPos = x;
this.yPos = y;
}
void showPoint() {
System.out.println("(" + xPos + "," + yPos + ")");
}
}
class ColorPoint extends Point {
private String color;
void setColor(String color) {
this.color = color;
}
void showColorPoint() {
showPoint(); // Point ํด๋์ค์ showPoint ๋ฉ์๋ ํธ์ถ
System.out.println("Color : " + color);
}
}
public class ExampleTest {
public static void main(String[] args) {
Point p = new Point();
p.setPoint(3, 4);
p.shoWPoint():
ColorPoint cp = new ColorPoint();
cp.setPoint(2, 3);
cp.setColor("Yellow");
cp.showColorPoint();
}
}
- ์๋ธ ํด๋์ค๋ ์์์ ํตํ์ฌ ์ํผ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ์์ ์ ๋ฉค๋ฒ๋ก ํ์ฅํ๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ํผ ํด๋์ค์ private ๋ฉค๋ฒ ์ธ์ ๋ชจ๋ ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ค.
- ์ฆ, ColorPoint๋ Point ํด๋์ค๋ฅผ ์์ํจ์ผ๋ก์จ ์์ ์ ๋ฉค๋ฒ ๋ณ์์ธ ๋ฌธ์์ด color๋ฟ๋ง ์๋๋ผ Point ํด๋์ค์ ์ ์ํ xPos, yPox๋ ๊ฐ๊ฒ ๋๋ค.
- ๋ํ ์๋ธ ํด๋์ค์ธ ColorPoint์ ๋ฉค๋ฒ ๋ฉ์๋ showColorPoint์์๋ ์ํผ ํด๋์ค์ showPoint๋ ํธ์ถํ ์ ์๋ค.
- ํ์ง๋ง xPos์ yPos๋ Point์ private ๋ฉค๋ฒ์ด๋ฏ๋ก Color ํด๋์ค์ ๋ฉค๋ฒ๋ค์ด ์ ๊ทผํ ์ ์๋ค.
- ๋ฐ๋ผ์ setPoint์ showPoint ๋ฉ์๋๋ฅผ ํตํด์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ๋ค.
์์์ ์ข ๋ฅ
- ์๋ฐ์์๋ C++์ฒ๋ผ public ์์, protected ์์ ๋ฑ์ ๋ช ์ํ์ง ์๋๋ค.
- ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ
์๋ธ ํด๋์ค extends ์ํผ ํด๋์ค๋ก๋ง ์ ์ธํ๋ฉฐ ์ํผ ํด๋์ค ๋ฉค๋ฒ๋ค์ ์ ๊ทผ ์ง์ ์์ ๋ฐ๋ผ์ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ์๋ธ ํด๋์ค์ ์์๋๋ค.
class Point {
private int privateVal;
protected int protectedVal;
public int publicVal;
int defaultVal;
}
// ๊ฐ์ ํจํค์ง์ ์๋ค.
class ColorPoint extends Point {
void someMethod() {
privateVal = 1; // Error!
protectedVal = 2;
publicVal = 3;
defaultVal = 4;
}
}
| ์ํผ ํด๋์ค ๋ฉค๋ฒ์ ์ ๊ทผํ๋ ํด๋์ค ์ข ๋ฅ | private | default | protected | public |
|---|---|---|---|---|
| ๊ฐ์ ํจํค์ง์ ํด๋์ค | X | O | O | O |
| ๋ค๋ฅธ ํจํค์ง์ ํด๋์ค | X | X | X | O |
| ๊ฐ์ ํจํค์ง์ ์๋ธ ํด๋์ค | X | O | O | O |
| ๋ค๋ฅธ ํจํค์ง์ ์๋ธ ํด๋์ค | X | X | O | O |
์์๊ณผ ์์ฑ์
์ํผ ํด๋์ค์ ์๋ธ ํด๋์ค์ ์์ฑ์
- ์ํผ ํด๋์ค์ ์๋ธ ํด๋์ค ๋ชจ๋ ์์ฑ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ์๋ธ ํด๋์ค ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋, ์๋ธ ํด๋์ค์ ์์ฑ์์ ์ํผ ํด๋์ค์ ์์ฑ์๊ฐ ๋ชจ๋ ์คํ๋๋ค.
- ์์ฑ์์ ๋ชฉ์ ์ ๊ฐ์ฒด ์ด๊ธฐํ์ ์๊ธฐ ๋๋ฌธ์, ์๋ธ ํด๋์ค์ ์์ฑ์๋ ์๋ธ ํด๋์ค์ ๋ฉค๋ฒ๋ ํ์ํ ์ด๊ธฐํ๋ฅผ ์ํํ๋ค.
- ์ํผ ํด๋์ค์ ์์ฑ์๋ ์ํผ ํด๋์ค์ ๋ฉค๋ฒ๋ ํ์ํ ์ด๊ธฐํ๋ฅผ ๊ฐ๊ฐ ์ํํ๋ค.
- ์ํผ ํด๋์ค์ ์์ฑ์์ ์๋ธ ํด๋์ค์ ์์ฑ์ ์ค์์ ์ํผ ํด๋์ค์ ์์ฑ์๊ฐ ๋จผ์ ์คํ๋๋ค.
class Point {
Point() {
// ๋จผ์ ์คํ๋๋ค.
System.out.println("Point ์์ฑ์ ์คํ");
}
}
class ColorPoint extends Point {
ColorPoint() {
// ์ดํ์ ์คํ๋๋ค.
System.out.println("ColorPoint ์์ฑ์ ์คํ");
}
}
class ExampleTest {
public static void main(String[] args) {
ColorPoint cp = new ColorPoint();
}
}
- ์ปดํ์ผ๋ฌ๋
new๋ฌธ์ฅ์ด ์คํ๋๋ฉด ColorPoint ์์ฑ์๋ฅผ ํธ์ถํ๋ค. - ๊ทธ๋ฌ๋ ColorPoint๋ ์์ ์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ๋จผ์ ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ๋ค.
- ์๋ธ ํด๋์ค์ ์์ฑ์๊ฐ ๋จผ์ ํธ์ถ๋์ง๋ง, ๊ฒฐ๊ตญ ์ํผ ํด๋์ค์ ์์ฑ์๊ฐ ๋จผ์ ์คํ๋๋ค.
- ์ด๋ค ์๋ธ ํด๋์ค๋ ์ง ์์ฑ์์ ๋ํด ์ปดํ์ผ๋ฌ๋ ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ๋ค ์์ ์ ์ฝ๋๋ฅผ ์คํํ๋๋ก ์ปดํ์ผ ํ๋ค.
- ์ด๋ ์ํผ ํด๋์ค๊ฐ ๋จผ์ ์ด๊ธฐํ๋ ํ ์ด๋ฅผ ์์๋ฐ๋ ์๋ธ ํด๋์ค๊ฐ ์ด๊ธฐํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ธ ํด๋์ค์ ์ํผ ํด๋์ค ์์ฑ์ ํธ์ถ
- ์ํผ ํด๋์ค์ ์์ฑ์๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ์ ์๋ค. ๋ฌผ๋ก ์๋ธ ํด๋์ค๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
- ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ๋ฌต์์ ์ผ๋ก ์ํผ ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถ๋๋๋ก ์ปดํ์ผํ๋ค.
class Point {
Point() {
// ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ๋ก ์คํ๋๋ค.
System.out.println("Point ๊ธฐ๋ณธ ์์ฑ์");
}
Point(int x) {
// ์คํ๋์ง ์๋๋ค.
System.out.println("Point ๋งค๊ฐ๋ณ์ ์์ฑ์");
}
}
class ColorPoint extends Point {
ColorPoint() {
// ๋ ๋ฒ์งธ๋ก ์คํ๋๋ค.
System.out.println("ColorPoint ๊ธฐ๋ณธ ์์ฑ์");
}
}
class ExampleTest {
public static void main(String[] args) {
ColorPoint cp = new ColorPoint();
}
}
- ๋ง์ผ ์ํผ ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์ ์ธ๋์ด ์์ง ์๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- ์๋ธ ํด๋์ค์ ์์ฑ์๋ก ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ์์ฑ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ ๊ฒฝ์ฐ์๋ ์ปดํ์ผ๋ฌ๋ ๋ฌต์์ ์ผ๋ก ์ํผ ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ๋ค.
- ๋ช ์์ ์ผ๋ก ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ์ ํํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
class Point {
Point() {
System.out.println("Point ๊ธฐ๋ณธ ์์ฑ์");
}
Point(int x) {
System.out.println("Point ๋งค๊ฐ๋ณ์ ์์ฑ์");
}
}
class ColorPoint extends Point {
ColorPoint() {
System.out.println("ColorPoint ๊ธฐ๋ณธ ์์ฑ์");
}
ColorPoint(int x) {
super(x); // ๋ฐ๋์ ๋ฉ์๋ ์์ ์์น์ ์์ด์ผ ํ๋ค.
System.out.println("ColorPoint ๋งค๊ฐ๋ณ์ ์์ฑ์");
}
}
superํค์๋๋ฅผ ์ด์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ ์๋ธ ํด๋์ค์ ์์ฑ์ ์ฒซ ๋ผ์ธ์ ์์ด์ผ ํ๋ค.- ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. Constructor call must be the first statement in a constructor