/*
   Ãß»ó Å¬·¡½º¿Í ÀÎÅÍÆäÀÌ½º ºñ±³ÇÏ±â


   - Ãß»ó Å¬·¡½º
      : Ãß»ó Å¬·¡½º´Â ¹Ì¿Ï¼º Å¬·¡½ºÀÌ´Ù. °´Ã¼°¡ °¡Áö´Â Æ¯¼ºÀ» Ãß»óÈ­ÇßÀ¸³ª ±¸ÇöÇÏÁö ¸øÇÑ °ÍÀÌ´Ù.
        Ãß»ó Å¬·¡½º¸¦ »ó¼ÓÇÑ ÀÚ½Ä Å¬·¡½º´Â ±¸ÇöÇÏÁö ¸øÇÑ ¸Þ¼­µå¸¦ ±¸ÇöÇØ¾ß¸¸ °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.
        Ãß»ó ¸Þ¼­µå´Â "ÇÁ·ÎÅä Å¸ÀÔ ¸Þ¼­µå"¶ó°íµµ ÇÑ´Ù.

      [Æ¯Â¡]
       - ¼±¾ð°ú ±¸ÇöÀ» ºÐ¸®½ÃÅ²´Ù.
       - ºÎ¸ð´Â ÀÚ½Äº¸´Ù Ãß»óÀû ¶Ç´Â ÀÏ¹ÝÀûÀÌ´Ù.
       - ÀÚ½ÄÀÇ Æ¯Â¡¿¡ ¾Ë¸ÂÀº ±¸Ã¼Àû ¸Þ¼­µå¸¦ ÀÚ½ÄÀÇ Å¬·¡½º¿¡¼­ ¿À¹ö¶óÀÌµùÇÑ´Ù.
       1) Ãß»ó ¸Þ¼­µå°¡ 1°³ ÀÌ»ó ÀÖÀ» ¶§(abstract field´Â ¾ø´Ù.)
       2) Ãß»ó Å¬·¡½º¸¦ »ó¼ÓÇÏ°Å³ª, ÀÎÅÍÆäÀÌ½º¸¦ ±¸ÇöÇÑ´Ù°í Çß´Âµ¥, ¿À¹ö¶óÀÌµù ÇÏÁö ¾Ê°Å³ª
           ±¸Çö ¾È ÇÑ ¸Þ¼­µå°¡ ÀÖÀ» ¶§
       3) Ãß»ó ¸Þ¼­µå´Â ¾øÁö¸¸ ¹Ýµå½Ã »ó¼ÓÀ» ÇØ¼­ »ç¿ëÇÏµµ·Ï °­Á¦¼ºÀ» µÎ±â À§ÇØ
           (final°ú ¹Ý´ë - final class´Â »ó¼ÓÀ» ±ÝÁö½ÃÄÑ¼­ ÀÚ½ÄÀÌ ¾ø´Ù.)


    - ÀÎÅÍÆäÀÌ½º
       : ÀÎÅÍÆäÀÌ½º´Â ÇÁ·ÎÅä Å¸ÀÔÀÌ¶ó°í ºÒ¸®´Â ±¸ÇöµÇÁö ¸øÇÑ ¸Þ¼­µå(Ãß»ó ¸Þ¼­µå)¸¸ ¼±¾ðÇÑ´Ù.
         ¸ðµç ¸Þ¼­µå°¡ Ãß»ó ¸Þ¼­µåÀÎ Ãß»ó Å¬·¡½º´Â ÀÎÅÍÆäÀÌ½º·Î ¹Ù²Ü ¼ö ÀÖ´Ù.
         Ãß»ó ¸Þ¼­µå¸¦ ¼±¾ð ÇÒ ±ú abstract Å°¿öµå¸¦ ¸Þ¼­µå¿¡ ºÙÀÎ´Ù. ÀÎÅÍÆäÀÌ½º¿¡¼­ ¼±¾ðµÈ º¯¼ö´Â
         ÀÚµ¿À¸·Î final staticÀÌ ºÙ¾î »ó¼ö°¡ µÇ°í, ¸Þ¼­µå´Â ÀÚµ¿À¸·Î abstract Å°¿öµå°¡ ºÙ´Â´Ù.

       [Æ¯Â¡]
       - ¼±¾ð°ú ±¸ÇöÀ» ºÐ¸®½ÃÅ²´Ù.
       - Ä¿ÇÃ¸µÀ» ¶³¾î¶ß¸°´Ù.
       - ´ÙÁß »ó¼ÓÀ» Èä³»³½´Ù.
       1) º¯¼ö´Â ÀÚµ¿À¸·Î »ó¼ö°¡ µÈ´Ù.
       2) privateÀº »ç¿ëÇÏÁö ¸»°í default ÀÌ»óÀ» »ç¿ëÇÏ¶ó. (void show() ¡æ public void show()°¡ µÈ´Ù.)
       3) {}(¹Ùµð)¸¦ ºÙÀÌÁö ¾Ê´Â´Ù.
       4) ÀÎÅÍÆäÀÌ½º¿¡ ¼±¾ðµÇ¾î ¸Þ¼­µå¸¦ ±¸Çö ¸øÇÏ¸é ÀÚ½Ä Å¬·¡½º´Â Ãß»ó Å¬·¡½º°¡ µÈ´Ù.
       5) ÀÎÅÍÆäÀÌ½º°¡ ¿©·¯ °³ÀÏ ¶§ ,(ÄÄ¸¶)¸¦ »ç¿ëÇÑ´Ù.
       6) »ó¼ÓÀÌ ¿ì¼±ÀÌ´Ù.
       7) ÀÎÅÍÆäÀÌ½º´Â ¿©·¯ °³ÀÇ ÀÎÅÍÆäÀÌ½º¸¦ extends ÇÒ ¼ö ÀÖ´Ù.

*/

interface Ship // ÀÎÅÍÆäÀÌ½º ¼±¾ð
{
	int move(); // »ç¶÷Àº ¸î ¸í ³ª¸£´Â°¡? (ÀÚµ¿À¸·Î public abstract int move();°¡ µÈ´Ù.)
	int carry(); // ¹«±â¸¦ ¸î Á¤ ³ª¸£´Â°¡? (ÀÚµ¿À¸·Î public abstract int carry();°¡ µÈ´Ù.)
}

abstract class Plane // Ãß»ó Å¬·¡½º ¼±¾ð
{
	public abstract void fly(); // Ãß»ó ¸Þ¼­µå
	public abstract int power(); // Ãß»ó ¸Þ¼­µå
	// Ãß»ó ¸Þ¼­µå ¶§¹®¿¡ Ãß»ó Å¬·¡½º°¡ µÈ´Ù.
}

class SeaAirplane extends Plane implements Ship // Å¬·¡½º¿Í ÀÎÅÍÆäÀÌ½º¸¦ ÀÌ¿ëÇÑ ´ÙÁß »ó¼Ó
{
	private String id="Air Balls";

	public SeaAirplane()
	{ // ¸â¹öÇÊµå¸¦ ÃÊ±âÈ­ ÇÏ·Á°í ¾Æ±Ô¸ÕÆ®°¡ ÇÏ³ª ÀÖ´Â »ý¼ºÀÚ¸¦ È£ÃâÇÏ¸é¼­ "LeeMass"¸¦ ´ëÀÔ
		this("LeeMass"); // this »ý¼ºÀÚ¸¦ ÀÌ¿ëÇÏ¿© ¸â¹öÇÊµå ÃÊ±âÈ­
	}

	public SeaAirplane(String id)
	{
		this.id=id;
	} // Ãß»óÈ­

	public void fly()
	{
		System.out.println("¿£Áø°ú ³¯°³¸¦ ÀÌ¿ëÇÏ¿© ³¯¾Æ°¨");
	}

	public int power()
	{
		return 10000;
	}// ÀÎÅÍÆäÀÌ½º

	public int move()
	{
		return 5;
	}// »ç¶÷À» ¸î ¸í ³ª¸£´Â°¡?

	public int carry()
	{
		return 300;
	}// ¹«±â¸¦ ¸î Á¤ ³ª¸£´Â°¡?

	public String toString()
	{
		return this.id+"°¡ "+power()+"¸¶·ÂÀ¸·Î "+move()+"¸íÀ» ³ª¸¥´Ù.";
	}
}

class SeaAirplaneUtil // static ¸Þ¼­µå¸¦ ¼±¾ðÇÏ´Â Å¬·¡½º·Î show¸¦ ¿À¹ö·ÎµùÇÑ´Ù.
{ /* show(Plane p), show(Ship s),  show(SeaAirplane s)¿Í °°ÀÌ °¢ Å¸ÀÔ¿¡ ¸Â°Ô È£Ãâ ÇÒ ¼ö ÀÖ´Ù.
       ±×·¯³ª show(Plane p), show(Ship s)¿Í °°ÀÌ ¿À¹ö·ÎµùµÈ ¸Þ¼­µå µÎ °³¸¸  ÀÖÀ» °æ¿ì,
       show ¸Þ¼­µåÀÇ ¾Æ±Ô¸ÕÆ®·Î SeaAirplane Å¸ÀÔÀ» ÀÔ·ÂÇÏ¸é reference to show is ambibuous¶ó´Â
       ¿¡·¯°¡ ³­´Ù. SeaAirplaneÀº Planeµµ µÇ°í, Shipµµ µÉ ¼ö ÀÖ±â ¶§¹®ÀÌ´Ù. */

	public static void show(Plane p)
	{
		System.out.print(p.power());
		p.fly();
	}

	public static void show(Ship s)
	{
		System.out.print(s.move()+"¸íÀ» ÅÂ¿ì°í ");
		System.out.println(s.carry()+"Á¤À» ½Æ°í °¡°í ÀÖ´Ù.");
	}

	public static void show(SeaAirplane s)
	{
		System.out.println(s);
	}

	public static void showOnly(Ship s) // Ship°ú SeaAirplane Å¸ÀÔÀ» ¾Æ±Ô¸ÕÆ®·Î ¹ÞÀ» ¼ö ÀÖ´Ù.
	{
		System.out.print(s.move()+"¸íÀ» ÅÂ¿ì°í ");
		System.out.println(s.carry()+"Á¤À» ½Æ°í °¡°í ÀÖ´Ù.");
	}

	public static void showPlane(Plane p) // Plane°ú SeaAirplane Å¸ÀÔÀ» ¾Æ±Ô¸ÕÆ®·Î ¹ÞÀ» ¼ö ÀÖ´Ù.
	{
		System.out.print(p.power());
		p.fly();
	}
}

class SeaAirplaneMain
{
	public static void main(String[] args)
	{
		SeaAirplane sea = new SeaAirplane("CS110"); // SeaAirplane Å¸ÀÔÀ¸·Î SeaAirplaneÀÇ °´Ã¼¸¦ »ý¼º
		Plane p = sea; // Ãß»óÅ¬·¡½º PlaneÀÇ ÀÌ¸§À¸·Î SeaAirplaneÀ» ¹ÞÀ» ¼ö ÀÖ´Â ¾Æ±Ô¸ÕÆ®ÀÇ ´ÙÇü¼º
		Ship s = sea; // Ãß»óÅ¬·¡½º ShipÀÇ ÀÌ¸§À¸·Î SeaAirplaneÀ» ¹ÞÀ» ¼ö ÀÖ´Â ¾Æ±Ô¸ÕÆ®ÀÇ ´ÙÇü¼º

		SeaAirplaneUtil.show(sea); // SeaAirplaneÀ» ¾Æ±Ô¸ÕÆ®·Î °®´Â show¸¦ È£ÃâÇÑ´Ù.
		SeaAirplaneUtil.show(p); // PlaneÀ» ¾Æ±Ô¸ÕÆ®·Î °®´Â show¸¦ È£ÃâÇÑ´Ù.
		SeaAirplaneUtil.show(s); // ShipÀ» ¾Æ±Ô¸ÕÆ®·Î °®´Â show¸¦ È£ÃâÇÑ´Ù.

		SeaAirplaneUtil.showOnly(sea);
		SeaAirplaneUtil.showPlane(sea);
	}
}