반응형


5천년만에 블로그에 글을 씁니다.^^ 반가워라.
자바(java)로 윈도우 어플리케이션을 만들고 있는데요.
자동완성 기능을 만들어 보려고 도전!!
JComboBox는 아래와 같이 생긴 녀석이죠.


아래와 같이 JComboBox에 Key Listener를 추가하니 이런..키보드를 아무리 눌러도 아무런 반응을 안 해주시네요..

combo1 = new JComboBox(model)
combo1.addKeyListener(new KeyAdapter() {
   @Override
   public void KeyTyped(KeyEvent ke) {
combo1.showPopup();
}



알고 보니.. JComboBox는 기본적으로 사용자 입력이 Item의 선택으로 이뤄지는 cmponent니깐
KeyEvent 가 먹지 않는 것이 이치에 맞는 것이더군요.


우리가 JComboBox의 editable 을 true로 설정하면 JComboBox라는 component에 editor라는 component가 덧 씌워지는 방식인가 봅니다.

그래서 찾아보니 아래 처럼 editor component에 KeyListener를 추가해줘야 하더군요^^
combo1 = new JComboBox(model)
combo1.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
   @Override
   public void KeyTyped(KeyEvent ke) {
   combo1.showPopup();
}


제가 원했던데로 키보드 입력이 있으면 popup메뉴가 열리는 이벤트가 발생하는 군요^^


(출처 : http://castever.wordpress.com/2008/12/09/keylistener-in-jcombobox/)

하..전문 프로그래머가 아닌 필요에 의한 개발을 하는 '엔지니어'로서 Google에게 감사합니다.


반응형
반응형

Eclipse에서 javadoc 생성을 하려는데
아래와 같은 에러가 났습니다.

javadoc unmappable character for encoding MS949

코드의 주석에 한글(UTF-8로 인코딩된)을 써서 그런 것 같아 구글링 해봤더니 역시나 그 문제 였네요.

해결 방법은 아래 창이 나타났을 때
VM options

-encoding UTF-8

을 적어주면 해결 됩니다.
그러면 한글이 포함된 JavaDoc을 생성할 수 있습니다.


 

반응형
반응형



자바로 만든 사칙연산 계산기 입니다.
인턴 출근하고 첫 번째 과제..
인터넷에서 가져온 녀석에 키보드 이벤트가 없어서 이벤트 추가해주고
키보드에 특수기호들 이름을 몰라서 걍 테스트로 System.out.print(블라블라);해서
콘솔에 나오는 숫자 그대로 넣어줬습니다..(부끄..어쨌든 잘 되네요..ㅎ;;)

기본적인 원리!!
입력한 숫자를 기억하고, 어떤 연산을 시켰는지 기억하면서 계산을 해나갑니다. 그리고 마지막 숫자가 들어 온 후 '='을 누르면 결과가 Text창에 뜨는 겁니다.

우선 GUI는 swing으로 덕지덕지 만들었습니다.
버튼들에 이벤트가 발생하면 무언가 일이 진행되게 합니다. 각각의 경우에 맞는 Listener와 Listener가 발견한 이벤트에 대해 할일을 만들어 주는 것이죠. 이벤트가 발생한 녀석이 어느 녀석이냐에따라 다른 일을 합니다. 이 땐 switch-case문을 사용했습니다.
에휴 설명이 허접해지네요ㅠㅠ
주석을 참고하세요^^ 설명을 위해서 주석을 엄청나게 써놨습니다... ㅎㅎ
아.. 프로그래밍 잘하고 싶다 ㅠ

그리고 인터넷에서 긁어온 소스의 닫기버튼에 대한 구현이 아래 처럼 되어 있어서 닫기 버튼을 눌러도 프로세스가 살아있더라구요..
엄청 띄웠더니 컴퓨터가 버벅 거려서 깜짝 놀랐습니다요..

addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e){
System.exit(0);
}
});

그래서 이러게 바꿔줬더니 잘 꺼지는 군요..

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});


코드는 아래와 같습니다. 아... 넘 길다 ㅠㅠ 첨부도 할게요...
딱 사칙연산만 하면 좀더 간단했을텐데.. 그래도 윈도우 계산기 켰을때 있는 녀석들은 다 있네요.^^;

 


package cal;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener, KeyListener{
 final int MAX_INPUT_LENGTH = 20; //최대한 입력 가능한 길이를 제한하고
 
 //각 모드별로 index를 부여
 final int INPUT_MODE = 0;
 final int RESULT_MODE = 1;
 final int ERROR_MODE = 2;
 int displayMode;
 
 boolean clearOnNextDigit;  //화면에 표시될 숫자를 지울지 말지 결정하는 녀석
 
 double lastNumber;   //마지막에 기억될 수
 String lastOperator;  // 마지막에 누른 연산자를 기억.
 
 private JLabel output;    //숫자가 표시될 공간
 private JButton buttons[];   //각 버튼을 배열로 생성할 것임.
 private JPanel masterPanel, btnPanel, ctrPanel; //버튼과 레이블을 배치할 공간
 
 //GUI를 생성해보자.
 public Calculator(){
  
  setBackground(Color.gray);   //프레임의 배경은 회색
  
  masterPanel = new JPanel();
  
  output = new JLabel("0", JLabel.RIGHT); // 레이블의 초기 값은 0
  output.setBackground(Color.WHITE);
  output.setOpaque(true);
  
  buttons = new JButton[23];
  
  btnPanel = new JPanel();
  
  //숫자 버튼 만듦0에서9까지.
  for (int i=0 ; i<=9 ; i++){
   buttons[i] = new JButton(String.valueOf(i));   
  }
  
  //연산 버튼 만듦.
  buttons[10] = new JButton("±");
  buttons[11] = new JButton(".");
  buttons[12] = new JButton("=");
  buttons[13] = new JButton("/");
  buttons[14] = new JButton("*");
  buttons[15] = new JButton("-");
  buttons[16] = new JButton("+");
  buttons[17] = new JButton("√");
  buttons[18] = new JButton("1/x");
  buttons[19] = new JButton("%");
  
  //컨트롤 버튼 만듦.
  buttons[20] = new JButton("←");
  buttons[21] = new JButton("CE");
  buttons[22] = new JButton("C");
  
  //각 버튼의 색을 다르게
  for(int i=0 ; i<buttons.length ; i++){
   if(i<10){
    buttons[i].setForeground(Color.black); //숫자 버튼들
   }else if(i>=10 && i<21){
    buttons[i].setForeground(Color.blue); //연산자 버튼들
   }else{
    buttons[i].setForeground(Color.red); //컨트롤 버튼들.
   }
  }
  
  //패널에 숫자버튼 및 연산자 버튼 배치
  btnPanel.setLayout(new GridLayout(4,5,2,2));
  
  for(int i=7; i<=9 ; i++){
   btnPanel.add(buttons[i]);
  }
  
  btnPanel.add(buttons[13]); // /
  btnPanel.add(buttons[17]); // √
  
  for(int i=4; i<=6 ; i++){
   btnPanel.add(buttons[i]);
  }
  
  btnPanel.add(buttons[14]); // *
  btnPanel.add(buttons[18]); // 1/x
  
  for(int i=1; i<=3 ; i++){
   btnPanel.add(buttons[i]);
  }
  
  btnPanel.add(buttons[15]); // -
  btnPanel.add(buttons[19]); // %
  
  btnPanel.add(buttons[0]); // 0
  btnPanel.add(buttons[10]); // ±
  btnPanel.add(buttons[11]); // .
  btnPanel.add(buttons[16]); // +
  btnPanel.add(buttons[12]); // =
  
  //컨트롤 패널에 컨트롤 버튼을 배치
  ctrPanel = new JPanel();
  ctrPanel.setLayout(new GridLayout(1,2,2,2));
  
  
  ctrPanel.add(buttons[20]);
  ctrPanel.add(buttons[21]);
  ctrPanel.add(buttons[22]);
  
  
  // 각 컴포넌트를 프레임에 추가
  masterPanel.setLayout(new BorderLayout());
  masterPanel.add(ctrPanel, BorderLayout.NORTH);
  masterPanel.add(btnPanel, BorderLayout.SOUTH);
  
  
  getContentPane().add(output, BorderLayout.NORTH);
  getContentPane().add(masterPanel,BorderLayout.SOUTH);
  requestFocus();
  
  //버튼 ActionListener, Keylistener 활성! 이놈들을 추가해야 버튼에 뭔일이 발생하는지 봅니다.
  for(int i=0 ; i<buttons.length ; i++){
   buttons[i].addActionListener(this);
   buttons[i].addKeyListener(this);
  }
    
  clearAll(); //모든 값을 초기화!!
  
  addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e){
     System.exit(0);
    }
   }
  );  
 }
 /*생성자 끝~~~~*/
 
 //마우스 입력에 대한 동작
 @Override
 public void actionPerformed(ActionEvent e){
  
  double result = 0;
  
  for(int i=0 ; i<buttons.length ; i++){
   if(e.getSource()==buttons[i]){
    if(i<10){
     addToDisplay(i);
     break;
    }else{
     switch(i){
      case 10: // ±
       processSingChange();
       break;
      case 11: // .
       addPoint();
       break;
      case 12: // =
       processEquals();
       break;
      case 13: // /
       processOperator("/");
       break;
      case 14: // *
       processOperator("*");
       break;
      case 15: // -
       processOperator("-");
       break;
      case 16: // +
       processOperator("+");
       break;
      case 17: // √
       if (displayMode != ERROR_MODE)
       {
          try
        {
         if (getDisplayString().indexOf("-") == 0)
             displayError("Invalid input for function!");
         result = Math.sqrt(getNumberInDisplay());
         displayResult(result);
        }
        catch(Exception ex)
        {
         displayError("Invalid input for function!");
         displayMode = ERROR_MODE;
        }
       }
       break;
      case 18: // 1/x
       if (displayMode != ERROR_MODE){
        try
        {
         if (getNumberInDisplay() == 0)
          displayError("영으로 나눌 수 없습니다.");
  
         result = 1 / getNumberInDisplay();
         displayResult(result);
        }
        
        catch(Exception ex) {
         displayError("영으로 나눌 수 없습니다.");
         displayMode = ERROR_MODE;
        }
       }
       break;
      case 19: // %
       if (displayMode != ERROR_MODE){
        try {
         result = getNumberInDisplay() / 100;
         displayResult(result);
        }
  
        catch(Exception ex) {
         displayError("Invalid input for function!");
         displayMode = ERROR_MODE;
        }
       }
       break;
      case 20: // ←
       backspace();
       break;
      case 21: //CE
       setDisplayString("0");
       clearOnNextDigit = true;
       displayMode = INPUT_MODE;
       break;
      case 22: //C
       clearAll();
       break;       
     }
    } 
   }
  }
 }
 
 
 //키보드 입력에 대한 동작
 public void keyPressed(KeyEvent e){
  int keycode = e.getKeyChar();
  //System.out.println(e.getKeyCode()+ "  "+ keycode ); 요걸로 특수기호 녀석들 코드를 알아냈습니다... ^^;;부끄
  switch(keycode){
   case KeyEvent.VK_0:
    addToDisplay(0);
    break;
   case KeyEvent.VK_1:
    addToDisplay(1);
    break;
   case KeyEvent.VK_2:
    addToDisplay(2);
    break;
   case KeyEvent.VK_3:
    addToDisplay(3);
    break;
   case KeyEvent.VK_4:
    addToDisplay(4);
    break;
   case KeyEvent.VK_5:
    addToDisplay(5);
    break;
   case KeyEvent.VK_6:
    addToDisplay(6);
    break;
   case KeyEvent.VK_7:
    addToDisplay(7);
    break;
   case KeyEvent.VK_8:
    addToDisplay(8);
    break;
   case KeyEvent.VK_9:
    addToDisplay(9);
    break;
   case 46: // .
    addPoint();    
    break;
   case 10: // =
    processEquals();
    break;
   case 47: // /
    processOperator("/");
    break;
   case 42: // *
    processOperator("*");
    break;
   case 43: // +
    processOperator("+");
    break;
   case 45: // -
    processOperator("-");
    break;
   case 8: //backspace
    backspace();
    break;
   case 27: //ESC
    clearAll();
    break;    
  }
 }
 private void clearAll() {
  setDisplayString("0");
  lastOperator = "0";
  lastNumber = 0;
  displayMode = INPUT_MODE;
  clearOnNextDigit = true;
 }
 
 private void backspace(){
  if (displayMode != ERROR_MODE){
   setDisplayString(getDisplayString().substring(0,
       getDisplayString().length() - 1));
   
   if (getDisplayString().length() < 1)
    setDisplayString("0");
  }
 }
 private void processOperator(String string) {
  if (displayMode != ERROR_MODE){
   double numberInDisplay = getNumberInDisplay();
   if (!lastOperator.equals("0")){
    try {
     double result = processLastOperator();
     displayResult(result);
     lastNumber = result;
    }catch(Exception e){}
   
   }else{
    lastNumber = numberInDisplay;
   }
   
   clearOnNextDigit = true;
   lastOperator = string;
  }
 }

 private double processLastOperator() throws Exception{
  double result = 0;
  double numberInDisplay = getNumberInDisplay();
  if (lastOperator.equals("/")){
   if (numberInDisplay == 0)
    throw (new Exception());
   result = lastNumber / numberInDisplay;
  }
   
  if (lastOperator.equals("*")){
   result = lastNumber * numberInDisplay;
  }
  if (lastOperator.equals("-")){
   result = lastNumber - numberInDisplay;
  }
  if (lastOperator.equals("+")){
   result = lastNumber + numberInDisplay;
  }
  
  return result;
 }
 private void processEquals() {
  double result = 0;
  if (displayMode != ERROR_MODE){
   try{
    result = processLastOperator();
    displayResult(result);
   }catch (Exception e){
    displayError("영으로 나눌 수 없습니다.");
   }
   lastOperator = "0";
  }
 }
 private void addPoint() {
  displayMode = INPUT_MODE;
  if (clearOnNextDigit)
   setDisplayString("");
  String inputString = getDisplayString();
 
  // 이미 점이 찍혀 있으면 안 찍음.
  if (inputString.indexOf(".") < 0)
   setDisplayString(new String(inputString + "."));
 }
 private void processSingChange() {
  if (displayMode == INPUT_MODE){
   String input = getDisplayString();
   if (input.length() > 0 && !input.equals("0")){
    if (input.indexOf("-") == 0)
     setDisplayString(input.substring(1));
    else
     setDisplayString("-" + input);
   }
  }else if (displayMode == RESULT_MODE){
   double numberInDisplay = getNumberInDisplay();
  
   if (numberInDisplay != 0)
    displayResult(-numberInDisplay);
  }
 }
 private void displayResult(double result) {
  setDisplayString(Double.toString(result));
  lastNumber = result;
  displayMode = RESULT_MODE;
  clearOnNextDigit = true;
 }
 private void displayError(String error) {
  setDisplayString(error);
  lastNumber = 0;
  displayMode = ERROR_MODE;
  clearOnNextDigit = true;
 }
 private double getNumberInDisplay() {
  String input = output.getText();
  return Double.parseDouble(input);
 }
 private void addToDisplay(int i) {
  if (clearOnNextDigit)
   setDisplayString("");
  
  String inputString = getDisplayString();
  
  if(inputString.indexOf("0") == 0){
   inputString = inputString.substring(1);
  }
  if(( !inputString.equals("0") || i>0 ) && inputString.length() < MAX_INPUT_LENGTH){
   setDisplayString(inputString + i);
  }
  
  displayMode = INPUT_MODE;
  clearOnNextDigit = false;
 }

 private void setDisplayString(String string) {
  output.setText(string);
 }

 private String getDisplayString() {
  return output.getText();
 }
 
 public static void main(String args[]){
  Calculator cal = new Calculator();
  cal.setTitle("Calculator");
  cal.setSize(300,300);
  cal.pack();
  cal.setVisible(true);
  cal.setResizable(false);  
 }
 @Override
 public void keyReleased(KeyEvent arg0) {}
 @Override
 public void keyTyped(KeyEvent arg0) {}
}

반응형
반응형

제가 자바에서 실수형 그러니간 double 형으로 변수를 정하고 0.5라는 결과는 기대하며 아래와 같이 작성했습니다.

double num = 1/2;

이런 식으로 해서 num을 콘솔에 출력해보니 에잉?? 게 뭡니까??? 0.0이 출력되네요 ㅠㅠ




제가 실수 한게 무엇일까요??
갑자기 옛날에 자바를 처음 배울때 읽었던 한 문장이 생각 났습니다.
자바는 형검사를 엄격히 한다? 물론 관련 없는 생각이었을 수도 있지만 이 문장이 생각나더군요

아무튼 제가 double 형(실수)으로 num이라는 변수를 선언하기는 했지만 그 속에 있는 오퍼레이터 /(나누기)는 1이라는 정수와 2라는 정수를 연산한 것입니다.
즉 정수와 정수를 연산했기 때문에 결과도 정수가 나와야 했던 것입니다. 그래서 결과 값에서 0에 가까운 정수를 결과로 취하게 됩니다.
즉 3/2를 하면 1.0, 5/2를 하면 2.0이 된다는 말이죠.

자바에서 이 문제를 해결하는 방법은 간단합니다. 오퍼레이터 /를 기준으로 양옆의 데이터 중 하나라도 실수형 데이터라는 것을 알려주면 됩니다.
아래 처럼 말이죠.





제가 요즘 파이썬을 공부하느라 데이터 타입에 무심해진건가 하는 생각을 하게 됐습니다.

하지만 제가 지금 고민 하는 것은 분명히 학교에서 배우기를 '정수 나누기 정수는 실수이다' 라고 배웠습니다.
즉 파이썬은 이 내용 그대로를 출력으로 제공하지만 대부분의 언어는 아니라는 사실이죠.

학교의 어떤 교수님께 물었더니 단호히 말씀하십니다.
 "전 파이썬을 싫어해요. 그건 스크립트 언어일 뿐이고, 정수와 정수를 계산한 결과가 실수로 나오는 그건 잘못된 것이에요."

현업에 계신 어떤 전문가분께 물었더니 이렇게 말씀하십니다.
"옛날에는 정수 나누기 정수가 정수라고 해서 크게 문제 될 것이 없었지요. 하지만 '빅데이터'시대에서 데이터 마이닝을 위해서는 파이썬의 방식이 더 좋다고 생각합니다."

예전에 읽었던 컴퓨터에 관한 책에서 본 한마디가 생각납니다.
"인간과 더 가까이!"
컴퓨터의 최종 목적이 인간과 더 가까워지는 것이라고 하더군요. 그렇다면 컴퓨터가 인간과 더 유사하게 동작하기 위해서 이런 사소한 문제부터 해결되어야 하는 것 아닐까요?

중학생에게 물어봐도 1/2은 0.5라고 대답하지 0.0이라고 답하지는 않을테니까요.

반응형
반응형

자바 응용프로그램(application)을 실행하기 위해서는 main() 함수가 있어야 합니다.
다시 말하면 프로그램이 실행되면 가장 먼저 찾는 것이 main() 함수라는 것이고, main()함수가 프로그램의 시작점인 것입니다.
main() 함수의 생긴 모양과 각각의 의미를 한 번 알아볼까요?

class A
{
public static void main(String[] arg)
{

...

}
}

위에서 A는 클래스의 이름 입니다.

main() 함수의 모양을 보면

처음에 접근권한이 public 으로 시작합니다. 이 것은 어떤 인터프리터(interpreter)도 접근 가능하게 하기 위함입니다.

다음으로 static 키워드가 나오는데 이것은 main()이 제일 먼저 실행되어야하기 때문에 static 키워드를 붙여 프로그램 시작시 먼저 메모리에 올라가도록 해서 이 함수를 사용하기 위함이라고 합니다.
static 키워드를 빼도 문법에 어긋나지 않기 때문에 컴파일 에러는 나지 않지만 프로그램이 실행되지 않습니다. 즉 static 키워드가 없으면 프로그램의 시작점인 main()함수를 찾을 수 없는 것입니다.

void는 반환형(return type)이 되겠습니다. C++에서는 main()함수의 반환형이 int로 되어 있어 숫자 0을 반환함으로써 프로그램의 자원을 반납하고 종료시키는데 자바에서는 void로 반환하는 것이 없습니다. 이것은 아마도 자바는 메모리 관리를 프로그래머가 직접하지 않기 때문이 아닌가 생각됩니다. 정확히 아시는분은 댓글 부탁드립니다^^

그리고 인자(argument)가 String 클래스의 배열로 되어있는데 이 것은 그 값이 어떤 형태이든 모든 값을 문자열로 받아들이고 또 여러 개의 인자를 받아들이겠다는 의미라고합니다.
프로그램 실행 시에 인자를 여러 개 입력할 때 띄어쓰기로 구분하고, 띄어쓰기가 포함된 문자열은 " "을 이용해 입력합니다.

만약 java A 1 2.5 text 라고 실행한다면

문자열 '1', '2.5', 'text'가 A클래스의 main()함수의 인자로 들어가는 것이죠.

제가 아는 바는 여기까지입니다 ㅋㅋ
저의 설명에 잘 못된 점이나 추가할 것이 있으면 댓글 부탁드립니다^^
반응형
반응형
자바도 이제 어느 정도 역사를 가진 언어가 된것 같습니다. 지금 와서 자바에 대해 포스팅 한다는 것이 많이 늦은 감이 있지만 그래도 제가 공부했던 언어 중 하나이고 여전히 자바를 사용하는 곳들이 많다고 생각되기 때문에 다시 한번 정리 하는 차원에서 포스트를 시작해 보려 합니다.

먼저 이번 포스트에서는 자바와 C언어를 비교해 보겠습니다!!

 자바와 C 언어는 어떤 차이가 있을까요? 


■ 1. 메모리를 접근하는 방식에 차이가 있습니다.


   C 언어 : pointer를 이용해서 메모리에 접근합니다. 하지만 이 pointer를 사용해서 부트영역을 건드린다면 치명적인 오류가 발생합니다.

   자바 : reference를 사용합니다.
  
C언어는 100번지에 직접 물건을 전달하려 하는데 실수로 101번지에 배달하면 오류가 발생하지만 Java는 우체국을 통해 보내서 주소가 다를 경우 수취인 불명으로 반송되는 정도로 생각하면 좋을 것 같습니다.


■ 2.

   C 언어 : 관련된 데이터를 하나로 모으기 위해 구조체(Structure)공용체(Union)를 사용합니다.

   자바 : 클래스(Class) 개념을 사용합니다.


■ 3. 구성 단위

   C언어 : acb.c 형태의 소스파일, abc.h 형태의 헤더파일 등 파일 단위로 되어 있어 #include를 사용해 문서에 포함합니다.

   자바 : 클래스(Class) 단위로 되어 있어 import를 사용해 포함 시킵니다.


■ 4. 타입(type) 정의

   C언어 : 구조체 등을 사용해 새로운 타입의 정의가 가능합니다.

   자바 : 타입을 정의할 수 없습니다.

■ 5. goto

   C언어 : goto 를 사용합니다.

   자바 : goto라는 예약어는 있지만 사용하지 않습니다.

goto를 사용하면 로직이 복잡해진다고 하네요.


■ 6. 형변환 (casting 캐스팅)

   C언어 : 자동 형변환을 합니다.

   자바 : 자동으로 형변환을 하지 않고 오류를 발생시킵니다.

C언어의 경우 int a = 3.14 라고 정의할 경우 a를 자동으로 3으로 캐스팅합니다. 만약에 이것이 314를 3.14로 잘 못 쓴 것이라면 오류를 찾아내기가 어렵습니다. 자바에서는 이런 사용자의 실수를 방지하기위해 형검사를 엄격하게 한다고 합니다.


■ 7. 상속 (Inheritance)

   C++ : 다중 상속이 가능합니다.

   자바 : 단일 상속만 가능합니다.

다중 상속이 가능할 경우 상속한 각각의 부모에 같은 변수 명이 있는 경우 그 변수가 어디서 온 것 인지 알기 어렵다고 합니다.


■ 8.

   C언어 : 파일 단위 이기 때문에 마음에 드는 부분을 가져다 쓸 수 없고 배껴야합니다.
abc.c → 컴파일(Compile) → abc.obj → 빌드(Build) → abc.exe 과정을 거쳐 최종적으로 바이너리 파일이 됩니다.
그래서 플랫폼에 종속적입니다.  예를 들면 UNIX에서 만든 abc.exe 는 WINDOWS에서는 실행이 안 됩니다. 라이브러리가 다를 수 있기 때문입니다.

   자바 : 클래스(Class) 단위의 객체 지향언어이고, interpreter방식 입니다.
abc.java → 컴파일 → abc.class → interpreter(자바가상머신) → 각 플랫 폼에 맛게 실행 하는 방식으로
바이너리가 아닌 바이트 코드의 클래스 파일을 읽으면서 자기 플랫폼에 맞게 실행됩니다. 즉 플랫폼에 독립적입니다.
반응형

+ Recent posts