.
.
Core Java
Technologies Technical Tips
.
 
2005³â 3¿ù 30ÀÏ  


Core Java Technologies Tech Tips¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù. Java 2 Platform, Standard Edition (J2SE)¿¡ ±â¹ÝÇÑ core Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­´Â Java 2 Platform Standard Edition Development Kit 5.0(JDK 5.0)À» »ç¿ëÇÕ´Ï´Ù.
Download JDK 5.0

À̹ø È£¿¡¼­´Â,

-JOGL(Java APIs for OpenGL) ¼Ò°³
-enumerated typeÀÇ °ª¿¡ ±âÃÊÇÑ ºñÇìÀ̺ñ¾î º¯°æÇϱâ

À» ´Ù·ç°Ô µË´Ï´Ù.

ÀúÀÚ Daniel H. Steinberg

.

JOGL(Java APIs for OpenGL) ¼Ò°³

JOGL(Java APIs for Open GL)´Â ±× À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ OpenGL 3D graphics API¿¡ ¼³Á¤µÈ Java ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÌ´Ù. JOGLÀº Java·Î ÀÛ¼ºµÈ ¾ÖÇø®ÄÉÀ̼ǿ¡ Çϵå¿þ¾î Áö¿ø 3D ±×·¡ÇÈÀ» Á¦°øÇϱâ À§ÇØ ¸¸µé¾îÁ³´Ù. À̹ø Å×Å©ÆÁ¿¡¼­´Â JOGLÀ» ÀÌ¿ëÇÏ¿© ¾ÖÇø®ÄÉÀ̼ǿ¡ ±âº»ÀûÀÎ 2Â÷¿ø°ú 3Â÷¿ø ±×·¡ÇÈÀ» Æ÷ÇÔ½ÃŰ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¼³¸íÇÑ´Ù. JOGLÀº BSD(Berkeley Software Distribution) ¶óÀ̼¾½º ÇÏ¿¡ java.net¿¡¼­ ´Ù¿î·ÎµåÇÒ ¼ö ÀÖ´Ù. JOGLÀÌ Ç¥ÁØ OpenGL API Àü¹Ý¿¡ °ÉÃÄ °£´ÜÇÑ Java wrapper·Î µÇ¾îÀÖÀ¸¹Ç·Î À̹ø Å×Å©ÆÁÀÇ ¿¹Á¦¿¡¼­´Â OpenGL¿¡ ´ëÇÑ ±âº» Á¤º¸´Â ´Ù·çÁö ¾Ê°Ú´Ù.

JOGLÀ» ¼³Ä¡Çϱâ À§ÇØ, jogl documents and files ÆäÀÌÁö¿¡¼­JOGLÀÇ ¸¶Áö¸· ¹öÀüÀ» ´Ù¿î·Îµå ¹Þ±â ¹Ù¶õ´Ù. À̹ø Å×Å©ÆÁÀº November 19, 2004 1.1b07 ¸±¸®Áî ¹öÀü¿¡ ÀÇÇØ Å×½ºÆ®µÇ¾ú´Ù. µÎ ¼¼Æ®ÀÇ ÆÄÀϵéÀ» ´Ù¿î·ÎµåÇϰí ÀνºÅçÇØ¾ßÇϴµ¥, Chris AdamsonÀÌ ÀÛ¼ºÇÑ Jumping into JOGL ¾ÆÆ¼Å¬¿¡¼­ ¾î¶² ÆÄÀÏÀ» ´Ù¿î·ÎµåÇÏ°í ¾î¶»°Ô ¼³Ä¡ÇÏ´Â Áö¸¦ ¼³¸íÇϰí ÀÖ´Ù. ÀÌ ¶§, Ç÷§Æû ÁöÁ¤ ÆÄÀÏÀÌ jar ÆÄÀÏ¿¡ ÀÖÀ½À» ¸í½ÉÇϱ⠹ٶõ´Ù. JarÆÄÀÏÀ» Ãß°¡ÇÏ°í »ç¿ëÀÚÀÇ ·±Å¸ÀÓÀÌ Ã£À» ¼ö ÀÖ´Â µð·ºÅ丮¿¡ Ç÷§Æû ÁöÁ¤ ÆÄÀÏÀ» ³Ö¾î¾ßÇÒ °ÍÀÌ´Ù.

JOGLÀÇ ¼³Ä¡ ÈÄ¿¡´Â À̸¦ »ç¿ëÇÏ¿© ¾ÖÇø®ÄÉÀ̼ǿ¡ hardware-accelerated 3D ±×·¡ÇÈÀ» Á¦°øÇÒ ¼ö ÀÖ´Ù. ¿ì¼±, JOGLÀ» »ç¿ëÇÏ¿© °ËÀº»ö °ø°£ ¾È¿¡¼­ ȸÀüÇÏ´Â »¡°£»ö »ç°¢ÇüÀ» ¸¸µé¾îº¸ÀÚ. ¿¹Á¦ ÇÁ·Î±×·¥ JOGLRotatingSquareÀº À̹ø Å×Å©ÆÁÀÇ µÞºÎºÐ¿¡ ³ª¿Â´Ù. JOGLRotatingSquareÀÇ »ý¼ºÀÚ´Â ¾ÖÇø®ÄÉÀ̼ÇÀ» ¼³Á¤Çϱâ À§ÇÑ ´Ü°èµéÀÇ °³¿ä¸¦ Àâ´Â´Ù.

   JOGLRotatingSquare() {
     GLCanvas canvas = getGLCanvas();
     canvas.addGLEventListener(new RotatingSquareListener());
     Animator anim = new Animator(canvas);
     addCanvasToFrame(canvas);
     anim.start();
    }

ÀÌ ¿¹Á¦´Â getGLCanvas() ¸Þ¼Òµå¸¦ ÅëÇØ GLCanvas ŸÀÔÀÇ ¿ÀºêÁ§Æ®¸¦ ¾ò´Â °Í¿¡¼­ ½ÃÀÛÇÑ´Ù. ±× ÈÄ GLEventListener¸¦ »ý¼ºÇÏ¿© ¿ÀºêÁ§Æ®¿¡ ÷ºÎÇϰí, Àå¸éÀÇ ¾Ö´Ï¸ÞÀ̼ÇÀ» ÁÖ°üÇÏ´Â Animator¸¦ »ý¼ºÇϸç, ÇÁ·¹ÀÓ¿¡ GLCanvas ¿ÀºêÁ§Æ®¸¦ Ãß°¡ÇÑ´Ù. ¸¶Áö¸·À¸·Î, ¾Ö´Ï¸ÞÀ̼ÇÀ» ½ÃÀÛÇÏ°Ô µÈ´Ù.

getGLCanvas() ¸Þ¼Òµå´Â GLCapabilities ¿ÀºêÁ§Æ®¸¦ ÄÁÇDZԾÇÏ´Â °Í¿¡¼­ ½ÃÀÛÇÑ´Ù. ÀÌ ¶§ ÀÌ ¿ÀºêÁ§Æ®´Â ·£´õ¸µ ȯ°æÀÌ ¹Ýµå½Ã Áö¿øÇؾßÇÏ´Â OpenGL ¼º´ÉÀ» ÁöÁ¤ÇÑ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½Àº hardware-accelerated°¡ ·£´õ¸µ ȯ°æÀ» Áö¿ø Çϵµ·Ï ¿äûÇÏ´Â ¹æ¹ýÀÌ´Ù.

   GLCapabilities capabilities = new GLCapabilities();
   capabilities.setHardwareAccelerated(true);

±× ÈÄ ¸Þ¼Òµå´Â GLCapabilities ¿ÀºêÁ§Æ®¸¦ ÆÑÅ丮¿¡ Àü´ÞÇÏ¿© GLCanvas¸¦ ¾ò´Â´Ù. GLCanvas´Â GLDrawable ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϸç, ÀÌ ÀÎÅÍÆäÀ̽º´Â OpenGL ·£´õ¸µÀ» Áö¿øÇÑ´Ù. GLCanvas ¿ÀºêÁ§Æ®´Â Àå¸éÀ» ·£´õ¸µÇÏ´Â µ¥ »ç¿ëÇÑ´Ù.

   private GLCanvas getGLCanvas() {
     GLCapabilities capabilities = new GLCapabilities();
     return GLDrawableFactory.getFactory().
                           createGLCanvas(capabilities);
   }

GLEventListener´Â ´ëºÎºÐÀÇ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. JOGLRotatingSquare¿¡¼­´Â ¸®½º³Ê°¡ ÀÌ³Ê Å¬·¡½º·Î½á ±¸ÇöµÈ´Ù. ¸®½º³Ê´Â ¹Ýµå½Ã init(), display(), displayChanged(), reshape() ¸Þ¼Òµå¸¦ ±¸ÇöÇØ¾ß¸¸ ÇÑ´Ù.

init() ¸Þ¼Òµå´Â OpenGL ȯ°æÀÌ Ã³À½À¸·Î ÃʱâÈ­µÇ´Â Áï½Ã drawable¿¡ ÀÇÇØ È£ÃâµÈ´Ù. init()´Â »ç¿ëÀÚÀÇ ±âº» ȯ°æÀ» ¼³Á¤ÇÏ´Â °÷ÀÌ´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ´Â Áö¿ì´Â »ö°ú ±×¸± »öÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. JOGLRotatingSquare ¿¹Á¦¿¡¼­´Â ÀÌ µÎ »öÀ» ¸ðµÎ °ËÀº»öÀ¸·Î ÃʱâÈ­ÇØ³õ¾Ò´Ù.

    public void init(GLDrawable drawable) {
      GL gl = drawable.getGL();
      gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //erasing color
      gl.glColor3f(0.0f, 0.0f, 0.0f); // drawing color
    }

displayChanged() ¸Þ¼Òµå´Â µð½ºÇ÷¹ÀÌ ¸ðµå ¶Ç´Â µð½ºÇ÷¹ÀÌ µð¹ÙÀ̽º°¡ º¯°æµÉ ¶§ È£ÃâµÈ´Ù. JOGLRotatingSquare ¿¹Á¦¿¡¼­´Â displayChanged() ¸Þ¼ÒµåÀÇ º»¹®ÀÌ ºñ¾îÀÖ´Ù.

    public void displayChanged(GLDrawable drawable,
                               boolean modeChanged,
                               boolean deviceChanged) {
    }

reshape() ¸Þ¼Òµå´Â ÄÄÆ÷³ÍÆ®ÀÇ »çÀÌÁî°¡ º¯°æµÈ ÈÄ Ã³À½À¸·Î ´Ù½Ã »öÀ» ÀÔÈú ¶§ È£ÃâµÈ´Ù. ÀÌ´Â ÄÄÆ÷³ÍÆ®°¡ È­¸é»ó¿¡ óÀ½ ³ªÅ¸³¯ ¶§µµ ÇØ´çµÈ´Ù. JOGLRotatingSquare ¿¹Á¦¿¡¼­ reshape() ¸Þ¼Òµå´Â º¸ÀÏ ¼ö ÀÖ´Â ¿µ¿ªÀ» ¸ÂÃß°í, FrameÀÇ »çÀÌÁî°¡ º¯°æµÇ¾úÀ» ¶§ »ç°¢ÇüÀÇ Áß½ÉÀ» ´Ù½Ã Àâµµ·Ï GLCanvas¸¦ ¼³Á¤ÇÏ´Â µ¥ ÀÌ¿ëÇÑ´Ù.

   public class VarGreeter3 {
   public void reshape(GLDrawable drawable,
                        int x,
                        int y,
                        int width,
                        int height) {
      GL gl = drawable.getGL();
      gl.glViewport(0, 0, width, height);
      gl.glMatrixMode(GL.GL_PROJECTION);
      gl.glLoadIdentity();
      gl.glOrtho(-width, width, -height, height, -1, 1);
    }

display() ¸Þ¼Òµå°¡ OpenGL ·£´õ¸µÀ» ÃʱâÈ­Çϱâ À§ÇØ È£ÃâµÈ´Ù. ÀÌ´Â È­¸éÀ» ¾÷µ¥ÀÌÆ® ÇÒ ¶§µµ Animator ¿ÀºêÁ§Æ®¿¡ ÀÇÇØ È£ÃâµÇ´Â ¸Þ¼ÒµåÀ̱⵵ ÇÏ´Ù.

JOGLRotatingSquare ÇÁ·Î±×·¥¿¡¼­ display() ¸Þ¼Òµå´Â È­¸éÀ» ±ú²ýÀÌ Áö¿ì°í, »ç°¢ÇüÀ» ´Ù½Ã ±×¸®°í ÇöÀç¿Í °°Àº °¢µµ·Î ȸÀü½ÃŲ´Ù. ÀÌ´Â ½Ã°è ¹Ý´ë ¹æÇâÀ¸·Î À绡¸® ȸÀü½ÃŰ°ÔµÈ´Ù.

   public void display(GLDrawable drawable) {
      GL gl = drawable.getGL();
      gl.glClear(GL.GL_COLOR_BUFFER_BIT);
      drawRedCenteredSquare(gl);
      angle++;
      gl.glMatrixMode(GL.GL_MODELVIEW);
      gl.glLoadIdentity();
      gl.glRotatef(angle, 0, 0, 1);
    }

glRotatef() ¸Þ¼Òµå¿¡ ´ëÇÑ ¸Å°³º¯¼ö´Â °¢µµ¿Í ȸÀüÀÌ ÀÌ·ïÁö´Â ÃàÀ» ³ªÅ¸³»´Â ¼¼ °³ÀÇ ´Ù¸¥ Á¡ÀÌ´Ù. ÀÌ ¿¹Á¦¿¡¼­´Â, ȸÀüÀº zÃà¿¡ °üÇÑ °ÇÀÌ´Ù. ÀÌ´Â x-y Æò¸é¿¡¼­ÀÇ ½Ã°è ¹Ý´ë ¹æÇâ ȸÀü°ú °°Àº °ÍÀÌ´Ù.

´ÙÀ½Àº JOGLRotatingSquare¿¡ ´ëÇÑ Àüü ÄÚµå ¸®½ºÆ®ÀÌ´Ù.

   import net.java.games.jogl.GLCanvas;
   import net.java.games.jogl.GLCapabilities;
   import net.java.games.jogl.GLDrawableFactory;
   import net.java.games.jogl.Animator;
   import net.java.games.jogl.GL;
   import net.java.games.jogl.GLEventListener;
   import net.java.games.jogl.GLDrawable;
   
   import java.awt.Frame;
   import java.awt.event.WindowAdapter;
   import java.awt.event.WindowEvent;
   
   public class JOGLRotatingSquare {
   
     private static float angle = 0;
     private static final int SIZE = 160;
   
     JOGLRotatingSquare() {
       GLCanvas canvas = getGLCanvas();
       canvas.addGLEventListener(new RotatingSquareListener());
       Animator anim = new Animator(canvas);
       addCanvasToFrame(canvas, anim);
       anim.start();
     }
   
     private void addCanvasToFrame(
      GLCanvas canvas, final Animator anim) {
       Frame f = new Frame("JOGL Rotating Square");
       f.setSize(600, 400);
       f.add(canvas);
       f.setVisible(true);
       f.addWindowListener(new WindowAdapter() {
           public void windowClosing(WindowEvent e) {
             anim.stop();
             System.exit(0);
           }
         });
     }
   
     private GLCanvas getGLCanvas() {
       GLCapabilities capabilities = new GLCapabilities();
       return GLDrawableFactory.getFactory().
                             createGLCanvas(capabilities);
     }
 

     public static void main(String[] args) {
       new JOGLRotatingSquare();
     }
 
     private void drawRedCenteredSquare(GL gl) {
       gl.glColor3f(1, 0, 0);
       gl.glRecti(-SIZE / 2, -SIZE / 2, SIZE / 2, SIZE / 2);
       gl.glColor3f(0.0f, 0.0f, 0.0f);
     }
   
     class RotatingSquareListener implements GLEventListener {
   
       public void init(GLDrawable drawable) {
         GL gl = drawable.getGL();
         gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //erasing color
         gl.glColor3f(0.0f, 0.0f, 0.0f); // drawing color
       }
   
       public void display(GLDrawable drawable) {
         GL gl = drawable.getGL();
         gl.glClear(GL.GL_COLOR_BUFFER_BIT);
         drawRedCenteredSquare(gl);
         angle++;
         gl.glMatrixMode(GL.GL_MODELVIEW);
         gl.glLoadIdentity();
         gl.glRotatef(angle, 0, 0, 1);
       }
   
       public void reshape(GLDrawable drawable,
                           int x,
                           int y,
                           int width,
                           int height) {
         GL gl = drawable.getGL();
         gl.glViewport(0, 0, width, height);
         gl.glMatrixMode(GL.GL_PROJECTION);
         gl.glLoadIdentity();
         gl.glOrtho(-width, width, -height, height, -1, 1);
       }
   
       public void displayChanged(GLDrawable drawable,
                                  boolean modeChanged,
                                  boolean deviceChanged) {
       }
     }
   }

JOGLRotatingSquareÀ» ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÏÀÚ. °ËÀº»ö ¿µ¿ª ¾È¿¡¼­ µ¹°í ÀÖ´Â »¡°£ »öÀÇ »ç°¢ÇüÀÌ º¸ÀÌ°Ô µÉ °ÍÀÌ´Ù.

FrameÀÇ Å©±â¸¦ Ű¿ì¸é, »ç°¢ÇüÀÌ Áß°£ ÁöÁ¡À» ´Ù½Ã ã°í, õõÈ÷ ¾Ö´Ï¸ÞÀÌ¼Ç µÉ °ÍÀÌ´Ù display() ¸Þ¼ÒµåÀÇ ¸¶Áö¸· ¶óÀÎÀ» ´Ù¸§°ú °°ÀÌ º¯°æÇÏ¿© ´õ¿í õõÈ÷ ¾Ö´Ï¸ÞÀ̼ǵǵµ·Ï ¸¸µé ¼öµµ ÀÖ´Ù.

   gl.glRotatef(angle/16, 0, 0, 1);

16 ´ë½Å ´Ù¸¥ °ªÀ¸·Î ±¸ÇöÇÒ ¼öµµ ÀÖ´Ù.

drawRedCenteredSquare() ¸Þ¼Òµå´Â ƯÁ¤ ¸Þ¼ÒµåµéÀÇ ÁýÇÕ ³»ÀÇ ¸Þ¼Òµå Çϳª¸¦ ÀÌ¿ëÇÏ¿© Á÷»ç°¢ÇüÀ» ±×¸°´Ù. ù¹øÂ°·Î ÇöÀç »öÀÌ »¡°£»öÀ̶ó°í ÁöÁ¤Çϸç, ±× ÈÄ SIZE¿Í µ¿ÀÏÇÑ ±æÀÌÀÇ º¯À» °¡Áö´Â Á÷»ç°¢ÇüÀ» ¿øº»ÀÇ Áß¾Ó¿¡ ±×¸°´Ù. ¸¶Áö¸·À¸·Î ÇöÀç »öÀ» °ËÀº»öÀ¸·Î Àç¼³Á¤ÇÑ´Ù.

   private void drawRedCenteredSquare(GL gl) {
     gl.glColor3f(1, 0, 0);
     gl.glRecti(-SIZE / 2, -SIZE / 2, SIZE / 2, SIZE / 2);
     gl.glColor3f(0.0f, 0.0f, 0.0f);
   }

ÀÌ´Â »ç°¢ÇüÀÌ x-y Æò¸é¿¡ ±×·ÁÁö±â ¶§¹®¿¡ °¡´ÉÇÏ´Ù. ´Ù½Ã ¸»ÇØ, ÀÌ ¸Þ¼Òµå´Â 3Â÷¿øÀ» °í·ÁÇÏÁö ¾Ê´Â´Ù. Á÷»ç°¢ÇüÀ» ±×¸®´Â ¶Ç´Ù¸¥ ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.

   private static void drawRedCenteredSquare(GL gl) {
       gl.glColor3f(1, 0, 0);
       gl.glBegin(GL.GL_QUADS);
       gl.glTexCoord2f(0, 0);
       gl.glVertex3f(-SIZE / 2, SIZE / 2, 0);
       gl.glTexCoord2f(0, 1);
       gl.glVertex3f(-SIZE / 2, -SIZE / 2, 0);
       gl.glTexCoord2f(1, 1);
       gl.glVertex3f(SIZE / 2, -SIZE / 2, 0);
       gl.glTexCoord2f(1, 0);
       gl.glVertex3f(SIZE / 2, SIZE / 2, 0);
       gl.glEnd();
       gl.glColor3f(0.0f, 0.0f, 0.0f);
     }

¿©±â ÀÌ »ç°¢ÇüÀÇ ²ÀÁöÁ¡µéÀº Á¤È®È÷ ¼¼Æ®°¡ µÈ´Ù. ÀÌ ¹æ¹ýÀº ÀÌÀü ¹æ¹ýº¸´Ù Á» ÀåȲÇÑ ¸éÀÌ ÀÖÁö¸¸, 2Â÷¿ø¿¡¼­ 3Â÷¿øÀ¸·Î ³Ñ¾î°¡´Â ´ÙÀ½ÀÇ ¿¹Á¦¿¡¼­´Â À¯¿ëÇÒ °ÍÀÌ´Ù. 3Â÷¿øÀÇ °æ¿ìµµ 2Â÷¿øÀÇ °æ¿ì¿Í ¸¹ÀÌ ´Ù¸¥ °ÍÀº ¾ø´Ù. ù°·Î, reshape() ¸Þ¼ÒµåÀÇ ¸¶Áö¸· ¶óÀÎÀ» º¯°æÇÏ¿©zÃà¿¡¼­ º¸ÀÌ´Â ¿µ¿ªÀÌ Àüü Á¤À°¸éü¸¦ Æ÷ÇÔÇϵµ·Ï ´Ã¾î³ª°ÔÇÑ´Ù. ÀÌ ´Ü°è¸¦ »ý·«ÇÒ °æ¿ì, ´ÜÁö x-y ÃàÀÇ ÇÑ ´ÜÀ§ »ó¿¡ ÀÖ´Â Á¤À°¸éüÀÇ °¡·Î¸é ¹Û¿¡ º¼ ¼ö ¾øÀ» °ÍÀÌ´Ù. ´ÙÀ½Àº ¼öÁ¤µÈ ¶óÀÎÀÌ´Ù.

   gl.glOrtho(-width, width, -height, height, -SIZE, SIZE);

´ÙÀ½À¸·Î, Á¤À°¸éü¸¦ ±â¿ïÀ̱â À§ÇØ display() ¸Þ¼ÒµåÀÇ ¸¶Áö¸·À» º¯°æÇÏ¿© ²ÀÁöÁ¡ÀÌ Á¤¸éÀ» ÇâÇϵµ·Ï ÇÑ´Ù. ±× ÈÄ Á¤À°¸éü¸¦ ºñ½ºµëÈ÷ ȸÀü½ÃŲ´Ù. ´ÙÀ½Àº display() ¸Þ¼Òµå ¸¶Áö¸· ¶óÀÎÀ» º¯°æÇÑ °ÍÀÌ´Ù.

      gl.glRotatef(-80, 1, 1, 0);
      gl.glRotatef(angle /16, 1, -1, 1);
      drawCenteredCube(gl);

¸¶Áö¸·À¸·Î, À§¿¡¼­ ¹¦»çÇÑ »ç°¢ÇüÀ» ±×¸®´Â ¸Þ¼Òµå¸¦ º¯°æÇؾßÇÒ °ÍÀÌ´Ù. »õ·Î¿î ¸Þ¼Òµå·Î Á¤À°¸éü¿¡ °¡Àå °¡±î¿î ¸éÀÇ »ç°¢ÇüÀ» ±×¸°´Ù.

   private void drawSquareFace(GL gl) {
     gl.glBegin(GL.GL_QUADS);
     gl.glTexCoord2f(0, 0);
     gl.glVertex3f(-SIZE / 2, -SIZE / 2, SIZE / 2);
     gl.glTexCoord2f(0, 1);
     gl.glVertex3f(-SIZE / 2, SIZE / 2, SIZE / 2);
     gl.glTexCoord2f(1, 1);
     gl.glVertex3f(SIZE / 2, SIZE / 2, SIZE / 2);
     gl.glTexCoord2f(1, 0);
     gl.glVertex3f(SIZE / 2, -SIZE / 2, SIZE / 2);
     gl.glEnd();
   }

3Â÷¿ø ¹öÀü¿¡ Ãß°¡µÇ´Â °ÍÀº ´ÙÀ½ÀÇ drawCenteredCube()¸Þ¼ÒµåÀÌ´Ù. ÀÌ ¿¹Á¦¿¡¼­´Â ¼¼¸é¸¸ÀÌ º¸À̹ǷΠ½ÇÁ¦·Î´Â Á¤À°¸éüÀÇ ¼¼ ¸é¸¸À» ±×¸°´Ù.

  private void drawCenteredCube(GL gl) {
    gl.glColor4f(1, 0, 0, 0);
    drawSquareFace(gl);
    gl.glColor4f(1, 1, 0, 0);
    gl.glRotatef(90, 1, 0, 0);
    drawSquareFace(gl);
    gl.glColor4f(0, 0, 1, 0);
    gl.glRotatef(90, 0, 1, 0);
    drawSquareFace(gl);
    gl.glColor3f(0.0f, 0.0f, 0.0f);
  }

ù¹øÂ°·Î »¡°£»ö ÇѸéÀÌ ±×·ÁÁø´Ù. ±× ÈÄ 90µµ·Î ȸÀüµÈ´Ù. ³ë¶õ»öÀ¸·Î »öÀÌ º¯°æµÇ¾î µÎ¹øÂ° ¸éÀÌ ±×·ÁÁø´Ù. ¹Ý´ëÂÊÀ¸·Î 90µµ ȸÀüÇÏ¿© ¼¼ ¸éÀÌ ÇÑ Á¡¿¡¼­ ¸¸³¯ ¼ö ÀÖ°Ô ÇÑ´Ù. ÆÄ¶õ»öÀ¸·Î º¯°æµÇ¾î ¼¼¹øÂ° ¸éÀÌ ±×·ÁÁø´Ù.

´ÙÀ½Àº Àüü ÄÚµåÀÇ ¸®½ºÆ®ÀÌ´Ù.

   import net.java.games.jogl.GLCanvas;
   import net.java.games.jogl.GLCapabilities;
   import net.java.games.jogl.GLDrawableFactory;
   import net.java.games.jogl.Animator;
   import net.java.games.jogl.GL;
   import net.java.games.jogl.GLEventListener;
   import net.java.games.jogl.GLDrawable;
   
   import java.awt.Frame;
   import java.awt.event.WindowAdapter;
   import java.awt.event.WindowEvent;
   
   public class JOGLRotatingCube {
   
     private static final int SIZE = 160;
   
     private static float angle = 0;
   
     JOGLRotatingCube() {
       GLCanvas canvas = getGLCanvas();
       canvas.addGLEventListener(new RotatingCubeListener());
       Animator anim = new Animator(canvas);
       addCanvasToFrame(canvas, anim);
       anim.start();
     }
   
     private void addCanvasToFrame(
      GLCanvas canvas, final Animator anim) {
       Frame f = new Frame("JOGL Rotating Half - Cube");
       f.setSize(600, 400);
       f.add(canvas);
       f.setVisible(true);
       f.addWindowListener(new WindowAdapter() {
           public void windowClosing(WindowEvent e) {
             anim.stop();
             System.exit(0);
           }
         });
     }
   
     private GLCanvas getGLCanvas() {
       GLCapabilities capabilities = new GLCapabilities();
       return GLDrawableFactory.getFactory().
                             createGLCanvas(capabilities);
     }
   
     public static void main(String[] args) {
       new JOGLRotatingCube();
     }
   
   
     private void drawCenteredCube(GL gl) {
       gl.glColor4f(1, 0, 0, 0);
       drawSquareFace(gl);
       gl.glColor4f(1, 1, 0, 0);
       gl.glRotatef(90, 1, 0, 0);
       drawSquareFace(gl);
       gl.glColor4f(0, 0, 1, 0);
       gl.glRotatef(90, 0, 1, 0);
       drawSquareFace(gl);
       gl.glColor3f(0.0f, 0.0f, 0.0f);
     }
   
     private void drawSquareFace(GL gl) {
       gl.glBegin(GL.GL_QUADS);
       gl.glTexCoord2f(0, 0);
       gl.glVertex3f(-SIZE / 2, -SIZE / 2, SIZE / 2);
       gl.glTexCoord2f(0, 1);
       gl.glVertex3f(-SIZE / 2, SIZE / 2, SIZE / 2);
       gl.glTexCoord2f(1, 1);
       gl.glVertex3f(SIZE / 2, SIZE / 2, SIZE / 2);
       gl.glTexCoord2f(1, 0);
       gl.glVertex3f(SIZE / 2, -SIZE / 2, SIZE / 2);
       gl.glEnd();
     }
   
     class RotatingCubeListener implements GLEventListener {
   
       public void init(GLDrawable drawable) {
         GL gl = drawable.getGL();
         gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //erasing color
         gl.glColor3f(0.0f, 0.0f, 0.0f); // drawing color
       }
   
       public void display(GLDrawable drawable) {
         GL gl = drawable.getGL();
         gl.glClear(GL.GL_COLOR_BUFFER_BIT);
   
         angle++;
         gl.glMatrixMode(GL.GL_MODELVIEW);
         gl.glLoadIdentity();
         gl.glRotatef(-80, 1, 1, 0);
         gl.glRotatef(angle /16, 1, -1, 1);
         drawCenteredCube(gl);
       }
   
       public void reshape(GLDrawable drawable,
                           int x,
                           int y,
                           int width,
                           int height) {
         GL gl = drawable.getGL();
         gl.glViewport(0, 0, width, height);
         gl.glMatrixMode(GL.GL_PROJECTION);
         gl.glLoadIdentity();
         gl.glOrtho(-width, width, -height, height, -SIZE, SIZE);
       }
   
       public void displayChanged(GLDrawable drawable,
                                  boolean modeChanged,
                                  boolean deviceChanged) {
       }
     }
   }

JOGLRotatingCube¸¦ ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÑ´Ù. ¿©·¯»öÀ¸·Î ÀÌ·ç¾îÁø, ȸÀüµÇ´Â Á¤À°¸éü¸¦ º¸°Ô µÉ °ÍÀÌ´Ù.

ÀÌ ¿¹Á¦¿¡¼­ JOGLÀÇ ½ÃÀÛ¿¡¼­ ±¸µ¿±îÁö ¾ó¸¶³ª ª°Ô ÇÒ ¼ö ÀÖ´ÂÁö ¾Ë¾Æº¸¾Ò´Ù. ù¹øÂ° ¿¹Á¦¿¡¼­ GLCanvas¿¡ Á÷»ç°¢ÇüÀ» Ãß°¡ÇÏ¿© ¿òÁ÷ÀÏ ¼ö ÀÖ°Ô ÇÏ¿´´Ù. µÎ¹øÂ° ¿¹Á¦¿¡¼­, À̸¦ È®ÀåÇÏ¿© ¼¼ ¸éÀ» °¡Áø Á¤À°¸éü¸¦ »ý¼ºÇÏ°í °øÅëÀÇ ²ÀÁöÁ¡À¸·Î ȸÀü½ÃÄ×´Ù. »ç¿ëÀÚ°¡ Á÷Á¢ Á¤À°¸éüÀÇ ´Ù¸¥ ¸éµéÀ» Ãß°¡Çϰųª ´Ù¸¥ ¸ð¾çµéÀ» 2Â÷¿ø ¿¹Á¦¿¡ Ãß°¡½ÃÄѺ¸´Â µî ÀÌ ¿¹Á¦µéÀ» È®ÀåÇØº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

.
.

enumerated typeÀÇ °ª¿¡ ±âÃÊÇÑ ºñÇìÀ̺ñ¾î º¯°æÇϱâ

enumerated typeÀ» óÀ½À¸·Î »ç¿ëÇÒ ¶§´Â »ó¼ö¸¦ ´ëüÇÏ¿© »ç¿ëÇÏ´Â °Í Á¤µµ·Î »ý°¢Çϱ⠽±´Ù. ±×·¯³ª À̵éÀ» Ȱ¿ëÇÒ ¼ö ÀÖ´Â Èï¹Ì·Î¿î µ¥°¡ ¸¹ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î, enumerated typeÀÇ °ª¿¡ ±âÃÊÇÏ¿© Ŭ·¡½ºÀÇ ºñÇìÀ̺ñ¾î¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. À̹ø ÆÁ¿¡¼­´Â enumeration constant-specific ºñÇìºñ¾î¸¦ ¸ÚÁø ¹æ¹ýÀ¸·Î ±¸ÇöÇÏ´Â °Í¿¡ ´ëÇØ¼­ ¼³¸íÇϰíÀÚ ÇÑ´Ù.

¹Ì±¹ µ¿ÀüÀÇ ³×°¡Áö ±âº» ŸÀÔÀ» ³ªÅ¸³»´Â °£´ÜÇÑ enum ŸÀÔÀ» »ý¼ºÇÏ´Â °ÍÀ¸·Î ½ÃÀÛÇÏÀÚ.

   public enum Coin1 {
     PENNY,
     NICKEL,
     DIME,
     QUARTER;
   }

ÀÌÁ¦ enum °ªÀ» ¸Â¹Ù²Ü ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î Coin1 ŸÀÔÀÇ ¿ÀºêÁ§Æ®¸¦ ¹Þ¾ÆµéÀÌ´Â getValue() ¸Þ¼Òµå¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.

   static int getValue(Coin1 coin) {
     switch( coin ) {
       case PENNY: //do something
       // .. remaining cases
     }
   }

¶ÇÇÑ °­È­µÈ for¹®À» ÀÌ¿ëÇÏ¿© Coin1ÀÇ ´Ù¸¥ °ªµéÀ» ¹Ýº¹ÇÒ ¼ö ÀÖ´Ù.

    for (Coin1 coin: Coin1.values())

ÀÌ µÎ ±â¼úÀ» Coin1¿¡ ´ëÇÑ Å¬¶óÀÌ¾ðÆ®¿¡ µµÀÔÇØº¸ÀÚ.

   public class Dispenser1 {

     static int getValue(Coin1 coin){
       switch(coin) {
         case PENNY:return 1;
         case NICKEL:return 5;
         case DIME: return 10;
         case QUARTER: return 25;
         default: return 0;
       }
     }
     public static void main(String[] args) {
       for (Coin1 coin: Coin1.values())  {
         System.out.println("A " + coin + " has value = "
         + getValue(coin) + ".");
       }
     }
   } 

ÀÌ ¿¹Á¦¿¡¼­, µðÆúÆ® ¸Þ¼Òµå´Â 0À» ¸®ÅÏÇÑ´Ù. ½ÇÁ¦ Äڵ忡¼­´Â µðÆúÆ®·Î ¿¹¿Ü»óȲÀ» ´øÁö´Â °ÍÀ» ¼±È£ÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.

coin.toString()ÀÇ °ªÀº enum ÀνºÅϽºÀÇ À̸§ÀÌ µÇ¸ç, µû¶ó¼­ °á°ú´Â ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù.

 A PENNY has value = 1.
 A NICKEL has value = 5.
 A DIME has value = 10.
 A QUARTER has value = 25.

ÀÌÀüÀÇ ¿¹Á¦¿Í °°Àº Á÷Á¢ÀûÀÎ ¿¹Á¦¿¡¼­´Â switch ¸í·É¹®ÀÌ Å¬¶óÀÌ¾ðÆ® Å¬·¡½º¿¡¼­ enumeration Ŭ·¡½º·Î ½±°Ô À̵¿µÉ ¼ö ÀÖÀ¸¹Ç·Î, switchÁ¤º¸´Â Coin enumÀÇ ±â´É Áß Çϳª°¡ µÈ´Ù. µÞ ºÎºÐ¿¡¼­, enum ŸÀÔ¿¡ switchÇϰí, ÀÚüÀûÀ¸·Î ¾î¶² ÀÏÀ» ÇØ¾ßÇÒ Áö °áÁ¤Çϱâ À§ÇØ Å¬¶óÀÌ¾ðÆ®¸¦ ÇÊ¿ä·ÎÇÏ´Â ¿¹Á¦¸¦ º¸°Ô µÉ °ÍÀÌ´Ù. Coin1¿¡¼­ °¢ ŸÀÔÀº ´ÜÀÏ ºñÇìÀ̺ñ¾î¸¦ °¡Áö°íÀÖÀ¸¹Ç·Î switch ¸í·É¹®À» enum·Î À̵¿½Ã۵µ·Ï ÇÏÀÚ. Coin2 enum¿¡ ³ª¿ÍÀÖÀ¸¸ç, ÀÌ Coin2¿¡¼­´Â switch ¸í·É¹®ÀÌ enum Ŭ·¡½ºÀÇ value() ¸Þ¼Òµå ¾È¿¡ ÀÖ´Ù.

enumerated typeÀ» óÀ½ Á¢ÇÏ´Â »ç¿ëÀÚµéÀº ÄÁ½ºÅÏÆ®¸¦ ³ªÅ¸³»°í ÀÖ´Ù°í »ý°¢ÇÏ¿©, Á¤ÀÇ¿¡ ¸Þ¼Òµå¸¦ Ãß°¡½Ãų ¼ö ÀÖ´Ù´Â °ÍÀ» ±î¸ÔÀ» ¼ö ÀÖ´Ù. enum´Â Ŭ·¡½ºÀÇ À¯¿ë¼ºÀ» °®°í Àֱ⠶§¹®¿¡ ¼­·Î ´Ù¸¥ ±â´ÉµéÀ» ¾ðÁ¦ ¶Ç´Â ¾î¶»°Ô °í·ÁÇÏ´Â Áö¿¡ ´ëÇÑ ¸¹Àº ¼±ÅÃÀÌ ÀÖÀ½À» ¸í½ÉÇϱ⠹ٶõ´Ù. value() ¸Þ¼Òµå´Â ŸÀÔ¿¡ ¼ÓÇØ ÀÖÀ¸¸ç, °¢°¢ÀÇ ÀνºÅϽº¿¡ À̿밡´ÉÇÏ´Ù.

   public enum Coin2 {
     PENNY,
     NICKEL,
     DIME,
     QUARTER;

     int value(){
        switch(this) {
         case PENNY:return 1;
         case NICKEL:return 5;
         case DIME: return 10;
         case QUARTER: return 25;
         default: return 0;
       }
     }
   }

ÀÌÁ¦ Ŭ¶óÀÌ¾ðÆ® Äڵ尡 °£´ÜÇØÁú ¼ö ÀÖ´Ù.

   public class Dispenser2 {

     public static void main(String[] args) {
        for (Coin2 coin: Coin2.values())  {
         System.out.println("A " + coin + " has value = "
         + coin.value() + ".");
       }
     }
   }

ÄÁ½ºÅÏÆ® ÁöÁ¤ ¸Þ¼Òµå ¾È¿¡¼­ °¢°¢ ´Ù¸¥ ºñÇìÀ̺ñ¾î¸¦ ÁöÁ¤ÇÔÀ¸·Î½á switch ¸í·É¹® Àüü¸¦ »èÁ¦ÇÒ ¼ö ÀÖ´Ù. abrstract value()¸¦ ¸¸µé¾î Ŭ¶óÀÌ¾ðÆ® Äڵ忡 ÀÇÇØ È£ÃâµÉ ¼ö ÀÖ°Ô ÇÑ´Ù. ¾î¶² ÄÁ½ºÅÏÆ®·Îµµ È£ÃâµÉ ¼ö ÀÖµµ·Ï º¸ÀåµÇ´Â enum ³»ÀÇ ¸Þ¼Òµå¸¦ Á¤ÀÇÇϰí, abrstract ¸Þ¼Òµå°¡ °¢ »ó¼ö°¡ ±¸ÇöÀ» ¿À¹ö¶óÀ̵ùÇϵµ·Ï ¼±¾ðÇÑ´Ù.

   public enum Coin3 {
     PENNY { int value(){ return 1;}},
     NICKEL { int value(){ return 5;}},
     DIME { int value() { return 10;}},
     QUARTER { int value() {return 25;}};

     abstract int value();
   }

Dispenser2ÀÇ ÇØ´ç ¶óÀÎÀ» ´ÙÀ½°ú °°ÀÌ º¯°æÇÏ¿© Coin3¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.

   for (Coin3 coin: Coin3.values())

enumerated typeµéÀº ¶ÇÇÑ »ó¼öµéÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. »ç¿ëÀÚ´Â Coin3¿¡ int¸¦ °®°í ÀÖÀ¸¸é¼­ »ó¼ö¿¡ ÀÇÇØ ¼³Á¤µÇ´Â coinValue¶ó´Â À̸§ÀÇ Çʵ带 °ø±ÞÇÒ ¼ö ÀÖ´Ù.

   private Coin3( int value) {
     coinValue = value;
   }

¿©±â¼­ enum »ó¼öµéÀÌ ³»ºÎÀûÀ¸·Î ºñ°ø°³À̱⠶§¹®¿¡ private Ű¿öµå°¡ °úµµÇÏ°Ô »ç¿ëµÇ¾ú´Ù. ¿©±â¼­´Â »ó¼öµéÀÌ ¸íÈ®ÇÏ°Ô È£ÃâµÉ ¼ö ¾ø´Ù´Â »ç½ÇÀ» ºñÁÖ¾óÇÏ°Ô È®ÀνÃŰ´Â ¿ëÀ¸·Î Æ÷ÇÔµÈ °ÍÀÌ´Ù. (¾Æ·¡¿¡ ¸®½ºÆ®µÈ Äڵ忡 µé¾îÀÖ´Ù.)

ÀÌÁ¦ value() ¸Þ¼Òµå´Â ´ÜÁö coinValue¸¦ ¸®ÅÏÇÑ´Ù. ¶Ç ´Ù¸¥ º¯È­·Î, °¢ Ŭ·¡½º°¡ ¹Ýµå½Ã coinValue¸¦ ¼³Á¤ÇؾßÇÑ´Ù. ´ÙÀ½ÀÇ ¸®½ºÆ®¸¦

   PENNY, NICKEL, DIME, QUARTER;

¾Æ·¡¿Í °°ÀÌ º¯°æ½ÃÄÑ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

   PENNY(1), NICKEL(5), DIME(10), QUARTER(25);

´ÙÀ½Àº Coin3À» ¼öÁ¤ÇÑ °ÍÀÌ´Ù.

   public enum Coin3 {
     PENNY(1),
     NICKEL(5),
     DIME(10),
     QUARTER(25);

     private int coinValue;

     int value() {return coinValue;}

     Coin3(int value){
       coinValue = value;
     }
   }

enumerated type¿¡ µû¶ó ´Ù¸¥ ºñÇìÀ̺ñ¾î°¡ ÇÊ¿äÇÑ ÄÉÀ̽º¸¦ ¾Ë¾Æº¸ÀÚ. ¿¹¸¦ µé¾î, Employee enum¸¦ °®°íÀÖ´Ù°í ÇÑ´Ù¸é, SALARY, HOURLY, HOURLY_PART_TIME µîÀÇ Employee ŸÀÔ¿¡ µû¶ó ÀÎ»ç ¾ÖÇø®ÄÉÀÌ¼Ç ºÐ¾ßÀÇ ºñÇìÀ̺ñ¾î¸¦ ´Ù¸£°Ô º¯°æÇؾßÇÒ °ÍÀÌ´Ù. ÀÌ Â÷ÀÌ´Â ¿ùÂ÷, º¸³Ê½º, ÀÌÀÍ, ¿ù±Þ µîÀÇ °è»ê¿¡µµ Àû¿ë °¡´ÉÇÒ °ÍÀÌ´Ù. È£ÃâµÇ´Â ŸÀÔ¿¡ ±âÃÊÇÏ¿© ´Ù¸¥ ¸Þ¼Òµå¸¦ È£ÃâÇϴ Ŭ¶óÀÌ¾ðÆ®µé¿¡ °¢°¢ÀÇ switch ¸í·É¹®À» ±¸ÇöÇϰí½ÍÁö´Â ¾ÊÀ» °ÍÀ̸ç, ÀÌ»óÀûÀ¸·Î, ÀûÇÕÇÑ ¸Þ¼Òµå°¡ ŸÀÔ¿¡ µû¶ó ÀÚµ¿ÀûÀ¸·Î È£ÃâµÇ±â¸¦ ¿øÇÒ °ÍÀÌ´Ù .

À̸¦ ¼öÇàÇÏ´Â ÇѰ¡Áö ¹æ¹ýÀ¸·Î´Â VisitorÆÐÅÏÀ» ±¸ÇöÇÏ´Â °ÍÀÌ ÀÖ´Ù. ÀÌ¿¡ ´ëÇÑ ÀüÇüÀûÀÎ ·¹ÆÛ·±½º·Î´Â Design Patterns, Elements of Reusable Object-Oriented SoftwareÀÌ ÀÖ´Ù. Visitor ÆÐÅÏ¿¡´Â ¿©·¯ º¯ÇüÀÌ ÀÖÁö¸¸ À̹ø Å×Å©ÆÁ¿¡¼­´Â ÇѰ¡Áö¸¸ ´Ù·ïº¸µµ·Ï ÇϰڴÙ. À̸¦ ÀÌ¿ëÇÏ´Â ¸ñÀûÀº Visitor ÆÐÅÏÀ» enum¿¡ ÀÌ¿ëÇϸé, ¾î¶² enum ÄÁ½ºÅÏÆ® ÁöÁ¤ ±â´ÉÀÌ ±× ¼ö¿¡ Á¦ÇÑ ¾øÀÌ visitor¸¦ ÀÌ¿ëÇÏ¿© ±¸Çö°¡´ÉÇÏ´Ù.

±âÁ¸¿¡ Visitor ÆÐÅÏ¿¡ ´ëÇØ ¾ËÁö ¸øÇÏ´Â »ç¿ëÀÚ¶ó¸é Á¶±Ý ¾î·Á¿ïÁöµµ ¸ð¸¥´Ù. enumerated typeÀÇ ÀνºÅϽº°¡ »ý¼ºµÇ°í, ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù.(À̹øÀÇ °æ¿ì, accept()). ºñÇìÀ̺ñ¾î¸¦ Æ÷ÇÔÇϴ Ŭ·¡½º´Â º¯¼ö·Î½á Àü´ÞµÈ´Ù. enum ÀνºÅϽº´Â ±× ÈÄ ºñÇìÀ̺ñ¾î¸¦ Æ÷ÇÔÇϴ Ŭ·¡½º¿¡¼­ ÀûÀýÇÑ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ÀÌ ¹æ¹ýÀ¸·Î, ´Ù¸¥ ºñÇìÀ̺ñ¾î°¡ Ŭ¶óÀÌ¾ðÆ® Å¬·¡½º¿¡ ÅõÀ﵃ ¼ö ÀÖ´Ù.

ù¹øÂ° ÄÄÆ÷³ÍÆ®´Â enumerated typeÀÌ´Ù. À̹ø °æ¿ì¿¡´Â accept() ¸Þ¼Òµå°¡ °¢°¢ Ư¼ºÈ­µÈ enum »ó¼ö¿¡¼­ ±¸ÇöµÇ´Â abrstract ¸Þ¼Òµå°¡ µÈ´Ù. ¿¹¸¦ µé¾î PENNY¿¡¼­ accept()´Â ´ÙÀ½°ú °°ÀÌ ±¸ÇöµÈ´Ù.

   void accept( CoinVisitor cv) {cv.visitPenny(this);

´Ù½Ã ¸»ÇØ, acceptÀÇ ÀνºÅϽº´Â ¸Å°³º¯¼ö·Î½á Àü´ÞµÇ´Â CoinVisitorÀνºÅϽºÀÇ visitPenny() ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ´ÙÀ½Àº ¼öÁ¤µÈ enum Ŭ·¡½ºÀÌ´Ù.

   public enum Coin4 {
     PENNY {
       void accept( CoinVisitor cv) {cv.visitPenny(this);}
     },
     NICKEL {
       void accept( CoinVisitor cv) {cv.visitNickel(this);}
     },
     DIME {
       void accept( CoinVisitor cv) {cv.visitDime(this);}
     },
     QUARTER {
       void accept( CoinVisitor cv) {cv.visitQuarter(this);}
     };
     abstract void accept(CoinVisitor cv);
   }

ÀÌ °æ¿ì, CoinVisitorÀÇ ´ÜÀÏ ±¸Çö¸¸ÀÌ ÀÖÀ¸¹Ç·Î »ç¿ëÀÚ°¡ ±¸Ã¼ÀûÀΠŬ·¡½º¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ ¿¹Á¦ÀÇ ¸ñÀûÀº infrastructure¸¦ ¼³Á¤ÇÏ¿© Ŭ¶óÀÌ¾ðÆ® Å¬·¡½ºÀÇ ºñÇìÀ̺ñ¾î¸¦ º¯ÇüÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÖ´Â °ÍÀ̹ǷΠ´ÙÀ½°ú °°Àº abrstract Ŭ·¡½º°¡ ÇÊ¿äÇÏ°ÔµÉ °ÍÀÌ´Ù.

   public abstract class CoinVisitor {
     void visitPenny(Coin4 c){}
     void visitNickel(Coin4 c){}
     void visitDime(Coin4 c){}
     void visitQuarter(Coin4 c){}
   }

ÀÌÁ¦ °¢°¢ÀÇ Coin4 ŸÀÔ¿¡ µû¶ó ƯÁ¤ ºñÇìÀ̺ñ¾î¸¦ ÁöÁ¤ÇÏ°í ½ÍÀ» ¶© ¾ðÁ¦¶óµµ CoinVisitor¸¦ »ó¼ÓÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î, CoinValueVisitor´Â ÀûÇÕÇÑ µ¿ÀüÀÇ À̸§°ú °ªÀ» Ãâ·ÂÇÑ´Ù.

   public class CoinValueVisitor extends CoinVisitor {
     void visitPenny(Coin4 c){
       System.out.println("A penny has value = 1.");
     }
     void visitNickel(Coin4 c){
       System.out.println("A nickel has value = 5.");
     }
     void visitDime(Coin4 c) {
       System.out.println("A dime has value = 10.");
     }
     void visitQuarter(Coin4 c) {
       System.out.println("A quarter has value = 25.");
     }
   }

Ŭ¶óÀÌ¾ðÆ® ÄÚµå´Â ¿©ÀüÈ÷ enum ³»ÀÇ °ªµéÀ» ¹Ýº¹ÇÑ´Ù. ±×·¯³ª À̹ø¿¡´Â coinÀÌ Coin4ÀÇ ÀνºÅϽºÀ̰í cvv°¡ CoinValueVisitorÀÇ ÀνºÅϽº¶ó¸é, ¾Ë¸ÂÀº ºñÇìÀ̺ñ¾î¸¦ ´ÙÀ½°ú °°ÀÌ È£ÃâÇÏ¿© ÃʱâÈ­ÇÑ´Ù.

   coin.accept(cvv);

coinÀÌ PENNYÀÇ ÀνºÅϽº¶ó¸é, ÀÌ È£ÃâÀº PENNYÀÇ accept() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿©, cvv¿¡ Àü´ÞÇÏ°Ô µÈ´Ù. ±× ÈÄ visitPenny() ¸Þ¼Òµå°¡ cvv¿¡ È£ÃâµÈ´Ù. ÀÌ °á°ú·Î "A penny has value = 1."ÀÌ Ãâ·ÂµÈ´Ù. ´ÙÀ½Àº ¼öÁ¤µÈ Ŭ·¡½ºÀÌ´Ù.

   public class Dispenser4 {
      public static void main(String[] args) {
        CoinValueVisitor cvv = new CoinValueVisitor();
       for (Coin4 coin: Coin4.values())  {
         coin.accept(cvv);
       }
     }
   }

ÀÌ °á°ú·Î ´ÙÀ½°ú °°Àº °á°ú¹°ÀÌ ³ªÅ¸³­´Ù.

   A penny has value = 1.
   A nickel has value = 5.
   A dime has value = 10.
   A quarter has value = 25.

enumerated typeÀÇ °ª¿¡ µû¶ó ºñÇìÀ̺ñ¾î¸¦ º¯°æÇÏ´Â ¿¹Á¦µéÀ» Á» ´õ È®ÀÎÇÏ·Á¸é, "Enums".À» Âü°íÇϱ⠹ٶõ´Ù.

.
.
.

Reader Feedback

  ¸Å¿ì ÁÁ´Ù    ÁÁ´Ù    ±×Àú ±×·¸´Ù 

 

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ ±Ã±ÝÇϼ¼¿ä? Java Online SupportÀ» Âü°íÇϼ¼¿ä.

.
.


º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¸ÞÀÏÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@sun.com·Î ¹®ÀÇÇØÁֽñ⠹ٶø´Ï´Ù.

SKDN(Sun Korea Developers Network)¿¡¼­ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ» Âü°íÇϼ¼¿ä.

Copyright 2003-2005 Sun Korea, Inc. All rights reserved.

Sun Microsystems, Inc.
.
.