๐ ์๋ฐ์ ์ ์์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
๋คํ์ฑ?
์ด์ ํ๋ ๋ฒ์ ํ ๋ฒ๋ง ๋ฐฐ์ฐ๋ฉด ์ด๋ค ์๋์ฐจ๋ ์ด์ ํ ์ ์๋ค. ์๋์ฐจ ๋ธ๋๋๋ ๋ด๋ถ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง์ง ์๋๋ค. ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฒ ๋คํ์ฑ์ด๋ค.
OOP์์ ๋คํ์ฑ์ด๋ ์ฌ๋ฌ๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง ์ ์๋ ๋ฅ๋ ฅ. ๋งํ์๋ฉด ์กฐ์ํด๋์ค ํ์ ์ ์ฐธ์กฐ๋ณ์๋ก ์์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๊ฒ์ด๋ค.
class Tv {
boolean power;
int channel;
void power{ power = !power;}
void channelUp() { ++channel;}
void channelDown() { --channel;}
}
class CaptionTv extends Tv {
String text;
void caption() {}
}
CationTv์ ์ธ์คํด์ค๋ฅผ Tv caption = new CaptionTv() ์ด๋ฐ ์์ผ๋ก ์์ฑํ ์๋ ์๋ค.
๋ค๋ง ์ด๋ด ๊ฒฝ์ฐ CaptionTv๊ฐ ๊ฐ์ง๊ณ ์๋ caption()๋ ์ฌ์ฉํ ์ ์๋ค.
์ฐธ์กฐ๋ณ์ ํ๋ณํ
class Car {
String color;
int door;
void drive() {
System.out.println("drive, brrr....");
}
void stop() {
System.out.println("stop...");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water...");
}
}
public class CastingTest {
public static void main(String[] args) {
Car car = null;
//FireEngine fire = (FireEngine)new Car(); //ERROR
FireEngine fireEngine = new FireEngine();
FireEngine fireEngine2 = new FireEngine();
fireEngine.water();
car = fireEngine;
//car.warter //์ฌ์ฉ ๋ถ๊ฐ
car.stop();
fireEngine2 = (FireEngine)car;
fireEngine2.water();
}
}
ํ๋ณํ์ ์ฐธ์กฐ๋ณ์ ํ์ ์ ๋ณํํ๋ ๊ฒ์ผ ๋ฟ, ์ธ์คํด์ค๋ฅผ ๋ณํํ๋ ๊ฒ์ ์๋๋ค. ์ฐธ์กฐ๋ณ์๋ ๋จ์ง ์ฐธ์กฐํ๋ ์ธ์คํด์ค์์ ์ฌ์ฉํ ์ ์๋ ๋ฉค๋ฒ์ ๋ฒ์(๊ฐ์)๋ฅผ ์กฐ์ ํ๋ค.
์์ -> ์กฐ์์ผ๋ก ํ๋ณํ์ ๊ฐ๋ฅํ์ง๋ง
์กฐ์ -> ์์์ผ๋ก ํ๋ณํ์ ๋ถ๊ฐ๋ฅํ๋ค.
์?
์ค์ ์ธ์คํด์ค์ธ Car์ ๋ฉค๋ฒ์ ๊ฐ์๋ณด๋ค FireEngine์ด ์ฌ์ฉํ ์ ์๋ ๋ฉค๋ฒ ๊ฐ์๊ฐ ๋ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
instanceof ์ฐ์ฐ์
์ฐธ์กฐ๋ณ์๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค์ ์ค์ ํ์
์ ์์๋ณผ ๋ ์ด๋ค. booleanํ์
์ผ๋ก returnํ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก ์กฐ๊ฑด๋ฌธ์์ ์ ํจ์ฑ ๊ฒ์ฌํ ๋ ์ฌ์ฉํ๋ค.
instanceof์ ๊ฒฐ๊ณผ๊ฐ true๋ผ๋ ๊ฒ์ ์ฐธ์กฐ๋ณ์๊ฐ ๊ฒ์ฌํ ํ์
์ผ๋ก ํ๋ณํ์ด ๊ฐ๋ฅํ๋ค๋ ๋ป์ด๋ค.
class InstanceofTest{
public static void main(String[] args) {
MotorCyle motorCycle = new MotorCyle();
if(motorCycle instanceof MotorCyle) {
System.out.println("MotorCyle Instance");
}
if(motorCycle instanceof Cycle) {
System.out.println("Cycle Instance");
}
if(motorCycle instanceof Object) {
System.out.println("Object Instance");
}
}
}
class Cycle {}
class MotorCyle extends Cycle{}
/* ๊ฒฐ๊ณผ
MotorCyle Instance
Cycle Instance
Object Instance
*/
MotorCycleํด๋์ค๋ ์๊ธฐ ์์ ์ธ MotorCycleํ์
์ด๋ฉด์, ์กฐ์์ธ Cycleํ์
์ด๋ฉด์, ๊ทธ์ ์กฐ์์ธ Objectํ์
์ด๊ธฐ๋ํ๋ค.
์ด์ฒ๋ผ instanceof๋ ์์ ์ ํ์
๋ฟ๋ง ์๋๋ผ ์กฐ์ํ์
์๋ true๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก MotorCycleํ์
์ Cycleํ์
์ผ๋ก๋, Objectํ์
์ผ๋ก๋ ํ๋ณํ ํ ์ ์๋ค.
์ฐธ์กฐ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๋ณ์
๋ฉ์๋์ ๊ฒฝ์ฐ ์กฐ์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ค๋ฉด, ์ฐธ์กฐ๋ณ์ ํ์
์ ์๊ด์์ด ์ค์ ์ธ์คํด์ค์ ๋ฉ์๋(์ค๋ฒ๋ผ์ด๋ฉํ ๋ฉ์๋)๊ฐ ํธ์ถ๋๋ค.
ํ์ง๋ง ๋ฉค๋ฒผ๋ณ์์ ๊ฒฝ์ฐ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ ์ฐธ์กฐ ๋ณ์์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง๋ค.
class Super {
int x = 10;
}
class Sub extends {
int x = 20;
}
class Main {
public static void main(String[] args) {
Super s = new Super();
Sub sub = new Sub();
System.out.println(s.x); // 10
System.out.println(sub.x); //20
}
}
๋งค๊ฐ๋ณ์์ ๋คํ์ฑ
๋งค๊ฐ๋ณ์๋ก ์กฐ์ํ์
์ ์ฐธ์กฐ๋ณ์๋ฅผ ์ค์ ํ๋ฉด, ๋ชจ๋ ์์ํ์
์ ์ฐธ์กฐ๋ณ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ค.
๋ฐ๋ก ์ ์์ ๋ฅผ ์ฐธ๊ณ ํ์ฌ, add(Super x)๋ผ๋ ๋ฉ์๋๊ฐ ์๋ค๊ณ ํ์. ๊ทธ๋ผ Super๋ฅผ ์์๋ฐ๋ Sub๋ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ค๋ ๋ป์ด๋ค.
package com.javaex.ch7;
/*
* ๊ฐ๊ฒฉ๊ณผ ํฌ์ธํธ ์ ์๋ฅผ ์ ์ํด๋์ ํด๋์ค
* ๋ชจ๋ ์ํ์ด ๊ฐ์ง๊ณ ์์ด์ผ ํ ๊ฒ๋ค์ ์ ์ํ๋ค.
* */
class Product {
int price;
int bonusPoint;
/*
* Product๋ฅผ ์์ํ๋ ํด๋์ค๋ค์ ์กฐ์ํด๋์ค์ ์์ฑ์super()๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ๊ฐ๊ฒฉ์ ์
๋ ฅํด์ผ ํ๋ค.
* Product()๋ ์
๋ ฅ๋ฐ์ ๊ฐ๊ฒฉ์ผ๋ก ๋ณด๋์คํฌ์ธํธ๋ฅผ ์ฐ์ฐํด์ ๋ณ์์ ์ ์ฅํ๋ค.
* */
Product(int price) {
this.price = price;
bonusPoint = (int)(price/10.0); //๊ฐ๊ฒฉ์ 10%๋ฅผ ์ ๋ฆฝํ๋ค.
}
}
class Tv extends Product {
Tv() {
/*์กฐ์ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ๋ ๊ฐ๊ฒฉ์ ์
๋ ฅ*/
super(100); //Tv๋ 100๋ง์์ด๋ค.
}
//toString ์ค๋ฒ๋ผ์ด๋ฉ
@Override
public String toString() { return "Tv"; }
}
class Computer extends Product {
Computer() {super(200);}
@Override
public String toString() {return "Computer";}
}
/*
* ๊ตฌ๋งค์์ ์ ๋ณด๋ฅผ ์ ์ํ ํด๋์ค
* */
class Buyer {
int money = 1000;
int bonusPoint = 0;
/*
* ๊ตฌ๋งค์Buyer๊ฐ ์ํProduct๋ฅผ ๊ตฌ๋งคํ๋ฉด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
* Product Type์ด๊ธฐ ๋๋ฌธ์ Product๋ฅผ ์์ํ๋ ๋ชจ๋ ํด๋์ค๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ค.(๋งค๊ฐ๋ณ์์ ๋คํ์ฑ)
* ๊ตฌ๋งค์๊ฐ ๊ฐ์ง ๋๊ณผ ์ํ ๊ฐ๊ฒฉ์ ๋น๊ต(์ ํจ์ฑ๊ฒ์ฌ) ํ, ๋์ด ์ถฉ๋ถํ๋ค๋ฉด
* 1.๊ฐ์ง ๋์์ ์ํ ๊ฐ๊ฒฉ์ ๋บ๋ค.
* 2.๋ณด๋์ค ์ ์๋ฅผ ๊ณ์ฐํ ๋ค์, ๊ตฌ๋งค์์ ๋ณด๋์์ ์ ๋ณ์์ ์ ์ฅํ๋ค.
* */
void buy(Product product) {
if(money < product.price) {
System.out.println("์์ก์ด ๋ถ์กฑํฉ๋๋ค.");
return;
}
money -= product.price;
bonusPoint += product.bonusPoint;
System.out.println(product +"์ํ์ ๊ตฌ๋งคํ์
จ์ต๋๋ค.");
}
}
public class PolyArgumentTest {
public static void main(String[] args) {
Buyer buyer = new Buyer();
buyer.buy(new Tv());
buyer.buy(new Computer());
System.out.println("๋จ์ ์์ก "+buyer.money+"๋ง์");
System.out.println("ํ์ฌ ํฌ์ธํธ๋ "+buyer.bonusPoint+"์ ");
}
}
๋ค์ํ ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก
๊ฐ์ ํด๋์ค๋ฅผ ์์ ๋ฐ๋ ์์ ํด๋์ค๋ค์ ๋ฌถ์ด์ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค.
๊ทธ๋ฌ๋๊น ์์ ๋ฐ๋ ํด๋์ค๋ง ๊ฐ๋ค๋ฉด, ํ์
์ด ๋ฌ๋ผ๋ ํ๋์ ๋ฐฐ์ด๋ก ๋ค๋ฃฐ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์์ ์์ ๋ฅผ ์ฝ๊ฐ ์์ ํด์ ๋ฐฐ์ด์ ๋ง๋ค์๋ค.
package com.javaex.ch7;
import java.util.Arrays;
/*
* ๊ฐ๊ฒฉ๊ณผ ํฌ์ธํธ ์ ์๋ฅผ ์ ์ํด๋์ ํด๋์ค
* ๋ชจ๋ ์ํ์ด ๊ฐ์ง๊ณ ์์ด์ผ ํ ๊ฒ๋ค์ ์ ์ํ๋ค.
* */
class Product {
int price;
int bonusPoint;
/*
* Product๋ฅผ ์์ํ๋ ํด๋์ค๋ค์ ์กฐ์ํด๋์ค์ ์์ฑ์super()๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ๊ฐ๊ฒฉ์ ์
๋ ฅํด์ผ ํ๋ค.
* Product()๋ ์
๋ ฅ๋ฐ์ ๊ฐ๊ฒฉ์ผ๋ก ๋ณด๋์คํฌ์ธํธ๋ฅผ ์ฐ์ฐํด์ ๋ณ์์ ์ ์ฅํ๋ค.
* */
Product(int price) {
this.price = price;
bonusPoint = (int)(price/10.0); //๊ฐ๊ฒฉ์ 10%๋ฅผ ์ ๋ฆฝํ๋ค.
}
Product() {}
}
class Tv extends Product {
Tv() {
/*์กฐ์ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ๋ ๊ฐ๊ฒฉ์ ์
๋ ฅ*/
super(100); //Tv๋ 100๋ง์์ด๋ค.
}
//toString ์ค๋ฒ๋ผ์ด๋ฉ
@Override
public String toString() { return "Tv"; }
}
class Computer extends Product {
Computer() {super(200);}
@Override
public String toString() {return "Computer";}
}
class Audio extends Product {
Audio() {super(50);}
@Override
public String toString() {return "Audio";}
}
/*
* ๊ตฌ๋งค์์ ์ ๋ณด๋ฅผ ์ ์ํ ํด๋์ค
* */
class Buyer {
int money = 1000;
int bonusPoint = 0;
//๊ตฌ์
ํ ์ ํ์ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฐ์ด
Product[] item = new Product[10]; //10๊ฐ๋ฅผ ๋ด์ ์ ์๋ ์ฅ๋ฐ๊ตฌ๋
int i = 0; //๋ฐฐ์ด์ ์ฌ์ฉํ index
/*
* ๊ตฌ๋งค์Buyer๊ฐ ์ํProduct๋ฅผ ๊ตฌ๋งคํ๋ฉด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
* Product Type์ด๊ธฐ ๋๋ฌธ์ Product๋ฅผ ์์ํ๋ ๋ชจ๋ ํด๋์ค๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ค.(๋งค๊ฐ๋ณ์์ ๋คํ์ฑ)
* ๊ตฌ๋งค์๊ฐ ๊ฐ์ง ๋๊ณผ ์ํ ๊ฐ๊ฒฉ์ ๋น๊ต(์ ํจ์ฑ๊ฒ์ฌ) ํ, ๋์ด ์ถฉ๋ถํ๋ค๋ฉด
* 1.๊ฐ์ง ๋์์ ์ํ ๊ฐ๊ฒฉ์ ๋บ๋ค.
* 2.๋ณด๋์ค ์ ์๋ฅผ ๊ณ์ฐํ ๋ค์, ๊ตฌ๋งค์์ ๋ณด๋์์ ์ ๋ณ์์ ์ ์ฅํ๋ค.
* */
void buy(Product product) {
if(money < product.price) {
System.out.println("์์ก์ด ๋ถ์กฑํฉ๋๋ค.");
return;
}
money -= product.price;
bonusPoint += product.bonusPoint;
item[i++] = product;
System.out.println(product +"์ํ์ ๊ตฌ๋งคํ์
จ์ต๋๋ค.");
}
/*๊ตฌ๋งคํ ์ํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฉ์๋*/
void summary() {
int sum = 0; //์ด๊ฐ๊ฒฉ
String itemList = ""; //์ํ ๋ชฉ๋ก
for(int i=0; i<item.length;i++) {
if(item[i] == null) break;
sum += item[i].price; //์ํ ๊ฐ๊ฒฉ์ ๋ํ๋ค.
itemList += item[i] +", "; //์ํ๋ช
์ ์ถ๊ฐํ๋ค.
}
System.out.println("๊ตฌ๋งคํ์ ์ํ ๋ชฉ๋ก์ " +itemList+"์
๋๋ค.");
System.out.println("๊ตฌ๋งคํ์ ์ํ ์ด์ก์ " +sum+"์
๋๋ค.");
}
}
public class PolyArgumentTest {
public static void main(String[] args) {
Buyer buyer = new Buyer();
buyer.buy(new Tv());
buyer.buy(new Computer());
buyer.buy(new Audio());
buyer.summary();
System.out.println("๋จ์ ์์ก "+buyer.money+"๋ง์");
System.out.println("ํ์ฌ ํฌ์ธํธ๋ "+buyer.bonusPoint+"์ ");
}
}
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ด๋ถ ํด๋์คinner class (0) | 2020.09.09 |
---|---|
์ถ์ํด๋์ค & ์ธํฐํ์ด์ค (0) | 2020.09.09 |
์์Inheritance (0) | 2020.09.06 |
์ ์ด์Modifier (0) | 2020.09.06 |
๊ฐ์ฒด์งํฅ2 (0) | 2020.09.06 |