๐ŸŒฎ [Java] ์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค

์ „์ฃผ์€ยท2022๋…„ 11์›” 21์ผ
post-thumbnail

๐ŸŒฎ ์ถ”์ƒํด๋ž˜์Šค VS ์ธํ„ฐํŽ˜์ด์Šค

๐Ÿง ๋“ค์–ด๊ฐ€๋ฉด์„œ...

์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€์•Œ๊ณ  ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”์ง€๋Š” ์•Œ์ง€๋งŒ, ๋‘˜์„ ๋น„๊ตํ•ด์„œ ์„ค๋ช…ํ•˜๋ผ๊ณ ํ•˜๋ฉด ๋ง‰์ƒ ๋ง๋ฌธ์ด ๋ง‰ํžˆ๊ฒŒ ๋œ๋‹ค. ์ด๋ฒˆ์— ๊ทธ๋ž˜์„œ ๊ทธ ๋‘˜์˜ ๊ฐœ๋…์„ ์„ค๋ช…ํ•ด์ฃผ๊ณ , ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋น„์œ ๋ฅผ ํ•˜์ž๋ฉด ์ถ”์ƒํด๋ž˜์Šค='๋ณต์ œ' ์ด๊ณ , ์ธํ„ฐํŽ˜์ด์Šค='์„ค๊ณ„๋„'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿฐ์ง€ ํ•œ๋ฒˆ ์•Œ์•„๋ณผ๊นŒ์š”?

โœ” ์ถ”์ƒํด๋ž˜์Šค

  • ์ •์˜: ํ•˜๋‚˜ ์ด์ƒ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ(๊ตฌํ˜„์ด ์•ˆ๋œ ๋ฉ”์†Œ๋“œ)๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค
    • abstract๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด '{ }'๊ฐ€ ์—†์–ด ๊ตฌํ˜„์ด ์•ˆ๋œ ์ƒํƒœ์—ฌ์•ผํ•œ๋‹ค.
    • abstract๊ฐ€ ๋“ค์–ด๊ฐ„ ํด๋ž˜์Šค๋Š” abstract๊ฐ€ ์žˆ๋Š” ์ถ”์ƒ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•ด์•ผํ•œ๋‹ค.
  • ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ตฌํ˜„๋˜ ์žˆ์„ ๋•Œ ์ž์‹๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ž๋ฐ”์—์„œ ์ž์‹ํด๋ž˜์Šค๋Š” ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๋Š” ์šฉ๋„์™€ ์ƒ์†์˜ ๋ณธ์—ฐ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ํŠน์ •ํ•œ ์ฝ”๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๋ฌผ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์„ ์–ธ๋ฐฉ๋ฒ•
    public abstract class ํด๋ž˜์Šค์ด๋ฆ„{
        ...๋ณ€์ˆ˜์„ ์–ธ ๋ฐŽ ์ผ๋ฐ˜๋ฉ”์„œ๋“œ...
        abstract ๋ฆฌํ„ดํƒ€์ž… ๋ฉ”์„œ๋“œ์ด๋ฆ„();  
        //์ค‘๊ด„ํ˜ธ ์—†์ด ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ
        }

โœ” ์ถ”์ƒํด๋ž˜์Šค์˜ ๋‹คํ˜•์„ฑ
์ถ”์ƒํด๋ž˜์Šค๋Š” "๋‹คํ˜•์„ฑ"์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜ํƒ€๋‚œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ž์‹ํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•ด์•ผํ•˜๋ฏ€๋กœ ๋‹คํ˜•์„ฑ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

โœ” ์ถ”์ƒํ™”
๊ณตํ†ต๋œ ํ–‰๋™(๋ฉ”์†Œ๋“œ), ํ•„๋“œ(๋ณ€์ˆ˜)๋ฅผ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

โœ” ์ถ”์ƒ ๋ฉ”์„œ๋“œ
๋ฉ”์†Œ๋“œ ์„ ์–ธ๋งŒ ๋˜์–ด์žˆ๊ณ  ๊ตฌํ˜„๋ถ€๊ฐ€ ์—†๋Š” ๋ฉ”์„œ๋“œ

์ถ”์ƒํด๋ž˜์Šค ์˜ˆ์‹œ

public abstract class Parent {
    private int num;
    public void print(){	//์ผ๋ฐ˜ ํด๋ž˜์Šค๊ฐ€ ์กด์žฌ
        System.out.println("print() ํ˜ธ์ถœ!");
    }	

    public abstract int sum(int num1, int num2);    
    //{}๋กœ ๊ตฌํ˜„์ด ์•ˆ๋œ ์ถ”์ƒ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌ
}

public class Child extends Parent{
    //์˜ค๋ฒ„๋ผ์ด๋”ฉ Generate-> overide method
	// ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์•ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    @Override
    public int sum(int num1, int num2) {
        return num1 + num2;
    }
}

public class Abstract1  {
    public static void main(String[] args) {
//        Parent parent = new Parent();  //๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†์Œ
        Child child = new Child();
        child.print();
        int result = child.sum(10,5);
        System.out.println(result);
    }
}

โœ” ์ธํ„ฐํŽ˜์ด์Šค

  • ์ •์˜: ๊ฐœ๋ฐœ์ฝ”๋“œ์™€ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•˜๋Š” ์ ‘์  ์—ญํ• 

  • ์ž๋ฐ”๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์ค‘ ์ƒ์†์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํ‹€์„ ์ œ๊ณตํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค ์‚ฌ์ด์˜ ๋งค๊ฐœ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ์ผ์ข…์˜ ์ถ”์ƒ ํด๋ž˜์Šค์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์™€ ์ƒ์ˆ˜๋งŒ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ java 8๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ, static ๋ฉ”์†Œ๋“œ๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ

    ์ ‘๊ทผ์ œ์–ด์ž interface ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„ {
          ํƒ€์ž… ์ƒ์ˆ˜์ด๋ฆ„ = ๊ฐ’;
          //public static final ํƒ€์ž… ๋ณ€์ˆ˜๋ช…์œผ๋กœ JVM์ด ์ž๋™์œผ๋กœ ๋ณ€ํ™˜
          public ๋ฐ˜ํ™˜ํ˜• ๋ฉ”์†Œ๋“œ๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜1, ๋งค๊ฐœ๋ณ€์ˆ˜2 ..);
          //abstract๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ JVM์—์„œ ์ž๋™์œผ๋กœ abstract๋ฅผ ๋ถ™์—ฌ์คŒ
      }
  • ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

    ์ ‘๊ทผ์ œ์–ด์ž class ํด๋ž˜์Šค์ด๋ฆ„ implements ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„{
         ...
     }
  • ์ƒ์†๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ๋™์‹œ์— ํ•˜๋ ค๋ฉด

      ์ ‘๊ทผ์ œ์–ด์ž class ํด๋ž˜์Šค์ด๋ฆ„ extends ๋ถ€๋ชจํด๋ž˜์Šค์ด๋ฆ„ implements ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„{
          ...
      }
  • ์ƒ์†๊ณผ ๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ๋™์‹œ์— ํ•˜๋ ค๋ฉด

    ์ ‘๊ทผ์ œ์–ด์ž class ํด๋ž˜์Šค์ด๋ฆ„ extends ๋ถ€๋ชจํด๋ž˜์Šค์ด๋ฆ„ implements ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„1, ์ธํ„ฐํŽ˜์ด์Šค2....{
          ...
      }
    		```
    
    
      

โœ” API(Application Programming Interface)
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์šด์˜์ฒด์ œ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

โœ” ์ƒ์ˆ˜(final)

  • ๋ณ€ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€ ๋ƒ…๋‹ˆ๋‹ค.
  • ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์”๋‹ˆ๋‹ค ex) final PI
  • ํด๋ž˜์Šค, ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ
    1)ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ
    - ์ƒ์†์„ ํ•  ์ˆ˜ ์—†๊ฒŒ๋จ
    2)๋ณ€์ˆ˜์—์„œ ์‚ฌ์šฉ
    - ๊ฐ’์„ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ
    3)๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉ
    - ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•  ์ˆ˜ ์—†์Œ

์ธํ„ฐํŽ˜์ด์Šค ์˜ˆ์ œ

public interface Drawable {
    int man = 100;  //public statiic final int MAX =100;
    //์ถ”์ƒ ๋ฉ”์†Œ๋“œ
    public  void drawPrint(String msg);  //publiv anstract void drawPrint(String msg)
    public void setColor(String color);

    //์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ
    public default void prinitInfo(){
        System.out.println("Drawable ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ prubtInfo()!");
    }

    //static ๋ฉ”์†Œ๋“œ
    public static void staticMethod(){
        System.out.println("Drawable ์ธํ„ฐํŽ˜์ด์Šค์˜ static ๋ฉ”์†Œ๋“œ prubtInfo()!");
    }

}


public interface Movable {

    public void move(int x, int y);

    public default void printMove(){
        System.out.println("Movable ์ธํ„ฐํŽ˜์ด์Šค์˜ printMove()");
    }
}


public class Circle implements Drawable{

    double radius = 10;

    @Override
    public void drawPrint(String msg) {
        System.out.println("๋ฉ”์„ธ์ง€: " +  msg);
    }

    @Override
    public void setColor(String color) {
        System.out.println(color + "์ƒ‰์ƒ์œผ๋กœ ์„ค์ •ํ•จ");
    }

    public double calcCircle(double radius){
        return radius * radius * Math.PI;

    }
}

public class Rectangle implements Drawable{
    @Override
    public void drawPrint(String msg) {
        System.out.println(msg + "ํ˜•ํƒœ๋กœ ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.");
    }

    @Override
    public void setColor(String color) {
        System.out.println("์ง์‚ฌ๊ฐํ˜•์˜ ์„ ์„ "+ color + "์ƒ‰์ƒ์œผ๋กœ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค");
    }

    public int calcRectangle(int x, int y){
        return x * y;
    }
}

public class Printer implements Movable{

    String tools = "ํ”„๋ฆฐํ„ฐ";
    @Override
    public void move(int x, int y) {
        System.out.println(tools + "๋กœ x:" + x + ", y:"+ y + "์ขŒํ‘œ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค");
    }
    public void test(){
        System.out.println(tools + "๋กœ ํ…Œ์ŠคํŠธ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค");
    }
}

public class Shape implements Drawable, Movable{
    @Override
    public void drawPrint(String msg) {
        System.out.println("๋ฉ”์„ธ์ง€: "+ msg);
        System.out.println("Drawable์˜ drawPrint() ํ˜ธ์ถœ");
    }

    @Override
    public void setColor(String color) {
        System.out.println("์ƒ‰์ƒ: "+ color);
        System.out.println("Drawable์˜ setColor() ํ˜ธ์ถœ");
    }

    @Override
    public void move(int x, int y) {
        System.out.println("x: "+ x +", y: "+ y);
        System.out.println("Movable์˜ move() ํ˜ธ์ถœ");
    }
}

public class Interface1 {
    public static void main(String[] args) {
        //๊ทธ๋ฆผ ๊ทธ๋ ค์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ
//        Drawable drawable = new Drawable; //์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ๋ชป๋งŒ๋“ ๋‹ค.
        Circle circle = new Circle();
        circle.drawPrint("์›์˜ ๋„“์ด๋ฅผ ๊ตฌํ•ด๋ผ");
        circle.setColor("๋…ธ๋ž‘");
        circle.prinitInfo();
        Drawable.staticMethod();    //static๋ฉ”์†Œ๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

        Rectangle rectangle = new Rectangle();
        rectangle.drawPrint("4 * 7");
        rectangle.setColor("ํŒŒ๋ž‘");
        System.out.println(rectangle.calcRectangle(4,7));

        Printer ptinter = new Printer();
        ptinter.move(10,5);
        ptinter.test();

        //๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
        Shape shape = new Shape();
        shape.drawPrint("shape ๋ฉ”์„ธ์ง€");
        shape.setColor("ํ•‘ํฌ");
        shape.move(2,6);

        //-------------------------------------

        Drawable drawable = new Circle();
        drawable.drawPrint("drawable");
        drawable.setColor("๊ฒ€์ •");
        //drawable.calCircle ==>์•ˆ๋จ ์—…์บ์ŠคํŒ…์ด๋ž‘ ๊ฐ™์€์›๋ฆฌ

        //------------------------------------

        Drawable shape2 = new Shape();  //Drawable ํ‹€์„ ๊ฐ€์ ธ์˜ด
        shape2.drawPrint("drawable");
        shape2.setColor("๋…น์ƒ‰");
        //shape2.move       //Movable ์ธํ„ฐํŽ˜์ด์Šค๊บผ๋ผ์„œ ๋ชป์”€

        Movable shape3 = new Shape();   //Movable ํ‹€์„ ๊ฐ€์ ธ์˜ด
        shape3.move(2,6);
        //shape3.drawPrint("drawable"); //Drawable ํƒ€์ž…์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ

    }
}


โœ” ์ถ”์ƒํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค ์ฐจ์ด์ 

  1. ์ถ”์ƒํด๋ž˜์Šค๋Š” ์ƒ์†์„ ๋ฐ›์•„์„œ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์„ค๊ณ„๋„์ฒ˜๋Ÿผ ์ผ์ •ํ•œ ๊ทœ์น™์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

  2. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค.

  3. ์ƒ์†๊ณผ ๋‹ฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‘˜ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋™์‹œ์— ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€