1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package source;
 
import java.awt.AWTException;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;
 
import javax.imageio.ImageIO;
/**
 13  * 화면 위에 지정한 그림 찾기
 14  * @author Jeby Sun
 15  * @date 2014-09-13
 16  * @website http://www.jebysun.com
  */
 public class ImageFindDemo {
     
     BufferedImage screenShotImage;    //화면 캡처
     BufferedImage keyImage;           //검색 대상 그림
     Image imagekey;
 
     int scrShotImgWidth;              //스크린샷 너비
     int scrShotImgHeight;             //스크린샷 높이
   
      int keyImgWidth;                  //검색 대상 이미지 너비
      int keyImgHeight;                 //목표 이미지 높이 찾기
      
      int[][] screenShotImageRGBData;   //화면 캡처 RGB 데이터
      int[][] keyImageRGBData;          //검색 대상 그림 RGB 데이터
      
      int[][][] findImgData;            //검색 결과 목표 아이콘 화면 캡처 위의 좌표 데이터 
      
      
      public ImageFindDemo()  {
          screenShotImage = this.getFullScreenShot();
          //imagekey = Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("DPIcon.jpg"));
         
          
          ImageObserver obserb = new ImageObserver() {
            
            @Override
            public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
                // TODO Auto-generated method stub
                return false;
            }
        };
          try {
            keyImage = ImageIO.read(new File("Img/DPIcon.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          screenShotImageRGBData = this.getImageGRB(screenShotImage);
          keyImageRGBData = this.getImageGRB(keyImage);
          scrShotImgWidth = screenShotImage.getWidth();
          scrShotImgHeight = screenShotImage.getHeight();
          keyImgWidth = keyImage.getWidth();
          keyImgHeight = keyImage.getHeight();
          
          //찾기 시작했다
          this.findImage();
          
      }
      
      /**
       * 전체 화면 캡처
       * @return 복귀 BufferedImage
       */
      public BufferedImage getFullScreenShot() {
          BufferedImage bfImage = null;
          int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
          int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
          try {
              Robot robot = new Robot();
              bfImage = robot.createScreenCapture(new Rectangle(00, width, height));
          } catch (AWTException e) {
              e.printStackTrace();
          }
          return bfImage;
     }
      
      /**
       * 로컬 파일 읽기 목표 이미지
       * @param keyImagePath - 그림 절대 경로
       * @return 로컬 그림 BufferedImage 대상
       */
      public BufferedImage getBfImageFromPath(String keyImagePath) {
          BufferedImage bfImage = null;
          try {
              bfImage = ImageIO.read(new File(keyImagePath));
          } catch (IOException e) {
              e.printStackTrace();
          }
          return bfImage;
      }
      
      /**
       * 근거 BufferedImage 그림 RGB 배열 가져오기
       * @param bfImage
       * @return
       */
      public int[][] getImageGRB(BufferedImage bfImage) {
          int width = bfImage.getWidth();
          int height = bfImage.getHeight();
          int[][] result = new int[height][width];
          for (int h = 0; h <height; h++) {
              for (int w = 0; w <width; w++) {
                  //사용 getRGB (w, h) 가져오는 중 이 색을 값, ARGB 아닌 실제 프로그램 중 사용, RGB. 그래서 다변화가 필요하다 ARGB 전환의 만든 RGB, 즉 bufImg.getRGB(w, h) & 0xFFFFFF. 
                  result[h][w] = bfImage.getRGB(w, h) & 0xFFFFFF;
              }
         }
          return result;
      }
      
     
     /**
      * 그림 찾기
      */
     public void findImage() {
         findImgData = new int[keyImgHeight][keyImgWidth][2];
         //화면 캡처 픽셀 좀 데이터 사이를 옮겨다니기
         for(int y=0; y<scrShotImgHeight-keyImgHeight; y++) {
             for(int x=0; x<scrShotImgWidth-keyImgWidth; x++) {
                 //대상 그림 크기 근거하여 얻은 목표 도 사각 맵 화면 위에 네 시 까지, 
                 //판단 스크린샷 위에 대응 네 개 좀 와 그림 B 네 개 픽셀 값을 같은 있는지 좀, 
                 //만약 같은 스며들게 화면 위에 맵 범위 내의 모든 좀 목표 도 모든 좀 비교해 보다. 
                 if((keyImageRGBData[0][0]^screenShotImageRGBData[y][x])==0
                         && (keyImageRGBData[0][keyImgWidth-1]^screenShotImageRGBData[y][x+keyImgWidth-1])==0
                         && (keyImageRGBData[keyImgHeight-1][keyImgWidth-1]^screenShotImageRGBData[y+keyImgHeight-1][x+keyImgWidth-1])==0
                         && (keyImageRGBData[keyImgHeight-1][0]^screenShotImageRGBData[y+keyImgHeight-1][x])==0) {
                     
                     boolean isFinded = isMatchAll(y, x);
                     //만약 비교적 결국 완전히 같지 않으면 설명이 그림 찾을 때까지 충전 중 위치 까지 좌표 데이터 검색 결과 배열. 
                     if(isFinded) {
                         for(int h=0; h<keyImgHeight; h++) {
                             for(int w=0; w<keyImgWidth; w++) {
                                 findImgData[h][w][0= y+h; 
                                 findImgData[h][w][1= x+w;
                             }
                         }
                         return;
                     }
                 }
             }
         }
     }
     
     /**
      * 판단 화면 위에 목표 도 맵 범위 내의 모든 것이 다 좀, 작은 그림 좀 일일이 대응. 
      * @param y - 목표 그림 왼쪽 위 픽셀 좀 하고 일치하는 화면 y 좌표
      * @param x - 목표 그림 왼쪽 위 픽셀 좀 하고 일치하는 화면 x 좌표
      * @return 
      */
     public boolean isMatchAll(int y, int x) {
         int biggerY = 0;
         int biggerX = 0;
         int xor = 0;
         for(int smallerY=0; smallerY<keyImgHeight; smallerY++) {
             biggerY = y+smallerY;
             for(int smallerX=0; smallerX<keyImgWidth; smallerX++) {
                 biggerX = x+smallerX;
                 if(biggerY>=scrShotImgHeight || biggerX>=scrShotImgWidth) {
                     return false;
                 }
                 xor = keyImageRGBData[smallerY][smallerX]^screenShotImageRGBData[biggerY][biggerX];
                 if(xor!=0) {
                     return false;
                 }
             }
             biggerX = x;
         }
         return true;
     }
     
     /**
      * 출력 검색 온 좌표 데이터
      */
     private void printFindData() {
         for(int y=0; y<keyImgHeight; y++) {
             for(int x=0; x<keyImgWidth; x++) {
                 System.out.print("("+this.findImgData[y][x][0]+", "+this.findImgData[y][x][1]+")");
             }
             System.out.println();
         }
     }
 
     
     public static void main(String[] args) {
         ImageFindDemo demo = new ImageFindDemo();
         demo.printFindData();
     }
 
}
 
cs


자료는 ProgrammerKR 구글 서치중 찾았다.


바탕화면 캡처 후 원하는 이미지와 좌표에 맞춰 RGB 대조 형식으로 진행.


출력은 전체 좌표를 출력함.

'javaSkills' 카테고리의 다른 글

Thread 의 sleep과 interrupt  (0) 2016.06.09
jar파일에서 이미지 로딩이 안되요!  (0) 2016.01.14
JAVA 실시간 그래프  (0) 2015.11.18
Hex String -> byte array , byte array -> hex String  (0) 2015.11.05
자바 int to hex  (0) 2015.11.05

여지껏 골치를 썩혀왔던 문제이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {
    try
    {
        while(!Thread.curruntThread.isInturrupt)
        {
        ..... 
        }    
    catch(InterruptedException e)
    {
 
    }
}
 
finally
{
 
}

cs


이 코드와 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {
    try
    {
        while(!Thread.curruntThread.isInturrupt)
        {
        ..... 
        }    
    }
}
catch(InterruptedException e)
{
 
}    
finally
{
 
}
cs


이 코드의 차이가  어마어마 하다 . 


윗 코드는 Thread가 sleep에 들어갈 경우 "sleep 중에 Interrup 했다!" 라는 Error를 띄우지만 


아래 코드는 "Thread를 오류가 나도 죽일게! "라는 코드이다.



많은 블로그에서 이 부분에 관해 포스트를 하셧지만 


결정적인 실수는 Catch의 위치에 따라 멈추냐 안멈추냐 차이이다. (이상동작도 발생한다)



참고 : http://javafreak.tistory.com/210 

해결이 안됬다가 해결했다 . 

방법은 

1
getClass().getClassLoader().getResource("이미지 이름")
cs


클래스 로더에서 리소스를 호출하는 것이다.


물론 이것만 하면 Eclipse 개발환경에서는 Null 포인터가 바로 뜬다. 


그래서 해줘야 할것은 프로젝트에서 properties에서

이런식으로 Add Folder를 선택후 본인이 필요한 이미지가 있는 폴더를 프로젝트 내에서 컨택하면 된다.

그러면 Null Pointer도 문제없이 컴파일이 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package pcprogram;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.Timer;
import javax.swing.JPanel;
 
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
 
/**
 * An example to show how we can create a dynamic chart.
*/
@SuppressWarnings("serial")
public class DynamicLineAndTimeSeriesChart extends ApplicationFrame 
implements ActionListener {
 
    /** The time series data. */
    private TimeSeries series;
 
    /** The most recent value added. */
    private double lastValue = 100.0;
 
    /** Timer to refresh graph after every 1/4th of a second */
    private Timer timer = new Timer(250this);
 
    /**
     * Constructs a new dynamic chart application.
     *
     * @param title  the frame title.
     */
    @SuppressWarnings("deprecation")
    public DynamicLineAndTimeSeriesChart(final String title) {
 
        super(title);
        this.series = new TimeSeries("Random Data", Millisecond.class);
 
        final TimeSeriesCollection dataset = new TimeSeriesCollection(this.series);
        final JFreeChart chart = createChart(dataset);
 
        timer.setInitialDelay(1000);
 
        //Sets background color of chart
        chart.setBackgroundPaint(Color.LIGHT_GRAY);
 
        //Created JPanel to show graph on screen
        final JPanel content = new JPanel(new BorderLayout());
 
        //Created Chartpanel for chart area
        final ChartPanel chartPanel = new ChartPanel(chart);
 
        //Added chartpanel to main panel
        content.add(chartPanel);
 
        //Sets the size of whole window (JPanel)
        chartPanel.setPreferredSize(new java.awt.Dimension(800500));
 
        //Puts the whole content on a Frame
        setContentPane(content);
 
        timer.start();
 
    }
 
    /**
     * Creates a sample chart.
     *
     * @param dataset  the dataset.
     *
     * @return A sample chart.
     */
    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createTimeSeriesChart(
            "Dynamic Line And TimeSeries Chart",
            "Time",
            "Value",
            dataset,
            true,
            true,
            false
        );
 
        final XYPlot plot = result.getXYPlot();
 
        plot.setBackgroundPaint(new Color(0xffffe0));
        plot.setDomainGridlinesVisible(true);
        plot.setDomainGridlinePaint(Color.lightGray);
        plot.setRangeGridlinesVisible(true);
        plot.setRangeGridlinePaint(Color.lightGray);
 
        ValueAxis xaxis = plot.getDomainAxis();
        xaxis.setAutoRange(true);
 
        //Domain axis would show data of 60 seconds for a time
        xaxis.setFixedAutoRange(60000.0);  // 60 seconds
        xaxis.setVerticalTickLabels(true);
 
        ValueAxis yaxis = plot.getRangeAxis();
        yaxis.setRange(0.0300.0);
 
        return result;
    }
    /**
     * Generates an random entry for a particular call
 made by time for every 1/4th of a second.
     *
     * @param e  the action event.
     */
    public void actionPerformed(final ActionEvent e) {
 
        final double factor = 0.+ 0.2*Math.random();
        this.lastValue = this.lastValue * factor;
 
        final Millisecond now = new Millisecond();
        this.series.add(new Millisecond(), this.lastValue);
 
        System.out.println("Current Time in Milliseconds = " + now.toString()+", Current Value : "+this.lastValue);
    }
 
    /**
     * Starting point for the dynamic graph application.
     *
     * @param args  ignored.
     */
    public static void main(final String[] args) {
 
        final DynamicLineAndTimeSeriesChart demo = new DynamicLineAndTimeSeriesChart("Dynamic Line And TimeSeries Chart");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
 
    }
 
}  


cs




랜덤수로 뽑아내는 실시간 선형 그래프 예제이다. 이걸로 지지고 복고 해야지~


출처 : http://ecogeo.tistory.com/129


1. hex string -> byte array

byte[] bytes = new java.math.BigInteger(hexText, 16).toByteArray();


2. byte array -> hex string

String hexText = new java.math.BigInteger(bytes).toString(16);

감사합니다 : ) 

String 으로 받아서 Int변환후 HexString 써서 hex변환.



String SrvrIP = srvrIpAddr.getHostAddress();  // i.e 166.10.10.0

StringTokenizer ip = new StringTokenizer( SrvrIP, "." );

int ip1 = Integer.parseInt(ip.nextToken());

int ip2 = Integer.parseInt(ip.nextToken());

int ip3 = Integer.parseInt(ip.nextToken());

int ip4 = Integer.parseInt(ip.nextToken());

 

byte[] buf = new byte[512];                // Does it give me this??

buf[0] = Integer.toHexString(ip1);              // buf[0] = 0xA6

buf[1] = Integer.toHexString(ip1);              // buf[1] = 0x0A

buf[2] = Integer.toHexString(ip1);              // buf[2] = 0x0A

buf[3] = Integer.toHexString(ip1);              // buf[3] = 0x00

 



출처 : http://suein1209.tistory.com/191


뚱곰님 감사합니다 

http://tjisblogging.blogspot.kr/2013/04/how-to-set-background-image-to-jframe.html


윈도우 빌더를 이용한 GUI 구성 TIPS LINK 입니다. 해외사이트임 ㅈㅅ;

자바는 객체마다 연관된 '모니터'를 갖고 있는데, synchronized 는 이 모니터를 획득/해제하는 방식을 통해서 한 쓰레드만 synchronized 영역을 실행할 수 있도록 함으로써 쓰레드의 동시 접근을 처리합니다.

쓰레드 접근 제어의 단위는 '모니터'인데, 이 모니터는 객체와 관련되어 있으므로, 자바에서 synchronized는 '객체'를 이용해서 접근 제어를 하게 됩니다. 이런 과점에서 1번과 2번은 효과가 (거의) 같다고 볼 수 있습니다. (메서드에 synchronized를 하면, 객체 자신-즉, this와 관련된 모니터를 사용하므로, synchronized(this)를 사용한 코드 블록과 동일한 모니터를 사용하게 됩니다.)

synchronized를 사용하면 아무래도 다중 쓰레드가 코드를 실행할 수 없기 때문에, 각 쓰레드들이 (순서를 알 수 없는 상태로) 순차적으로 synchronized 영역을 실행하게 되죠. 그래서, 한 메서드에서 일부부만 동기화가 필요하다면 이런 경우에는 메서드 전체를 synchronized로 하는 것보단, 특정 코드 영역만 synchronized로 하는 것이 다중 쓰레드 환경에서 쓰레드의 이점을 살릴 수 있게 됩니다.

1
2
3
4
5
6
    ... // someCode
    synchronized(this) {
        동기화영역을 최소화할 때에 synchronized 블록을 사용
    }
    ... // anyCode
}```
cs
그런데, 멀티쓰레드 환경에 알맞은 코드를 작성하다보면 한 객체의 두 종류의 데이터는 동시에 두 쓰레드가 접근해도 문제가 없는 경우가 있습니다. 그런데, 각 데이터 군은 동시 접근을 막아야 하는 경우가 있죠. 예를 들어, 아래 코드를 보죠. (그냥 설명을 위해 억지로 만든 급조한 예제에요... 더 좋은 예제는 교수님이 만들어주셔요~)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private int width;
private int height;
 
 
private Object sizeLock = new Object();
 
 
private int revision;
 
 
public int getArea() {
    synchronized(sizeLock) {
        return width * height;
    }
}
public void setSize(int width, int height) {
    synchronized(sizeLock) {
        this.width = width;
        this.height = height;
    }
}
 
 
public synchronized int getRevision() {
    return revision;
}
public synchronized void increaseRevision() {
    revision++;
}
}```
cs

여기서, width/height와 revision은 서로 동시 접근을 막을 필요가 없다고 한다고 해 보죠. 이 경우 한 쓰레드가 width/height의 값을 변경하는 동안에 다른 쓰레드가 revision의 값을 접근하는 것을 막을 필요가 없을 것입니다. 따라서, 하나의 모니터(즉, 객체)를 사용하기 보단, 두 데이터 군에 대해 서로 다른 모니터를 사용하도록 함으로써 쓰레드에 대한 동시 접근을 알맞게 제어할 수 있게 됩니다.

그런데, 메서드에 synchronized를 붙일 때에는 조심할 게 있는데, 그것은 바로 this를 사용한다는 점입니다. 아래 코드를 보죠.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        final Rectangle rec = new Rectangle();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (rec) {
                    System.out.println("synchronized(rec) begin");
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                    }
                    System.out.println("synchronized(rec) end");
                }
            }
        });
        t1.start();
 
 
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        System.out.println("rec.increaseRevision() before");
        rec.increaseRevision();
        System.out.println("rec.increaseRevision() after");
    }```
cs
이 코드에서 t1 쓰레드는 rec 객체를 이용해서 구성된 synchronized 블록을 실행합니다. 메인 쓰레드는 rec.increaseRevision()을 실행하구요. 여기서 t1 쓰레드의 synchronized 블록과 rec.increaseRevision() 메서드는 동일한 모니터(객체)를 사용하기 때문에 한 쓰레드가 먼저 코드를 실행하게 되면, 다른 쓰레드는 대기하게 됩니다. 실제 실행 결과는 아래와 같아요.

rec.increaseRevision() before ---> 메인 쓰레드는 대기 synchronized(rec) end --> t1 쓰레드가 모니터 해제 rec.increaseRevision() after ---> 메인 쓰레드가 비로서 실행```



이 예만 보더라도, 메서드에 synchronized를 적용하는 것은 다소 위험이 따를 수 있습니다. 따라서, 실제 코드에서는 synchronized를 메서드에 적용하기 보다는 자바 5부터 추가된 Lock을 이용해서 동시 접근을 제어하는 것이 더 안전한 코드를 만들 가능성을 높여준다고 할 수 있습니다.




출처 : http://www.slipp.net/questions/179 

댓글 작성자  : beomkyun.choi 님의 댓글 내용입니다 .


다중 쓰레드에서 특정적인 스레드 제어가 필요했는데 정말 고마운 정보 감사합니다 : )

'javaSkills' 카테고리의 다른 글

Hex String -> byte array , byte array -> hex String  (0) 2015.11.05
자바 int to hex  (0) 2015.11.05
윈도우 빌더를 이용한 GUI 구성 TIPS  (0) 2015.11.05
자바 1일차에 앞서.  (0) 2015.03.12
자바 자습 1일차  (0) 2015.03.12

자바 1일차에 앞서 이클립스의 기능 사용법을 알아보자

https://opentutorials.org/course/1223/5570

위의 링크에서 정확한 영상과 기능을 확인해 볼수 있다.

(강의 저자님께 매우 감사드립니다.)


내용은 이클립스를 실행하자 마자 보이는  view화면의 설명과 그 화면의 관리하는법, 그리고 debug 화면설정을 볼수있다.


 새 프로젝트 생성과 패키지 생성 및 클래스 생성을 알수 있고, 패키지에서 각 .(점)들이 의미하는 내용은 하위 디렉토리로 들어가는 개념이라고 보면된다. 


실제로 패키지생성 이후 그리고 클래스 생성이후 프로젝트 폴더 내에서 bin 폴더 내부로 들어가면, 본인이 생성했던 패키지의 이름대로 디렉토리가 생성된 것을 확인할 수 있다.

자습 내용은 

https://opentutorials.org/course/1223 에서 자습했습니다.


-1995년 자바의 아버지 제임스 고슬링과 그의 동료들

- 시작은 가전제품의 제어를 위한 언어로 고안, 웹의 등장으로 엄청난 성공을 거둠


java SE = java platform, standard Edition   자바의 표준안. 자바라는 언어가 어떠한 문법적인 구성을 가졌는지와 같은 것들을 정의하고 있다. 구체적인 소프트웨어가 아닌 그 소프트웨어의 설계도. 명세서라는 말을 사용하는게 더 맞다. 이 명세서에 따라 Java가 만들어진다. 만드는 기관은 JCP 라는 조직을 통해 만들어진다.


JDK = java development Kit   java SE의 표준안에 따라서 만들어진 구체적인 소프트웨어다. java 개발자라면 JDK를 다운받아서 설치해야한다. 코드 컴파일러와 개발에 필요한 각종 도구, JRE가 포함되어있다.


JRE = java Runtime Environment  자바가 실제로 동작하는데 필요한 JVM, 라이브러리, 각종 파일들이 포함되어있다. 구동하려고 하면 이것을 설치. 일반인을 위한 자바 버전


JVM = java virtual Machine   JVM은 자바가 실제로 구동하는 환경. 자바로 만들어진 소프트웨어는 JVM이라는 가상화된 환경에서구동되고, 하드웨어나 운영체제에 따라서 달라질 수 있는 호환성 문제는 운영체제 버전에 따라서 만들어진 JVM이 알아서 해결한다. 즉 하나의 자바 프로그램을 만들면 어떤 환경에서도 실행할수 있는것이 VM의 역활

 JDK의 분류

SE = standard Edition

자바의 핵심으로 일반적인 자바


java EE = enterprise Edition

기업용 자바


java Me = Micrio Edition

모바일 환경의 자바


이클립스의 설치와 자바의 환경구성은 

http://blog.naver.com/lhm5226/220251869104

의 블로그를 따라가도록 하자.

+ Recent posts