Skip to content

Latest commit

ย 

History

History
1959 lines (1326 loc) ยท 64.6 KB

99.all.adoc

File metadata and controls

1959 lines (1326 loc) ยท 64.6 KB

Cannon Game

1. ์ค€๋น„ํ•˜๊ธฐ

1-1. ๋ชฉ์ 

  • Java ๊ธฐ์ดˆ ๊ณผ์ •์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์—ฐ์Šตํ•˜๊ณ  ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์ง€์‹ ์Šต๋“์„ ์œ„ํ•œ ์—ฐ์Šต

1-2. ํ•™์Šต ๋ฒ”์œ„

  • Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ฐ์Šต

    • Java ์–ธ์–ด ๊ธฐ์ดˆ

    • Class vs Interface

  • Event-Driven Programming

  • Java Graphics

    • swing

  • Testing

    • JUnit

  • Logging

    • Log4J2

1-3. ์ฐธ๊ณ 

1-3-1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์‹ค์Šต์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Log4J2

    • ๋กœ๊ทธ ์ถœ๋ ฅ ๋ฐ ๊ด€๋ฆฌ

    • ๋ฒ„์ „

      • log4j-api-2.20.0.jar ์ด์ƒ

      • log4j-core-2.20.0.jar ์ด์ƒ

    • ์„ค์ • ํŒŒ์ผ : log4j2.xml

  • JUnit5

    • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

    • ๋ฒ„์ „

      • junit-jupiter-api-5.9.3.jar ์ด์ƒ

      • Junit-platform-console-standalone-1.9.3.jar ์ด์ƒ

1-3-2. Project Package ๊ตฌ์„ฑ

  • src/main/java/com/nhnacademy/ - com.nhnacademy

  • src/test/ - test code

  • src/main/java/com/nhnacademy/example/ - example code

figure01
Figure 1. ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ
1-3-3. ๋„์›€ ์ž๋ฃŒ

2. Ball World

Keyword

  • awt(Abstract Window Toolkit) / swing

  • accessor / mutator

2-1. Ball

2-1-1. ์ •์˜

figure02
Figure 2. Ball
  • ball world๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ

  • 2์ฐจ์› ํ‰๋ฉด์—์„œ ball์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์ •๋ณด

  • ์ƒ์„ฑ ํ›„ ์ •๋ณด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

    • ์œ„์น˜ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

Variable(๋ณ€์ˆ˜)
  • int x

    • 2์ฐจ์› ํ‰๋ฉด์—์„œ์˜ X์ถ• ์ƒ ์œ„์น˜

    • ์ƒ์„ฑ ์‹œ ์ง€์ •

  • int y

    • 2์ฐจ์› ํ‰๋ฉด์—์„œ์˜ Y์ถ• ์ƒ ์œ„์น˜

    • ์ƒ์„ฑ ์‹œ ์ง€์ •

  • int radius

    • ๋ณผ์˜ ์ค‘์‹ฌ์—์„œ ์™ธ๊ณฝ๊นŒ์ง€์˜ ๊ธธ์ด

    • ์ƒ์„ฑ ์‹œ ์ง€์ •

Method(ํ•จ์ˆ˜)
  • int getX()

    • ๋ณผ์˜ X ์ขŒํ‘œ ์–ป๊ธฐ

  • int getY()

    • ๋ณผ์˜ Y ์ขŒํ‘œ ์–ป๊ธฐ

  • int getRadius()

    • ๋ณผ์˜ ์ค‘์‹ฌ์—์„œ ์™ธ๊ณฝ๊นŒ์ง€์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ˜์ง€๋ฆ„ ์–ป๊ธฐ

์ฐธ๊ณ . Accessor์™€ Mutator
  • Accessor

    • ๋ณ€์ˆ˜๊ฐ’ ๋ฐ˜ํ™˜

      • private ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ง€์›

      • ์™ธ๋ถ€์—์„œ ์ง์ ‘์ ์ธ ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ •์˜

    • ํ˜•์‹

      • get + <field name>

        • getRadius, getColor, โ€ฆโ€‹

      • is + <field name>

      • isEnabled, isInterrupted, โ€ฆโ€‹

    • ๋‹ค๋ฅธ ์šฉ์–ด

      • Getter

  • Mutator

    • ๋ณ€์ˆ˜๊ฐ’ ๋ณ€๊ฒฝ

      • private ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์ง€์›

      • ์™ธ๋ถ€์—์„œ ์ง์ ‘์ ์ธ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ง€์›

    • ํ˜•์‹

      • set + <field name>

      • setRadius, setColor, โ€ฆโ€‹

    • Setter

accessor์™€ mutator ์ •์˜๋Š” ์ตœ์†Œํ•œ์œผ๋กœ ํ•œ๋‹ค


Exam-01. Ball class๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

  • x, y๋กœ ์ด๋ฃจ์–ด์ง„ ์ค‘์‹ฌ์  ์ขŒํ‘œ, ๋ฐ˜์ง€๋ฆ„, ์ƒ‰์„ ๊ฐ–๋Š”๋‹ค.

  • ์ค‘์‹ฌ์  ์ขŒํ‘œ์™€ ๋ฐ˜์ง€๋ฆ„์€ ์ƒ์„ฑํ•  ๋•Œ ์„ค์ •ํ•œ๋‹ค.

  • ์ƒ‰์€ ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •ํ•œ๋‹ค.

    • ์ƒ‰์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ์ƒ‰์€ ๊ฒ€์€์ƒ‰(BLACK)์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

  • ๊ฐ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

    • x, y, radius, color

  • ์ฝ”๋“œ ์ค‘๋ณต์€ ์ตœ์†Œํ™”ํ•˜๋ผ.

    • ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ค‘๋ณต ์ •์˜๋Š” ๊ฐ€์ง€๋งŒ, ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์€ ์ตœ์†Œํ™”

  • ์ฝ”๋”ฉ ๊ทœ์น™์„ ๋”ฐ๋ผ ์ž‘์„ฑํ•œ๋‹ค.

    • VSCode ๋˜๋Š” IntelliJ์— SonarLint์™€ CheckStyle์„ ์„ค์น˜ํ•˜์—ฌ ํ™•์ธํ•œ๋‹ค.

class Ball

package com.nhnacademy;

import java.awt.Color;

public class Ball {
        ...

    public Ball(int x, int y, int radius, Color color) {
        ...
    }

    public Ball(int x, int y, int radius) {
        ...
    }

    public int getX() {
        ...
    }

    public int getY() {
        ...
    }

    public int getRadius() {
        ...
    }
}
๋ฌผ์Œ
  • Ball์ด ์š”๊ตฌ๋Œ€๋กœ ์ •์˜ ๋˜์—ˆ๋‚˜?

    • ์ƒ์„ฑ์‹œ ์ฃผ์–ด์ง„ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ๋ฐ˜ํ™˜๋˜๋Š”๊ฐ€?

  • Ball ์ƒ์„ฑ์‹œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ํ™•์ธํ–ˆ๋‚˜?

    • ์ขŒํ‘œ x,y์˜ ํ—ˆ์šฉ ๋ฒ”์œ„๋Š”?

    • ๋ฐ˜์ง€๋ฆ„ radius์˜ ํ—ˆ์šฉ ๋ฒ”์œ„๋Š”?

๊ฒฐ๊ณผ ํ™•์ธ
์ถ”๊ฐ€ ๋ฌธ์ œ
  • ๋™์ผํ•œ ๊ธฐ๋Šฅ ํ™•์ธ์„ N๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰ํ•ด ๋ณด์ž.

    • @RepeatedTest

    • RepetitionInfo

    • ์ƒˆ๋กญ๊ฒŒ ์ •์˜๋œ constructor๋Š” unit test๋ฅผ ์ด์šฉํ•ด ํ™•์ธํ•ด ๋ณด์ž.


2-2. PaintableBall

์ •์˜

  • ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

Variable
  • Color color

    • ๋ณผ ์ƒ‰์ƒ

    • ์ƒ์„ฑํ•  ๋•Œ ์ƒ๋žต ๊ฐ€๋Šฅ

    • ์ƒ๋žต ์‹œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฒ€์€์ƒ‰(BLACK)

Method
  • Color getColor()

    • ๋ณผ์˜ ์ƒ‰ ์–ป๊ธฐ

์ฐธ๊ณ 
  • ํ™”๋ฉด์— ๊ทธ๋ฆฌ๊ธฐ๋Š” Java์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์š”๊ตฌํ•˜๋Š” ํ˜•์‹์— ๋งž์ถฐ ๊ตฌ์„ฑ

  • Java AWT

    • awt์—์„œ๋Š” component๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ์‹œ์ ์— paint ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ

    • paintํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํ•จ๊ป˜ graphic context๋ฅผ ์ด์šฉํ•ด ๊ทธ๋ฆฌ๊ธฐ ๊ฐ€๋Šฅ

  • Ball class์—๋Š” ball์„ ํ™”๋ฉด์ƒ์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜ ํ•„์š”

    • void paint(Graphics g)

      • g - ball์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” graphic context์˜ instance

  • awt์—์„œ ์›์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” fillOval ์‚ฌ์šฉ

    • ์›์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ํƒ€์› ๊ทธ๋ฆฌ๊ธฐ ๋ฐฉ๋ฒ• ์ด์šฉ

    • ์›์€ ํญ๊ณผ ๋†’์ด๊ฐ€ ๊ฐ™์€ ํƒ€์›

      figure03
      Figure 3. oval

Exam-02. PaintableBall class๋ฅผ ์ •์˜ํ•˜๊ณ , ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ผ.

  • Ball์„ ํ™•์žฅํ•œ PaintableBall์„ ์ •์˜ํ•˜๋ผ.

  • awt graphics context๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜ paint๋ฅผ ์ •์˜ํ•˜๋ผ.

    • void paint(Graphics g);

  • ๋„ํ˜•์˜ ์ƒ‰์€ graphics context์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • setColor(Color color);

  • ์™ธ๋ถ€์˜ ์ž์›์„ ํ™œ์šฉํ•  ๊ฒฝ์šฐ, ์ž์› ํ™œ์šฉ ํ›„ ํ•ด๋‹น ์ž์›์˜ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ ์œ ์ง€๊ฐ€ ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ๋ฉด ํ™œ์šฉ ์ „ ์ƒํƒœ๋กœ ๋Œ๋ ค๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


๋ฌผ์Œ
  • PaintableBall์˜ constructor์—์„œ super class์˜ constructor๋ฅผ ์ด์šฉํ•˜์˜€๋‚˜?

  • paint ํ•จ์ˆ˜์—์„œ x, y, radius, color๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ, ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜์˜€๋‚˜?

  • graphic context๋ฅผ ์ด์šฉํ•ด ball ์ƒ‰์„ ์ถœ๋ ฅํ•˜๊ณ , ์›๋ž˜ ์„ค์ •๋œ ์ƒ‰์œผ๋กœ ๋Œ๋ ค๋†“์•˜๋Š”๊ฐ€?


๊ฒฐ๊ณผ ํ™•์ธ
  • JFrame์„ ์ด์šฉํ•ด Frame ๊ตฌ์„ฑ

  • Exam02.java

Unit Test
  • DummyGraphics class๋ฅผ ๋งŒ๋“ค์–ด PaintableBall ๊ฒ€์ฆํ•˜๊ธฐ

  • Graphics๋Š” ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ์–ด๋ ค์›€

  • Graphics๋ฅผ ํ™•์žฅํ•ด์„œ ๋งŒ๋“  DummyGraphics๋ฅผ ์ด์šฉํ•ด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ

  • DummyGraphics.java

    • ๊ฒ€์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด ์ €์žฅ

      • color

      • fillOval ํ˜ธ์ถœ ์‹œ ์ฃผ์–ด์ง„ argument

    • void setColor(Color color)

      • ์ƒ‰์„ ์„ค์ •ํ•˜๋Š” ํ•จ์ˆ˜๋กœ, PaintableBall์—์„œ ์„ค์ •ํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๋„๋ก ๊ตฌ์„ฑํ•œ๋‹ค.

    • Color getColor()

      • ํ˜„์žฌ ์„ค์ •๋œ ์ƒ‰์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    • Color getColorHistory()

      • ํ˜„์žฌ ์ƒ‰ ์ด์ „์— ์„ค์ •๋˜์—ˆ๋˜ ์ƒ‰๋“ค์„ ์ €์žฅํ•œ๋‹ค.

    • Color[] clearColorHistory()

      • ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ƒ‰ ๋ณ€๊ฒฝ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

    • Map<String, Object> getFillOvalParam();

      • fillOval์„ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์‚ฌ์šฉ๋œ ์ธ์ˆ˜๋ฅผ ์ €์žฅ ํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      • fillOval์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, exception์ด ๋ฐœ์ƒํ•œ๋‹ค.

      • Map<String, Object>๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      • Map์—๋Š” x, y, width, height, color๊ฐ€ ์ €์žฅ๋œ๋‹ค.

  • PaintableBallTest.java

    • DummyGraphics๋ฅผ ํ†ตํ•ด ๋™์ž‘ ์‹œํ‚ค๊ณ , DummyGraphics์— ๋‚จ๊ฒจ์ง„ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ํ™•์ธ

์ถ”๊ฐ€ ๋ฌธ์ œ
  • DEFAULT_COLOR๋ฅผ ์‚ฌ์šฉ๋ฅผ ์ง€์ •ํ•˜๊ณ , color๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•„๋„ ball์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋„๋ก Ball class๋ฅผ ์ˆ˜์ •ํ•ด ๋ณด์ž.


2-3. World

2-3-1. ์ •์˜

  • ball์ด ์กด์žฌํ•  ๊ณต๊ฐ„์ด๋ฉด์„œ ํ™”๋ฉด์— ์ถœ๋ ฅ๋  ์˜์—ญ

    • world๋‚ด์—์„œ ๋™์ž‘ํ•  ball์€ world์—์„œ ๊ด€๋ฆฌ

  • JPanel component ํ™•์žฅ

    • swing component

    • JFrame ์ƒ์„ฑ ํ›„ panel์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹คํ–‰์‹œํ‚ค๋ฉด ํ™”๋ฉด์— ์ถœ๋ ฅ๋จ


Variable
  • List<Ball> ballList

    • ball ๊ด€๋ฆฌ


Method
  • void add(Ball ball)

    • ball์„ ๊ด€๋ฆฌ ๋ชฉ๋ก์— ์ถ”๊ฐ€

    • ball - ์ถ”๊ฐ€ํ•  ball

  • void remove(Ball ball)

    • ball์„ ๊ด€๋ฆฌ ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐ

    • ball - ์ œ๊ฑฐํ•  ball

  • int getBallCount()

    • ball ๊ฐœ์ˆ˜

  • Ball getBall(int index)

    • ํŠน์ • ๋ฒˆ์งธ ball ๊ฐ€์ ธ์˜ค๊ธฐ

    • index - ๊ฐ€์ ธ์˜ฌ ball ์œ„์น˜

  • void removeBall(int index)

    • ํŠน์ • ๋ฒˆ์งธ ball ์ œ๊ฑฐํ•˜๊ธฐ

    • index - ์ œ๊ฑฐํ•  ball ์œ„์น˜

  • void paint(Graphics g)

    • ํ™”๋ฉด ์ถœ๋ ฅ

    • JPanel์˜ ์ •์˜๋œ void paint(Graphics g) ์žฌ์ •์˜

    • Panel์„ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ์‹œ์ ์— ball ์ถœ๋ ฅ

    • Ball ์ข…๋ฅ˜ ํ™•์ธ ํ•„์š”

    • g - ํ™”๋ฉด ์ถœ๋ ฅ์„ ์œ„ํ•œ graphic context


Exam-03. World class๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

  • JPanel์„ ํ™•์žฅํ•˜์—ฌ World class๋ฅผ ์ •์˜ํ•˜๋ผ.

  • World์—์„œ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š” method๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ.


์‹คํ–‰ ๊ฒฐ๊ณผ
  • ์‹คํ–‰ ํ›„ ์•„๋ฌด๋Ÿฐ ๊ทธ๋ฆผ์ด ์—†๋Š” window ์‹คํ–‰

figure04
Figure 4. ์‹คํ–‰ ๊ฒฐ๊ณผ
  • log4j2๋ฅผ ์ด์šฉํ•ด ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๋„๋ก ๊ตฌ์„ฑํ•˜์˜€์œผ๋ฏ€๋กœ, ์‹คํ–‰ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ ์ถœ๋ ฅ

2024-01-17T23:53:32.915+0900 INFO world ์ƒ์„ฑ ์™„๋ฃŒ
2024-01-17T23:53:32.918+0900 INFO Frame์— ์ถ”๊ฐ€ ์™„๋ฃŒ
2024-01-17T23:53:32.989+0900 INFO ํ™”๋ฉด ์ถœ๋ ฅ
  • Exam03.java

    • JFrame์„ ์ด์šฉํ•œ Window๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

    • JFrame

      • setSize(int, int)

        • Window ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

      • addWindowListener(WindowListener)

        • window์— ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ frame์— ์ „๋‹ฌํ•œ๋‹ค.

        • windowClosing ์„ค์ •์„ ํ†ตํ•ด close ์ด๋ฒคํŠธ ์ƒ์„ฑํ•  ๋•Œ System.exit(0)์„ ์ด์šฉํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•œ๋‹ค.

      • add(Component)

        • world๋Š” JPanel์„ ํ™•์žฅํ•˜์—ฌ ์ •์˜ํ•˜์˜€์œผ๋ฏ€๋กœ, awt component์ด๋‹ค.

        • frame์—์„œ ๊ด€๋ฆฌํ•˜๋Š” component๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

      • setEnabled(boolean)

        • Component class์— ์ •์˜๋œ ํ•จ์ˆ˜๋กœ์„œ, component ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค.

      • setVisible(boolean)

        • Component๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ์ถœ๋ ฅ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

        • visible ์„ค์ •์„ ํ•ด์•ผ ํ•˜๊ณ , ๊ธฐ๋ณธ๊ฐ’์€ false๋กœ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.


World class๋ฅผ ์ •์˜ํ•˜๊ณ , test code๋ฅผ ์ด์šฉํ•ด world๊ฐ€ ์ƒ์„ฑ๋จ์„ ํ™•์ธํ•˜์˜€๋‹ค.

์ด์ œ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ๊ฒŒ์ž„์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” world์™€ ball์ด ์ •์˜๋˜์—ˆ์œผ๋ฏ€๋กœ, world๋ฅผ ์ด์šฉํ•ด ball์„ ์ถœ๋ ฅํ•ด ๋ณด์ž.


Exam-04. world๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ball์„ ์ถ”๊ฐ€ํ•ด ์ถœ๋ ฅํ•˜๋ผ

  • world

    • ํฌ๊ธฐ๋Š” ๊ฐ€๋กœ 400, ์„ธ๋กœ 300์œผ๋กœ ํ•œ๋‹ค.

    • ๋ณผ์ด ์ถ”๊ฐ€๋ ๋•Œ ๋งˆ๋‹ค ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

  • ball

    • 10๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ถ”๊ฐ€ํ•œ๋‹ค.

    • ํฌ๊ธฐ๋Š” 10์—์„œ 50์œผ๋กœ ์ œํ•œํ•œ๋‹ค.

    • ์œ„์น˜๋Š” world ๋‚ด ์ž„์˜ ์œ„์น˜๋กœ ํ•œ๋‹ค.

      • world๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๊ฒฝ๊ณ„์— ๊ฑธ์ณ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

    • ๋‹ค์„ฏ ๊ฐ€์ง€ ์ƒ‰ ์ค‘ ์ž„์˜์˜ ํ•˜๋‚˜๋ฅผ ์ ์šฉํ•œ๋‹ค.

      • BLUE, RED, WHITE, BLACK, GREEN

  • Test Code

    • Exam-03์„ ์ฐธ๊ณ ํ•œ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ

figure05
Figure 5. Exam-04
  • ๋กœ๊ทธ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

2024-01-18T00:07:10.276+0900 INFO world ์ƒ์„ฑ ์™„๋ฃŒ
2024-01-18T00:07:10.279+0900 INFO ball ์ถ”๊ฐ€ : 278, 209,  31, ff00ff00
2024-01-18T00:07:10.279+0900 INFO ball ์ถ”๊ฐ€ : 192,  74,  44, ff0000ff
2024-01-18T00:07:10.280+0900 INFO ball ์ถ”๊ฐ€ :  66, 290,  42, ffff0000
2024-01-18T00:07:10.280+0900 INFO ball ์ถ”๊ฐ€ : 194, 260,  31, ffffffff
2024-01-18T00:07:10.280+0900 INFO ball ์ถ”๊ฐ€ :  27, 105,  25, ffffffff
2024-01-18T00:07:10.280+0900 INFO ball ์ถ”๊ฐ€ : 375, 269,  49, ffffffff
2024-01-18T00:07:10.280+0900 INFO ball ์ถ”๊ฐ€ :  96, 289,  26, ffffffff
2024-01-18T00:07:10.280+0900 INFO ball ์ถ”๊ฐ€ :  97,  94,  16, ffff0000
2024-01-18T00:07:10.281+0900 INFO ball ์ถ”๊ฐ€ : 249,  71,  19, ff00ff00
2024-01-18T00:07:10.281+0900 INFO ball ์ถ”๊ฐ€ : 129, 219,  26, ff000000
2024-01-18T00:07:10.281+0900 INFO Frame์— ์ถ”๊ฐ€ ์™„๋ฃŒ
2024-01-18T00:07:10.373+0900 INFO ํ™”๋ฉด ์ถœ๋ ฅ

3. Movable Ball World

Ball๊ณผ World๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค. ํ•˜์ง€๋งŒ, ๋‹จ์ˆœํžˆ ๋‹ค์–‘ํ•œ ๋ชจ์–‘์˜ ball์„ ๊ทธ๋ ค์ฃผ๋Š” ๊ณผ์ •๋งŒ ์ˆ˜ํ–‰ํ•˜์˜€๋‹ค. ์ด์ œ๋Š” ball์„ ์ด๋™์‹œํ‚ค๋ฉฐ ์ด์™€ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฒƒ๋“ค์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž

ball์˜ ์ด๋™์€ ์‹œ๊ฐ„์ด ๋ณ€ํ™”ํ•จ์— ๋”ฐ๋ผ ์œ„์น˜๊ฐ€ ๋ณ€ํ™”ํ•จ์„ ๋งํ•œ๋‹ค.

๊ณต๊ฐ„์—์„œ ball์˜ ์ด๋™์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„๊ณผ ๋‹จ์œ„ ์‹œ๊ฐ„ ๋™์•ˆ์˜ ์ด๋™ ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋‹จ์œ„ ์‹œ๊ฐ„ dt๋Š” ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ ๋˜๋Š” ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰ํ•  ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„์œผ๋กœ Ball์ด๋‚˜ World์—์„œ๋Š” Ball์„ ์ด๋™์‹œํ‚ค๊ณ  ํ™”๋ฉด์„ ์ถœ๋ ฅํ•˜๋Š” ๊ณผ์ •์ด ๋  ๊ฒƒ์ด๋‹ค.

figure06
Figure 6. ๋‹จ์œ„ ์‹œ๊ฐ„ ๋ณ€ํ™”

3-1. MovableBall

3-1-1. ์ •์˜

  • world์—์„œ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

    • ํŠน์ • ์œ„์น˜๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

    • ๋‹จ์œ„ ์‹œ๊ฐ„ ๋™์•ˆ ์ผ์ • ๊ฑฐ๋ฆฌ๋งŒํผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณ€ํ™”๋Ÿ‰์„ ๊ฐ€์ง„๋‹ค.

    • ์ด๋™ ๋ช…๋ น(move)์— ๋”ฐ๋ผ ์ง€์ •๋œ ๋ณ€ํ™”๋Ÿ‰๋งŒํผ ์ด๋™ํ•œ๋‹ค.

figure07
Figure 7. Movable Ball
  • ๋ณ€ํ™”๋Ÿ‰์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

Variable
  • int dx

    • ๋‹จ์œ„ ์‹œ๊ฐ„ ๋™์•ˆ์˜ x์ถ• ์ด๋™๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์œ„๋Ÿ‰

  • int dy

    • ๋‹จ์œ„ ์‹œ๊ฐ„ ๋™์•ˆ์˜ y์ถ• ์ด๋™๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์œ„๋Ÿ‰

Method
  • int getDX()

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น x์ถ•์œผ๋กœ ์ด๋™๋Ÿ‰ ๊ฐ€์ ธ์˜ค๊ธฐ

  • int getDY()

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น y์ถ•์œผ๋กœ ์ด๋™๋Ÿ‰ ๊ฐ€์ ธ์˜ค๊ธฐ

  • void setDX(int dx)

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น x์ถ•์œผ๋กœ ์ด๋™๋Ÿ‰ ์„ค์ •

  • void setDY(int dy)

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น y์ถ•์œผ๋กœ ์ด๋™๋Ÿ‰ ์„ค์ •

  • void move()

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋งŒํผ ์ด๋™์‹œํ‚ค๊ธฐ

  • void moveTo(int x, int y)

    • ํŠน์ • ์œ„์น˜๋กœ ์˜ฎ๊ธฐ๊ธฐ


Exam-05. MovableBall class๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

  • PaintableBall class๋ฅผ ํ™•์žฅํ•˜์—ฌ MovableBall class๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ผ.

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋™์•ˆ ์ด๋™ํ•  ๋ณ€์œ„๋Ÿ‰ ์ €์žฅ์„ ์œ„ํ•œ ๋ณ€์ˆ˜๋“ค ์ถ”๊ฐ€

    • ๋ณ€์œ„๋Ÿ‰ ํ™•์ธ ๋˜๋Š” ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ํ•จ์ˆ˜ ์ถ”๊ฐ€

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋งŒํผ ์ด๋™์„ ์œ„ํ•œ ํ•จ์ˆ˜ ์ถ”๊ฐ€

    • ํŠน์ • ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜ ์ถ”๊ฐ€

  • ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋Š” ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ
  1. ์‹คํ–‰ ํ›„ ํ™•์ธ

    • Test code๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

      2024-01-18T00:18:49.962+0900 INFO creation : 709, 534,  10
      2024-01-18T00:18:49.964+0900 INFO set DX/DY :  18,  69
      2024-01-18T00:18:49.976+0900 DEBUG 1, 1705504729964, 727, 603
      2024-01-18T00:18:49.983+0900 INFO move : 727, 603
      2024-01-18T00:18:49.983+0900 DEBUG 2, 1705504729983, 745, 672
      2024-01-18T00:18:49.983+0900 INFO move : 745, 672
      2024-01-18T00:18:49.984+0900 DEBUG 3, 1705504729984, 763, 741
      2024-01-18T00:18:49.984+0900 INFO move : 763, 741
        ...
      2024-01-18T00:18:50.112+0900 DEBUG 36, 1705504730112, 4185, 1350
      2024-01-18T00:18:50.112+0900 INFO move : 4185, 1350
      2024-01-18T00:18:50.112+0900 DEBUG 37, 1705504730112, 4278, 1376
      2024-01-18T00:18:50.112+0900 INFO move : 4278, 1376
      2024-01-18T00:18:50.112+0900 DEBUG 38, 1705504730112, 4371, 1402
      2024-01-18T00:18:50.112+0900 INFO move : 4371, 1402
      2024-01-18T00:18:50.112+0900 DEBUG 39, 1705504730112, 4464, 1428
      2024-01-18T00:18:50.112+0900 INFO move : 4464, 1428
  2. Unit Test

๋ฌผ์Œ
  • ํ™”๋ฉด์—๋Š” ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๋ณด์ด๋‚˜?

  • Unit test๋ฅผ ํ•  ๊ฒฝ์šฐ, graphics์˜ ์ƒํƒœ ์ €์žฅ์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

    • closure๋ฅผ ๊ณ ๋ คํ•˜๋ผ.

    • Pair class๋ฅผ ์ •์˜ํ•˜๊ณ , location์„ final๋กœ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.


3-2. MovableWorld class

3-2-1. ์ •์˜

  • ๊ณต๊ฐ„์—์„œ ball์„ ๋‹จ์œ„ ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์ด๋™์‹œํ‚จ๋‹ค

    • ๋‹จ์œ„ ์‹œ๊ฐ„ ๋‹จ์œ„ ์ด๋™์ด๋ž€?

      • ์ถ”๊ฐ€๋œ ball์„ ํ•œ๋ฒˆ ์ด๋™์‹œํ‚ค๋Š” ๊ฑธ ๋งํ•œ๋‹ค.

Variable
  • int moveCount

    • ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์ด๋™ ํšŸ์ˆ˜

  • maxMoveCount

    • ์ตœ๋Œ€ ์ด๋™ ํšŸ์ˆ˜

Method
  • void reset()

    • ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค

    • ์„ค์ •ํ•œ maxMoveCount๋Š” ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • void move()

    • ๋‹จ์œ„ ์‹œ๊ฐ„ ๋‹จ์œ„ ์ด๋™

    • ํ˜ธ์ถœ ์‹œ ๋“ฑ๋ก๋œ ๋ณผ ์ค‘์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” MovableBall๋งŒ 1ํšŒ ์ด๋™์‹œํ‚จ๋‹ค

    • ์ด๋™ํ•˜๊ณ  ๋‚˜๋ฉด ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•œ๋‹ค.

      • AWT์—์„œ๋Š” component๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด repaint ํ•จ์ˆ˜ ์ง€์›

    • ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

    • ์ตœ๋Œ€ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๋„˜์ง€๋Š” ์•Š๋Š”๋‹ค.

  • void run()

    • ์ง€์ •ํ•œ ํšŸ์ˆ˜ ๋˜๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ball์„ ์ด๋™์‹œํ‚จ๋‹ค.

    • ์ตœ๋Œ€ ์ด๋™ ํšŸ์ˆ˜๊ฐ€ 0์ด๋ฉด, ๊ณ„์† ์ด๋™ํ•œ๋‹ค.

  • int getMoveCount()

    • ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • int getMaxMoveCount()

    • ์ตœ๋Œ€ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • void setMaxMoveCount(int count)

    • ์ตœ๋Œ€ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.


Exam-06. MovableWorld class๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

  • World class์˜ ํ•„๋“œ๋ฅผ ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, World class๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ง์ ‘์ ์ธ ์ ‘๊ทผ์€ ๋ฐฉ์ง€ํ•˜๋ผ.

  • Test code๋ฅผ ์ด์šฉํ•ด ํ™•์ธํ•œ๋‹ค.

๊ฒฐ๊ณผ ํ™•์ธ
  • MovableWorld class๋ฅผ ์ •์˜ํ•˜๊ณ , test code๋ฅผ ์ด์šฉํ•ด ๊ธฐ๋ณธ ๋™์ž‘์„ ํ™•์ธํ•ด ๋ณด์ž.

  • ์‹ค์ œ ํ™”๋ฉด์ƒ์—๋„ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

Exam-07. MovableWorld class ๊ตฌ๋™์„ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ํ™•์ธํ•˜๋ผ

  • JFrame์„ ์ด์šฉํ•ด window๋ฅผ ๋งŒ๋“ค๊ณ , MovableWorld๋ฅผ component๋กœ ์‚ฌ์šฉํ•ด ์ ์šฉํ•˜๋ผ.

    • Window ํฌ๊ธฐ๋Š” ๊ฐ€๋กœ 400, ์„ธ๋กœ 300์œผ๋กœ ํ•œ๋‹ค.

  • 10๊ฐœ์˜ ball์„ ์ƒ์„ฑํ•˜๋ผ.

    • ์‹œ์ž‘ ์œ„์น˜ window ๋‚ด๋กœ ์ œํ•œํ•œ๋‹ค.

    • ํฌ๊ธฐ๋Š” ๋ฐ˜์ง€๋ฆ„ 10~50 ์‚ฌ์ด๋กœ ํ•œ๋‹ค.

    • ๋ณ€ํ™”๋Ÿ‰์€ ๊ฐ€๋กœ, ์„ธ๋กœ 10์—์„œ 30 ์‚ฌ์ด๋กœ ํ•œ๋‹ค.

    • ball ๊ฐ„ ์ค‘์ฒฉ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

      • ball ๊ฐ„ ์ค‘์ฒฉ์€ ball์—์„œ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ
  • ์ด๋™ ํšŸ์ˆ˜๊ฐ€ ์ ์„ ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉˆ์ถฐ ์žˆ๋‹ค.

figure08
Figure 8. ์ด๋™ ํšŸ์ˆ˜ ์ ์Œ
  • ์ด๋™ ํšŸ์ˆ˜๊ฐ€ ์กฐ๊ธˆ๋งŒ ๋Š˜์–ด๋„ ํ™”๋ฉด์—๋Š” ๋ช‡ ๊ฐœ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

figure09
Figure 9. ์ด๋™ ํšŸ์ˆ˜ ์ค‘๊ฐ„
  • ์ด๋™ ํšŸ์ˆ˜๊ฐ€ ์กฐ๊ธˆ๋งŒ ๋งŽ์•„์ ธ๋„ ์ถœ๋ ฅ๋˜๋Š” ball์€ ํ•˜๋‚˜๋„ ์—†๋‹ค.

figure10
Figure 10. ์ด๋™ ํšŸ์ˆ˜ ๋งŽ์Œ
๋ฌผ์Œ
  • MovableWorld์—์„œ๋Š” ball์ด ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค. ball์ด ์ด๋™ํ•˜๋Š”๊ฐ€?

    • ํ™•์ธ์„ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ผ๋ถ€ ์ˆ˜์ •ํ•˜์—ฌ ball์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•ด ๋ณด์ž.

        public class MovableBall extends Ball {
          Logger logger;
          ...
            public void move() {
                ...
                logger.debug("X : {}, Y : {}", getX(), getY());
          }
        }
    • ์ถœ๋ ฅ ํ„ฐ๋ฏธ๋„์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค.

      18:07:22.562 [main] DEBUG exam.Exam_3_2_2 - world created
      18:07:22.571 [main] DEBUG exam.Exam_3_2_2 - add ball : 331, 187, 36
      18:07:22.623 [main] DEBUG MovableBall - 360, 194
      18:07:22.623 [main] DEBUG MovableBall - 389, 201
      18:07:22.623 [main] DEBUG MovableBall - 418, 208
      18:07:22.623 [main] DEBUG MovableBall - 447, 215
      18:07:22.623 [main] DEBUG MovableBall - 476, 222
      18:07:22.623 [main] DEBUG MovableBall - 505, 229
      18:07:22.623 [main] DEBUG MovableBall - 534, 236
      18:07:22.623 [main] DEBUG MovableBall - 563, 243
      18:07:22.623 [main] DEBUG MovableBall - 592, 250
      18:07:22.623 [main] DEBUG MovableBall - 621, 257
  • ๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ?


3-3. ball์˜ ์ด๋™ ์‹œ๊ฐ„

  • MovableWorld๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด \(dt\) ๊ฐ„๊ฒฉ๋งˆ๋‹ค ball์„ ์ด๋™์‹œํ‚ด

    figure11
    Figure 11. Zero DT
  • ์•ž์—์„œ ๊ตฌํ˜„ํ•œ MovableWorld์—์„œ๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„ \(dt\)์— ๋Œ€ํ•ด ์ •์˜ํ•˜์ง€ ์•Š์•„ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ณ€ํ™”๋ฅผ ๋ณผ ์ˆ˜ ์—†์Œ

  • \(dt\)๊ฐ€ ์•„์ฃผ ์ž‘์€ ๊ฐ’์„ ์ฃผ๊ฑฐ๋‚˜ 0์ด๋ผ๋ฉด ๊ฒฐ๊ณผ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?


Exam-08. ๋‹ค์Œ ์ฝ”๋“œ๋Š” MovableBall์„ ์ˆ˜์ •ํ•˜์—ฌ ball ์ด๋™์ด ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ œ์— ๊ด€ํ•ด ํ™•์ธํ•ด ๋ณด์ž

MovableWorldTest์—์„œ๋Š” dt๋ฅผ ์„ค์ •ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. MovableBall์— ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณผ์ด ์–ด๋–ป๊ฒŒ ์ด๋™ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

public class MovableBall ... {
    ...

    public void move() {
        ...
        logger.debug("{} : {}, {}, {}",
                     getMovementCount(), System.currentTimeMillis(), getX(), getY());
        }
}
  • World class์— ๋กœ๊ทธ ์ถœ๋ ฅ์„ ์œ„ํ•œ logger ์ถ”๊ฐ€

  • ์ด๋™ ํšŸ์ˆ˜(movementCount)๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • System class์—์„œ ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ์‹œ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹คํ–‰ ๋กœ๊ทธ

  • ๊ฐ ๋ผ์ธ์€ ๋ณผ์ด ์ด๋™๋ ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„๊ณผ ball์˜ ์œ„์น˜๋ฅผ ํ‘œ์‹œ

  • ์‹œ๊ฐ„์€ ๋ฐ€๋ฆฌ์ดˆ(milliseconds) ๋‹จ์œ„๋กœ ํ‘œ์‹œ

๋ฌผ์Œ
  • ball์˜ ์ด๋™ ์†๋„๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜?

  • ์›€์ง์ด๋Š” ๋ณผ์€ ๋ณด์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ญ์ƒ ๋ณด์ด๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?


3-3-1. ๋‹จ์œ„์‹œ๊ฐ„ \(dt\)

๋‹จ์œ„ ์‹œ๊ฐ„์„ ์ถ”๊ฐ€ํ•ด ๋ณด์ž.

๋‹จ์œ„ ์‹œ๊ฐ„์€ ball์˜ ์ด๋™ ๊ฐ„๊ฒฉ ์‚ฌ์ด ์ผ์ • ์‹œ๊ฐ„ ๊ธฐ๋‹ค๋ฆผ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Thread.sleep()์„ ์ด์šฉํ•ด ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

Variable
  • int dt

    • ๋‹จ์œ„ ์‹œ๊ฐ„ ์ €์žฅ์„ ์œ„ํ•œ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค

Method
  • void setDT(int dt)

    • ๋‹จ์œ„ ์‹œ๊ฐ„ ์„ค์ •

  • int getDT()

    • ์„ค์ •๋˜์–ด ์žˆ๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„

  • void run()

    • ํ•จ์ˆ˜ ์ˆ˜์ •

    • move ํ›„ ์ง€์ •๋œ ๋‹จ์œ„ ์‹œ๊ฐ„๋งŒํผ ๋Œ€๊ธฐ


Exam-09. MovableWorld class์— ๋‹จ์œ„ ์‹œ๊ฐ„์„ ์ถ”๊ฐ€ํ•˜๋ผ

  • move ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„ ์„ค์ •๋œ ๋‹จ์œ„ ์‹œ๊ฐ„๋งŒํผ ๋Œ€๊ธฐํ•œ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ

๋‹จ์œ„ ์‹œ๊ฐ„์„ ์ถ”๊ฐ€ํ•œ ํ›„ ๋กœ๊ทธ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋กœ๊ทธ ์ถœ๋ ฅ

2:28:10.274 [main] DEBUG exam.Exam_3_3_2 - world created
22:28:10.285 [main] DEBUG exam.Exam_3_3_2 - add ball : 217, 281, 28, 13, -25
22:28:10.337 [main] DEBUG MovableWorld - start : 1686662890337
22:28:10.337 [main] DEBUG MovableBall - 1, 1686662890337, 230, 256
22:28:10.350 [main] DEBUG MovableBall - 2, 1686662890350, 243, 231
22:28:10.362 [main] DEBUG MovableBall - 3, 1686662890362, 256, 206
22:28:10.375 [main] DEBUG MovableBall - 4, 1686662890375, 269, 181
22:28:10.388 [main] DEBUG MovableBall - 5, 1686662890388, 282, 156
22:28:10.400 [main] DEBUG MovableBall - 6, 1686662890400, 295, 131
22:28:10.412 [main] DEBUG MovableBall - 7, 1686662890412, 308, 106
22:28:10.425 [main] DEBUG MovableBall - 8, 1686662890425, 321, 81
22:28:10.438 [main] DEBUG MovableBall - 9, 1686662890438, 334, 56
...
22:28:11.080 [main] DEBUG MovableBall - 60, 1686662891080, 997, -1219
22:28:11.093 [main] DEBUG MovableBall - 61, 1686662891093, 1010, -1244
22:28:11.106 [main] DEBUG MovableBall - 62, 1686662891106, 1023, -1269
22:28:11.119 [main] DEBUG MovableBall - 63, 1686662891119, 1036, -1294
22:28:11.132 [main] DEBUG MovableBall - 64, 1686662891132, 1049, -1319
...
22:28:11.576 [main] DEBUG MovableBall - 99, 1686662891576, 1504, -2194
22:28:11.587 [main] DEBUG MovableBall - 100, 1686662891587, 1517, -2219
22:28:11.599 [main] DEBUG MovableWorld - finished : 1686662891599 - 1262
  • 100ํšŒ ์ด๋™ํ•˜๋Š” ๋™์•ˆ 1,262๋ฐ€๋ฆฌ ์ดˆ ์†Œ๋ชจ

  • ๋‹จ์œ„ ์‹œ๊ฐ„์„ 10ms๋กœ ์„ค์ •ํ•˜์˜€๊ธฐ์— ๊ณ„์‚ฐ์ƒ์œผ๋กœ๋Š” 1,000ms ์†Œ๋ชจ๋˜์–ด์•ผ ์ •์ƒ

    • move 1ํšŒ ํ˜ธ์ถœ ํ›„ ๋ฌด์กฐ๊ฑด 10ms ๋Œ€๊ธฐ(๋งˆ์ง€๋ง‰๋„ ๋™์ผํ•จ)

๋ฌผ์Œ
  • ๋กœ๊ทธ๋กœ ์ถœ๋ ฅ๋œ ์†Œ์š” ์‹œ๊ฐ„์ด 1,262๋ฐ€๋ฆฌ ์ดˆ์ธ ์ด์œ ๋Š”?


์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

move ๊ฐ„ ๋‹จ์œ„ ์‹œ๊ฐ„(\(dt\))์„ ์ค„ ๊ฒฝ์šฐ ์‹ค์ œ ์ˆ˜ํ–‰์‹œ๊ฐ„์€ \(T=dt * n\)์ด ์•„๋‹ˆ๋‹ค.

์ด๋Š” move ์ฒ˜๋ฆฌ์‹œ๊ฐ„์„ ๊ฐ์•ˆํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ์„œ ์‹ค์ œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ \(T = (\alpha + dt) * n\) ๊ฐ€ ๋œ๋‹ค.

figure12
Figure 12. ๋‹จ์œ„์‹œ๊ฐ„ ์˜ค์ฐจ

Exam-10. MovableWorld์—์„œ move ํ›„ ๋ณ€๊ฒฝ๋˜๋Š” ์‹œ๊ฐ„์˜ ์˜ค์ฐจ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ผ

move๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋‹ค์Œ move๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๊นŒ์ง€์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋‹จ์œ„ ์‹œ๊ฐ„์ด ์•„๋‹Œ ์˜ˆ์ • ์‹œ๊ฐ„๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, move์™€ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ๋“ฑ์˜ ์ถ”๊ฐ€ ์ž‘์—…์„ ์œ„ํ•ด 1ms๋ฅผ ์†Œ๋น„ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ move๋ฅผ ์œ„ํ•ด ๋Œ€๊ธฐ ์‹œ๊ฐ„์€ ๋‹จ์œ„ ์‹œ๊ฐ„ - 1์ด ๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ๊ทธ๋ฆผ์€ ์‹ค์ œ ์ˆ˜ํ–‰ ์ž‘์—…์„ ๊ณ ๋ คํ•œ ๋‹จ์œ„ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

figure13
Figure 13. ๋‹จ์œ„์‹œ๊ฐ„ ์˜ค์ฐจ ๋ณด์ •
์‹คํ–‰ ๊ฒฐ๊ณผ

์ˆ˜์ •ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

๋กœ๊ทธ ์ถœ๋ ฅ

23:02:58.564 [main] DEBUG exam.Exam_3_3_2 - world created
23:02:58.573 [main] DEBUG exam.Exam_3_3_2 - add ball : 238, 224, 34, -27, -29
23:02:58.620 [main] DEBUG MovableWorld - start : 1686664978620
23:02:58.621 [main] DEBUG MovableBall - 1, 1686664978621, 211, 195
23:02:58.632 [main] DEBUG MovableBall - 2, 1686664978632, 184, 166
23:02:58.641 [main] DEBUG MovableBall - 3, 1686664978641, 157, 137
23:02:58.652 [main] DEBUG MovableBall - 4, 1686664978652, 130, 108
23:02:58.661 [main] DEBUG MovableBall - 5, 1686664978661, 103, 79
23:02:58.672 [main] DEBUG MovableBall - 6, 1686664978672, 76, 50
...
23:02:59.062 [main] DEBUG MovableBall - 45, 1686664979062, -977, -1081
23:02:59.072 [main] DEBUG MovableBall - 46, 1686664979072, -1004, -1110
23:02:59.083 [main] DEBUG MovableBall - 47, 1686664979083, -1031, -1139
23:02:59.091 [main] DEBUG MovableBall - 48, 1686664979091, -1058, -1168
23:02:59.102 [main] DEBUG MovableBall - 49, 1686664979102, -1085, -1197
...
23:02:59.582 [main] DEBUG MovableBall - 97, 1686664979582, -2381, -2589
23:02:59.592 [main] DEBUG MovableBall - 98, 1686664979592, -2408, -2618
23:02:59.603 [main] DEBUG MovableBall - 99, 1686664979603, -2435, -2647
23:02:59.611 [main] DEBUG MovableBall - 100, 1686664979611, -2462, -2676
23:02:59.621 [main] DEBUG MovableWorld - finished : 1686664979621 - 1001

๊ฒฐ๊ณผ๋Š” 1,001๋ฐ€๋ฆฌ ์ดˆ๋กœ ๊ฑฐ์˜ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ธ๋‹ค. ๋‚˜๋จธ์ง€ ์˜ค์ฐจ๋Š” ๋‹จ์œ„ ๋ฐ ๊ธฐํƒ€ ์—ฐ์‚ฐ์˜ ์˜ํ–ฅ์œผ๋กœ ์ฐจ์ด ๋‚  ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ์Œ

  • 0.999 ๋ฐ€๋ฆฌ์ดˆ์—์„œ ์‹œ์ž‘ํ•ด 1.001 ๋ฐ€๋ฆฌ์ดˆ์— ๋๋‚ฌ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ๊ณผ์ •์˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€?


4. Bounded Ball World

Keyword

  • Collision detection

  • Bounds

ball์€ ์‹œ๊ฐ„์ด ํ๋ฆ„์— ๋”ฐ๋ผ ์ง€์ •๋œ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์ •ํ•ด์ง„ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋”๋ผ๋„ ์ด๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ๊ณ„์† ์ด๋™ํ•ด ๋ฒ„๋ ค ๊ฒฐ๊ตญ์—๋Š” ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚˜ ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

๊ฒฝ๊ณ„๊ฐ€ ์žˆ๋Š” ์„ธ์ƒ์ด๋ž€ ์ •ํ•ด์ง„ ๊ณต๊ฐ„์˜ ์™ธ๊ณฝ์—๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ๋ฒฝ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ๋ฒฝ์— ball์ด ๋ถ€๋”ช์น  ๊ฒฝ์šฐ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ํŠ•๊ฒจ ๋‚˜์™€์•ผ ํ•œ๋‹ค.

์‚ฌ๊ฐ์˜ ๊ฒฝ๊ณ„๊ฐ€ ์žˆ๋Š” ์„ธ์ƒ์—์„œ ball์ด ๋ฒฝ์— ๋ถ€๋”ชํžˆ๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

figure14
Figure 14. แ„ƒแ…กแ†ฎแ„’แ…ตแ†ซ แ„€แ…ฉแ†ผแ„€แ…กแ†ซแ„‹แ…ฆแ„‰แ…ฅแ„‹แ…ด แ„‡แ…ฉแ†ฏ

์ด๋ฅผ ์•ž์—์„œ ์„ค๋ช…ํ•œ ์œ„์น˜ ๋ณ€ํ™”๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์™ผ์ชฝ ๋ฒฝ : (dx, dy) โ†’ (-dx, dy)

  2. ์•„๋ž˜์ชฝ ๋ฒฝ : (dx, dy) โ†’ (dx, -dy)

  3. ์˜ค๋ฅธ์ชฝ ๋ฒฝ : (dx, dy) โ†’ (-dx, dy)

  4. ์œ„์ชฝ ๋ฒฝ : (dx, dy) โ†’ (dx, -dy)

์„ค๋ช…์— ๋”ฐ๋ผ ball์ด ๋ฒฝ์— ๋ถ€๋”ชํ˜”์„ ๊ฒฝ์šฐ ball์ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋‹จ์œ„ ๋ณ€ํ™”๋Ÿ‰๋งŒ ๋ณ€๊ฒฝํ•ด์„œ ์ฃผ๋ฉด ๋œ๋‹ค.

์ด์ œ ๊ฒฐ์ •์ด ํ•„์š”ํ•˜๋‹ค. ๋ˆ„๊ฐ€ ์ด ์ž‘์—…์„ ํ•ด์ค„ ๊ฒƒ์ธ๊ฐ€? ball? world?

ball ์Šค์Šค๋กœ๊ฐ€ ๋ณ€๊ฒฝ ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ถฉ๋Œ๊ฐ์ง€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด๊ณ , world๊ฐ€ ๋ณ€๊ฒฝ ์ž‘์—…์„ ๋„์™€์ค€๋‹ค๋ฉด ball์˜ ์œ„์น˜๋ฅผ ํ•ญ์ƒ ๊ฐ์‹œํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๋งŒ๋“ค์–ด ๋ณด๋„๋ก ํ•˜์ž.


4-1. BoundedBall class

4-1-1. ์ •์˜

  • ๊ฒฝ๊ณ„์˜์—ญ ์ •๋ณด๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ๊ฒฝ๊ณ„์˜์—ญ์€ ๋ฒฝ์œผ๋กœ ๋ง‰ํ˜€ ์žˆ๋‹ค.

  • ๋ฒฝ์— ๋ถ€๋”ชํžˆ๋ฉด ํŠ•๊ฒจ ๋‚œ๋‹ค.

  • ๋ฒฝ์€ ๋ฌดํ•œํžˆ ๋‹จ๋‹จํ•˜์—ฌ ๋ถ€๋”ชํžŒ ์†๋„๋กœ ํŠ•๊ฒจ์ ธ ๋‚˜์˜จ๋‹ค.

Variable
  • Rectangle bounds

    • ์ž์‹ ์ด ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ์˜์—ญ ์ •๋ณด

Method
  • Rectangle getBounds()

    • ๊ฒฝ๊ณ„ ์˜์—ญ ์ •๋ณด

  • void setBounds(Rectangle bounds)

    • ๊ฒฝ๊ณ„ ์˜์—ญ ์„ค์ •

  • boolean isOutOfBounds()

    • ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธ

  • void move()

    • MovableBall์—์„œ ์ •์˜๋œ ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด๋™

    • ์ด๋™ ํ›„ ๊ฒฝ๊ณ„ ์˜์—ญ์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ, ์˜์—ญ ๋‚ด๋กœ ๋“ค์–ด ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ ๋™์ž‘ ์‹คํ–‰

  • void bounce()

    • ๊ฒฝ๊ณ„ ์˜์—ญ์„ ๋ฒ—์–ด ๋‚œ ๊ฒฝ์šฐ, ๊ฒฝ๊ณ„ ์˜์—ญ ๋‚ด๋กœ ๋“ค์–ด ์˜ค๋„๋ก d์œ„์น˜ ์ˆ˜์ •


Examp-11. BoundedBall class๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

  • ๊ฒฝ๊ณ„์˜์—ญ์€ ์‚ฌ๊ฐํ˜•์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    • AWT์—์„œ Rectangle class๋ฅผ ์ง€์›ํ•œ๋‹ค.

    • Rectangle class์—๋Š” ๋‘ ๊ฐœ์˜ ์‚ฌ๊ฐํ˜•์ด ๊ฒน์ณค๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ๊ฒน์นœ ์˜์—ญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ œ๊ณต๋œ๋‹ค.

    • ball๊ณผ ๊ฒฝ๊ณ„์˜์—ญ์ด ๊ฒน์น˜๋Š” ๊ฒƒ์€ ball์„ ๋‘˜๋Ÿฌ์‹ธ๋Š” ์ตœ์†Œํ•œ์˜ ์‚ฌ๊ฐํ˜•์ด ๊ฒฝ๊ณ„์˜์—ญ๊ณผ ๊ฒน์น˜๋Š” ๊ฒƒ์ด ๋™์ผํ•˜๋‹ค.

    • ํŠน์ •ํ•œ ์ ์ด ์‚ฌ๊ฒฉํ˜•์„ ๋ฒ—์–ด๋‚œ ๊ฒƒ์€ contains ํ•จ์ˆ˜๋กœ๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

figure15
Figure 15. exam_4_1_1_1
  • ๋ฒฝ์— ํŠ•๊ธฐ๋Š” ๊ฒƒ์€ ๋‹ค์Œ์˜ ๊ฒฝ์šฐ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

    • ์™ผ์ชฝ์ด๋‚˜ ์˜ค๋ฅธ์ชฝ ๋ฒฝ์— ๋ถ€๋”ชํž ๊ฒฝ์šฐ, X์˜ ์ด๋™ ๋ฐฉํ–ฅ์ด ๋ณ€๊ฒฝ๋œ๋‹ค. ์ฆ‰, X์ถ•์˜ ๋ณ€ํ™”๋Ÿ‰ \(dx\)๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.

      • ball์˜ ์™ผ์ชฝ ๋๋ถ€๋ถ„์ด ๊ฒฝ๊ณ„์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด ์™ผ์ชฝ ๋ฒฝ์— ๋ถ€๋”ชํžŒ ๊ฒƒ์ด๋‹ค.

      • ball์˜ ์˜ค๋ฅธ์ชฝ ๋๋ถ€๋ถ„์ด ๊ฒฝ๊ณ„์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด ์˜ค๋ฅธ์ชฝ ๋ฒฝ์— ๋ถ€๋”ชํžŒ ๊ฒƒ์ด๋‹ค.

    • ์œ„์ชฝ์ด๋‚˜ ์•„๋ž˜์ชฝ ๋ฒฝ์— ๋ถ€๋”ชํž ๊ฒฝ์šฐ, Y์˜ ์ด๋™ ๋ฐฉํ–ฅ์ด ๋ณ€๊ฒฝ๋œ๋‹ค. ์ฆ‰, Y์ถ•์˜ ๋ณ€ํ™”๋Ÿ‰ \(dy\)๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.

      • ball์˜ ์œ„์ชฝ ๋๋ถ€๋ถ„์ด ๊ฒฝ๊ณ„์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด ์œ„์ชฝ ๋ฒฝ์— ๋ถ€๋”ชํžŒ ๊ฒƒ์ด๋‹ค.

      • ball์˜ ์•„๋ž˜์ชฝ ๋๋ถ€๋ถ„์ด ๊ฒฝ๊ณ„์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด ์•„๋ž˜์ชฝ ๋ฒฝ์— ๋ถ€๋”ชํžŒ ๊ฒƒ์ด๋‹ค.

figure16
Figure 16. ๋ณผ๊ณผ ๊ฒฝ๊ณ„์˜์—ญ

์‹คํ–‰ ๊ฒฐ๊ณผ

figure17
Figure 17. ์‹คํ–‰ ๊ฒฐ๊ณผ
  • ๊ฒฝ๊ณ„์˜์—ญ์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ, ํŠ•๊ฒจ์„œ ์˜์—ญ ์•ˆ์œผ๋กœ ๋“ค์–ด์˜จ๋‹ค.

๋ฌผ์Œ
  • ball์ด ๊ฒฝ๊ณ„์˜์—ญ์— ๋ฒ—์–ด๋‚˜๋Š” ์‹œ์ ์— ํŠ•์ง€ ์•Š๊ณ , ์ผ๋ถ€๋Š” ์˜์—ญ์„ ๋ฒ—์–ด๋‚ฌ๋‹ค ํŠ•๊ฒจ ๋“ค์–ด์˜จ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ? ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€?


์˜ค๋ฅธ์ชฝ ๊ฒฝ๊ณ„์— ๋ถ€๋”ชํžŒ ํ›„ ํŠ•๊ฒจ ๋‚œ ๊ฒฝ์šฐ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

figure18
Figure 18. bounce ๋ณด์ •

๊ทธ๋ฆผ์„ ๋ฐ”ํƒ•์œผ๋กœ ์˜ค๋ฅธ์ชฝ ๊ฒฝ๊ณ„ ์ถฉ๋Œ ํ›„ ์ด๋™ ํ›„ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. \begin{align*} X_R & = X_2 - r\\ x_2 &= x_1 + |d_x|\\ x_3 &= X_R - (|d_x| - (X_R - x_1))\\ &= 2X_R - x_1 - |d_x|\\ &= 2{(X_2 - r)} - x_1 - |d_x|\\ &= 2{(X_2 - r)} - x_2\\ y_3 &= y_1 + dy\\ \end{align*}

๊ทธ๋ฆผ์„ ๋ฐ”ํƒ•์œผ๋กœ ์™ผ์ชฝ ๊ฒฝ๊ณ„ ์ถฉ๋Œ ํ›„ ์ด๋™ ํ›„ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. \begin{align*} X_L & = X_1 + r\\ x_2 & = x_1 - |d_x|\\ x_3 &= X_L + (|d_x| - (x_1 - X_L))\\ &= 2X_L - x_1 + |d_x|\\ &= 2{(X_1 + r)} - x_1 + |d_x|\\ &= 2{(X_1 + r)} - (x_1 - |d_x|)\\ &= 2{(X_1 + r)} - x_2\\ y_3 &= y_1 + d_y\\ \end{align*} ๊ทธ๋ฆผ์„ ๋ฐ”ํƒ•์œผ๋กœ ์œ„์ชฝ ๊ฒฝ๊ณ„ ์ถฉ๋Œ ํ›„ ์ด๋™ ํ›„ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. \begin{align*} Y_T & = Y_2 - r\\ y_2 &= y_1 + |d_y|\\ y_3 &= Y_T - (|d_y| - (Y_T - y_1))\\ &= 2Y_T - y_1 - |d_y|\\ &= 2{(Y_2 - r)} - y_1 - |d_y|\\ &= 2{(Y_2 - r)} - y_2\\ x_3 &= x_1 + d_x\\ \end{align*}

๊ทธ๋ฆผ์„ ๋ฐ”ํƒ•์œผ๋กœ ์•„๋ž˜์ชฝ ๊ฒฝ๊ณ„ ์ถฉ๋Œ ํ›„ ์ด๋™ ํ›„ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. \begin{align*} Y_B & = Y_1 + r\\ y_2 & = y_1 - |d_y|\\ y_3 &= Y_B + (|d_y| - (y_1 - Y_B))\\ &= 2Y_B - y_1 + |d_y|\\ &= 2{(Y_1 + r)} - y_1 + |d_y|\\ &= 2{(Y_1 + r)} - (y_1 - |d_y|)\\ &= 2{(Y_1 + r)} - y_2\\ x_3 &= x_1 + d_x\\ \end{align*}


Exam-12. ๊ฒฝ๊ณ„์˜์—ญ์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•˜๋ผ.

  • ๊ฒฝ๊ณ„ ์˜์—ญ์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ, ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์œ„์น˜๋ฅผ ๋ณด์ •ํ•˜๋ผ.

  • Rectangle์˜ contains๋กœ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ํ•  ๋•Œ, ํ•ด๋‹น ์ ์ด ๊ฒฝ๊ณ„ ์œ„์— ์กด์žฌํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.

  • ์œ„ ์‹์—์„œ ๋ณ€ํ™”๋Ÿ‰ \((|d_x|, |d_y|)\) ๋Š” ์ ˆ๋Œ“๊ฐ’์„ ๋‚˜ํƒ€๋ƒ„์„ ์ฃผ์˜ํ•˜๋ผ.(๋‹คํ–‰ํžˆ ์ตœ์ข… ๊ณ„์‚ฐ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ)

์‹คํ–‰ ๊ฒฐ๊ณผ
figure19
Figure 19. ์‹คํ–‰ ๊ฒฐ๊ณผ
  • ๋ณด์ •์‹์„ ์ ์šฉํ•œ ๊ฒฐ๊ณผ๋Š” ๊ฒฝ๊ณ„์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

  • ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ์•„๋ž˜์ชฝ์œผ๋กœ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ฒฝ๊ณ„์˜์—ญ์ด ๋ณด์ด๋Š” ๊ฒƒ๋ณด๋‹ค ์•„๋ž˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

figure20
Figure 20. ๊ฒฝ๊ณ„์˜์—ญ

4-2. BoundedWorld class

4-2-1. ์ •์˜

BoundedBall class๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ball์„ ์ด์šฉํ•œ ๋‹ซํžŒ ์„ธ์ƒ์—์„œ ์›€์ง์ž„์„ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค. ๊ทธ๋Ÿผ, ball์ด ์•„๋‹Œ world๋ฅผ ์ด์šฉํ•œ ๊ฒฝ์šฐ๋Š” ์–ด๋– ํ•œ์ง€ ํ™•์ธํ•ด ๋ณด์ž.

์›€์ง์ด๋Š” ball์ด ์ฃผ์–ด์ง„ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š”์ง€์— ๋Œ€ํ•ด world์—์„œ๋Š” ์ง€์†์ ์ธ ๊ฐ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ˜„์—์„œ world๋Š” ball์˜ ์›€์ง์ž„์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋”์šฑ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ BoundedWorld๋ผ๊ณ  ํ•˜์ž.

BoundedWorld๋Š” ball์ด ํ—ˆ์šฉ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ ์ ˆํ•˜๊ฒŒ ์ด๋™ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ๋ณ€ํ™”๋Ÿ‰์„ ์žฌ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Variable
  • BoundedWorld๋Š” ์ž์‹ ์˜ ๊ณต๊ฐ„ ์ •๋ณด๊ฐ€ ๊ฒฝ๊ณ„ ์ •๋ณด๊ฐ€ ๋˜๋ฏ€๋กœ, ๋ณ„๋„์˜ ์ถ”๊ฐ€๋Š” ํ•„์š” ์—†๋‹ค.

Method
  • BoundedWorld๋Š” ball์ด ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ƒˆ๋กœ์šด ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•ด ์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

  • Rectangle getBounds()

    • world์˜ ์˜์—ญ์„ ๊ฐ€์ ธ์˜จ๋‹ค

  • boolean outOfBounds(Ball ball)

    • ball์ด ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค

  • void bounceBall(Ball ball)

    • ball์˜ ์ƒˆ๋กœ์šด ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์„ค์ •ํ•œ๋‹ค


Exam-13. BoundedWorld class๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

  • getBounds

    • World์˜ ์˜์—ญ์— ๋Œ€ํ•œ ์ •๋ณด๋กœ์„œ World class์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    • awt component์—์„œ๋Š” getBounds ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ, ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

  • outOfBounds

    • ball์ด world๋ฅผ ๋ฒ—์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    • BoundedWorld ์˜์—ญ๊ณผ ball ์˜์—ญ์˜ ์ค‘์ฒฉ ์˜์—ญ์„ ๊ตฌํ•ด ball ์˜์—ญ๊ณผ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๋ฒ—์–ด๋‚œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

  • bounceBall

    • ball์ด ๊ฒฝ๊ณ„์˜์—ญ ๋ฒฝ์— ๋ถ€๋”ชํ˜”์„ ๋•Œ ํŠ•๊ฒจ ๋‚˜์˜จ ์œ„์น˜๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

    • MovableBall๋งŒ ํ•ด๋‹นํ•œ๋‹ค.

    • BoundedBall์˜ bounce๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • move

    • ball์„ ์ด๋™์‹œํ‚ค๊ณ , ์ถฉ๋Œ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค

์‹คํ–‰ ๊ฒฐ๊ณผ
  • MovableWorld๋ฅผ BoundedWorld๋กœ ๋ณ€๊ฒฝ

  • BoundedBall๋ฅผ MovableBall๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , bounds ์„ค์ • ๋ณ€๊ฒฝ


4-3. ๋ฌผ์ฒด ๊ฐ„ ์ถฉ๋Œ

Keyword

  • Collision detection

  • Bounds

BoundedBall์€ ๊ฒฝ๊ณ„์˜์—ญ์„ ์„ค์ •ํ•˜๊ณ  ํ•ด๋‹น ์˜์—ญ์„ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ, ํŠ•๊ฒจ์ ธ ๋‚˜์˜จ๋‹ค.

๊ทธ๋Ÿผ, ball์ด ํ•˜๋‚˜ ์ด์ƒ ์กด์žฌํ•  ๋•Œ ๋‹ค๋ฅธ ball์ด ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ณต๊ฐ„์€ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๋˜ํ•œ, ๊ฒฝ๊ณ„์˜์—ญ์€ ball์— ํ—ˆ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด ๋‹ค๋ฅธ ball์ด ์ฐจ์ง€ํ•œ ๊ณต๊ฐ„์˜ ๊ฒฝ์šฐ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์˜์—ญ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ๊ณต๊ฐ„์— ๋Œ€ํ•ด ํ—ˆ์šฉ ์˜์—ญ์ด ์•ˆ์ธ์ง€ ๋ฐ–์ด์ง€ ๊ตฌ๋ณ„์ด ํ•„์š”ํ•˜๋‹ค.

figure21
Figure 21. ๋ฌผ์ฒด ๊ฐ„ ์ถฉ๋Œ
  • ํฐ์ƒ‰ ball์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.

  • ํŒŒ๋ž€์ƒ‰์€ ์•ž์—์„œ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š” world๊ฐ€ ๋œ๋‹ค.

  • ๋ถ‰์€์ƒ‰ ball์€ ์ค‘์ฒฉ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ฌผ์ฒด๊ฐ€ ๋œ๋‹ค.

  • ๋ถ‰์€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ์˜์—ญ์€ ํฐ์ƒ‰ ball์— ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์˜์—ญ์ด๋‹ค.

  • world๋ฅผ ๊ธฐ์กด์œผ๋กœ ํ•  ๊ฒฝ์šฐ ๋‚ด๋ถ€ ์˜์—ญ์ด ํ—ˆ์šฉ ์˜์—ญ์ด๊ณ , ๋‹ค๋ฅธ ball์„ ๊ธฐ์ค€์œผ๋กœ ํ•  ๊ฒฝ์šฐ, ์™ธ๋ถ€ ์˜์—ญ์ด ํ—ˆ์šฉ ์˜์—ญ์ด ๋œ๋‹ค.

4-3-1. ์ถฉ๋Œ ๊ฐ์ง€

  • ball์ด ๊ฒน์นจ์€ ball ์ค‘๊ฐ„ ๊ฑฐ๋ฆฌ๊ฐ€ ๋‘ ball์˜ ๋ฐ˜์ง€๋ฆ„ ํ•ฉ๋ณด๋‹ค ํฌ๋ฉด ๋œ๋‹ค.

figure22
Figure 22. ball ๊ฐ„ ๊ฑฐ๋ฆฌ
  • ball ๊ฐ„ ๊ฑฐ๋ฆฌ๋Š” \begin{align*} ์ค‘์‹ฌ ๊ฐ„ ๊ฑฐ๋ฆฌ(D) &= r_1+r_2+d=\sqrt{{(x_1-x_2)}^2 + {(y_1-y_2)}^2}\\ ball ๊ฐ„ ๊ฑฐ๋ฆฌ(d) &= \sqrt{{(x_1-x_2)}^2 + {(y_1-y_2)}^2} - (r_1 + r_2) \end{align*}

ball ๊ฐ„ ๊ฑฐ๋ฆฌ๊ฐ€ ๋‘ ball์˜ ๋ฐ˜์ง€๋ฆ„ ํ•ฉ๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ, ๋‘ ball์€ ์ถฉ๋Œํ•œ ์ƒํƒœ๋‹ค.


Exam-14. ๊ฐ€๋ ค์ง€๋Š” ball์ด ์—†๋„๋ก ์ƒ์„ฑํ•˜๋ผ

์ž„์˜์˜ ์œ„์น˜์— ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ ์ผ๋ถ€ ball์ด ๊ฒน์นจ์„ ball ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์•ž์„œ ์ถ”๊ฐ€๋œ ball์ด ์–ด๋””์— ์–ผ๋งŒํ•œ ํฌ๊ธฐ๋กœ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ํ•ด ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ด๋‹ค. world์— ball์ด ์ถ”๊ฐ€๋  ๋•Œ ํ•ด๋‹น ์˜์—ญ์„ ๋‹ค๋ฅธ ball์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค. ๋งŒ์•ฝ, ๋‹ค๋ฅธ ball์ด ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์–ด ์ƒˆ๋กœ์šด ball์˜ ์ถ”๊ฐ€๊ฐ€ ์–ด๋ ต๋‹ค๋ฉด exception์„ ๋ฐœ์ƒ์‹œ์ผœ์„œ ๋‹ค๋ฅธ ์œ„์น˜์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์ฐธ๊ณ 

  • ์ œ๊ณฑ๊ทผ ํ•จ์ˆ˜๋Š” Math.sqrt()๋ฅผ ์ด์šฉํ•œ๋‹ค.

  • ๋ฐ˜๋ณตํ•ด์„œ ball์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฐ˜๋“œ์‹œ for๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

figure23
Figure 23. ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ball

๋‹ค์Œ ๊ทธ๋ฆผ์€ ball๊ณผ box ๊ฐ„ ์ถฉ๋Œ์„ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

figure24
Figure 24. ball๊ณผ box๊ฐ„ ๊ฑฐ๋ฆฌ

\begin{align*} ๋‘ ์ ์˜ ์ค‘์‹ฌ ๊ฐ„ ๊ฑฐ๋ฆฌ(d) &= \sqrt {{(x_1-x_2)}^2 + {(y_1-y_2)}^2}\\ ์ตœ์†Œ ์ถฉ๋Œ ๊ฑฐ๋ฆฌ(c) &= r1 + {w_2 \over 2} \end{align*}

ball๊ณผ box์˜ ์ถฉ๋Œ ์—ญ์‹œ ๋ณต์žกํ•ด ๋ณด์ด์ง€๋Š” ์•Š๋Š”๋‹ค. ์ค‘์‹ฌ ๊ฐ„ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ์†Œ ์ถฉ๋Œ ๊ฑฐ๋ฆฌ๋„ ์งง์œผ๋ฉด ์ถฉ๋Œ์ด๋‹ค.

ํ•˜์ง€๋งŒ, ๋‹ค์Œ ๊ทธ๋ฆผ์„ ๋ณด์ž.

figure25
Figure 25. ๋ณผ๊ณผ ๋ฐ•์Šค ๊ฐ„ ๊ฑฐ๋ฆฌ

๋ณต์žกํ•œ ์‹์„ ์ด์šฉํ•˜๋ฉด ๊ตฌํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ, ๋ณธ ๊ณผ์ •์—์„œ๋Š” ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ๋ชปํ•œ๋‹ค. ๋ฌผ์ฒด๊ฐ€ ์ถฉ๋Œํ•œ ์กฐ๊ฑด์„ ์ •์˜ํ•˜๊ณ , ์ถฉ๋Œ ์‹œ ๊ทธ์— ๋Œ€ํ•œ ํ–‰๋™๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

๋‹ค์Œ ๊ทธ๋ฆผ์€ ๋‘ ball์˜ ์ถฉ๋Œ์„ intersects ํ•จ์ˆ˜๋กœ ์ด์šฉํ•  ๊ฒฝ์šฐ๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

figure26
Figure 26. ๊ต์ฐจ ์˜์—ญ

์‹ค์ œ ์ถฉ๋Œํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ์ถฉ๋Œํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•œ๋‹ค. ๋Œ€์‹  box์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


Exam-15. intersects ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ€๋ ค์ง€๋Š” ball์ด ์—†๋„๋ก ์ƒ์„ฑํ•˜๋ผ

  • Ball class์— ์žˆ๋Š” ์ถฉ๋Œ ํ™•์ธ ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

  • ์ƒ์„ฑ๋˜๋Š” ball์„ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด ๋ณธ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ

figure27
Figure 27. ์ค‘์ฒฉ๋˜์ง€ ์•Š๋Š” ball


Exam-16. ์ถฉ๋Œ ๋ถ€๋ถ„์„ ํ‘œ์‹œํ•˜๋ผ.(์ถ”๊ฐ€)

  • ball์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ, ์ถฉ๋Œ ๋ถ€๋ถ„์„ ๋ถ‰์€์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค.

  • ์ถฉ๋Œ ์˜์—ญ์„ ์–ป์–ด ๋‚ผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

  • ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•  ๋•Œ์™€ ๊ทธ๋ฆด ๋•Œ๊ฐ€ ๋‹ฌ๋ผ ๋”ฐ๋กœ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

  • ์ €์žฅ๋œ ์ถฉ๋Œ ์˜์—ญ์€ ๋งค๋ฒˆ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

figure28
Figure 28. ์ถฉ๋Œ ์˜์—ญ

4-3-2. ์ถฉ๋Œ ํ›„ ํŠ•๊ธฐ๊ธฐ

์›€์ง์ด๋Š” ๋‘ ball์ด ์ถฉ๋Œํ•˜๋ฉด ์„œ๋กœ ํŠ•๊ฒจ ๋‚˜๊ฐ„๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋™์‹œ์— ํŠ•๊ธฐ๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ๋ณต์žกํ•˜๋ฏ€๋กœ, ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ํŠน์ • ์ˆœ๊ฐ„์— ํ•˜๋‚˜์˜ ball๋งŒ ์›€์ง์—ฌ์„œ ๊ณ ์ •๋œ ball์— ๋ถ€๋”ชํžˆ๋Š” ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค.

์ด๋Ÿด ๊ฒฝ์šฐ, ์›€์ง์ด๋˜ ball์€ ์–ด๋””๋ฅผ ๋ถ€๋”ช์น˜๋Š๋ƒ์— ๋”ฐ๋ผ ํŠน์ •ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊บพ์—ฌ์„œ ํŠ•๊ฒจ ๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋‹ค์Œ ๊ทธ๋ฆผ์€ ๋‘ ball์ด ์ถฉ๋Œํ•˜์˜€์„ ๋•Œ, ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์„ ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋‹ค.

figure29
Figure 29. ์ค‘์ฒฉ ์˜์—ญ

๊ฒน์นœ ์˜์—ญ์„ ๋ฒˆํ˜ธ๋กœ ํ•˜์—ฌ, 1, 3, 6, 8์€ ์ง„ํ–‰ ๋ฐฉํ–ฅ์˜ ๋ฐ˜๋Œ€๋กœ, 2, 7์€ X์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜๋Œ€๋กœ(์ฆ‰, dy๋ฅผ ๋ณ€๊ฒฝ), 4, 5๋Š” Y์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜๋Œ€๋กœ ์›€์ง์ด๋„๋ก ํ•˜๋ฉด ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ถฉ๋Œ ํ›„ ํŠ•๊น€์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํฐ ball์ด ์›€์ง์ผ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๊ฐ€ ๋œ๋‹ค.


Exam-17. ํ•˜๋‚˜์˜ ball์„ ๊ณ ์ •ํ•ด ๋‘” ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ball์„ ์›€์ง์ด๋„๋ก ํ•˜์—ฌ ์ถฉ๋Œ ์‹œ ํŠ•๊น€์„ ๊ตฌํ˜„ํ•˜๋ผ

์ฐธ๊ณ 
  • ๊ต์ฐจ ์˜์—ญ์„ ๊ตฌํ•˜๊ณ  ์˜์—ญ์˜ ํญ๊ณผ ๋†’์ด๋กœ 3๊ฐ€์ง€ ๊ทธ๋ฃน ์ค‘ ํ•˜๋‚˜๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค


5. ๊ฐ„์ถ”๋ ค ์‚ฌ์šฉํ•˜๊ธฐ

Keyworld

  • ADT

  • Vector(mathematics and physics)

5-1. Region ํ™œ์šฉํ•˜๊ธฐ

Ball class ์ฝ”๋“œ๋ฅผ ๋ณด๋„๋ก ํ•˜์ž.

  • ball ์œ„์น˜๋ฅผ ์œ„ํ•œ x,y ์ขŒํ‘œ์™€ ํฌ๊ธฐ๋ฅผ ์œ„ํ•ด radius๋ฅผ ์„ ์–ธํ•˜๊ณ  ์žˆ๋‹ค.

  • ball์˜ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ์˜์—ญ์„ ์‚ฌ๊ฐ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ๋Š” ์ตœ์†Œ ์˜์—ญ์„ region์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ์žˆ๋‹ค.


Exam-18. x,y ์ขŒํ‘œ, radius ๋Œ€์‹  region์„ ์ด์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๋ผ

  • instance variable๋กœ ์‚ฌ์šฉํ•˜๋˜, x, y, radius๋ฅผ ์ œ๊ฑฐ

  • Rectangle์„ ์ด์šฉํ•œ region์œผ๋กœ ๋Œ€์ฒด

  • ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ํ•จ์ˆ˜์˜ ์ •์˜๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ๊ตฌํ˜„๋งŒ ์ˆ˜์ •

๋ฌผ์Œ
  • ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ˆ˜์ •ํ•˜์˜€๋‚˜?

  • ์•ž์— ๋งŒ๋“ค์–ด ๋‘” test code์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‚˜? ๋ชจ๋‘ ์ •์ƒ?

  • x, y, radius์™€ region์€ ๊ด€๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

  • x, y, radius์˜ access modifier๋Š”?

์ฐธ๊ณ 
  • ํ•„๋“œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค accessor๋‚˜ mutator๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค๋ฉด, accessor์™€ mutator๋งŒ ์ˆ˜์ •ํ•ด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.


5-2. Motion class

5-2-1. ์ •์˜

์•ž์—์„œ 2์ฐจ์› ๊ณต๊ฐ„์—์„œ์˜ ๋ฌผ์ฒด ์ด๋™์€ \((dx, dy)\), ์ฆ‰, x์ถ•์˜ ๋ณ€ํ™”๋Ÿ‰๊ณผ y์ถ•์˜ ๋ณ€ํ™”๋Ÿ‰์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ ๋ฌผ์ฒด์˜ ์ด๋™์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ball์„ 30๋„ ๊ฐ๋„(\(\theta\))๋ฅผ 10๋งŒํผ์˜ ํฌ๊ธฐ(\(v\))๋กœ ์œ๋‹ค๊ณ  ํ•ด๋ณด์ž. x์ถ•๊ณผ y์ถ•์˜ ๋ณ€ํ™”๋Ÿ‰์€ ์–ผ๋งˆ์ธ๊ฐ€?

\begin{align*} dx = v sin \theta\\ dy = v cos \theta \end{align*}

๊ณ„์‚ฐ์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ, ์ด๊ฒƒ์„ ๋งค๋ฒˆ ํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๋ณ€์œ„๋Ÿ‰์ด ์ค‘์ฒฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋งค์šฐ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด 2์ฐจ์› ๊ณต๊ฐ„์—์„œ์˜ ๋ฌผ์ฒด ์ด๋™๊ณผ ๊ด€๋ จ๋œ class๋ฅผ ๋งŒ๋“ค๋„๋ก ํ•œ๋‹ค.

Motion class๋Š” ๋ฌผ๋ฆฌํ•™์ด๋‚˜ ์ˆ˜ํ•™์—์„œ ๋งํ•˜๋Š” Vector๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

figure30
Figure 30. Motion

Variables

Motion์€ ์ขŒํ‘œ๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•จ์œผ๋กœ dx, dy๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ–๋Š”๋‹ค.

  • int dx

    • x์ถ• ๋ณ€ํ™”๋Ÿ‰

  • int dy

    • y์ถ• ๋ณ€ํ™”๋Ÿ‰

Method

Motion์€ ์ˆ˜ํ•™๊ณผ ๋ฌผ๋ฆฌํ•™์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๋ฒกํ„ฐ๋กœ์„œ ๊ฐ๊ฐ์˜ ์„ฑ๋ถ„์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, motion ๊ฐ„ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Motion createPosition(int dx, int dy)

    • x์ถ•๊ณผ y์ถ• ๋ณ€ํ™”๋Ÿ‰์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

  • Motion createDisplacement(int angle, int magnitude)

    • ๊ฐ๋„(angle)์™€ ํฌ๊ธฐ(magnitude)๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

  • void add(Motion other)

    • motion์„ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • void sub(Motion other)

    • motion์„ ๋บ„ ์ˆ˜ ์žˆ๋‹ค.

  • int getDX()

    • x์ถ• ๋ณ€ํ™”๋Ÿ‰


Exam-19. Motion class๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

  • x์ถ•๊ณผ y์ถ•์˜ ๋ณ€ํ™”๋Ÿ‰์„ ์ค„ ๊ฒฝ์šฐ์™€ ๊ฐ๋„์™€ ํฌ๊ธฐ๋ฅผ ์ค„ ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค(์ •์ˆ˜์™€ ์‹ค์ˆ˜๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒโ€ฆ.)

  • Motion์„ ์ •์˜ํ•˜๊ณ , ์ƒ์„ฑ์ž๋Š” class ํ•จ์ˆ˜๋กœ ์ •์˜ํ•œ๋‹ค.

    • x์ถ•๊ณผ y์ถ•์˜ ๋ณ€ํ™”๋Ÿ‰์€ createPosition

    • ๊ฐ๋„์™€ ํฌ๊ธฐ๋Š” createDisplacement

๊ฒฐ๊ณผ

5-3. ๊ณต๊ฐ„์—์„œ์˜ ์ด๋™

๊ณต๊ฐ„์—์„œ์˜ ์ด๋™์€ ๋ฌผ์ฒด๊ฐ€ ๋ฐฉํ–ฅ๊ณผ ํฌ๊ธฐ(motion)์— ๋”ฐ๋ผ ์œ„์น˜๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, ์ด๋ฅผ Motion class๋กœ ์ •์˜ํ•˜์˜€๋‹ค.

5-3-1. Ball์˜ ์ด๋™

์•ž์˜ MovableBall์€ ๋‹จ์œ„ ์ด๋™๋Ÿ‰์„ dx, dy๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

์ด๋ฅผ Motion class๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ ์šฉํ•ด ๋ณด์ž.


Exam-20. ๋‹จ์œ„ ์ด๋™๋Ÿ‰\((dx, dy)\)์„ Motion class๋กœ ์ˆ˜์ •ํ•˜๋ผ

  • ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ move(int dx, int dy)๋Š” ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋‘๋„๋ก ํ•œ๋‹ค.

  • Ball test code์— Motion ์ถ”๊ฐ€์™€ ๊ด€๋ จ๋œ test code๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ๊ธฐ์กด์— ์ž‘์„ฑํ–ˆ๋˜, Exam-19.java๋ฅผ ์‹คํ–‰ํ•ด ๋™์ผํ•˜๊ณ  ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

๋ณ€๊ฒฝ ์ „

public class MovableBall extends Ball {
    int dx = 0;
    int dy = 0;
    long movementCount = 0;
        ...
}

๋ณ€๊ฒฝ ํ›„

public class MovableBall extends Ball {
    motion = new Motion();
    long movementCount = 0;
        ...
}

6. ์ƒˆ๋กœ์šด ๋ฌผ์ฒด์˜ ์ถœํ˜„

ํ˜„์žฌ์˜ world์—๋Š” ball๋งŒ ์กด์žฌํ•œ๋‹ค. ball ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋ฌผ์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋  ๊ฒƒ์ธ๊ฐ€?

์‚ฌ๊ฐํ˜•์˜ box๋ฅผ world์— ์ถ”๊ฐ€ํ•ด ๋ณด๋„๋ก ํ•˜์ž.

6-1. Box class

6-1-1. ์ •์˜

2์ฐจ์› ๊ณต๊ฐ„์—์„œ์˜ Box๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๊ฐํ˜•์ด๋‹ค.

figure31
Figure 31. box
  • ์ƒ์„ฑ ํ›„ ์ด๋™์ด๋‚˜ ์ •๋ณด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

Variable

box๋Š” ์ค‘์‹ฌ ์ขŒํ‘œ์™€ ํญ๊ณผ ๋†’์ด๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • int x

    • 2์ฐจ์› ํ‰๋ฉด์—์„œ์˜ X์ถ• ์ƒ ์œ„์น˜

    • ์ƒ์„ฑ์‹œ ์ง€์ •

  • int y

    • 2์ฐจ์› ํ‰๋ฉด์—์„œ์˜ Y์ถ• ์ƒ ์œ„์น˜

    • ์ƒ์„ฑ์‹œ ์ง€์ •

  • int width

    • ์ƒ์ž์˜ ๊ฐ€๋กœ ๊ธธ์ด

    • ์ƒ์„ฑ์‹œ ์ง€์ •

  • int height

    • ์ƒ์ž์˜ ๋†’์ด

    • ์ƒ์„ฑ์‹œ ์ง€์ •

  • Color color

    • box ์ƒ‰์ƒ

    • ์ƒ์„ฑํ•  ๋•Œ ์ƒ๋žต ๊ฐ€๋Šฅ

    • ์ƒ๋žต์‹œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฒ€์€์ƒ‰(BLACK)

Method

box์—๋Š” ๊ฐ’์„ ์–ป๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์™€ ํ™”๋ฉด์ƒ์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์œ„์—์„œ ์ •์˜ํ•œ ํ•„๋“œ์˜ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ์˜ ํ•จ์ˆ˜๊ฐ€ ์š”๊ตฌ๋œ๋‹ค.

  • int getX()

    • x์ถ• ์ƒ์—์„œ์˜ box ์ค‘์‹ฌ

  • int getY()

    • y์ถ• ์ƒ์—์„œ์˜ box ์ค‘์‹ฌ

  • int getWidth()

    • box ๊ฐ€๋กœ ๊ธธ์ด

  • int getHeight()

    • box ๋†’์ด

  • Color getColor()

    • box ์ƒ‰

  • Rectangle getRegion()

    • ์˜์—ญ ๋ฐ˜ํ™˜

  • void paint(Graphics g)

    • ๊ทธ๋ฆฌ๊ธฐ

๊ธฐ๋ณธ์ ์ธ Box class ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, ํ™”๋ฉด์ƒ์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ๋‹ค์Œ์˜ ํ•จ์ˆ˜๊ฐ€ ์š”๊ตฌ๋œ๋‹ค.

ํ™”๋ฉด์— ๊ทธ๋ฆฌ๊ธฐ๋Š” awt library๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์š”๊ตฌํ•˜๋Š” ํ˜•์‹์— ๋งž์ถฐ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

AWT์—์„œ๋Š” Graphics context ์ œ๊ณตํ•˜์—ฌ ํ™”๋ฉด ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ง€์›ํ•˜๋ฏ€๋กœ, ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜์—์„œ๋Š” ์ œ๊ณต๋˜๋Š” context๋ฅผ ์ด์šฉํ•ด ๊ทธ๋ ค์•ผ ํ•œ๋‹ค.

void paint(Graphics g) {...}

์ฐธ๊ณ . AWT์—์„œ ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ

Box class์—์„œ ๋„ํ˜•์„ ๊ทธ๋ฆฌ๋Š” paint ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด, ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด fillRect๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

figure32
Figure 32. fillRect
  • (x, y)๋Š” box์˜ ์ค‘์‹ฌ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  • fillRect๋Š” ์šฐ์ธก ์ƒ๋‹จ ๊ผญ์ง“์ ๊ณผ ํญ, ๋†’์ด ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.


Exam-21. Box class๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ

  • x, y๋กœ ์ด๋ฃจ์–ด์ง„ ์ค‘์‹ฌ์  ์ขŒํ‘œ, ํญ, ๋†’์ด, ์ƒ‰์„ ๊ฐ–๋Š”๋‹ค.

  • ์ค‘์‹ฌ์  ์ขŒํ‘œ, ํญ, ๋†’์ด๋Š” ์ƒ์„ฑ ์‹œ ์„ค์ •ํ•œ๋‹ค.

  • ๋ณต์ œ ์ƒ์„ฑ์ž๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

  • ์ƒ‰์€ ์ƒ์„ฑ ์‹œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ธฐ๋ณธ์ƒ‰์€ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

  • ๊ฐ ํ•„๋“œ ๊ฐ’์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝ”๋“œ ์ค‘๋ณต์€ ์ตœ์†Œํ™”ํ•˜๋ผ.

  • ์ฝ”๋”ฉ ๊ทœ์น™์„ ๋”ฐ๋ผ ์ž‘์„ฑํ•œ๋‹ค.

  • awt Graphics context๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ๋„ํ˜•์˜ ์ƒ‰์€ graphics context์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (setColor)

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์™ธ๋ถ€์˜ ์ž์›์„ ํ™œ์šฉํ•  ๊ฒฝ์šฐ, ์ž์› ํ™œ์šฉ ํ›„ ํ™œ์šฉ ์ „ ์„ค์ •์„ ์ตœ๋Œ€ํ•œ ๋ณต์›ํ•ด ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋”ฐ๋ผ์„œ, graphics context์˜ ์ƒ‰ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ๊ธฐ์กด ์ƒ‰์„ ์ €์žฅํ•˜์˜€๋‹ค ๋ณต์›์— ์‚ฌ์šฉํ•œ๋‹ค.

Test Code

  • Exam_2_1_1.java์™€ Exam_2_1_2.java ์ฐธ์กฐ

  • DummyGraphics์— Rect ๊ด€๋ จ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.(test code ์ฐธ์กฐ)



Exam-22. World์—์„œ Box class๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ํ•˜๋ผ

World์—๋Š” Ball๋งŒ ์ถ”๊ฐ€๋˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. World์— Box๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•ด ๋ณด์ž.

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ฒซ ๋ฒˆ์งธ, Box class๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๋“ค์„ ์ถ”๊ฐ€ํ•ด ๋ณด์ž.

์‹คํ–‰ ๊ฒฐ๊ณผ

figure33
Figure 33. Box World
  • Box ์ถ”๊ฐ€์— ๋ฌธ์ œ๋Š” ์—†๋‚˜?

  • Data type๋งŒ ๋‹ค๋ฅผ ๋ฟ ๋™์ผํ•œ ์ž‘์—…์€ ๋ฌธ์ œ์—†๋‚˜?

  • ์ƒˆ๋กœ์šด ์ข…๋ฅ˜๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด?


box๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ด€๋ จ๋œ ํ•จ์ˆ˜๋“ค์„ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ด ์•„๋‹ ์ˆ˜ ์—†๋‹ค.

์ด๋Š” World class๊ฐ€ ํ™•์žฅ์„ฑ์„ ์ „ํ˜€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ๋ชปํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ ์ค€๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ Ball class์™€ Box class์˜ ์ƒ์œ„ class์ธ Object class๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.


Exam-23. World class์˜ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ Obect class๋กœ ๋‹จ์ผํ™”์‹œ์ผœ ๊ด€๋ฆฌํ† ๋ก ๋ฐ”๊ฟ” ๋ณด์ž

์‹คํ–‰ ๊ฒฐ๊ณผ
figure34
Figure 34. exam_6_1_3_1
๋ฌผ์Œ
  • ์ƒˆ๋กœ์šด ์ข…๋ฅ˜ ์ถ”๊ฐ€์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๊ฐ€?

  • paint์—์„œ Object class์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฐ€?


๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹ ๋ชจ๋‘ ์ข‹์•„ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ  ๋‚˜๋จธ์ง€ ์ถ”๊ฐ€ ์ž‘์—…์ด ์—†๋‹ค๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ, World class๋ฅผ ํ™•์žฅํ•ด์„œ ์ •์˜ํ•œ MovableWorld, BoundedWorld๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜?

World class์—์„œ ํ–ˆ๋˜ ์ž‘์—…์„ ๋™์ผํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•ด์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ์€ ์•Š์€ ๋“ฏํ•˜๋‹ค.

7. ๋ณต์žกํ•œ ์„ธ์ƒ์„ ์กฐ๊ธˆ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ

Keyword

  • Interface

  • Subclassing

  • Subtyping

๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด Box class๊ฐ€ ์ถ”๊ฐ€๋œ World class๋ฅผ ๋‹ค์‹œ ๋ณด์ž.

World class ๋‚ด์—์„œ ball๊ณผ box๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•  ๊ณณ์€ ์–ด๋””์ธ๊ฐ€?

์ด๊ฒƒ๋งŒ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„๊นŒ?

7-1. Regionable ์ธํ„ฐํŽ˜์ด์Šค

World class๋Š” ์ถœ๋ ฅ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ๋ชจ๋‘ ์ผ์ •ํ•œ ์˜์—ญ์„ ๊ฐ–๋Š”๋‹ค. ์•ž์„œ ์ •์˜ํ•œ ball์ด๋‚˜ box์—์„œ๋„ getRegion ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์˜์—ญ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋Ÿฌํ•œ ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ๋“ค์ด ์ œ๊ณต๋˜๋Š” type์„ ์ •์˜ํ•œ๋‹ค.

7-1-1. ์ •์˜

  • ์˜์—ญ์„ ๊ฐ€์ง€๋Š” type

Method
  • Rectangle getRegion()

    • ์˜์—ญ ๊ฐ€์ ธ์˜ค๊ธฐ


Exam-24. Regionable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ , World class์—๋Š” Regionable ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ›์•„์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•˜๋ผ

๋ฌผ์Œ
  • ์–ด๋– ํ•œ ๋ฌธ์ œ์ ์ด ์žˆ๋Š”๊ฐ€?

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€? Regionable์— ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜ ์ถ”๊ฐ€?


7-2. Paintable ์ธํ„ฐํŽ˜์ด์Šค

World class๋Š” ๋„ํ˜•์„ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ์ž‘์—…์„ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ paint ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ๋ฉด ์–ด๋– ํ•œ ์ข…๋ฅ˜๋“  ์ƒ๊ด€์ด ์—†๋‹ค.

7-2-1. ์ •์˜

  • ๊ทธ๋ฆฌ๊ธฐ ์ง€์›

Method
  • void paint(Graphics g)

    • ๊ทธ๋ฆฌ๊ธฐ


Exam-25. Paintable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ , World class์—๋Š” Paintable ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ›์•„์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•˜๋ผ

๋ฌผ์Œ
  • [Exam-24]์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์—ˆ๋‚˜?


Exam-26. Ball class์™€ Box class๋ฅผ World class์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•˜๋ผ

  • class๊ฐ€ ์ˆ˜์ •๋˜์—ˆ๋‹ค๋ฉด ์•ž์„œ ๋งŒ๋“ค์–ด ๋‘” SingleBallWorldTest๋ฅผ ์ด์šฉํ•ด ๋™์ž‘์„ ํ™•์ธํ•ด ๋ณด์ž.

  • MultiBallWorldTest์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํ™•์ธ์„ ์œ„ํ•ด getBall ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด Ball์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ˆ˜์ •ํ•ด ๋ณด๋„๋ก ํ•œ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ
figure35
Figure 35. Exam-26

7-3. Movable ์ธํ„ฐํŽ˜์ด์Šค

7-3-1. ์ •์˜

  • MovableBall, MovableBox ๊ทธ๋ฆฌ๊ณ  MovableWorld? Movable!

  • MovableWorld์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์€ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ด๋™์— ํ•„์š”ํ•œ ํ•จ์ˆ˜ ์ง€์› ์—ฌ๋ถ€

Method
  • void setMotion(Motion motion)

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ์ด๋™๋Ÿ‰์„ ์„ค์ •

  • Motion getMotion()

    • ์„ค์ •๋˜์–ด ์žˆ๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ์ด๋™๋Ÿ‰

  • void move()

    • ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ์ด๋™๋Ÿ‰๋งŒํผ ์ด๋™ํ•˜๊ธฐ

  • void moveTo(int x, int y)

    • ํŠน์ • ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ธฐ


Exam-27. MovableBall๊ณผ MovableWorld๋„ Movable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ผ

๋ฌผ์Œ
  • ๊ธฐ์กด ์ฝ”๋“œ์—์„œ ๋งŽ์€ ๋ถ€๋ถ„์„ ๋ฐ”๊ฟ”์•ผ ํ•˜๋‚˜?


7-3. Bounded ์ธํ„ฐํŽ˜์ด์Šค

7-3-1 ์ •์˜

  • BoundedBall, BoundedBox ๊ทธ๋ฆฌ๊ณ  BoundedWorld?? Bounded!

Method
  • Rectangle getBounds()

    • ๊ฒฝ๊ณ„ ์ •๋ณด

  • void setBounds(Rectangle bounds)

    • ๊ฒฝ๊ณ„ ์ •๋ณด ์„ค์ •

  • boolean isOutOfBounds(Rectangle bounds)

    • ์ด๋™ ํ›„ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธ

  • void bounce()

  • ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด ๊ฒฝ์šฐ ๋ฒฝ์—์„œ ํŠ•๊น€


Exam-28. BoundedBall๊ณผ BoundedWorld๋„ Bounded ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ผ


8. ๊ฑฐ๊พธ๋กœ ์„ธ์ƒ

Keyword

  • Model, View

8-1. ํ™”๋ฉด์ƒ์˜ ์ขŒํ‘œ

์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ ์ขŒํ‘œ์™€ ์‚ฌ๋žŒ๋“ค์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ์ขŒํ‘œ๊ณ„์™€๋Š” ๋‹ค๋ฅด๋‹ค.

figure35
Figure 36. ์ขŒํ‘œ๊ณ„

8-1-1. ์ขŒํ‘œ ๋ณ€ํ™˜

Method
  • void rotate(Axis axis, int angle)

    • ํšŒ์ „

  • void translate(int dx, int dy)

    • ์ด๋™

  • void scale(int ratio)

    • ํฌ๊ธฐ ์กฐ์ •


Exam-29. World class์— ํšŒ์ „ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด์ž

  • ํšŒ์ „ ๋ฐฉํ–ฅ์€ ์˜ค๋ธŒ์ ํŠธ ๋‹จ์œ„๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • setRotation

  • X์ถ• ๋˜๋Š” Y์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ํšŒ์ „ํ•œ๋‹ค.

    • ํšŒ์ „ํ•  ์ถ•์€ enum์œผ๋กœ ์„ ์–ธํ•œ๋‹ค.

    • AXIS_X, AXIS_Y



Exam-30. World class์— ์ด๋™ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด์ž

  • ์ด๋™๋Ÿ‰์„ ๋ฏธ๋ฆฌ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค(setTranslation, translate)

  • X์ถ•, Y์ถ• ๋˜๋Š” ์–‘ ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ์ด๋™ํ•œ๋‹ค.(translate)



Exam-31. World class์— ํ™•๋Œ€/์ถ•์†Œ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด์ž

  • ํฌ๊ธฐ ์กฐ์ • ๋น„์œจ์„ ๋ฏธ๋ฆฌ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.(setScale, scale)

  • ๊ณต๊ฐ„ ํฌ๊ธฐ๋ฅผ ํ™•๋Œ€ ๋˜๋Š” ์ถ•์†Œํ•œ๋‹ค(scale)


๋„ํ˜• ๊ทธ๋ฆฌ๊ธฐ

  • ๋‹จ์ˆœํžˆ ํ•˜๋‚˜์˜ ์ ์— ๋Œ€ํ•œ ์ขŒํ‘œ ๋ณ€ํ™˜์€ X์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ํšŒ์ „์‹œํ‚จ ํ›„ Y์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•˜๋ฉด ๋œ๋‹ค.

  • ๋„ํ˜•์˜ ๊ฒฝ์šฐ, ๊ธฐ์ค€์  ๋ณ€๊ฒฝ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ, ๊ทธ๋ ค์ง€๋Š” ๋„ํ˜•์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ๊ทธ๋ ค์ง€๋Š”์ง€, ์•„๋ž˜์—์„œ ์œ„๋กœ ๊ทธ๋ ค์ง€๋Š”์ง€์— ๋”ฐ๋ผ ๋„ํ˜•์˜ ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ธฐ์ค€์ ์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๋„ํ˜•์„ ๊ทธ๋ฆฌ๋Š” ๋ฐฉํ–ฅ์ด ์œ„์—์„œ ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๊ฐ€ ๋œ๋‹ค.

  • ๋„ํ˜•์€ ํšŒ์ „๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ„์น˜ ์ด๋™๋„ ํ•„์š”ํ•˜๋‹ค.


Exam-32. ๋„ํ˜• ๊ทธ๋ฆด ๋•Œ ์ขŒํ‘œ์˜ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค. Ball, box ๋“ฑ์—์„œ ๋„ํ˜•์„ ๊ทธ๋ฆด ๋•Œ ์ขŒํ‘œ๊ฐ€ ๋ณ€ํ™˜๋œ ๋„ํ˜•์„ ๊ทธ๋ฆฌ๋„๋ก ์ˆ˜์ •ํ•ด ๋ณด์ž

  • ๋„ํ˜•์€ ํ™”๋ฉด์ƒ์—์„œ ์ขŒ์ธก ์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค. ์ขŒํ‘œ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉด, ์šฐ์ธก ์•„๋ž˜๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๊ธฐ์ค€์ ์„ ๋ณ€๊ฒฝํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.


9. ์™ธ๋ถ€ ์˜ํ–ฅ

Keyword

  • Acceleration

  • Vector Operation

๋ฌผ์ฒด์˜ ์›€์ง์ž„์„ ๋ณ€ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์€ ์™ธ๋ถ€ ์˜ํ–ฅ์ด๋‹ค. ์•ž์„œ ์ •์˜ํ•œ ๋ฒฝ์— ๋ถ€๋”ชํž ๊ฒฝ์šฐ ๋ฌผ์ฒด์˜ ์ง„ํ–‰ ๋ฐฉํ–ฅ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ ๋˜ํ•œ ์™ธ๋ถ€ ์˜ํ–ฅ์ด๋ฉฐ, ๊ฒŒ์ž„ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌผ์ฒด์˜ ์›€์ง์ž„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์š”์†Œ๋“ค์˜ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋Œ€ํฌ๊ฒŒ์ž„์€ ๋Œ€ํฌ๋ฅผ ์˜์•„ ์ƒ๋Œ€๋ฐฉ ๋ชฉํ‘œ๋ฌผ์„ ๋งžํžˆ๋Š” ๊ฒƒ์ด๋‹ค. ์‹ค์ œ ํ™˜๊ฒฝ์— ๋Œ€ํฌ์— ์˜ํ•ด ๋ฐœ์‚ฌ๋œ ํฌํƒ„์€ ๋ฐ”๋žŒ, ์ค‘๋ ฅ, ๊ณต๊ธฐ ์ €ํ•ญ ๋“ฑ ๋‹ค์–‘ํ•œ ์š”์†Œ๋“ค์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

์ด์— ๋”ฐ๋ผ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“œ๋Š” ๊ฒŒ์ž„์—์„œ๋Š” ์ค‘๋ ฅ๊ณผ ๋ฐ”๋žŒ์˜ ์˜ํ–ฅ์„ ๋„ฃ์–ด ๋ณด๋„๋ก ํ•œ๋‹ค.

์ด๋“ค์€ ํŠน์ • ๊ฐ’์œผ๋กœ ์„ค์ •๋˜๊ธฐ๋ณด๋‹ค๋Š” ํฌํƒ„์ด ๋‚ ์•„๊ฐ€๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„ ๋™์•ˆ ์ผ์ •๋Ÿ‰์˜ ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋  ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋™์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์™ธ๋ถ€ ํšจ๊ณผ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

9-1. ์™ธ๋ถ€ ํšจ๊ณผ

์™ธ๋ถ€ ํšจ๊ณผ๋Š” world ๋‚ด์—์„œ ๋ฌผ์ฒด์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋งŒ, ๋ณ€ํ™”๋Ÿ‰๊ณผ ๊ฐ™์ด ๊ณ ์ •๋˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€๋˜๋Š” ์„ฑ์งˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๊ธฐ์กด์˜ ๋ณ€ํ™”๋Ÿ‰์€ ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ๋ณ€ํ™”๋Ÿ‰๊ณผ ๊ฐ™์ด ์ง€์†ํ•ด ๊ฐ™์€ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ๋ณด๋‹ค๋Š” ๋ฌผ์ฒด๊ฐ€ ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€์ ์ธ ์˜ํ–ฅ์„ ์คŒ์œผ๋กœ์จ ๋ฌผ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ๋ณ€ํ™”๋Ÿ‰์˜ ๋ณ€ํ™”๋ฅผ ์ค€๋‹ค.

์™ธ๋ถ€ ํšจ๊ณผ๋„ ๋ฌผ์ฒด์˜ ์ด๋™๊ณผ ๊ด€๊ณ„๋˜๋ฏ€๋กœ Motion์„ ์ด์šฉํ•ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ 

  • ์†๋„ \begin{align*} v = {dx \over dt} \end{align*}

    • ๋ฌผ์ฒด์˜ ์†๋„์™€ ์šด๋™ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฌผ์ฒด์˜ ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ์œ„์น˜ ๋ณ€ํ™”๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

    • ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฌผ์ฒด์˜ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.

  • ๊ฐ€์†๋„

stem \begin{align*} a={dv \over dt} \end{align*}

  • ์†๋„์˜ ๋ณ€ํ™”๋กœ์จ ๋ฌผ์ฒด์˜ ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ์†๋„ ๋ณ€ํ™”๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  • ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฌผ์ฒด์˜ ์†๋„๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.

9-2. MovableWorld class

ball์ด๋‚˜ box๊ฐ€ ์›€์ง์ผ ๋•Œ, ์™ธ๋ถ€ ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Movable ์ธํ„ฐํŽ˜์ด์Šค์— ์™ธ๋ถ€ ํšจ๊ณผ๋ฅผ ์ฃผ๋ฉด์„œ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ฐ๊ฐ์˜ class์—์„œ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

MovableWorld์—๋Š” ์™ธ๋ถ€ ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„๋“œ์™€ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

9-2-1. ์ˆ˜์ •

๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

Method

  • ์™ธ๋ถ€ ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.(addEffect)

    • ์™ธ๋ถ€ ํšจ๊ณผ๋Š” 0๊ฐœ ์ด์ƒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ์ถ”๊ฐ€๋œ ์™ธ๋ถ€ ํšจ๊ณผ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค(getEffectCount)

  • ์™ธ๋ถ€ ํšจ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค(getEffect)

  • ์™ธ๋ถ€ ํšจ๊ณผ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค(removeEffect)


Exam-33. MovableWorld์—์„œ ํ•˜๋‚˜์˜ ball์„ ์ƒ์„ฑํ•˜์—ฌ, ball์ด ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค ์™ธ๋ถ€ ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด์ž

MovableWorld์— ์ถ”๊ฐ€๋œ ํ•จ์ˆ˜๋“ค์„ ๊ตฌํ˜„ํ•œ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ

Exam-34. MovableWorld์— ์™ธ๋ถ€ ์˜ํ–ฅ์œผ๋กœ ์ค‘๋ ฅ์„ ์ถ”๊ฐ€ํ•ด ๋ณด์ž

  • ์ค‘๋ ฅ ๊ฐ€์†๋„(\(g\))๋Š” \(a=-9.8 {m \over {s^2}}\) ๋กœ ๋ณ€ํ™”๋Ÿ‰ ๊ณ„์‚ฐ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณต์žกํ•˜๋‹ค.

  • ์—ฌ๊ธฐ์„œ, ์ด๋ฅผ ๋‹จ์ˆœํ™”์‹œ์ผœ์„œ ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ์ผ์ •ํ•œ ๋ณ€ํ™”๋Ÿ‰์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ •๋ฆฌํ•œ๋‹ค. ๋‹ค๋งŒ, ๋ฐฉํ–ฅ์—๋Š” ์ฃผ์˜ํ•˜์ž.

    • \(g\) ๋Š” Y์ถ•์˜ ์Œ์ˆ˜ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€ํ•ด์ง€๋Š” ๋ณ€ํ™”๋Ÿ‰์ด๋‹ค.

figure36
Figure 37. ์ค‘๋ ฅ๊ฐ€์†๋„


Exam-35. MovableWorld์— ์™ธ๋ถ€ ์˜ํ–ฅ์œผ๋กœ ๋ฐ”๋žŒ์„ ์ถ”๊ฐ€ํ•ด ๋ณด์ž

  • ์ค‘๋ ฅ์€ ์ผ์ •ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ผ์ •ํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค.

  • ๋ฐ”๋žŒ์€ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

figure37
Figure 38. ์ค‘๋ ฅ๊ฐ€์†๋„

Movable ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ๊ฒŒ์ž„์ƒ์—์„œ ์›€์ง์ด๋Š” ๋ฌผ์ฒด๋“ค์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋‹ค. MovableWorld์—์„œ ๋“ฑ๋ก๋œ ์˜ค๋ธŒ์ ํŠธ ์ค‘ Movable type์˜ ์˜ค๋ธŒ์ ํŠธ๋“ค๋งŒ ์ฐพ์•„์„œ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋™์‹œ์ผฐ์ง€๋งŒ, Thread๋ฅผ ์ ์šฉํ•˜๋ฉด Movable type ์Šค์Šค๋กœ ์›€์ง์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋จผ์ €, Thread์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ๊ณ„์† ์ง„ํ–‰ํ•˜์ž

10. ์Šค์Šค๋กœ ์›€์ง์ด๋Š” ๋ฌผ์ฒด

Keyword

  • Thread

  • Synchronization

Thread๋ฅผ ํ•™์Šตํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋Œ€๋ถ€๋ถ„์ด ํ•˜๋‚˜์˜ thread์—์„œ ๋™์ž‘ํ•˜์˜€๋‹ค. (์ •ํ™•ํžˆ ๋งํ•ด์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์ง€๋งŒ, ์ตœ์†Œํ•œ ์—ฌ๋Ÿฌ๋ถ„์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ๊ทธ๋Ÿฌํ•˜๋‹ค)

์ด์ œ๋Š” thread์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•˜๊ณ  ์—ฐ์Šตํ•˜์˜€์œผ๋ฏ€๋กœ ๊ฒŒ์ž„์— ์ ์šฉํ•ด ๋ณด๋„๋ก ํ•˜์ž.

10-1. Movable ์ธํ„ฐํŽ˜์ด์Šค

Thread์— ๋Œ€ํ•ด ์ดํ•ดํ•˜์˜€๋‹ค๋ฉด, Movable์„ Thread ์ ์šฉ์ด ๊ฐ€๋Šฅํ•œ Runnable ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ™•์žฅ์œผ๋กœ ์ •์˜ํ•œ๋‹ค.

Movable์€ ์Šค์Šค๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” type์œผ๋กœ์„œ, ์ด์— ํ•„์š”ํ•œ ํ•จ์ˆ˜ ์ถ”๊ฐ€๊ฐ€ ์š”๊ตฌ๋œ๋‹ค.

10-1-1. ์ •์˜

Method
  • int getDT()

    • ๋‹จ์œ„ ์‹œ๊ฐ„์„ ๋Œ๋ ค ์ค€๋‹ค.

  • void setDT(int dt)

    • ๋‹จ์œ„ ์‹œ๊ฐ„์„ ์„ค์ •ํ•œ๋‹ค.

  • void start()

    • ์›€์ง์ž„ ์‹œ์ž‘ํ•œ๋‹ค

  • void stop()

    • ์›€์ง์ž„ ๋ฉˆ์ถ˜๋‹ค


Exam-36. Movable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ Runnable ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ™•์žฅ์œผ๋กœ ์ •์˜ํ•˜๊ณ , MovableBall, MovableBox ๋“ฑ์„ thread๋กœ ๋™์ž‘ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๋ผ

  • ๊ตฌํ˜„ class๋Š” ๋ณ„๋„์˜ Thread ์ธ์Šคํ„ด์Šค์˜ ๋„์›€์„ ๋ฐ›์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค.

์ฃผ์˜

  • paint ํ•จ์ˆ˜๊ฐ€ ์–ด๋Š thread์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ผ.

  • ๋™์ผํ•œ ์ž์›์— ๋Œ€ํ•ด ๋‘ ๊ฐœ ์ด์ƒ์˜ thread๊ฐ€ ๋™์‹œ ์ ‘๊ทผ ์‹œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

    • Thread ํ•™์Šต์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์œผ๋กœ ๋Œ€์ฒ˜ํ•˜๋ผ


10-2. MovableWorld class

MovableWorld์—์„œ๋Š” ์ผ์ •ํ•œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์˜€๋‹ค.

์˜ค๋ธŒ์ ํŠธ๋ฅผ Runnable type์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ๊ฒฝ์šฐ, ์˜ค๋ธŒ์ ํŠธ ์ด๋™์„ ์œ„ํ•œ ์ž‘์—…์€ ํ•„์š” ์—†๊ฒŒ ๋˜๊ณ  ์ „์ฒด์ ์ธ ๋™์ž‘์˜ ์‹œ์ž‘๊ณผ ๋ฉˆ์ถค๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

๋˜ํ•œ, MovableWorld์—์„œ๋งŒ์˜ ๊ด€๋ฆฌ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, MovableWorld๋„ thread๋ฅผ ์ด์šฉํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

10-2-1. ์ˆ˜์ •

  • Thread์— ์˜ํ•ด ๊ฐœ๋ณ„ ๋™์ž‘ํ•  ๊ฒƒ์€ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

Variable
  • Thread ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ thread ์ถ”๊ฐ€ํ•œ๋‹ค.

Method
  • Thread๋ฅผ ์ด์šฉํ•ด ๊ตฌ๋™ํ•  ๊ฒƒ์œผ๋กœ run์„ ์ œ๊ฑฐํ•˜๊ณ ,

  • Thread ๊ตฌ๋™์„ ์œ„ํ•œ main ํ•จ์ˆ˜ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • Thread ์‹œ์ž‘๊ณผ ๋ฉˆ์ถค์„ ์ถ”๊ฐ€ํ•œ๋‹ค(start/stop)


Exam-37. MovableWorld๋ฅผ thread๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•˜๋ผ

๋ฌผ์Œ
  • ์ด์ „๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•˜๋‚˜?

  • ์˜ค๋ธŒ์ ํŠธ๋Š” ๋™์ž‘ ์ค‘์— ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค.

    • ์ž์› ๋™์‹œ ์ ‘๊ทผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

10-2. ์ถฉ๋Œ ๊ฐ์ง€ ๋ฐ ํŠ•๊ธฐ๊ธฐ

์•ž์„œ์„œ๋Š” BoundedWorld์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด๋™์‹œํ‚ค๊ณ , ์ถฉ๋Œ ๊ฐ์ง€ ๋ฐ ๊ทธ์— ๋”ฐ๋ฅธ ํŠ•๊ธฐ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. Movable ๊ฐœ์ฒด์— ๋Œ€ํ•ด thread๋ฅผ ์ ์šฉํ•˜์—ฌ ์Šค์Šค๋กœ ์›€์ง์ž„์„ ๊ตฌํ˜„ํ•œ ํ›„ ๋” ์ด์ƒ BoundedWorld์—์„œ ๊ฐœ๋ณ„ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ถฉ๋Œ ๊ฒ€์ถœ ๋ฐ ํŠ•๊ธฐ๊ธฐ ๊ตฌํ˜„์ด ์–ด๋ ค์›Œ์กŒ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

BoundedWorld์˜ ๊ธฐ๋ณธ ์—ญํ• ์€ ์œ ์ง€ํ•˜์ง€๋งŒ, ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ์ฃผ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์กฐ์ •ํ•ด ๋ณด์ž.

BoundedWorld์—์„œ ์ด๋™๊ณผ ์ถฉ๋™ ๊ฒ€์ถœ์„ ํ•จ๊ป˜ ํ•  ๊ฒฝ์šฐ, ์ด๋™ ํ›„ ์‹œ์ ์— ๋Œ€ํ•ด์„œ ์Šค์Šค๋กœ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐœ๋ณ„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์Šค์Šค๋กœ ์›€์ง์ผ ๊ฒฝ์šฐ ํ•ด๋‹น ์‹œ์ ์„ ์•Œ ์ˆ˜ ์—†๋‹ค.

์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ?

๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์›€์ง์ด๋Š” ์ฃผ์ฒด๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.

  • ๊ฒฝ๊ณ„ ์˜์—ญ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์˜ค๋ธŒ์ ํŠธ ๊ฐ„ ์ถฉ๋Œ ํ™•์ธ์„ ์œ„ํ•ด์„œ๋Š” World์˜ ์˜ค๋ธŒ์ ํŠธ ๋ชฉ๋ก์ด ํ•„์š”ํ•˜๋‹ค.

    • ์˜ค๋ธŒ์ ํŠธ ๋“ฑ๋ก ์‹œ ๋ชฉ๋ก์„ ๋ฐ›๊ณ , ์‹ ๊ทœ ๋“ฑ๋ก ์‹œ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜

    • ๋งค๋ฒˆ World์— ์š”์ฒญํ•˜๊ฑฐ๋‚˜


Exam-38. ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ด๋™ ํ›„ World๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ๋ฐ›์•„ ์ถฉ๋Œ ๊ฐ์ง€ ๋ฐ ํŠ•๊น€ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๋ผ

  • World์— ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, ์˜ค๋ธŒ์ ํŠธ์— world๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ์˜ค๋ธŒ์ ํŠธ๋Š” ์ด๋™ ํ›„ ์ถฉ๋Œ ํ™•์ธ world๋กœ๋ถ€ํ„ฐ ์žฅ์• ๋ฌผ(๊ฒฝ๊ณ„์˜์—ญ, ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์•„ ์ถฉ๋Œ ํ™•์ธํ•œ๋‹ค.

  • ์ถฉ๋Œ ๊ฒ€์ถœ ์‹œ ํŠ•๊ธฐ๋ฉด ์ฒ˜๋ฆฌํ•œ๋‹ค.


11. ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ

Keyword

  • GUI

11-1. ๊ฒŒ์ž„ ๊ตฌ์„ฑ ์š”์†Œ ๋งŒ๋“ค๊ธฐ

๊ฒŒ์ž„ ํ™”๋ฉด์—๋Š” ๋‹ค์–‘ํ•œ ๋ฌผ์ฒด๋“ค์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ํฌํƒ„์„ ๋ฐœ์‚ฌํ•˜๋Š” ํฌ, ํฌํƒ„์ด ํŠ•๊ฒจ์ ธ ๋‚˜์˜ค๋Š” ๋ฒฝ์ด๋‚˜ ๋ฌผ์ฒด, ํฌํƒ„์ด ๋ฐ•ํ˜€ ๋ฒ„๋ฆฌ๋Š” ๋Šช์ง€๋Œ€ ๊ทธ๋ฆฌ๊ณ  ํฌํƒ„์œผ๋กœ ๋งž์ถ”๋ฉด ์ ์ˆ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ ๋ฌผ์ฒด ๋“ฑ์ด ์žˆ๋‹ค.

11-1-1. ํฌ ๋งŒ๋“ค๊ธฐ

  • ํฌํƒ„์„ ๋ฐœ์‚ฌํ•˜๋Š” ๋ฌผ์ฒด๋กœ์„œ ํฌํƒ„์˜ ๊ฐ๋„, ์†๋„ ๋“ฑ์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํฌ์‹ ์˜ ๋์—์„œ ํฌํƒ„์ด ๋ฐœ์‚ฌ๋œ๋‹ค.

  • ํฌ์‹ ์€ ํ•œ์ชฝ์ด ๊ณ ์ •๋˜์–ด ์žˆ๊ณ , ๋‹ค๋ฅธ ํ•œ์ชฝ์€ ์›์„ ๊ทธ๋ฆฌ๋ฉฐ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํฌํƒ„์„ ๋งž์œผ๋ฉด ๊ฒŒ์ž„์€ ๋๋‚œ๋‹ค.

11-1-2. ๋Šช์ง€๋Œ€ ๋งŒ๋“ค๊ธฐ

  • ํฌํƒ„์€ ๋ฌผ์ฒด์— ๋ถ€๋”ชํž ๊ฒฝ์šฐ ํŠ•๊ธฐ์ง€๋งŒ ๋Šช์ง€๋Œ€์—์„œ๋Š” ํŠ•๊ธฐ์ง€ ์•Š๊ณ , ๋ฉˆ์ถฐ ๋ฒ„๋ฆฐ๋‹ค.

  • ํฌํƒ„์ด ๋Šช์ง€๋Œ€์— ๋น ์ง€๋ฉด ํ•ด๋‹น ๊ฒŒ์ž„์€ ๋ชฉํ‘œ๋ฌผ์„ ๋งžํžˆ์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค.

  • ๋Šช์ง€๋Œ€๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋ฐ”๋‹ฅ์— ์œ„์น˜ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

11-1-3. ๋ชฉํ‘œ๋ฌผ ๋งŒ๋“ค๊ธฐ

  • ํฌํƒ„์„ ๋งž์œผ๋ฉด ๊ฒŒ์ž„์ด ์Šน๋ฆฌ๋กœ ๋๋‚œ๋‹ค.

11-2. GameWorld class

11-2-1. ์ •์˜

  • ๊ฒŒ์ž„์ด ์‹คํ–‰๋˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ๋‹ค์šฉํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ๋‹ค.

    • ๋Œ€ํฌ

    • ์žฅ์• ๋ฌผ

    • ๋ชฉํ‘œ๋ฌผ

  • ๊ฒŒ์ž„ ์šด์˜์— ํ•„์š”ํ•œ ์ œ์–ด๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

    • ํฌํƒ„ ๋ฐœ์‚ฌ

    • ์ดˆ๊ธฐํ™”

  • ๊ฒŒ์ž„ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ๊ฑด(?)์„ ์™ธ๋ถ€๋กœ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ œ๊ณต

    • ํฌํƒ„ ๋ฐœ์‚ฌ ์ด๋ฒคํŠธ

      • ๋ชฉํ‘œ๋ฌผ ๋งžํžˆ๊ธฐ๊ฐ€ ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค์Œ ํฌํƒ„ ๋ฐœ์‚ฌ์™€ ๊ฐ™์ด UI๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๋ชฉํ‘œ๋ฌผ ๋งžํžˆ๊ธฐ ์„ฑ๊ณต

      • ์ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๋‹ค์Œ ์žฅ๋ฉด์„ ์ค€๋น„ํ•œ๋‹ค.

    • ๋ชฉํ‘œ๋ฌผ ๋งžํžˆ๊ธฐ ์‹คํŒจ

      • ์‹คํŒจ ํšŸ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•œ๋‹ค.

Variable
  • ๊ตฌ์„ฑ ์š”์†Œ ๋ชฉ๋ก

  • ๋ฐœ์‚ฌ ํšŸ์ˆ˜

  • ์„ฑ๊ณต ํšŸ์ˆ˜

  • ๊ฒŒ์ž„ ์ƒํƒœ

Method
  • ํฌํƒ„ ๋ฐœ์‚ฌ (fire)

  • ์ดˆ๊ธฐํ™” (init)

  • ํฌํƒ„ ๋ฐœ์‚ฌ ์ค€๋น„ ํ™•์ธ(isReady)

  • ํฌํƒ„ ๋ฐœ์‚ฌ ํšŸ์ˆ˜(getNumberOfFire)

  • ์„ฑ๊ณต ํšŸ์ˆ˜(getNumberOfHit)

11-3. Game class

  • ๊ฒŒ์ž„์„ ๊ตฌ์„ฑํ•  Frame

  • ๋‹ค์–‘ํ•œ component๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒŒ์ž„ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ

  • ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฒŒ์ž„ ํ™”๋ฉด์ด ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

11-3-1. ํ™”๋ฉด ๊ตฌ์„ฑํ•˜๊ธฐ

  • ๊ฒŒ์ž„ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค.

๋ฌธ์ œ. JFrame์„ ํ™•์žฅํ•˜์—ฌ Game Frame์„ ์ •์˜ํ•˜๊ณ , ๋‹ค์Œ์— ๋‚˜์—ด๋œ ๊ธฐ๋Šฅ ์ง€์›์„ ์œ„ํ•œ component๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐฐ์น˜ํ•œ๋‹ค

  • ๊ฒŒ์ž„ ํ™”๋ฉด์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ํฌํƒ„ ๋ฐœ์‚ฌ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ์™ธ๋ถ€ ํšจ๊ณผ์ธ ๋ฐ”๋žŒ ์„ธ๊ธฐ๋ฅผ ์œ„ํ•œ ์Šฌ๋ผ์ด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ์ ์ˆ˜ํŒ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

11-3-2. ์ œ์–ด ์—ฐ๊ฒฐ

  • ๊ตฌ์„ฑ๋œ ํ™”๋ฉด์—์„œ component๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋™์ž‘์„ ์ถ”๊ฐ€ํ•ด ๋ณด์ž.

12. ๋ฒฝ๋Œ ๊นจ๊ธฐ ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ

๊ณ ์ „์ ์ธ ๊ฒŒ์ž„ ์ค‘ ๋ฒฝ๋Œ ๊นจ๊ธฐ๊ฐ€ ์žˆ๋‹ค. ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฐœ์‚ฌํ•œ ๋ณผ์€ ๊ณต๊ฐ„์— ํŠ•๊ธฐ๋ฉด์„œ ๋Œ์•„๋‹ค๋‹ˆ๊ณ , ๊ณต๊ฐ„ ๋‚ด์— ์กด์žฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ง‰๋Œ€๋“ค์€ ํŠน์„ฑ์— ๋”ฐ๋ผ ๊นจ์ง€๊ฑฐ๋‚˜ ๋ฐ˜์‚ฌ๋งŒ ์‹œํ‚ค๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ํ–‰๋™์„ ์ทจํ•œ๋‹ค.

์•ž์„œ ๋งŒ๋“  ๋Œ€ํฌ ๊ฒŒ์ž„๊ณผ ๋‹ค๋ฅธ ๊ฒŒ์ž„์ด์ง€๋งŒ ๊ธฐ๋ณธ ๋™์ž‘์€ ๋™์ผํ•˜๋‹ค.