๋งค๋ฒ ์ค๋ฒ๋ก๋ฉ(Overloading), ์ค๋ฒ๋ผ์ด๋ฉ(Overriding)โฆ ์์งํ ๊ฐ๋ ์์ฒด๋ ์๊ณ ์์๊ณ , ์ค์ ๋ก ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋ ํด๋ดค๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ์ฅ ์ค์ํ ๊ฑธ ๋์น๊ณ ์์๋ค. โ์ ์ฌ์ฉํ๋๋ฐ? ์ด๋ค ์ํฉ์์ ์จ์ผ ํ๋๋ฐ?โ
์ด ์ง๋ฌธ์ด ๋์ค๋ฉด ํญ์ ํโฆ ํ๋ฉด์ ๋นํฉํ๋ค.
๊ฐ์ฒด์งํฅ์ 4๊ฐ์ง ํต์ฌ ์์น(์บก์ํ, ๋คํ์ฑ, ์ถ์ํ, ์์)๋ ๋จ์ํ โ์๊ณ ์๋คโ ์์ค์ด ์๋๋ผ, โ์(Why) ์ฌ์ฉํ๋์งโ์ ๋ํ ๊ณ ๋ฏผ์ ์ ๋๋ก ํด๋ณธ ์ ์ด ์๋ ๊ฒ ๊ฐ๋ค.
์ด๋ฒ ๊ธฐํ์ ๊ทธ ๋ถ๋ถ๊น์ง ํ์คํ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๋ณด๋ ค ํ๋ค.
๋จผ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP, Object-Oriented Programming)์ด ๋ฌด์์ธ์ง ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด์.
๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๋ณ์์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ๋ฅ(๋ฉ์๋)์ ํ๋๋ก ๋ฌถ์ด '๊ฐ์ฒด'๋ก ๋ง๋ค๊ณ , ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ์๋ก ํ๋ ฅํ๋ฉฐ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๋ฐฉ์
์ฝ๊ฒ ๋งํด์, โํ์ค ์ธ๊ณ์ ์ฌ๋ฌผ์ด๋ ๊ฐ๋ ์ ์ฝ๋ ์์์ ๊ฐ์ฒด ๋จ์๋ก ๋ง๋ค์ด ์๋ก ์ํธ์์ฉํ๊ฒ ํ๋ ๋ฐฉ๋ฒโ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด์งํฅ์ ์ด์ผ๊ธฐํ ๋๋ ํญ์ 4๊ฐ์ง ํต์ฌ ์์น(์บก์ํ, ์์, ๋คํ์ฑ, ์ถ์ํ)์ด ํจ๊ป ๋์จ๋ค.
์ด 4๊ฐ์ง ์์น์ด ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๊ณํ๊ณ ๊ตฌํํ๋ ๊ทผ๋ณธ์ ์ธ ๊ธฐ์ค์ด ๋๋ค.
์บก์ํ๋ ๋ฐ์ดํฐ(๋ณ์)์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ๋ฅ(๋ฉ์๋)์ ํ๋๋ก ๋ฌถ๊ณ , ์ธ๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์จ๊ธฐ๋ ๊ฒ์ ๋งํ๋ค.
์ฆ, ์ ๋ณด ์๋(Information Hiding)์ ํตํด ๊ฐ์ฒด ๋ด๋ถ ์ํ๋ฅผ ๋ณดํธํ๊ณ , ์๋ชป๋ ์ ๊ทผ์ด๋ ๋ณ๊ฒฝ์ ๋ง๋ ๊ฒ์ด๋ค.
class Person {
private String name; // ์ธ๋ถ์์ ์ง์ ์ ๊ทผ ๋ถ๊ฐ
private int age;
// Getter ๋ฉ์๋
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Setter ๋ฉ์๋
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
if (age > 0) { // ์๋ชป๋ ๊ฐ ๋ฐฉ์ง
this.age = age;
}
}
}
1. ๋ฐ์ดํฐ ๋ณดํธ
์ถ์ํ๋ ๋ถํ์ํ ์ธ๋ถ ์ฌํญ์ ์จ๊ธฐ๊ณ , ์ค์ํ ํน์ง์ด๋ ๊ณตํต๋ ๊ฐ๋ ๋ง ๋ฝ์๋ด๋ ๊ฒ์ ๋งํ๋ค.
์ฆ, ๊ฐ์ฒด์ ํต์ฌ ์์ฑ๊ณผ ๊ธฐ๋ฅ๋ง ์ ์ํ๊ณ , ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์จ๊ธฐ๋ ๊ฒ์ด๋ค.
// ์ถ์ ํด๋์ค
abstract class Animal {
String name;
Animal(String name) {
this.name = name;
}
// ๊ณตํต ๊ธฐ๋ฅ์ ์ ์ธ๋ง (์ถ์ ๋ฉ์๋)
abstract void sound();
}
// ๊ตฌ์ฒด ํด๋์ค
class Dog extends Animal {
Dog(String name) {
super(name);
}
@Override
void sound() {
System.out.println(name + " : ๋ฉ๋ฉ!");
}
}
class Cat extends Animal {
Cat(String name) {
super(name);
}
@Override
void sound() {
System.out.println(name + " : ์ผ์น!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog("์ฒ ์");
Animal cat = new Cat("๋๋น");
dog.sound(); // ์ฒ ์ : ๋ฉ๋ฉ!
cat.sound(); // ๋๋น : ์ผ์น!
}
}
1. ๋ณต์ก์ฑ ๊ฐ์
2. ์ฌ์ฌ์ฉ์ฑ ํฅ์
3. ์ ์ง๋ณด์ ์ฉ์ด
4. ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น ์ค์
์์์ ๊ธฐ์กด ํด๋์ค(๋ถ๋ชจ ํด๋์ค, Superclass)์ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ์๋ก์ด ํด๋์ค(์์ ํด๋์ค, Subclass)๊ฐ ๋ฌผ๋ ค๋ฐ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋งํ๋ค.
์ฆ, ๊ณตํต๋ ๊ธฐ๋ฅ์ ๋ถ๋ชจ ํด๋์ค์ ์ ์ํ๊ณ , ์์ ํด๋์ค์์ ํ์์ ๋ฐ๋ผ ํ์ฅํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
// ๋ถ๋ชจ ํด๋์ค
class Animal {
String name;
Animal(String name) {
this.name = name;
}
void eat() {
System.out.println(name + "๊ฐ ๋ฐฅ์ ๋จน๋๋ค");
}
}
// ์์ ํด๋์ค
class Dog extends Animal {
Dog(String name) {
super(name);
}
void play() {
System.out.println(name + "๊ฐ ๊ณต๋์ด๋ฅผ ํ๋ค");
}
}
class Cat extends Animal {
Cat(String name) {
super(name);
}
void sleep() {
System.out.println(name + "๊ฐ ์ ์ ์๋ค");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("์ฒ ์");
Cat cat = new Cat("๋๋น");
// ์์๋ฐ์ ๋ฉ์๋ ์ฌ์ฉ
dog.eat(); // ์ฒ ์๊ฐ ๋ฐฅ์ ๋จน๋๋ค
cat.eat(); // ๋๋น๊ฐ ๋ฐฅ์ ๋จน๋๋ค
// ์์ ํด๋์ค ๊ณ ์ ๊ธฐ๋ฅ
dog.play(); // ์ฒ ์๊ฐ ๊ณต๋์ด๋ฅผ ํ๋ค
cat.sleep(); // ๋๋น๊ฐ ์ ์ ์๋ค
}
}
1. ์ฝ๋ ์ฌ์ฌ์ฉ
2. ์ ์ง๋ณด์ ์ฉ์ด
3. ๊ณ์ธต์ ๊ตฌ์กฐ ํํ
4. ๋คํ์ฑ๊ณผ ์ฐ๊ณ ๊ฐ๋ฅ
๋คํ์ฑ์ ํ๋์ ํ์ (์ฃผ๋ก ๋ถ๋ชจ ํด๋์ค)์ผ๋ก ์ฌ๋ฌ ์์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ์ ์๋ ์ฑ์ง์ ๋งํ๋ค.
์ฆ, ๊ฐ์ ์ฝ๋์ง๋ง ์ค์ ๊ฐ์ฒด ํ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋๋ก ๋ง๋๋ ๊ฒ.
์ค๋ฒ๋ก๋ฉ(Overloading)๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ(Overriding)์ ํตํด ๋คํ์ฑ์ ๊ตฌํํ๋ค๊ณ ๋ณผ ์ ์๋ค.
// ๋ถ๋ชจ ํด๋์ค
class Animal {
String name;
Animal(String name) {
this.name = name;
}
// ๊ธฐ๋ณธ ์๋ฆฌ
void sound() {
System.out.println(name + "๊ฐ ์๋ฆฌ๋ฅผ ๋ธ๋ค");
}
// ์ค๋ฒ๋ก๋ฉ ์์: ๊ฐ์ ์ด๋ฆ, ๋ค๋ฅธ ๋งค๊ฐ๋ณ์
void sound(int times) {
for (int i = 0; i < times; i++) {
sound();
}
}
}
// ์์ ํด๋์ค 1
class Dog extends Animal {
Dog(String name) {
super(name);
}
// ์ค๋ฒ๋ผ์ด๋ฉ: ๋ถ๋ชจ ๋ฉ์๋ ์ฌ์ ์
@Override
void sound() {
System.out.println(name + " : ๋ฉ๋ฉ!");
}
}
// ์์ ํด๋์ค 2
class Cat extends Animal {
Cat(String name) {
super(name);
}
@Override
void sound() {
System.out.println(name + " : ์ผ์น!");
}
}
public class Main {
public static void main(String[] args) {
// ๋ถ๋ชจ ํ์
์ผ๋ก ์ฌ๋ฌ ์์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ๋คํ์ฑ
Animal a1 = new Dog("์ฒ ์");
Animal a2 = new Cat("๋๋น");
a1.sound(); // ์ฒ ์ : ๋ฉ๋ฉ!
a2.sound(); // ๋๋น : ์ผ์น!
// ์ค๋ฒ๋ก๋ฉ ํ์ฉ
a1.sound(3); // ์ฒ ์ : ๋ฉ๋ฉ! x3
a2.sound(2); // ๋๋น : ์ผ์น! x2
// ๋ฐฐ์ด๊ณผ ๋คํ์ฑ
Animal[] animals = {new Dog("๋ฝ์"), new Cat("์ฝ์ฝ"), new Dog("๋ฐ๋์ด")};
for (Animal a : animals) {
a.sound(); // ๊ฐ ๊ฐ์ฒด ํ์
์ ๋ง๋ ์๋ฆฌ ์ถ๋ ฅ
}
}
}
1. ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ํฅ์
2.์ ์ฐํ ์ค๊ณ ๊ฐ๋ฅ
3. ์ค๋ณต ์ฝ๋ ๊ฐ์
4. ๋์ ๋ฐ์ธ๋ฉ(Dynamic Binding) ํ์ฉ
๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ(Method Overloading)์ ํต์ฌ์ ๋ฉ์๋ ์๊ทธ๋์ฒ(Method Signature)์ ์๋ค.
๋ฉ์๋ ์๊ทธ๋์ฒ(Method Signature)๋ ๋ฉ์๋ ์ ์ธ๋ถ์์ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ์ ๋ณด, ์ฆ ๋ฉ์๋ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ๋ฅผ ์๋ฏธํ๋ค.
๋ ๋ฉ์๋๊ฐ ์๋ก ๋ค๋ฅธ ์ค๋ฒ๋ก๋ฉ ๋ฉ์๋๊ฐ ๋๋ ค๋ฉด ๋ค์ ์กฐ๊ฑด ์ค ํ๋๋ผ๋ ๋ฌ๋ผ์ผ ํ๋ค.
๋ฉ์๋ ์ด๋ฆ
๋งค๊ฐ๋ณ์์ ์
๋งค๊ฐ๋ณ์ ํ์ ์ ์์
โ ๏ธ ์ฃผ์: ๋ฆฌํดํ์ ์ ๋ฉ์๋ ์๊ทธ๋์ฒ์ ํฌํจ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ๋ฆฌํดํ์ ๋ง ๋ค๋ฅด๊ณ ๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ๊ฐ ๊ฐ์ผ๋ฉด ์ค๋ฒ๋ก๋ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์์
public class Calculator {
// ๊ฐ๋ฅ: ๊ธฐ๋ณธ ๋ง์
public int add(int a, int b) {
return a + b;
}
// ๊ฐ๋ฅ: ํ๋์ ๊ฐ๋ง ์ฒ๋ฆฌ
public int add(int a) {
return a;
}
// ๊ฐ๋ฅ: ์ค์ ํ์
๋ง์
public double add(double a, double b) {
return a + b;
}
// ๊ฐ๋ฅ: ๋ฌธ์์ด ์ฐ๊ฒฐ
public String add(String a, String b) {
return a + b;
}
// ๋ถ๊ฐ๋ฅ: ๋งค๊ฐ๋ณ์ ์์ ํ์
์ด ๊ธฐ์กด ๋ฉ์๋์ ๋์ผ
// public void add(int x, int y) { }
// ๋ถ๊ฐ๋ฅ: ๋งค๊ฐ๋ณ์ ์์ ํ์
์ด ๊ธฐ์กด ๋ฉ์๋์ ๋์ผ
// public int add(int a, int b) { return 0; }
}
์๋ฐ์์๋ ํ ํด๋์ค ๋ด์ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์ค๋ณตํด์ ์ ์ํ ์ ์๋ค.
ํ์ง๋ง ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ ํ์ , ์์๋ฅผ ๋ค๋ฅด๊ฒ ํ๋ฉด, ํ๋์ ์ด๋ฆ์ผ๋ก ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์์ฑํ ์ ์๋ค.
์ฆ, ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ(Method Overloading)์ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์๋ก ๋ค๋ฅธ ์๊ทธ๋์ฒ(Signature)๋ก ์ฌ๋ฌ ๊ฐ ์ ์ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ํ์ ์ธ ์๋ก๋ println() ๋ฉ์๋๋ฅผ ๋ค ์ ์๋ค.
PrintStream ํด๋์ค์๋ ๋ค์ํ ํ์
์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ์๋๋ก ์ฝ 10๊ฐ์ง ์ด์์ ์ค๋ฒ๋ก๋ฉ๋ println() ๋ฉ์๋๊ฐ ์ ์๋์ด ์๋ค.
public void println() {
newLine();
}
public void println(boolean x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(char x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(String s) {
synchronized (this) {
print(s);
newLine();
}
}
private void print(boolean b) {
System.out.print(b);
}
private void print(char c) {
System.out.print(c);
}
private void print(int i) {
System.out.print(i);
}
private void print(String s) {
System.out.print(s);
}
private void newLine() {
System.out.println();
}
์ค๋ฒ๋ก๋ฉ(Overloading)์ ๋น์ทํ ๊ธฐ๋ฅ์ด ์๋ ๋ฉ์๋๋ค์ ๋์ผํ ์ด๋ฆ์ผ๋ก ์์ฑํ๋ฉด, ํ์ ํ๋ ๊ฐ๋ฐ์๋ค๋ผ๋ฆฌ ํผ๋์ ์ค ์ ์๋ค.
import java.util.*;
public class Main {
public static void main(String[] args) {
Collection<?>[] collections = {
new LinkedHashSet<Integer>(),
new LinkedList<String>(),
new ArrayList<Double>(),
new TreeSet<Character>()
};
for (Collection<?> c : collections) {
System.out.println(classify(c));
}
}
public static String classify(Set<?> s) {
return "Set";
}
public static String classify(List<?> l) {
return "List";
}
public static String classify(Collection<?> c) {
return "Other Collection";
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ
Other Collection
Other Collection
Other Collection
Other Collection
์ค๋ฒ๋ก๋ฉ์ ์ปดํ์ผ ์์ ์ ์ฐธ์กฐ ํ์ ๊ธฐ์ค์ผ๋ก ๊ฒฐ์ ๋๋ค. ์ฆ, ์ค์ ๊ฐ์ฒด๊ฐ LinkedHashSet์ด๋ , LinkedList๋ ์๊ด์์ด Collection ํ์ ์ด๋ฏ๋ก `classify(Collection c)`๊ฐ ํธ์ถ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ค๋ฉด instanceof ๋ฅผ ํ์ฉํด์ผํ๋ค.
public static String classify(Collection<?> c) {
if (c instanceof Set) return "Set";
if (c instanceof List) return "List";
return "Other Collection";
}
์์ ํด๋์ค๊ฐ ๊ฐ์ง ๋ฉค๋ฒ ๋ณ์๋ฟ๋ง ์๋๋ผ ๋ฉ์๋๋ ํ์ ํด๋์ค๋ก ์์๋์ด ํ์ ํด๋์ค์์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง ํ์ ํด๋์ค์์ ํ์์ ๋ฐ๋ผ ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ ์๋ ์๋ค.
์ด์ฒ๋ผ ์์ ๊ด๊ณ์ ์๋ ํด๋์ค์์ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค๊ฐ ์๋กญ๊ฒ ์ ์ํ๋ ๊ฒ์ ์ค๋ฒ๋ผ์ด๋ฉ(Overriding)์ด๋ผ๊ณ ํ๋ค.
๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ค๋ฉด ๋ฉ์๋ ์๊ทธ๋์ฒ(๋ฆฌํด ํ์ , ๋ฉ์๋ ์ด๋ฆ, ๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ)๊ฐ ๋์ผํด์ผ ํ๋ค.
์ ๊ทผ ์ ์ด์๋ ๋ถ๋ชจ ํด๋์ค ๋ฉ์๋๋ณด๋ค ์ข์ ๋ฒ์๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
-> ์: ๋ถ๋ชจ ๋ฉ์๋๊ฐ protected๋ผ๋ฉด, ์์ ํด๋์ค์ ์ค๋ฒ๋ผ์ด๋ฉ ๋ฉ์๋๋ protected๋ public์ด์ด์ผ ํ๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ์ ๋ฒ์์ ์ ๊ทผ ์ ์ด์๋ฅผ ์ฌ์ฉํ๋ค.
๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ณด๋ค ๋ ๋ง์ ์์ธ๋ฅผ ์ ์ธํ ์ ์๋ค.
์์๋ฐ์ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง, ์์ ํด๋์ค์ ํน์ฑ์ด๋ ํ์์ ๋ฐ๋ผ ๋์์ ๋ค๋ฅด๊ฒ ํ๊ณ ์ถ์ ๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด ํ์ํ๋ค.
๋ง์ฝ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ์ง ์๊ณ ๋ฉ์๋ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด, ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ ์ฌ์ ํ ๊ทธ๋๋ก ์กด์ฌํ๊ฒ ๋์ด ์๋์น ์์ ๊ธฐ๋ฅ์ด ํธ์ถ๋ ์ ์๋ค.
๋ฐ๋ผ์ ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํจ์ผ๋ก์จ ๋ถํ์ํ๊ฑฐ๋ ๋ถ์ ์ ํ ๊ธฐ๋ฅ์ ์ ํํ๊ณ , ์ํ๋ ๋์์ผ๋ก ์์ ํ๊ธฐ ์ํด ์ค๋ฒ๋ผ์ด๋ฉ์ ์ฌ์ฉํ๋ค.
๊ธฐ์กด ๊ธฐ๋ฅ ์ ํ ๋๋ ์์
๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๊ฐ ์์ ํด๋์ค์ ์ ํฉํ์ง ์์ ๊ฒฝ์ฐ, ์ค๋ฒ๋ผ์ด๋ฉ์ ํตํด ๋ถํ์ํ๊ฑฐ๋ ๋ถ์ ์ ํ ๊ธฐ๋ฅ์ ์ ํํ ์ ์์ต๋๋ค.
์บก์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ์์ ๋ง์๋๋ก ๋ฐ๊พธ์ง ๋ชปํ๊ฒ ๋ณดํธํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, Person ํด๋์ค์ age๋ฅผ private์ผ๋ก ์ ์ธํ๊ณ , setAge() ๋ฉ์๋์์ ์์๊ฐ ๋ค์ด๊ฐ์ง ์๋๋ก ๊ฒ์ฆํ๋ฉด, ์๋ชป๋ ๊ฐ์ผ๋ก ๊ฐ์ฒด ์ํ๊ฐ ๊นจ์ง๋ ๊ฒ์ ๋ง์ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ์ ์งํ๊ณ , ๋ด๋ถ ๊ตฌํ์ด ๋ฐ๋๋๋ผ๋ ์ธ๋ถ ์ฝ๋๋ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ด ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค.
์ค๋ฒ๋ก๋ฉ์ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฅผ ๋ค์ด, add(int a, int b)์ add(double a, double b)์ฒ๋ผ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ ์์ ์ค์๋ฅผ ๋ํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค ์ ์๋ค. ๋ง์ฝ ์ค๋ฒ๋ก๋ฉ์ ์ฐ์ง ์์ผ๋ฉด ๊ธฐ๋ฅ์ ๊ฐ์๋ ๋ฉ์๋ ์ด๋ฆ์ ๋ค๋ฅด๊ฒ ์ง์ด์ผ ํด์ ์ฝ๋๊ฐ ์ฐ๋งํด์ง๊ณ , ์ดํดํ๊ธฐ ์ด๋ ต๋ค.
๋ฐ๋ฉด, ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ถ๋ชจ ํด๋์ค์์ ์์๋ฐ์ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค ์ํฉ์ ๋ง๊ฒ ๋ฐ๊ฟ์ ์ธ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. ์๋ฅผ ๋ค์ด, Animal ํด๋์ค์ sound() ๋ฉ์๋๊ฐ ์๊ณ , Cat ํด๋์ค์์ ์ด๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ฉด Cat ๊ฐ์ฒด๊ฐ sound()๋ฅผ ํธ์ถํ์ ๋ โ์ผ์นโ์ด๋ผ๊ณ ์ถ๋ ฅ๋๋ค. ์ค๋ฒ๋ผ์ด๋ฉ์ ํ์ง ์์ผ๋ฉด ๋ถ๋ชจ ๋ฉ์๋๋๋ก ๋์ํด์ ์์ ๊ฐ์ฒด์ ๋ง๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.