OPP
์ ์
- Object-Oriented Programming, ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ํํ์ฌ ์์ฑ๊ณผ ํ์๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๊ฐ์ฒด๋ค ๊ฐ์ ์ ๊ธฐ์ ์ธ ์ํธ์์ฉ์ ํตํด ๋ก์ง์ ๊ตฌ์ฑํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ
- ํ์ค ์ธ๊ณ์ ๋น์ทํ๊ฒ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ์์ฑ๊ณผ ํ์๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ก ์์ฑํ๊ณ , ์ด๋ ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๋ผ๋ฆฌ ์๋ก ์ํธ ์์ฉ์ ํ๋ฉฐ ์ํํธ์จ์ด๊ฐ ๋์
ํน์ง
- ์ถ์ํ
- ๊ฐ์ฒด๋ค์ ๊ณตํต ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ํ๋๋ก ๋ฌถ๋ ๊ฒ
- ์ถ์ ํด๋์ค, ์ถ์ ๋ฉ์๋ ๊ทธ๋ฆฌ๊ณ ์ธํฐํ์ด์ค๋ก ์ถ์ํ๋ฅผ ํํ
public interface Phone {
void showInformation();
void call(String phoneNumber);
void sendMessage(String message, String phoneNumber);
void powerOn();
void powerOff();
}
- ํด๋ํฐ์ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ธ ์ ํ ๊ฑธ๊ธฐ, ๋ฉ์์ง ๋ณด๋ด๊ธฐ, ์ ์ ์ผ๊ธฐ, ์ ์ ๋๊ธฐ ๊ทธ๋ฆฌ๊ณ ํด๋ํฐ ์ ๋ณด ๋ณด์ฌ์ฃผ๊ธฐ๋ฅผ ์ธํฐํ์ด์ค ์ถ์ ๋ฉ์๋๋ก ์ ์ธํ๋ค.
- Phone ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ค์ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํจ์ผ๋ก์จ ์ถ์ํ๋ฅผ ํํํ ์ ์๋ค.
public class Samsung implements Phone {
private String phoneNumber;
private String phoneName;
private boolean power;
public Samsung(String phoneNumber, String phoneName) {
this.phoneNumber = phoneNumber;
this.phoneName = phoneName;
}
@Override
public void showInformation() {
System.out.println("phoneNumber = " + phoneNumber);
System.out.println("phoneName = " + phoneName);
}
@Override
public void call(String phoneNumber) {
if (this.power) System.out.println(phoneNumber + "์ ์ ํ๋ฅผ ๊ฒ๋๋ค.");
}
@Override
public void sendMessage(String message, String phoneNumber) {
if (this.power) {
System.out.println("message = " + message);
System.out.println(phoneNumber + "์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋
๋๋ค.");
}
}
@Override
public void powerOn() {
if (!this.power) {
this.power = true;
System.out.println("์ ์์ ํต๋๋ค.");
}
}
@Override
public void powerOff() {
if (this.power) {
this.power = false;
System.out.println("์ ์์ ๋๋๋ค.");
}
}
}
- Samsung ํด๋์ค๊ฐ Phone์ ์์๋ฐ๊ณ , ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํจ์ผ๋ก์จ ํด๋ํฐ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
public static void main(String[] args) {
Phone phone = new Samsung("010-1234-5678", "๊ฐค๋ญ์ s24");
phone.showInformation();
phone.powerOn();
phone.call("010-5678-1234");
phone.powerOff();
}
- ๋คํ์ฑ
- ์์์ ํตํด ๊ธฐ๋ฅ์ ํ์ฅ, ๋ณ๊ฒฝํ์ฌ ํ๋์ ์ฝ๋๋ก ์ฌ๋ฌ ํํ์ ๊ฐ์ฒด๋ก ์ฌ๊ตฌ์ฑ๋๋ ๊ฒ์ ์๋ฏธ
- ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ๊ณผ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ผ๋ก ๋คํ์ฑ์ ํํ
public class Soldier {
public void sayInformation() {
System.out.println("์ ๋ ๊ตฐ์ธ์
๋๋ค.");
}
}
- Soldier ํด๋์ค์ sayInformation() ๋ฉ์๋๋ โ์ ๋ ๊ตฐ์ธ์
๋๋ค.โ๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๋ค.
public class Private extends Soldier {
@Override
public void sayInformation() {
System.out.println("์ ๋ ์ด๋ฑ๋ณ์
๋๋ค.");
}
}
public class Private1st extends Soldier {
@Override
public void sayInformation() {
System.out.println("์ ๋ ์ผ๋ณ์
๋๋ค.");
}
}
public class Corporal extends Soldier {
@Override
public void sayInformation() {
System.out.println("์ ๋ ์๋ณ์
๋๋ค.");
}
}
public class Sergeant extends Soldier {
@Override
public void sayInformation() {
System.out.println("์ ๋ ๋ณ์ฅ์
๋๋ค.");
}
}
- Soldier ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค๋ค์ sayInformation() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํจ์ผ๋ก์จ ๊ณ๊ธ์ ๋ง๋ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค. - ์์
- **๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋์ ๋ฉ์๋๋ฅผ ๋ฐ์ ์ฌ์ฌ์ฉํ๊ฑฐ๋, ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐ**ํจ์ผ๋ก์จ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์
- extends ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ํํ
public class SamsungPlus extends Samsung {
public SamsungPlus(String phoneNumber, String phoneName) {
super(phoneNumber, phoneName);
}
public void orderBixby(String order) {
if (this.power) System.out.println("๋น
์ค๋น์๊ฒ " + order + " ๋ช
๋ น์ ๋ด๋ฆฝ๋๋ค.");
}
}
- Samsung ํด๋์ค๋ฅผ extends ํค์๋๋ฅผ ํตํด ์์๋ฐ์ SamsungPlus ํด๋์ค์ด๋ค.
- super() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฐ์ ํด๋์ค์ ์์ฑ์๋ ์์๋ฐ์ ํด๋์ค์ ์์ฑ์ฌ๋ฅผ ํธ์ถํ๋ค.
- ์์๋ฐ์ SamsungPlus ํด๋์ค๋ ๊ธฐ์กด Samsung ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ๋ํ, ์์๋ฐ์ ํด๋์ค๋ง์ ์์ฑ๊ณผ ํ๋๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
public static void main(String[] args) {
SamsungPlus phone = new SamsungPlus("010-1234-5677", "๊ฐค๋ญ์ s24+");
phone.powerOn();
phone.call("010-1234-5678");
phone.orderBixby("์์
ํ์ด์ค");
}
- ์บก์ํ
- ํด๋์ค ์์ ์๋ก ์ฐ๊ด์๋ ์์ฑ๊ณผ ๊ธฐ๋ฅ๋ค์ ํ๋์ ์บก์๋ก ๋ง๋๋ ๊ฒ
- ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ์์ ํจ๋ถ๋ก ์ ๊ทผํ์ง ๋ชปํ๊ฒ ๋ณดํธ
- ์ ๊ทผ์ ์ด์์ getter/setter๋ก ์บก์ํ๋ฅผ ํํ

- ์ ๊ทผ ์ ์ด์์ ์ข
๋ฅ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- private๋ ๋จ์ด ๋ป์ฒ๋ผ ๋์ผ ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์์ด ์ธ๋ถ์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅ ํ๋ค.
- default๋ ์ ๊ทผ ์ ์ด์๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด ์ฌ์ฉ๋๋ ๋ํดํธ ๊ฐ์ผ๋ก, ๋์ผ ํจํค์ง ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ค.
- protected๋ ๋์ผ ํจํค์ง ๋ด๋ถ์์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ํด๋น ์ ๊ทผ์๋ก ์ ์ธ๋ ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค์์๋ ์ ๊ทผํ ์ ์๋ค.
- public๋ ๋จ์ด ๋ป์ฒ๋ผ ์๋ฌด ๊ณณ์์ ๋ค ์ ๊ทผํ ์ ์๋ค.
public class People {
private int money;
private String name;
public String nickName;
}
- People ํด๋์ค์ ์์ฑ์ด๋ค.
- money๊ณผ name์ ์ธ๋ถ์์ ์์ ๋๋ฉด ์๋๊ธฐ ๋๋ฌธ์ private๋ก ์ ์ธํ๋ค.
- nickname์ ๊ฒฝ์ฐ ์ธ์ ๋ ์ง ๋ณํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ public๋ก ์ ์ธํ๋ค.
People people = new People(1000, "๊น์ฒ ์", "์์ฒ ๊น");
people.name = "ํ๊ธธ๋"; // Error
people.money = 1234; // Error
people.nickName = "๊น๋ฐ์"; // OK
- private๋ก ์ ์ธ๋ name๊ณผ money๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- public๋ก ์ ์ธ๋ nickName์ ๊ฒฝ์ฐ ์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
- get** : **์ ํด๋นํ๋ ๋ณ์์ ๊ฐ์ ๋ฐํํ๋ ํจ์ / ์ ๊ทผ์๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
- set** : **์ ํด๋นํ๋ ๋ณ์์ ๊ฐ์ ์ค์ ํ๋ ํจ์ / ์ค์ ์๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
- ํด๋์ค ๋ด๋ถ์ ํด๋น ํจ์๋ฅผ ์ ์ธํ์ฌ private๋ก ์ ์ธ๋ ํ๋์ ์ ๊ทผํ ์ ์๋ค.
- ๊ทธ๋ฌ๋, ๊ผญ ์จ๊ฒจ์ผํ๋ ์ ๋ณด์ ๊ฒฝ์ฐ์๋ setter๋ฅผ ์ ์ธํ์ง ์๋ ๊ฒ์ด ์ข์ ๋ณด์ธ๋ค.
์ฅ์
- ์ฝ๋ ์ฌ์ฌ์ฉ์ด ์ฉ์ดํ๋ค.
- ์ ์ง๋ณด์๊ฐ ์ฝ๋ค.
๋จ์
- ์ฒ๋ฆฌ ์๋๊ฐ ์๋์ ์ผ๋ก ๋๋ฆฌ๋ค.
- ์ค๊ณ ์ ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ํ์ํ๋ค.