• ์ถ”์ƒํ™”

    2022. 5. 17.

    by. JuneBee

    728x90
    ๋ฐ˜์‘ํ˜•

    <1> Abstraction

    ํด๋ž˜์Šค๋Š” ์ถ”์ƒํ™”์˜ ์ตœ์†Œ ๋‹จ์œ„์ด๋‹ค

    ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ์ถ”์ƒํ™” ํ•˜์—ฌ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ , ์ด ํด๋ž˜์Šค๋ฅผ ๊ตฌ์ฒดํ™” ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค

     

    Practice Problem: ์•„๋ž˜ ํด๋ž˜์Šค๋“ค์˜ ๊ณตํ†ต ๋ถ„๋ชจ๋ฅผ ๋ฝ‘์•„์„œ ์ƒ์† ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž

    public class DiselSuv{
    private int curX, curY;
    public void reportPosition(){System.out.printf("ํ˜„์žฌ ์œ„์น˜: (%d, %d)%n" ,curX, curY );}
    public void addFuel(){System.out.printf("์ฃผ์œ ์†Œ์—์„œ ๊ธ‰์œ ");}
    }
    public class ElectricCar{
    private int curX, curY;
    public void reportPosition(){
    System.out.printf("ํ˜„์žฌ ์œ„์น˜: (%d %d)%n", curX, curY);}
    public void addFuel(){System.out.printf("๊ธ‰์† ์ถฉ์ „");}
    }
    }

    ์ƒ์† ๊ตฌ์กฐ๋กœ ์œ„ ๋ฌธ์ œ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ž‘์„ฑ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค 

    public class Car{
    private int curx, curY;
    public void reportPosition(){System.out.printf("ํ˜„์žฌ ์œ„์น˜: (%d %d)%n",curX,curY);}}
    public void addFuel(){**System.out.pirntf("์—ฐ๋ฃŒ");} //์–˜ ๊ฒฐ๊ตด ์•ˆ์“ฐ๋„น?**
    }
    class DiselSuv extends Car {
    //@override -> ์—ฐ๋ฃŒ๋ฅผ ์ง€์šฐ๊ณ  ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ์—†์•จ๊นŒ?
    public void addFuel(){System.out.println("์ฃผ์œ ์†Œ์—์„œ ๊ธ‰์œ ");}}
    class ElectricCar extends Car{
    @override
    public void addFuel(){System.out.println("๊ธ‰์†์ถฉ์ „");}}}
    //Test
    public class CarTest{
    public static void main(String[ ]args){
    Car[] c = {new DiselSuv(), new ElectricCar()};
    for(Car cx = c){cx.addFuel(); cx.reportPosition();}}}

    ์ƒ์†์„ ํ†ตํ•ด ์ฝ”๋“œํ™” ํ•˜์˜€๋”๋‹ˆ, ๊ฒฐ๊ตญ Car class ์•ˆ์— ์žˆ๋Š” addFuel() ์˜ "์—ฐ๋ฃŒ"๋Š” ๋‹จ ํ•œ๋ฒˆ๋„ ์“ฐ์ด์ง€ ์•Š๊ณ  ๋ชจ๋‘ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ addFuel() ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›Œ๋ฒ„๋ฆฐ ํ›„, ๋””์ ค๊ณผ ์ „๊ธฐ์ฐจ ํด๋ž˜์Šค ์•ˆ์˜ override๋ฅผ ์—†์• ๊ณ  ์ง์ ‘ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด, Test ํด๋ž˜์Šค์—์„œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์— addFuel์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    for(Car cx = c){cx.addFuel(); cx.reportPosition();}
    if ( cx instance of ElectricCar) {
    ElectricCar ev = new (ElectricCar) cx;
    cx.addFuel();}
    else if (cx instance of DiselSuv) {
    DiselSuv ds = new (DiselSuv) cx;
    cx.addFuel();

    ์ฆ‰, ์˜์›ํžˆ ์“ฐ์ด์ง€ ์•Š๋Š” Car Class ์˜ ์—ฐ๋ฃŒ ๋ฉ”์„œ๋“œ๋ฅผ ์—†์• ๋ฒ„๋ฆฐ๋‹ค๋ฉด, Car Test ํด๋ž˜์Šค ์•ˆ์—์„œ Car ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ์ž์‹ ํด๋ž˜์Šค์— ์†ํ•ด์žˆ๋Š”์ง€ ์ผ์ผ์ด ํ™•์ธํ•ด๋ด์•ผ ํ•œ๋‹ค.

    ์ง€๊ธˆ ์ด car ๊ฐ์ฒด๊ฐ€ ํ˜น์‹œ..ev๋‹ˆ? ์•„๋‹ˆ๋ฉด ๋””์ ค? ํ•˜์ด๋ธŒ๋ฆฌ๋“œ...?
    โ†’ ์—„์ฒญ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๋ณต์žกํ•ด์ง„๋‹ค!

    ์ด๋ฅผ ํ•ด๊ฒฐํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋กœ abstract class ์ด๋‹ค

    <2> Abstract Class

    Abstract Class ๋ž€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํด๋ž˜์Šค ์„ ์–ธ๋ถ€์˜ abstract ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ ์–ธํ•œ๋‹ค.

    ์–ธ์ œ abstract class ๋ฅผ ์จ์•ผ ํ• ๊นŒ?

    ์ž์† ํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ ๋˜์–ด ์‚ฌ์šฉ โ†’ ์กฐ์ƒ์˜ ๊ตฌํ˜„์ด ๋ฌด์˜๋ฏธํ•œ ๋ฉ”์„œ๋“œ์ผ ๋•Œ [EX] ์กฐ์ƒ์˜ addFuel()์€ ์•„๋ฌด์ง์— ์“ธ๋ชจ ์—†์—ˆ๋‹ค...ใ…  โ†’abstract class ๋กœ ๊ตฌํ˜„ํ•˜์ž

    abstract class Car {
    private int curX, curY;
    public void reportPosition(){ System.out.prinf("ํ˜„์œ„์น˜: (%d %d)%n", curX, curY);}
    public abstract void addFuel();// abstract method design pattern -> body ์—†๋‹ค
    }

    ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์“ฐ์ด๋˜ Car class๋ฅผ abstract class๋กœ ๋งŒ๋“  ์ฝ”๋“œ์ด๋‹ค. ์ด ๋•Œ, abstract class๋ž€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ์˜ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์–ด์•ผ ํ• ๊นŒ?

    //Car cx = new Car();
    Car cxx = new DisselSuv(); //์ž์‹์„ ์ฐธ์กฐํ•œ๋‹ค

    ๋น„๋ก, abstract class๋ฅผ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์ƒ์œ„ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์ž์‹์ธ disselsuv ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๐Ÿคฆ๐Ÿปโ€โ™€๏ธ ์กฐ์ƒ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋ฐ›์€ abstract ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: ํด๋ž˜์Šค ๋‚ด๋ถ€์— abstract method ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์ด๋ฏ€๋กœ ์ž์‹ํด๋ž˜์Šค๋Š” abstract ํด๋ž˜์Šค๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค

    ์™œ abstract class๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

    abstract class ๋Š” ๊ตฌํ˜„์˜ ๊ฐ•์ œ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋ฉฐ, interface์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ ์ค‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด ๊ฐœ๋ฐœ์˜ ํŽธ์˜๋ฅผ ์ง€์›ํ•œ๋‹ค.

    <3> Interface

    ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ถ”์ƒํ™” ๋‹จ๊ณ„๋กœ, ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ abstract ํ˜•ํƒœ์ด๋‹ค JDK 8์—์„œ default method ์™€ static method๋ฅผ ์ถ”๊ฐ€๋˜์–ด body๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ˜•ํƒœ๋„ ์žˆ๋‹ค.

    ๐Ÿงธ static์€ ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€ ์žˆ๋‹ค

    ํ˜•ํƒœ

    ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์„ ์–ธํ•œ๋‹ค ๋งด๋ฒ„ ๊ตฌ์„ฑ:

    1. ๋ชจ๋“  ๋งด๋ฒ„ ๋ณ€์ˆ˜๋Š” public static final ์ด๋ฉฐ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค

    2. ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” public abstract ์ด๋ฉฐ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค

    public interface InterfaceName{
    public static final int MEMBER1 =1;
    int MEMBER2 = 2; //public static final์ด ์ž๋™ ์ƒ๋žต
    public abstract void method(int parameter);
    void method2 (int parameter); //public abstract ์ƒ๋žต
    }

    ๋”ฐ๋ผ์„œ, method overriding ์‹œ์— ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€, Method Overriding์„ ํ•˜๊ธฐ ์œ„ํ•ด์„ , ๋ถ€๋ชจ์˜ ์ ‘๊ทผ์ œํ•œ์ž๋ณด๋‹ค ๋„“๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์ฝ”๋“œ์˜ void method2 (int parameter) ๊ฐ€ ๋””ํดํŠธ ์ ‘๊ทผ ์ œํ•œ์ž๊ฐ€ ์•„๋‹ˆ๋ผ public ์ ‘๊ทผ์ œํ•œ์ž ์ธ๊ฒƒ์„ ์ธ์ง€ํ•ด์•ผํ•œ๋‹ค. ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์กฐ๊ฑด์€ ์ƒ์† ํŽ˜์ด์ง€์—์„œ ํ™•์ธํ•˜๋„๋ก ํ•˜์ž.

    ์ƒ์†

    1. ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋„ Extends ๋ฅผ ์ด์šฉํ•ด ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค
    2. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์ค‘ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด์œ ๋Š” ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ž˜์Šค์˜ ์ƒ์†๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ํ˜ผ๋ˆ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ์—†๋‹ค
    interface ๋ฐ˜์ฃฝ {boolean ์ฃผ๋ฌผ์ฃผ๋ฌผ(boolean ๋ฐ€๊ฐ€๋ฃจ); }
    interface ์† {boolean ๊ฝ‰๊ฝ‰๋‹ด์•„(String ์†์žฌ๋ฃŒ); }
    interface ๋นตํ‹€๋ˆ„๋ฅด๊ธฐ {void ๊พน๊พน๋ˆŒ๋Ÿฌ(int time); }
    public interface ๋ถ•์–ด๋นตํƒ€์ด์ฟค extends ๋ฐ˜์ฃฝ, ์†, ๋นตํ‹€๋ˆ„๋ฅด๊ธฐ {
    void ๋ถ•์–ด๋นต๋งŒ๋“ค๊ธฐ();
    void ๋ถ•์–ด๋นตํŒ”๊ธฐ();
    }

     

    ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„๊ณผ ๊ฐ์ฒด ์ฐธ์กฐ

    ์ด๋ ‡๊ฒŒ ๋‹ค์ค‘ ์ƒ์† ๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํด๋ž˜์Šค์—์„œ implements ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ interface๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. Implements ํ•œ ํด๋ž˜์Šค๋Š”,

    1. ๋ชจ๋“  abstract methods ๋ฅผ override ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜
    2. ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ abstract ํด๋ž˜์Šค๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค
    3. ์—ฌ๋Ÿฌ๊ฐœ์˜ interface ๋ฅผ implements ํ•  ์ˆ˜ ์žˆ๋‹ค
    /*extends ์™€ implements ๋™์‹œ์‚ฌ์šฉ๊ฐ€๋Šฅ*/
    public class ํŒฅ๋ถ•์–ด๋นต extends ๊ฐ„์‹ implements ๋ถ•์–ด๋นตํƒ€์ด์ฟค{
    //์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฃ„๋‹ค ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ฑฐ๋‚˜ abstract ํด๋ž˜์Šค๋กœ ํ‘œ์‹œํ•ด์•ผํ•œ๋‹ค
    String ์†์žฌ๋ฃŒ = "ํŒฅ";
    boolean ๋ฐ€๊ฐ€๋ฃจ = true;
    int time = 3;
    //๋ถ•์–ด๋นต ํƒ€์ด์ฟค์ด ์ƒ์†ํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    @override
    public boolean ์ฃผ๋ฌผ์ฃผ๋ฌผ(){ if(๋ฐ€๊ฐ€๋ฃจ){ return true;}
    else{System.out.println("๋ฐ˜์ฃฝํ• ์ˆ˜ ์—†์–ด.."); return false;} }
    @override
    public boolean ์†(String ์†์žฌ๋ฃŒ) { if (์†์žฌ๋ฃŒ == "๋ถ•์–ด") {return false;} return true;}
    @override
    public void ๊พน๊พน๋ˆŒ๋Ÿฌ(int time){ return 30;}
    //๋ถ•์–ด๋นต ํƒ€์ด์ฟค์˜ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    @override
    public void ๋ถ•์–ด๋นต๋งŒ๋“ค๊ธฐ() {if(์ฃผ๋ฌผ์ฃผ๋ฌผ() && ์†()){ System.out.println("๋”ฐ๋ˆ๋”ฐ๋ˆ ๋ถ•์–ด๋นต ์™„์„ฑ");} }
    @override
    public void ๋ถ•์–ด๋นตํŒ”๊ธฐ(){}
    }
    //๋งŒ์•ฝ public void ๋ถ•์–ด๋นตํŒ”๊ธฐ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๊ธฐ ์‹ซ๋‹ค๋ฉด??: ์•„์˜ˆ abstract class ํ–‰*/
    public abstract class ํŒฅ๋ถ•์–ด๋นต implements ๋ถ•์–ด๋นตํƒ€์ด์ฟค {
    //์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฃ„๋‹ค ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ฑฐ๋‚˜ abstract ํด๋ž˜์Šค๋กœ ํ‘œ์‹œํ•ด์•ผํ•œ๋‹ค
    String ์†์žฌ๋ฃŒ = "ํŒฅ";
    boolean ๋ฐ€๊ฐ€๋ฃจ = true;
    int time = 3;
    //๋ถ•์–ด๋นต ํƒ€์ด์ฟค์ด ์ƒ์†ํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    @override
    public boolean ์ฃผ๋ฌผ์ฃผ๋ฌผ(){ if(๋ฐ€๊ฐ€๋ฃจ){ return true;}
    else{System.out.println("๋ฐ˜์ฃฝํ• ์ˆ˜ ์—†์–ด.."); return false;} }
    @override
    public boolean ์†(String ์†์žฌ๋ฃŒ) { if (์†์žฌ๋ฃŒ == "๋ถ•์–ด") { return false;} return true;}
    @override
    public void ๊พน๊พน๋ˆŒ๋Ÿฌ(int time){ return 30;}
    //๋ถ•์–ด๋นต ํƒ€์ด์ฟค์˜ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    public void ๋ถ•์–ด๋นต๋งŒ๋“ค๊ธฐ() { if(์ฃผ๋ฌผ์ฃผ๋ฌผ() && ์†()){ System.out.println("๋”ฐ๋ˆ๋”ฐ๋ˆ ๋ถ•์–ด๋นต ์™„์„ฑ");}}
    /*public void ๋ถ•์–ด๋นตํŒ”๊ธฐ(){}*/
    }
     ๐Ÿคฆ๐Ÿปโ€โ™€๏ธ Interface
    ์ƒ์† : interface extends interface1, interface 2, interface 3
    ๊ตฌํ˜„ : class implements interface

    ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ•„์š”์„ฑ

    1. ๊ตฌํ˜„์˜ ๊ฐ•์ œ๋กœ ํ‘œ์ค€ํ™” ์ฒ˜๋ฆฌ โ†’ ์†์‰ฌ์šด ๋ชจ๋“ˆ ๊ต์ฒด๋ฅผ ์ง€์›ํ•œ๋‹ค ํ•˜๋„ ๊ดด์‹์ด ์œ ํ–‰ํ•ด์„œ ์†์žฌ๋ฃŒ์— ๋ญ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”์ง€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง โ†’ ๊ทธ๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์†์žฌ๋ฃŒ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ํ•˜๋‚˜ ๊ต์ฒดํ•˜๋ฉด ์‰ฝ๊ฒŒ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ๋ถ•์–ด๋นต ์†์— ๋ถ•์–ด๋นต์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ‘œ์ค€์ด ๋ฐ”๋€Œ์–ด๋„ ๋ถ•์–ด๋นต์€ ๋ถ•์–ด๋นต์ด์—ฌ..
    2. ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
      ๋ถ•์–ด๋นต ์ฃผ์ธ์€ ํŠธ์œ„ํ„ฐ์— ๋ˆ„๊ฐ€ ์˜ฌ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•˜๊ณ  ๋†€๋‹ค๊ฐ€ ์†๋‹˜์ด ์˜ค๋ฉด ๊ทธ์ œ์„œ์•ผ ๋ฐ˜์ฃฝ์„ ํ•˜๊ณ  ๋ถ•์–ด๋นต์„ ํŠ€๊ฒจ์ค˜์•ผ ํ•˜๋Š”๊ฐ€? ๋˜ํ•œ, ์†๋‹˜์€ ์ƒˆ๋ฒฝ 7์‹œ์— ํฌ์žฅ๋งˆ์ฐจ๊ฐ€ ์—ด์ž๋งˆ์ž ๋ถ•์–ด๋นต์„ ๋‹น์žฅ ๋‹ฌ๋ผ๋ฉฐ ์ฃผ์ธ์„ ๋‹ฆ๋‹ฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ์ด๋•Œ, ์ฃผ์ธ๊ณผ ์†๋‹˜์€ ์„œ๋กœ ํ•ฉ์˜์ ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ฐ˜์ฃฝ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฏธ๋ฆฌ ๋ฐ˜์ฃฝ์„ ํ•ด๋†“๊ณ  ์†๋‹˜์ด ์™”์„๋•Œ ๊ตฌ์šธ ์ˆ˜ ์žˆ๋„๋ก ํ˜‘์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    3. ์„œ๋กœ ์ƒ์†์˜ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค๋“ค์—๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๊ด€๊ณ„ ๋ถ€์—ฌ๋กœ ๋‹คํ˜•์„ฑ ํ™•์žฅ

    ์œ„ ๊ทธ๋ฆผ์—์„œ, ๋ถ•์–ด๋นต๊ณผ ์ƒ๊ณผ์ผ ์ฃผ์Šค๋Š” ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ์žฌ๋ฃŒ๋„, ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋„ ๋‹ค๋ฅด๋‹ค. ํ•˜์ง€๋งŒ ๋‘˜ ๋‹ค ํƒ€์ด์ฟค์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ž๋ฐ”๋Š” ๋‹จ์ผ ์ƒ์†๋งŒ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋”์ด์ƒ ์ƒ์†์„ ํ•  ์ˆ˜ ์—†๋‹ค.

    ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ ‡๊ฒŒ ์„œ๋กœ ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค๋“ค์—๊ฒŒ ๊ด€๊ณ„๋ฅผ ๋ถ€์—ฌํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์žฅ์‚ฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ, ์ด๋ฏธ ๋นต์„ ์ƒ์†ํ•œ ๋ถ•์–ด๋นต๊ณผ, ์Œ๋ฃŒ์ˆ˜๋ฅผ ์ƒ์†ํ•œ ์ƒ๊ณผ์ผ ์ฃผ์Šค ์‚ฌ์ด์— ํƒ€์ด์ฟค์ด๋ž€ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ๋ฅ ์„ ๋†’์ด๊ณ  ํšจ์œจ์ ์ธ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

    ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์œ„์˜ ๊ด€๊ณ„๋„๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋‹ค.

    public interface Sellable {void ํƒ€์ด์ฟค();}
    
    public ๋ถ•์–ด๋นต extends ๋นต implements Sellable {
    @override
    public void ํƒ€์ด์ฟค(){
    System.out.println("๋”ฐ๋ˆ๋”ฐ๋ˆ ๋ถ•์–ด๋นต์‚ฌ์„ธ์šฉ");}}
    public ์ƒ๊ณผ์ผ์ฃผ์Šค extends ์Œ๋ฃŒ์ˆ˜ implements Sellable{
    @override
    public void ํƒ€์ด์ฟค(){
    System.out.println("์‹œ์›ํ•œ ์ƒ๊ณผ์ผ์ฃผ์Šค์‚ฌ์„ธ์šฉ");}
    public ๋™์ƒ extends ๊ฐ€์กฑ{
    public void ๋‚ด๋™์ƒ(){
    System.out.println("๋‚ด๋™์ƒ ์งฑ๊ท€์—ฝ์ง€? ๊ฐ€์งˆ๋ž˜?");}}
    public class RelationShipTest{
    public static void main (String[] args){
    Object[] obj = {new ๋ถ•์–ด๋นต(), new ์ƒ๊ณผ์ผ์ฃผ์Šค(), new ๋™์ƒ()};
    for( Object x : obj) {
    //์ด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ Sellable ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค ์ธ๊ฐ€์š”?
    if(x instanceof Sellable)
    Sellable sell = (Sellable) x; //๊ทธ๋Ÿผ ์ด ์˜ค๋ธŒ์ ํŠธ๋Š” Sellable ์ธ๊ฑฐ์•ผ
    x.ํƒ€์ด์ฟค(); //Sellable ์ด๋‹ˆ๊นŒ ํŒ”์•„๋ฒ„๋ฆฌ์ž
    }
    }

    ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implements ํ•˜๊ณ  ์ž‡๋Š” ํด๋ž˜์Šค๋“ค์€ "Sellable" ์ด๋ž€ ๊ด€๊ณ„๋ฅผ ๋‚˜๋ˆ„์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํŒ” ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ถ•์–ด๋นต๊ณผ ์ƒ๊ณผ์ผ ์ฃผ์Šค๋Š” ๊ฐ๊ฐ ๋นต๊ณผ ์Œ๋ฃŒ์ˆ˜๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ฐ™์€ ํŒ๋งค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ๋‹ค ํƒ€์ด์ฟค ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋™์ƒ์€ ํŒ๋งค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŒ”์•„๋ฒ„๋ฆด์ˆ˜ ์—†๋‹ค

    Default Method

    Default Method ๋ž€ ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ๊ตฌํ˜„๋ถ€๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋œปํ•œ๋‹ค.

    1. ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€์— default modifier ์ถ”๊ฐ€ ํ›„ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„๋ถ€ ์ž‘์„ฑ

    interface ์†์žฌ๋ฃŒ{
    void ๊ฝ‰๊ฝ‰๋‹ด์•„();
    default void ์žฌ๋ฃŒ์ƒํƒœํ™•์ธ(){
    System.out.println("์ด ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ ์ž…๋‹ˆ๋‹ค");
    System.out.println("์ผ๋‹จ ์†์žฌ๋ฃŒ๊ฐ€ ์žˆ์œผ๋ฉด ์ƒํƒœ๋ถ€ํ„ฐ ํ™•์ธํ•˜๊ณ  ์‹œ์ž‘ํ•ฉ์‹œ๋‹ค");}
    }

    2.ํ•„์š”์„ฑ

     

    (1) ๊ธฐ์กด์— interface ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ interface ์— ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ฐœ์ƒ abstract ํ˜•ํƒœ๋กœ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ๊ธฐ์กด ๋ฉ”์„œ๋“œ๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ์—ด์–ด์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค โ†’ ์™€ ์ •๋ง ๋ถˆํŽธ...

    (2) ๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ๋ผ๋ฉด ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ override ํ•ด์•ผํ•œ๋ฐ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” abstract ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค!

    (3) ๋””ํดํŠธ ๋ฉ”์„œ๋“œ์™€ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์˜ ์ถฉ๋Œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ :

       a. ์ธํ„ฐํŽ˜์ด์Šค โ†” ํด๋ž˜์Šค: ํด๋ž˜์Šค๊ฐ€ ์šฐ์„ ๊ถŒ์„ ๊ฐ–๋Š”๋‹ค

       b. ์ธํ„ฐํŽ˜์ด์Šค1 โ†” ์ธํ„ฐํŽ˜์ด์Šค2: ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ํ•ด์•ผํ•œ๋‹ค

    728x90
    ๋ฐ˜์‘ํ˜•

    '๐Ÿ““ STUDY > JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    ๋‹คํ˜•์„ฑ  (0) 2022.05.17
    ์ƒ์†  (0) 2022.05.17
    ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ  (1) 2022.05.17
    Class Case Exception  (0) 2022.05.17
    JAVA Basics  (0) 2022.05.12

    ๋Œ“๊ธ€