- Today
- Total
- 묞ë²
- ë°ìŽí°ë² ìŽì€
- ìžíŽ
- CS
- pytorch
- ììì ë ¬
- ìë£êµ¬ì¡°
- 구í
- 벚ë§í¬ë
- ë€ìµì€ížëŒ
- Graph
- 귞늬ë
- ë°±ì€
- ìë°ìì ì
- OOP
- database
- ì¡žì ìí
- dp
- íë¡ê·žëëšžì€
- ë°±ìë
- Algorithm
- tree
- ìë°
- java
- spring
- array
- leetcode
- BFS
- PS
- MST
Partially Committed
[CH07] ê°ì²Žì§í¥íë¡ê·žëë°4 (OOP) 볞묞
볞 í¬ì€í ì ìë°ì ì ì êµì¬ë¥Œ ê³µë¶íë©°, ê°ëší ì 늬/êž°ë¡ ì©ëë¡ ìì±íììµëë€. í¹ì¬, ì못ë ëŽì©ìŽ ìë€ë©Ž ì§ì íŽì£Œìë©Ž ê°ì¬íê² ìµëë€.
1. ì¶ì íŽëì€(Abstract class)
[ì¶ìíŽëì€ë?]
ì¶ì íŽëì€(Abstract class) ë ì¶ì ë©ìë(Abstract method)륌 í¬íšíê³ ìë íŽëì€ë¡, ìžì€íŽì€ë¥Œ ìì±í ì ìê³ ì€ë¡ì§ ììì íµíŽìë§ ìì±ìŽ ê°ë¥íë€. í€ìë abstract 륌 ìì ë¶ì¬ ìì±í ì ììŒë©°, ì¶ì ë©ìë륌 í¬íšíê³ ìë€ë ê² ìžìë ìŒë° íŽëì€ì ìì í ëìŒíë€.
[ì¶ìë©ìëë?]
ì¶ì ë©ìëë ë©ìëì ì ìžë¶ë§ 구íë ê²ì ì믞íë©°, ììží 구í/ëìì ììë°ì íŽëì€ì ë°ëŒì ë¬ëŒì§ë€. abstract void paly(int pos); ì ê°ìŽ ì ìží ì ììŒë©°, ììë°ì íŽëì€ìì ììží 구ííë€.
[ì¶ìíŽëì€ì ìì±]
abstract class Player{
boolean pause;
int currentPos;
Player(){
pause = false;
currentPos = 0;
}
abstract void play(int pos);
// abstract method
abstract void stop();
void play(){
play(currentPos);
}
void pause(){
if(pause)
{
pause = false;
play(currentPos);
}
else {
pause = true;
stop();
}
}
}
ìì ê°ìŽ ìì±ë ì¶ì íŽëì€ê° ìë€. ìŽë¥Œ ììë°ì CDplayer íŽëì€ë ìëì ê°ìŽ 구íí ì ìë€.
class CDPlayer extends Player {
void play(int currentPos) {
/* */
}
void stop() {
/* */
}
int currentTrack;
void nextTrack() {
currentTrack++;
}
void preTrack() {
if (currentTrack > 1) {
currentTrack--;
}
}
}
ì¶ì ë©ìëë ììë°ë íŽëì€ìì 구ííŽì€ ì ìë€. abstract í€ìë륌 ì¬ì©íì§ ìê³ ê·žë¥ ë¹ ëªžíµì ë§ë€ìŽ ëìë ì¬ì€ ëìŒíì§ë§, êµ³ìŽ abstract í€ìëë¡ ëª ìíë ê²ì ìì íŽëì€ë¥Œ ìì±í ë íë¡ê·žëëšžê° ì¶ì ë©ìëìì ìžì§íê³ ëŽì©ì ì§ì 구ííŽì£ŒìŽìŒ íë€ë ê²ì ëì¹ì§ ìì ì ìêž° ëë¬žìŒ ê²ìŽë€.
ìëì íŽëì€ìì ê³µíµë ë¶ë¶ì ëœìëŽìŽ ì¶ì íŽëì€ë¡ ë§ë€ ì ìë€.
class Marine{
int x,y;
void move(int x,int y){}
void stop(){}
void stimPack(){}
}
class Tank{
int x,y;
void move(int x,int y){}
void stop(){}
void changeMode(){}
}
class Dropship{
int x,y;
void move(int x,int y){}
void stop(){}
void load(){}
}
ìë ê°ê° move, stop ë©ìëì x, y ë³ìê° ê³µíµì ìŒë¡ ë€ìŽê°ììŒë©°, ìŽë¬í 겜ì°ìë ìœë륌 ì€ë³µíŽì ìì±íêž° 볎ë€ë ì¶ì íŽëì€ë¥Œ ì ìíŽì ì¡°ì íŽëì€ë¡ ë§ë€ìŽì£Œë©Ž ìœëê° ë³Žë€ ì ëë ì ìë€. ê³µíµë ë¶ë¶ì ê°ì§ë ì¶ì íŽëì€ë¥Œ Unit ìŒë¡ ì ìíê³ ììë°ëë¡ íì. ê³µíµì ìŒë¡ ë€ìŽê°ë ë©ìë륌 ì¶ì ë©ìëë¡ ì ìíê³ , ê°ê°ì ìì íŽëì€ìì 구첎ì ìŒë¡ 구íë¶ë¥Œ ìì±íŽì£Œë©Ž ëë€.
abstract class Unit{
int x,y;
void move(int x,int y){}
void stop(){}
}
class Marine{
void move(int x,int y){}
void stimPack(){}
}
class Tank extends Unit{
void move(int x,int y){}
void changeMode(){}
}
class Dropship extends Unit{
void move(int x,int y){}
void load(){}
}
ã· Unit íŽëì€íì ì ì°žì¡°ë³ì ë°°ìŽì ìŽì©íì¬, ìë¡ ë€ë¥ž ì¢ ë¥ì ìžì€íŽì€ë¥Œ ë¶ìŽì íë²ì ë€ë£° ì ìë€.
class source{
public static void main(String[] args) {
Unit[] group = new Unit[4];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();
for(int i = 0 ; i < group.length; i ++)
group[i].move(100, 200);
}
}
ë¹ì°íë Object ë°°ìŽë¡ ë€ë£° 겜ì°ìë move íšì륌 ì¬ì©í ì ìë€. Object íŽëì€ìë move ë©ìëê° ìêž° ë묞ìŽë€.
2. ìží°íìŽì€(interface)
ì¶ìíŽëì€ì ìŒì¢ ìž ìží°íìŽì€ë, ì¶ìíŽëì€ë³Žë€ ì¶ìí ìì€ìŽ ëêž° ë묞ì ìŒë° ë©ìë, ë©€ë² ë³ì륌 ë©€ë²ë¡ ê°ì§ ì ìë€. ì€ë¡ì§ ì¶ì ë©ìëì ììë§ì ë©€ë²ë¡ ê°ì§ ì ìë€. ìží°íìŽì€ë íŽëì€ììì²ëŒ ì ìží ì ìë€. ë€ë§ class í€ìë ëì interface 륌 ì¬ì©íŽìŒ íë€. ì ê·Œ ì ìŽìë íŽëì€ì ëìŒíê² public, default 륌 ì¬ì©í ì ìë€.
몚ë ë©€ë² ë³ìë public static final ìŽìŽìŒ íê³ , ìëµìŽ ê°ë¥íë€.
몚ë ë©ìëë public abstract ìŽìŽìŒ íë©°, ìëµí ì ìë€.
ë€ë§, static ë©ìëì default ë©ìëë ììž(JDK 1.8ë¶í° ì ì©ëš.)
ìží°íìŽì€ì 몚ë ë©€ë²ì ëíŽì ì ì¬íì ì ì©ëêž° ë묞ì, ì ìŽì륌 ìëµí ì ìë ê²ìŽë€. ìëµë ì ìŽìë 컎íìŒ ì 컎íìŒë¬ì ìíŽ ì¶ê°ëë€. ìží°íìŽì€ì ë©ìëë 몚ë ì¶ìë©ìëì¬ìŒ íì§ë§, JDK 1.8 ë²ì ë¶í° ìží°íìŽì€ì static ë©ìëì default ë©ìë륌 íì©í ì ìê² ëììŒë íì¬ ì€ë¬Žììë JDK 1.8 ì ì¬ì©íì§ ìë 겜ì°ê° ë§êž° ë묞ì ìŽì ë²ì 곌 ìŽí ë²ì ì ëí ì°šìŽì ì ì ìê³ ìì íìê° ìë€.
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3;
static int HEART = 2;
int CLOVER = 1;
public abstract String getCardNumber();
String getCardKind();
}
ìží°íìŽì€ë ì€ì§ ìží°íìŽì€ë¡ë¶í°ë§ ììì ë°ì ì ìê³ , ë€ì€ ìììŽ íì©ëë€. ìží°íìŽì€ë ì¶ì íŽëì€ì ê°ìŽ ê·ž ìì²Žë¡ ìžì€íŽì€ë¥Œ ìì±í ìë ììŒë©°, ì¶ì íŽëì€ê° ììì íµíŽ ì¶ì ë©ìë륌 ìì±ìí€ë ê²ê³Œ ê°ìŽ ìží°íìŽì€ì 겜ì°ë ë§ì°¬ê°ì§ìžë° ìŽë¥Œ extends ê° ìë implements 륌 ì¬ì©íë€ë ê²ìŽ ì°šìŽì ìŽë€. 구ííë ìží°íìŽì€ì ë©ìë ì€ìì ìŒë¶ ë¶ë¶ë§ 구ííë€ë©Ž, abstract í€ìë륌 ìì ë¶ì¬ì abstract class ë¡ ì ìžíŽìŒ íë©°, ìì곌 구íì ëìì í ìë ìë€.
class source {
public static void main(String[] args) {
Fighter f = new Fighter();
if(f instanceof Unit)
System.out.println("f is an instance of Unit Class");
if(f instanceof Fightable)
System.out.println("f is implemented from Fightable");
if(f instanceof Movable)
System.out.println("f is implemented from Movable");
if(f instanceof Attackable)
System.out.println("f is implemented from Attackable");
if(f instanceof Object)
System.out.println("f is implemented from Object");
}
}
class Fighter extends Unit implements Fightable{
public void move(int x, int y){
// ...
}
public void attack(Unit u){
// ...
}
}
class Unit {
int currentHP;
int x;
int y;
}
interface Fightable extends Movable, Attackable{ }
interface Movable { void move(int x, int y); }
interface Attackable { void attack(Unit u); }
ìì ë°ì ë, interface ë implement í€ìë륌 ì¬ì©íì ë¿ìŽì§ class ììì ìì곌 ëìŒíë€. ê·žë¬ë¯ë¡ interface ë ì¡°ììŽëŒê³ í ì ììŒë©°, Movable interface ì 구íë ë©ìëìž move íšì륌 볎멎 ì ê·Œ ì ìŽì륌 public ìŒë¡ ì€ì íìë€ë ê²ì 죌목íŽìŒ íë€. ì€ë²ëŒìŽë© í ëìë ì¡°ìì ë©ìë ë³Žë€ ëì ë²ìì ì ê·Œ ì ìŽìë¡ ì§ì íŽìŒ íëë°, Movable ìží°íìŽì€ì void move(int x, int y)ëŒê³ ì ìë ë©ìëë public abstract ê° ìëµë ê²ìŽë€. ê·žëì ìŽë¥Œ ì€ì ë¡ êµ¬ííë Fighter íŽëì€ììë void move(int x, int y)ì ì ê·Œì ìŽì륌 public ìŒë¡ íŽìŒë§ íë ê²ìŽë€.
ìží°íìŽì€ë íŽëì€ììì ë¬ëŠ¬ ë€ì€ ìììŽ ê°ë¥íë€ê³ íë€. ë€ë§ ë ì¡°ììŒë¡ë¶í° ììë°ì ë©€ë² ì€ ìŽëŠìŽë ì ìžë¶ê° ê°ê³ 구í ëŽì©ìŽ ë€ë¥ž 겜ì°ê° ë°ìí ì ìëë°, ìŽë¬í 겜ì°ìë ìì íŽëì€ìì ìŽë í ì¡°ìì ë©ìë륌 ììë°ë ê²ìžì§ ì ì ìë€. í 쪜ìŒë¡ë¶í°ì ììì í¬êž°íê±°ë, ìŽëŠ 충ëìŽ ë°ìíì§ ìëë¡ ì¡°ì íŽëì€ë¥Œ ë³ê²œíë ê²ìŽ ìŒë°ì ìž ëììŽë€. ê·žëì ìŽë¬í ë€ì€ììì ëë³Žë€ ì€ìŽ ë í¬ë€ê³ íëšíìêž° ë묞ì java ììë íì©íì§ ììë€. C++ ììë íì©íë€. ì¬íŒ ìë°ë ë€ì€ ììì íì©íì§ ìë ê²ìŽ íëì ëíì ìž ëšì ìŒë¡ ìì©íëë°, ìŽë¥Œ ìží°íìŽì€ì ë€ì€ ììì íì©íšìŒë¡ìš ìŽëì ë ëìí ì ììì§ë§ ì€ì ë¡ ìë°ìì ìží°íìŽì€ë¡ ë€ì€ììì 구ííë 겜ì°ë ì ìë€ê³ íë€.
ìží°íìŽì€ë static ììë§ ì ìí ì ìêž° ë묞ì ì¡°ì íŽëì€ì 멀벌 ë³ìì 충ëíë 겜ì°ê° ê±°ì ìê³ , 충ëëë€ê³ íëëŒë íŽëì€ ìŽëŠì ë¶ì¬ì 구ë¶ìŽ ê°ë¥íë€. ì¶ì ë©ìëë 구í ëŽì©ìŽ ì í ìêž° ë묞ì ì¡°ì íŽëì€ì ë©ìëì ì ìžë¶ê° ìŒì¹íë 겜ì°ìë ì¡°ì íŽëì€ ìªœì ë©ìë륌 ììë°ìŒë©Ž ëêž° ë묞ì 묞ì ê° ë°ìíì§ ìëë€. íë ìŽë ê² íë©Ž 충ëì íŒíì§ë§ ë€ì€ ììì ì¥ì ì ìëë€. ë§ìœì ë ê°ì íŽëì€ë¡ë¶í° ììì ë°ììŒë§ íë ìí©ìŽ ë°ìíë€ë©Ž, ë¹ì€ìŽ ëì íŽëì€ë¥Œ ììë°ê³ ëëšžì§ í íŽëì€ë ëŽë¶ì ë©€ë²ë¡ í¬íšìí€ê±°ë íìí ë¶ë¶ì ëœìì ìží°íìŽì€ë¡ 구ííë ê²ìŽ ì¢ë€. TVCR ìŽëŒë íŽëì€ë¥Œ TVì VCR ë¡ë¶í° 몚ë ììë°ëë¡ ë§ë€êž° ìíŽìë, ë¹ì€ìŽ ëì íŽëì€ìž TV 륌 ììë°ëë¡ íê³ , VCR íŽëì€ì ëìŒí ë©ìë륌 ê°ì§ë interface ìž IVCR ì ë§ë ë€ì ìëì ê°ìŽ 구ííë ê²ìŽ ì¢ë€.
public class TVCR extends TV implements IVCR{
VCR vcr = new VCR();
public void play() {
vcr.play();
}
public void stop() {
vcr.stop();
}
/*
...
*/
}
ìë¡ ë©ìë륌 ìì±íŽìŒ íë ë¶ëŽì ìì§ë§ VCR íŽëì€ì ìžì€íŽì€ë¥Œ ì¬ì©íì¬ ìœê² ë€ì€ ììì 구íí ì ìë€. ëí VCR íŽëì€ì ëŽì©ìŽ ë°ëìŽë ë³ê²œë ëŽì©ìŽ TVCR íŽëì€ìë ìëìŒë¡ ë°ìëë€. ìží°íìŽì€ë¥Œ ì¬ì©íì§ ìê³ ê·žë¥ VCR íŽëì€ë¥Œ TVCR íŽëì€ì í¬íšììŒì 구íí ì ìì§ë§, ìží°íìŽì€ë¥Œ íì©íšìŒë¡ìš ë€íì í¹ì±ì ìŽì©í ì ìë€ë ê²ìŽ ì¥ì ìŽë€.
ìì íŽëì€ì ìžì€íŽì€ë ì¡°ì íŽëì€ íì ì ì°žì¡° ë³ìë¡ ì°žì¡°íë ê²ìŽ ê°ë¥íë€. ìží°íìŽì€ë íŽëì€ì ì¡°ììŽëŒê³ í ì ìêž° ë묞ì, ìží°íìŽì€ íì ì ì°žì¡° ë³ìë¡ êµ¬íí íŽëì€ì ìžì€íŽì€ë¥Œ ì°žì¡°í ì ìê³ , í ë³í ëí ê°ë¥íë€. interface Fightable ì Fighter class ê° êµ¬íí 겜ì°, Fightable f = (Fightable)new Fighter(); í¹ì Fightable f = new Fighter(); ì ê°ìŽ ì°žì¡°íë ê²ìŽ ê°ë¥íë€. ê·žëŒë¡ ìží°íìŽì€ë ë©ìëì 맀ê°ë³ì íì ìŒë¡ ì¬ì©ê°ë¥íë€.
void attack(Fightable f){ ... }
ìží°íìŽì€ íì ì 맀ê°ë³ì륌 ëë€ë ê²ì ë©ìë륌 ížì¶í ë, íŽë¹ ìží°íìŽì€ë¥Œ 구íí íŽëì€ì ìžì€íŽì€ë¥Œ 맀ê°ë³ìë¡ ì ê³µíŽìŒ íë€ë ê²ì ì믞íë€. ê·žëì ìì attack ë©ìë륌 ížì¶í ëìë 맀ê°ë³ìë¡ Fightable ìží°íìŽì€ë¥Œ 구íí íŽëì€ì ìžì€íŽì€ë¥Œ ë겚죌ìŽìŒ íë€ë ê²ìŽë€. Fightable ìží°íìŽì€ë¥Œ 구íí Fighter íŽëì€ê° ìë€ê³ ì¹ì. ê·žë¬ë©Ž attack ë©ìëì 맀ê°ë³ìë¡ Fighter ìžì€íŽì€ë¥Œ ëê²šì€ ì ìë€. ê·žë§ì ìŠìš attack(new Fighter()) ì ê°ìŽ í ì ìë€ë ê²ìŽê³ , ë§ì°¬ê°ì§ë¡ ëŠ¬íŽ íì ìŒë¡ ìží°íìŽì€ì íì ì ì§ì íë ê² ëí ê°ë¥íë€. ëŠ¬íŽ íì ì ìží°íìŽì€ë¡ íë€ë ê²ì íŽë¹íë ìží°íìŽì€ë¥Œ 구íí íŽëì€ì ìžì€íŽì€ë¥Œ ë°ííë€ë ê²ì ì믞íë€.
interface Parseable{
public abstract void parse(String fileName);
}
class ParserManager{
public static Parseable getParser(String type){
if(type.equals("XML")) {
return new XMLParser();
}else{
Parseable p = new HTMLParser();
return p;
// return new HTMLParser();
}
}
}
class XMLParser implements Parseable{
public void parse(String fileName){
/*
* ...
* */
System.out.println(fileName + "- XML parsing completed.");
}
}
class HTMLParer implements Parseable{
public void parse(String fileName){
/*
...
*/
System.out.println(fileName + "-HTML parsing completed.");
}
}
class ParserTest{
public static void main(String[] args) {
Parseable parser = ParserManager.getParser("XML");
parser.parse("document.xml");
parser = ParserManager.getParser("HTML");
parser.parse("document2.html");
}
}
ì ìœë륌 볎멎 Parseable ìží°íìŽì€ë parsing êž°ë¥ì 구íí 목ì ìŒë¡ abstract method parse(String fileName)ì ì ìíìë€. XMLParser íŽëì€ì HTMLParser íŽëì€ë Parseable ìží°íìŽì€ë¥Œ 구íí ê²ìŽê³ , ParserManager íŽëì€ì getParser ë©ìëë 맀ê°ë³ìë¡ ë겚ë°ë type ì ê°ì ë°ëŒì XMLParser ìžì€íŽì€ í¹ì HTMLParser ìžì€íŽì€ë¥Œ ë°ííë€. ë§ìœ ìë¡ìŽ ë²ì ì XML 구묞 ë¶ìêž°ìž NewXMLParser íŽëì€ë¥Œ ì¶ê°íŽìŒíë€ë©Ž, ParserManager íŽëì€ì getParser ë©ìëìì return new NewXMLParser(); ìŒë¡ë§ ìì íŽì£Œë©Ž ëë€. ìŽë¬í í¹ì§ì ë¶ì°í겜 íë¡ê·žëë°ìì í° ì¥ì ìŒë¡ ìì©ëë€. ì륌 ë€ìŽ, ìë²ëšììì ë³ê²œë§ íŽë ì¬ì©ì 컎íší°ì íë¡ê·žëšì ë³ê²œ ììŽ ì ë°ìŽížê° ê°ë¥í ê²ìŽë€.
ìŽë¬í ìží°íìŽì€ë¥Œ ì¬ì©íë ìŽì ì ì¥ì ì ì 늬íŽë³Žì.
1. ê°ë° ìê°ì ëšì¶í ì ìë€.
ìží°íìŽì€ë§ ì¬ì©íŽì íë¡ê·žëšì ìì±íë ê²ìŽ ê°ë¥íêž° ë묞ìŽë€. ë©ìë ížì¶ ë¶ìì ë©ìëì ëŽì©ì ìêŽììŽ ì ìžë¶ë§ ìë©Ž ëë€. ëìì ë€ë¥ž ìì§ëìŽê° ìží°íìŽì€ë¥Œ 구ííë íŽëì€ë¥Œ ë§ë€ëë¡ íë©Ž, íšìšì ìŒë¡ ê°ë°í ì ìë€.
2. íì€íê° ê°ë¥íë€.
íë¡ì ížì Ʞ볞 íì ìží°íìŽì€ë¡ ìì±ì 뚌ì í ë€ìì, íìë€ìê² êµ¬ì²Žì ìŒë¡ 구ííëë¡ íšìŒë¡ìš ìœëì íì€íê° ê°ë¥íë€.
3. ìë¡ êŽê³ìë íŽëì€ë€ìê² êŽê³ë¥Œ 맺ìŽì€ ì ìë€.
ììêŽê³ì ëì¬ìì§ë ìê³ ê°ì ì¡°ìíŽëì€ë¥Œ ê°ì§ê³ ìì§ë ìì, ìë¡ ìë¬Žë° êŽê³ë ìë íŽëì€ë€ìê² ìží°íìŽì€ë¥Œ ê³µíµìŒë¡ 구ííëë¡ íšìŒë¡ìš êŽê³ë¥Œ ë§ë€ìŽ ì€ ì ìë€.
4. ë 늜ì ìž íë¡ê·žëë°ìŽ ê°ë¥íë€.
ìží°íìŽì€ë¥Œ ì¬ì©íšìŒë¡ìš 구íë¶ì ì ìžë¶ë¥Œ ë¶ëŠ¬í ì ììŒë¯ë¡, ì€ì 구íì ë 늜ì ìž íë¡ê·žëšì ìì±íë ê²ìŽ ê°ë¥íë©° íŽëì€ ê°ì êŽê³ë¥Œ ìží°íìŽì€ë¥Œ ìŽì©íì¬ ê°ì ì ìž êŽê³ë¡ ë³ê²œíŽì€ë€ë©Ž í íŽëì€ì ë³ê²œìŽ ë€ë¥ž íŽëì€ì ìí¥ì ì£Œì§ ìë ë 늜ì ìž íë¡ê·žëë°ì í ì ìë€.
í¹ì ë°ìŽí°ë² ìŽì€ë¥Œ ì¬ì©íë íŽëì€ë¥Œ ë§ë€ìì§ë§, ì¶íì ë€ë¥ž ë°ìŽí°ë² ìŽì€ë¡ì ë³ê²œì ìíë ìí©ìŽ ìì ì ìë€. ìŽë, ë°ìŽí°ë² ìŽì€ êŽë š ìží°íìŽì€ë¥Œ ìŽì©íì¬ íë¡ê·žëšì ì ìíìë€ë©Ž íë¡ê·žëšì ë³ê²œíì§ ìëëŒë ë°ìŽí°ë² ìŽì€ì ì¢ ë¥ë¥Œ ë°êŸžë ê²ì í¬ê² ìŽë µì§ ìì ìŒìŽë€. ìë°ììë ë€ìì ë°ìŽí°ë² ìŽì€ì êŽë šë ìží°íìŽì€ë¥Œ ì ê³µíê³ ììŽ, ìŽë¥Œ ìŽì©íë©Ž í¹ì ë°ìŽí°ë² ìŽì€ì ì¢ ìëì§ ìë íë¡ê·žëšì ìì±í ì ìë€.
class source{
public static void main(String[] args) {
Tank tank = new Tank();
Dropship dropship = new Dropship();
Marine marine = new Marine();
SCV scv = new SCV();
scv.repair(tank);
scv.repair(dropship);
}
}
interface Repairable{ } // interface
class Unit{
int hitPoint;
final int MAX_HP;
Unit(int hp) {
MAX_HP = hp;
}
}
class GroundUnit extends Unit{
GroundUnit(int hp){
super(hp);
}
}
class AirUnit extends Unit{
AirUnit(int hp){
super(hp);
}
}
class Tank extends GroundUnit implements Repairable{
Tank(){
super(150);
hitPoint = MAX_HP;
}
public String toString(){
return "Tank";
}
}
class Dropship extends AirUnit implements Repairable{
Dropship(){
super(125);
hitPoint = MAX_HP;
}
public String toString(){
return "Dropship";
}
}
class Marine extends GroundUnit{
Marine(){
super(40);
hitPoint = MAX_HP;
}
}
class SCV extends GroundUnit implements Repairable{
SCV(){
super(60);
hitPoint = MAX_HP;
}
void repair(Repairable r){
if(r instanceof Unit){
Unit u = (Unit)r;
while(u.hitPoint != u.MAX_HP){
u.hitPoint++;
}
System.out.println(u.toString() + " repairing completed");
}
}
}
ìì ê°ìŽ Marine, SCV, Tank, DropShip íŽëì€ê° ìë€ê³ íì. Marine, SCV, Tank ë GroudUnit ì ì¡°ì íŽëì€ë¡ ê°ì§ê³ ìê³ Dropship ì AirUnit ì ì¡°ì íŽëì€ë¡ ê°ì§ê³ ìë€. ì€ì ì€íí¬ëííž ê²ìììë êž°ê³ ì ëì ëíì¬ repair êž°ë¥ì ìíí ì ìë€. ìŽë¥Œ 구ííë €ê³ íë€ ë³Žë, repair ë©ìë륌 ê°ê°ì íŽë¹íë ë§íŒ ì€ë²ë¡ë©íŽìŒ íë ìí©ìŽ ë°ìíë€. ìŽë íšìšì ìŽì§ ììŒë©°, ìŽë¬í ìí©ìì ìží°íìŽì€ë¥Œ ìŽì©íë©Ž ê°ê°ì íŽëì€ì ëí ììêŽê³ë¥Œ ì ì§íë©Žì ê³µíµì ì ë¶ì¬í ì ìë€. Repairable ìží°íìŽì€ë¥Œ ì ìí ë€ì ê°ê°ì êž°ê³ ì ëì ëíì¬ ìží°íìŽì€ë¥Œ 구ííëë¡ ì ìíë©Ž ëë€. repair ë©ìëìì r 맀ê°ë³ìë Repairable íì ìžë°, Repairable ìží°íìŽì€ë ì ìë ë©€ë²ê° ìêž° ë묞ì r ìŒë¡ë í ì ìëê² ì묎ë ìë€. ê·žëì instanceof ì°ì°ì륌 ìŽì©íì¬ íì ì 첎í¬í ë€ìì Unit íŽëì€ì ì ìë ë©€ë²ë¥Œ ì¬ì©í ì ìëë¡ íìë€.
ê·žëì ìží°íìŽì€ë ëë첎 묎ììžê°?
ìëì ë ê°ì§ ì¬íì ìŒëì ëê³ ììŽìŒ íë€.
1. íŽëì€ë¥Œ ì¬ì©íë 쪜(User)곌 íŽëì€ë¥Œ ì ê³µíë 쪜(Provider)ìŽ ìë€.
2. ë©ìë륌 ì¬ì©(ížì¶)íë 쪜(User)ììë ì¬ì©íë €ë ë©ìë(Provider)ì ì ìžë¶ë§ ìë©Ž ëê³ , ëŽì©ì 몰ëŒë ëë€.
class A{
public void methodA(B b){
b.methodB();
}
}
class B{
public void methodB(){
System.out.println("MethodB()");
}
}
class source{
public static void main(String[] args) {
A a = new A();
a.methodA(new B());
}
}
ìì ê°ìŽ ìì±ë íë¡ê·žëšì 볎멎 íŽëì€ B ì methodB() ì ì ìžë¶ê° ë°ëë©Ž íŽëì€ A ë ë³ê²œëìŽìŒ íë 구조륌 ê°ì§ë€. ìŽì ê°ìŽ ì§ì ì ìž êŽê³ë¥Œ ê°ì§ë íŽëì€ë Provider ìŽ ë³ê²œëë©Ž User ëí ë³ê²œìŽ ë¶ê°íŒíë€. ìŽë¬í ìí©ììë ìží°íìŽì€ë¥Œ ìŽì©íë©Ž íŽëì€ Aê° íŽëì€ B 륌 ì§ì ì ìŒë¡ ížì¶íì§ ìê³ ë ìží°íìŽì€ë¥Œ 맀ê°ì²Žë¡ íì¬ ì ê·Œíëë¡ íë©Ž, íŽëì€ B ì ë³ê²œ ì¬íìŽ ë°ìíëëŒë íŽëì€ A ë ë³ê²œíì§ ììë ëë€. ìŽì ê°ìŽ ê°ì ì ìŒë¡ êŽê³ë¥Œ ë³ê²œíë €ë©Ž ìží°íìŽì€ë¥Œ ìŽì©íŽì íŽëì€ B ì ì ìžë¶ì 구íë¶ë¥Œ ë¶ëŠ¬í íìê° ìë€.
interface I{
public abstract void methodB();
}
ìì ê°ìŽ íŽëì€ Bì ë©ìë B 륌 ì¶ìííì¬ ì ìíë interface 륌 ë§ë€ìŽ ì€ ë€ì, íŽëì€ B ìì 구ííëë¡ íë€.
class A{
public void methodA(I i){
i.methodB();
}
}
class B implements I{
public void methodB(){
System.out.println("MethodB()");
}
}
ìŽë ê² íŽì£Œë©Ž íŽëì€ A ìì íŽëì€ B 륌 ì¬ì©íì§ ììŒë¯ë¡, ê°ì ì ìž êŽê³ê° ëë€. íŽëì€ A ìì ì¬ì í íŽëì€ B ì ë©ìë륌 ížì¶íê³ ìììë íŽëì€ A ë ìží°íìŽì€ I 륌 íµíŽì íŽëì€ B ì ë©ìëì ì ê·Œíêž° ë묞ì íŽëì€ B ì ë³ê²œì ì í ìí¥ì ë°ì§ ìëë€.
JDK1.8 ë¶í° ìží°íìŽì€ì ì¶ì ë©ìë ë¿ë§ ìëëŒ ëíŽíž ë©ìëì static ë©ìëë ì¶ê°í ì ìë€. static ë©ìëë ìžì€íŽì€ì êŽê³ ìë ë 늜ì ìž ë©ìëìŽë¯ë¡ ì¬ì€ íì©íì§ ììì ìŽì ê° í¬ê² ììëë°, JAVA ìžìŽì ëí ëšìí륌 ìíŽ ìží°íìŽì€ì ë©ìëë 몚ë ì¶ì ë©ìëì¬ìŒì§ íë€ë ê²ì ëí ììž ì¬íì ëì§ ìì ê²ìŽëŒê³ íë€. ê·žëì ìží°íìŽì€ì êŽë šë static ë©ìëë ë³ëì íŽëì€ì ë§ë€ììŽìŒ íëë°, ëíì ìŒë¡ java.util.Collection ìží°íìŽì€ê° ìë€. ìŽ ìží°íìŽì€ì êŽë šë static ë©ìëë€ì, ìží°íìŽì€ìë ì¶ì ë©ìëë§ ì ìží ì ìë€ë ê·ì¹ ë묞ì Collection ìŽëŒë íŽëì€ì ë³ëë¡ ë€ìŽê°ê² ëìë€. ë§ìœ ìŽêž°ë¶í° ìží°íìŽì€ì ì¶ì ë©ìë ë¿ë§ìŽ ìëëŒ static ë©ìë륌 ì¶ê°í ì ììëëŒë©Ž Collection íŽëì€ë ì¡Žì¬íì§ ììì ê²ìŽë€. ìží°íìŽì€ììë ìì static ë©ìëì ì ê·Œ ì ìŽìë public ìŒë¡ íŽìŒíë©°, ìëµìŽ ê°ë¥íë€.
ìží°íìŽì€ì ë©ìë륌 ì¶ê°íë€ë ê²ì ì¶ì ë©ìë륌 ì¶ê°íë€ë ê²ìŽê³ , ìŽë§ì ìŠìš ìží°íìŽì€ë¥Œ 구ííê³ ìë 몚ë íŽëì€ë€ìì ìë¡ê² ì¶ê°ë ì¶ì ë©ìë륌 구ííŽìŒíë€ë ì믞ìŽë€. ìŽë¬í ìì ì ꜀ë ë³µì¡í ìŒìŽë©°, ìží°íìŽì€ì ë³ê²œì ìµëí ë°©ì§íë €ê³ íŽë ìŽì©ì ììŽ íŽìŒë§íë ìí©ìŽ ì¢ ì¢ ë°ìíë€. ìŽë¬í ìí©ìì ë³Žë€ ìœê² íŽê²°í ì ìê² íêž° ìíŽ JDK ì€ê³ìë€ì ëíŽíž ë©ìë(default method) 륌 ê³ ìíìë€. ëíŽíž ë©ìë륌 ìží°íìŽì€ì ì¶ê°íëëŒë íŽë¹íë ìží°íìŽì€ë¥Œ 구ííë íŽëì€ì ë³ê²œì íìíì§ ìëë€. ìì default í€ìë륌 ë¶ì¬ì ë©ìë륌 ì ìžíë©Ž ëëë°, ì¶ì ë©ìëìë ë¬ëŠ¬ ìŒë° ë©ìëì²ëŒ ëªžíµ ë¶ë¶ì ë§ë€ìŽì£ŒìŽìŒ íë©° ì ê·Œ ì ìŽìë public ì ì¬ì©íŽìŒ íê³ ìëµìŽ ê°ë¥íë€. ìží°íìŽì€ì ì¶ì ë©ìë륌 ì¶ê°íë ëì ëíŽíž ë©ìë륌 ì¶ê°íë©Ž íŽë¹ ìží°íìŽì€ë¥Œ 구íí íŽëì€ë¥Œ ë³ê²œíì§ ììë ëë ê²ìŽë€. ìŽë ì¡°ì íŽëì€ì ìë¡ìŽ ë©ìë륌 ì¶ê°í ê²ê³Œ ëìŒíë€. ë€ë§ ìë¡ê² ì¶ê°í ëíŽíž ë©ìëì êž°ì¡Ž ë©ìëì ìŽëŠ 충ëìŽ ë°ìíë 겜ì°ê° ìëë° 1. ì¬ë¬ ìží°íìŽì€ì ëíŽíž ë©ìë ê° ì¶©ëìŽ ë°ìíë 겜ì°ìë ìží°íìŽì€ë¥Œ 구íí íŽëì€ìì ëíŽíž ë©ìë륌 ì€ë²ëŒìŽë©íì¬ íŽê²°íë€. 2. ëíŽíž ë©ìëì ì¡°ì íŽëì€ì ë©ìë ê° ì¶©ëìŽ ë°ìíë©Ž, ì¡°ì íŽëì€ì ë©ìëê° ììëê³ , ëíŽíž ë©ìëë 묎ìëë€. ê·žë¥ íìí 쪜ì ë©ìëì ê°ì ëŽì©ìŒë¡ ì€ë²ëŒìŽë©íëë¡ íì...
3. ëŽë¶ íŽëì€(inner class)
íŽëì€ ìì ì ìží íŽëì€ë¥Œ ëŽë¶ íŽëì€ëŒê³ íëë°, ìŽë ê² íšìŒë¡ìš 1. ëŽë¶ íŽëì€ìì ìžë¶ íŽëì€ì ë©€ë²ë€ì ìœê² ì ê·Œí ì ìê³ , 2. ìœëì ë³µì¡ì±ì ì€ìŒ ì ìë€(캡ìí)ë ì¥ì ìŽ ìë€. ëŽë¶ íŽëì€ë¡ ë§ëë ê²ì ìžë¶ íŽëì€ìì ì ì¬ì©íì§ ìë íŽëì€ì¬ìŒ íë€.
class A{
class B{
}
}
ëŽë¶ íŽëì€ë ì ìž ìì¹ì ë°ëŒì ì¢ ë¥ê° ë¬ëŒì§ë€. instance class ë ìžë¶ íŽëì€ì ë©€ë² ë³ì ì ìžë¶ìì ì ìžíë©°, ìžë¶ íŽëì€ì ìžì€íŽì€ ë©€ë²ì²ëŒ ë€ë€ì§ë€. static class ë ëìŒíê² ìžë¶ íŽëì€ì ë©€ë² ë³ì ì ìžë¶ìì ì ìžíëë°, ìžë¶ íŽëì€ì static ë©€ë²ì ê°ìŽ ë€ë£šìŽì§ë€. local class ë ìžë¶ íŽëì€ì ë©ìë í¹ì ìŽêž°í ëžë ëŽìì ì ìžëë©°, ì ìž ìì ëŽë¶ììë§ ì¬ì©ìŽ ê°ë¥íë€. anonymous class ë íŽëì€ì ì ìž ë° ê°ì²Žì ìì±ì ëìì íë ìŒíì© ìµëª íŽëì€ìŽë€.
íŽëì€ììë default ì public ì ê·Œ ì ìŽìë§ ì¬ì©ìŽ ê°ë¥íë ëŽë¶ íŽëì€ë ë³ìì ëìŒíê² public, default, private, protected ì ê·Œ ì ìŽì륌 ì¬ì©ê°ë¥íë€. ëí abstract ì final 곌 ê°ì ì ìŽìë ì¬ì©ìŽ ê°ë¥íë€. ëŽë¶ íŽëì€ë¥Œ ì ìí ë ì ìíŽìŒ í ì ì ë§ìœ ëŽë¶ íŽëì€ìì static member ì ì¬ì©íŽìŒ íë 겜ì°ëŒë©Ž ëŽë¶ íŽëì€ë static ìŒë¡ ë§ë€ìŽì£ŒìŽìŒ íë€ë ê²ìŽë€. ìëë©Ž static member ëŒë ê²ì ê°ì²Ž ìì± ììŽ ì¬ì©ìŽ ê°ë¥í member ìžë°, ë§ìœ ëŽë¶ íŽëì€ê° static ìŽ ìëëŒë©Ž 몚ììŽ ë°ìíë€ë ê²ìŽë€. ëŽë¶ íŽëì€ê° static ìŽì¬ìŒì§ ë ŒëŠ¬ê° ì±ëŠœíë€. ëí ì€ìí ê²ì static ëŽë¶ íŽëì€ììë ìžë¶ íŽëì€ì ìžì€íŽì€ ë©€ë²ì ì ê·Œí ì ìë€. final static ì ìììŽë¯ë¡ íì©íë€.
- static íŽëì€ììë§ static ë©€ë²ë¥Œ ì ìí ì ìë€.
- ìžì€íŽì€ ë©€ë² ê° í¹ì static ë©€ë² ê°ìë ìë¡ ì§ì ì ê·ŒìŽ ê°ë¥íë€.
- static ë©€ë²ë ìžì€íŽì€ ë©€ë²ì ì§ì ì ìŒë¡ ì ê·Œí ì ìë€. êµ³ìŽ ì ê·Œíë €ë©Ž ê°ì²Žë¥Œ ìì±íŽìŒë§ íë€.
- ìžë¶ íŽëì€ì private ë©€ë²ë ëŽë¶ íŽëì€ììë ì§ì ì ê·ŒìŽ ê°ë¥íë€.
- ìžë¶ íŽëì€ì ì§ìë³ìë final ìŽ ë¶ì ë³ì(ìì)ë§ ì ê·Œ ê°ë¥íë€. JDK1.8 ë¶í°ë final ìëµìŽ ê°ë¥íŽì§ì ì ì.
- ìžì€íŽì€ íŽëì€ì ìžì€íŽì€ë¥Œ ìììë €ë©Ž ìžë¶ íŽëì€ì ìžì€íŽì€ë¥Œ 뚌ì ìì±íŽìŒë§ íë€.
- static ëŽë¶ íŽëì€ì ìžì€íŽì€ë ìžë¶ íŽëì€ë¥Œ 뚌ì ìì±ì¹ ììë ëë€.
- ìµëª íŽëì€ë ì ìžê³Œ ê°ì²Žì ìì±ì ëìì ì§ííŽì, ìŒíì±ìŒë¡ ì¬ì©ëë íŽëì€ìŽë€.
References
'ð» Study ! > JAVA' 칎í ê³ ëŠ¬ì ë€ë¥ž êž
[CH09] java.lang íší€ì§ (0) | 2022.08.21 |
---|---|
[CH08] ììžì²ëŠ¬(Exception handling) (0) | 2022.08.02 |
[CH07] ê°ì²Žì§í¥íë¡ê·žëë°3 (OOP) (0) | 2022.08.01 |
[CH07] ê°ì²Žì§í¥íë¡ê·žëë°2 (OOP) (0) | 2022.07.31 |
[CH06] ê°ì²Žì§í¥íë¡ê·žëë°1 (OOP) (0) | 2022.07.07 |