C#과 JAVA 간단히 비교한 사이트

Projects/CoRapport 2009.04.28 11:41 Posted by soulfree >동네청년<

http://www.harding.edu/fmccown/java1_5_csharp_comparison.html

아래 복사는 Creative Commons License.에 따라 적법하게 긁어온것임.


 

Java (J2SE 5.0) and C# Comparison
This is a quick reference guide to highlight some key syntactical differences between Java and C#.
This is by no means a complete overview of either language. Hope you find this useful!
Also see VB.NET and C# Comparison.



 



Java Program Structure C#
package hello;

public class HelloWorld {
   public static void main(String[] args) {
      String name = "Java";

      // See if an argument was passed from the command line
      if (args.length == 1)
         name = args[0];

      System.out.println("Hello, " + name + "!");
    }
}
using System;

namespace Hello {
   public class HelloWorld {
      public static void Main(string[] args) {
         string name = "C#";

         // See if an argument was passed from the command line
         if (args.Length == 1)
            name = args[0];

         Console.WriteLine("Hello, " + name + "!");
      }
   }
}
Java Comments C#
// Single line
/* Multiple
    line  */

/** Javadoc documentation comments */
// Single line
/* Multiple
    line  */

/// XML comments on a single line
/** XML comments on multiple lines */
Java Data Types C#

Primitive Types
boolean
byte
char
short, int, long
float, double


Reference Types

Object   (superclass of all other classes)
String
arrays, classes, interfaces

Conversions

// int to String
int x = 123;
String y = Integer.toString(x);  // y is "123"

// String to int
y = "456";
x = Integer.parseInt(y);   // x is 456

// double to int
double z = 3.5;
x = (int) z;   // x is 3  (truncates decimal)

Value Types
bool
byte, sbyte
char
short, ushort, int, uint, long, ulong
float, double, decimal
structures, enumerations

Reference Types
object    (superclass of all other classes)
string
arrays, classes, interfaces, delegates

Convertions

// int to string
int x = 123;
String y = x.ToString();  // y is "123"

// string to int
y = "456";
x = int.Parse(y);   // or x = Convert.ToInt32(y);

// double to int
double z = 3.5;
x = (int) z;   // x is 3  (truncates decimal)

Java Constants C#
// May be initialized in a constructor
final double PI = 3.14;
const double PI = 3.14;

// Can be set to a const or a variable. May be initialized in a constructor.
readonly int MAX_HEIGHT = 9;

Java Enumerations C#

enum Action {Start, Stop, Rewind, Forward};

// Special type of class
enum Status {
  Flunk(50), Pass(70), Excel(90);
  private final int value;
  Status(int value) { this.value = value; }
  public int value() { return value; }
};

Action a = Action.Stop;
if (a != Action.Start)
  System.out.println(a);              
// Prints "Stop"

Status s = Status.Pass;
System.out.println(s.value());      // Prints "70"

enum Action {Start, Stop, Rewind, Forward};

enum Status {Flunk = 50, Pass = 70, Excel = 90};

No equivalent.





Action a = Action.Stop;
if (a != Action.Start)
  Console.WriteLine(a);             // Prints "Stop"

Status s = Status.Pass;
Console.WriteLine((int) s);       // Prints "70"

Java Operators C#

Comparison
==  <  >  <=  >=  !=

Arithmetic
+  -  *  /
(mod)
/  
(integer division if both operands are ints)
Math.Pow(x, y)

Assignment
=  +=  -=  *=  /=   %=   &=  |=  ^=  <<=  >>=  >>>=  ++  --

Bitwise
&  |  ^   ~  <<  >>  >>>

Logical
&&  ||  &  |   ^   !

Note: && and || perform short-circuit logical evaluations

String Concatenation
+

Comparison
==  <  >  <=  >=  !=

Arithmetic
+  -  *  /
(mod)
/  
(integer division if both operands are ints)
Math.Pow(x, y)

Assignment
=  +=  -=  *=  /=   %=  &=  |=  ^=  <<=  >>=  ++  --

Bitwise
&  |  ^   ~  <<  >>

Logical
&&  ||  &  |   ^   !

Note: && and || perform short-circuit logical evaluations

String Concatenation
+

Java Choices C#

greeting = age < 20 ? "What's up?" : "Hello";

if (x < y)
  System.out.println("greater");

if (x != 100) {   
  x *= 5;
  y *= 2;
}
else
  z *= 6;

int selection = 2;
switch (selection) {     // Must be byte, short, int, char, or enum
  case 1: x++;            // Falls through to next case if no break
  case 2: y++;   break;
  case 3: z++;   break;
  default: other++;
}

greeting = age < 20 ? "What's up?" : "Hello";

if (x < y) 
  Console.WriteLine("greater");

if (x != 100) {   
  x *= 5;
  y *= 2;
}
else
  z *= 6;

string color = "red";
switch (color) {                          // Can be any predefined type
  case "red":    r++;    break;       // break is mandatory; no fall-through
  case "blue":   b++;   break;
  case "green": g++;   break;
  default: other++;     break;       // break necessary on default
}

Java Loops C#

while (i < 10)
  i++;

for (i = 2; i <= 10; i += 2)
  System.out.println(i);

do
  i++;
while (i < 10);

for (int i : numArray)  // foreach construct 
  sum += i;

// for loop can be used to iterate through any Collection
import java.util.ArrayList;
ArrayList<Object> list = new ArrayList<Object>();
list.add(10);    
// boxing converts to instance of Integer
list.add("Bisons");
list.add(2.3);   
// boxing converts to instance of Double

for (Object o : list)
  System.out.println(o);

while (i < 10)
  i++;

for (i = 2; i <= 10; i += 2)
  Console.WriteLine(i);

do
  i++;
while (i < 10);

foreach (int i in numArray) 
  sum += i;

// foreach can be used to iterate through any collection 
using System.Collections;
ArrayList list = new ArrayList();
list.Add(10);
list.Add("Bisons");
list.Add(2.3);

foreach (Object o in list)
  Console.WriteLine(o);

Java Arrays C#
int nums[] = {1, 2, 3};   or   int[] nums = {1, 2, 3};
for (int i = 0; i < nums.length; i++)
  System.out.println(nums[i]);

String names[] = new String[5];
names[0] = "David";

float twoD[][] = new float[rows][cols];
twoD[2][0] = 4.5;

int[][] jagged = new int[5][];
jagged[0] = new int[5];
jagged[1] = new int[2];
jagged[2] = new int[3];
jagged[0][4] = 5;

int[] nums = {1, 2, 3};
for (int i = 0; i < nums.Length; i++)
  Console.WriteLine(nums[i]);

string[] names = new string[5];
names[0] = "David";

float[,] twoD = new float[rows, cols];
twoD[2,0] = 4.5f;

int[][] jagged = new int[3][] {
    new int[5], new int[2], new int[3] };
jagged[0][4] = 5;

Java Functions C#
// Return single value
int Add(int x, int y) {
   return x + y;
}

int sum = Add(2, 3);

// Return no value
void PrintSum(int x, int y) {
   System.out.println(x + y);
}

PrintSum(2, 3);

// Primitive types and references are always passed by value
void TestFunc(int x, Point p) {
   x++;
   p.x++;      
// Modifying property of the object
   p = null;    // Remove local reference to object
}

class Point {
   public int x, y;
}

Point p = new Point();
p.x = 2;
int a = 1;
TestFunc(a, p);
System.out.println(a + " " + p.x + " " + (p == null) );  // 1 3 false




// Accept variable number of arguments
int Sum(int ... nums) {
  int sum = 0;
  for (int i : nums)
    sum += i;
  return sum;
}

int total = Sum(4, 3, 2, 1);   // returns 10

// Return single value
int Add(int x, int y) {
   return x + y;
}

int sum = Add(2, 3);

// Return no value
void PrintSum(int x, int y) {
   Console.WriteLine(x + y);
}

PrintSum(2, 3);

// Pass by value (default), in/out-reference (ref), and out-reference (out)
void TestFunc(int x, ref int y, out int z, Point p1, ref Point p2) {
   x++;  y++;  z = 5;
   p1.x++;       // Modifying property of the object     
   p1 = null;    // Remove local reference to object
   p2 = null;   // Free the object
}

class Point {
   public int x, y;
}

Point p1 = new Point();
Point p2 = new Point();
p1.x = 2;
int a = 1, b = 1, c;   // Output param doesn't need initializing
TestFunc(a, ref b, out c, p1, ref p2);
Console.WriteLine("{0} {1} {2} {3} {4}",
   a, b, c, p1.x, p2 == null);   // 1 2 5 3 True

// Accept variable number of arguments
int Sum(params int[] nums) {
  int sum = 0;
  foreach (int i in nums)
    sum += i;
  return sum;
}

int total = Sum(4, 3, 2, 1);   // returns 10

Java Strings C#

// String concatenation
String school = "Harding ";
school = school + "University";   // school is "Harding University"

// String comparison
String mascot = "Bisons";
if (mascot == "Bisons")    
// Not the correct way to do string comparisons
if (mascot.equals("Bisons"))  
// true
if (mascot.equalsIgnoreCase("BISONS"))  
// true
if (mascot.compareTo("Bisons") == 0)   // true

System.out.println(mascot.substring(2, 5));   // Prints "son"

// My birthday: Oct 12, 1973
java.util.Calendar c = new java.util.GregorianCalendar(1973, 10, 12);
String s = String.format("My birthday: %1$tb %1$te, %1$tY", c);

// Mutable string
StringBuffer buffer = new StringBuffer("two ");
buffer.append("three ");
buffer.insert(0, "one ");
buffer.replace(4, 7, "TWO");
System.out.println(buffer);     // Prints "one TWO three"

// String concatenation
string school = "Harding ";
school = school + "University";   // school is "Harding University"

// String comparison
string mascot = "Bisons";
if (mascot == "Bisons")   
// true
if (mascot.Equals("Bisons"))   
// true
if (mascot.ToUpper().Equals("BISONS"))  
// true
if (mascot.CompareTo("Bisons") == 0)    // true

Console.WriteLine(mascot.Substring(2, 3));    // Prints "son"

// My birthday: Oct 12, 1973
DateTime dt = new DateTime(1973, 10, 12);
string s = "My birthday: " + dt.ToString("MMM dd, yyyy");

// Mutable string
System.Text.StringBuilder buffer = new System.Text.StringBuilder("two ");
buffer.Append("three ");
buffer.Insert(0, "one ");
buffer.Replace("two", "TWO");
Console.WriteLine(buffer);     // Prints "one TWO three"

Java Exception Handling C#

// Must be in a method that is declared to throw this exception
Exception ex = new Exception("Something is really wrong.");
throw ex;  

try {
  y = 0;
  x = 10 / y;
} catch (Exception ex) {
  System.out.println(ex.getMessage());
} finally {
 
// Code that always gets executed
}

Exception up = new Exception("Something is really wrong.");
throw up;  // ha ha


try
{
  y = 0;
  x = 10 / y;
} catch (Exception ex) {     
// Variable "ex" is optional
  Console.WriteLine(ex.Message);
} finally {
 
// Code that always gets executed
}

Java Namespaces C#

package harding.compsci.graphics;












import
harding.compsci.graphics.Rectangle;  // Import single class

import harding.compsci.graphics.*;   // Import all classes

namespace Harding.Compsci.Graphics {
  ...
}

or

namespace Harding {
  namespace Compsci {
    namespace Graphics {
      ...
    }
  }
}

// Import all class. Can't import single class.
using Harding.Compsci.Graphics;

Java Classes / Interfaces C#

Accessibility keywords
public
private
protected
static



// Inheritance
class FootballGame extends Competition {
  ...
}

// Interface definition
interface IAlarmClock {
  ...
}

// Extending an interface
interface IAlarmClock extends IClock {
  ...
}

// Interface implementation
class WristWatch implements IAlarmClock, ITimer {
   ...
}

Accessibility keywords
public
private
internal
protected
protected internal
static

// Inheritance
class FootballGame : Competition {
  ...
}

// Interface definition
interface IAlarmClock {
  ...
}

// Extending an interface
interface IAlarmClock : IClock {
  ...
}

// Interface implementation
class WristWatch : IAlarmClock, ITimer {
   ...
}

Java Constructors / Destructors C#

class SuperHero {
  private int mPowerLevel;

  public SuperHero() {
    mPowerLevel = 0;
  }

  public SuperHero(int powerLevel) {
    this.mPowerLevel= powerLevel;
  }

  // No destructors, just override the finalize method
  protected void finalize() throws Throwable {
    super.finalize();   // Always call parent's finalizer  
  }
}

class SuperHero {
  private int mPowerLevel;

  public SuperHero() {
     mPowerLevel = 0;
  }

  public SuperHero(int powerLevel) {
    this.mPowerLevel= powerLevel;
  }

  ~SuperHero() {
   
// Destructor code to free unmanaged resources.
    // Implicitly creates a Finalize method.

  }
}

Java Objects C#

SuperHero hero = new SuperHero();

hero.setName("SpamMan");
hero.setPowerLevel(3);

hero.Defend("Laura Jones");
SuperHero.Rest();  // Calling static method

SuperHero hero2 = hero;   // Both refer to same object
hero2.setName("WormWoman");
System.out.println(hero.getName());  // Prints WormWoman

hero = null;   // Free the object

if (hero == null)
  hero = new SuperHero();

Object obj = new SuperHero();
System.out.println("object's type: " + obj.getClass().toString());
if (obj instanceof SuperHero)
  System.out.println("Is a SuperHero object.");

SuperHero hero = new SuperHero();

hero.Name = "SpamMan";
hero.PowerLevel = 3;

hero.Defend("Laura Jones");
SuperHero.Rest();   // Calling static method

SuperHero hero2 = hero;   // Both refer to same object
hero2.Name = "WormWoman";
Console.WriteLine(hero.Name);   // Prints WormWoman

hero = null ;   // Free the object

if (hero == null)
  hero = new SuperHero();

Object obj = new SuperHero();
Console.WriteLine("object's type: " + obj.GetType().ToString());
if (obj is SuperHero)
  Console.WriteLine("Is a SuperHero object.");

Java Properties C#

private int mSize;

public int getSize() { return mSize; }
public void setSize(int value) {
  if (value < 0)
    mSize = 0;
  else
    mSize = value;
}


int s = shoe.getSize();
shoe.setSize(s+1);

private int mSize;

public int Size {
  get { return mSize; }
  set {
    if (value < 0)
      mSize = 0;
    else
      mSize = value;
  }
}

shoe.Size++;

Java Structs C#



No structs in Java.

struct StudentRecord {
  public string name;
  public float gpa;

  public StudentRecord(string name, float gpa) {
    this.name = name;
    this.gpa = gpa;
  }
}

StudentRecord stu = new StudentRecord("Bob", 3.5f);
StudentRecord stu2 = stu;  

stu2.name = "Sue";
Console.WriteLine(stu.name);   
// Prints "Bob"
Console.WriteLine(stu2.name);   // Prints "Sue"
Java Console I/O C#
java.io.DataInput in = new java.io.DataInputStream(System.in);
System.out.print("What is your name? ");
String name = in.readLine();
System.out.print("How old are you? ");
int age = Integer.parseInt(in.readLine());
System.out.println(name + " is " + age + " years old.");


int c = System.in.read();   // Read single char
System.out.println(c);      // Prints 65 if user enters "A"

// The studio costs $499.00 for 3 months.
System.out.printf("The %s costs $%.2f for %d months.%n", "studio", 499.0, 3);

// Today is 06/25/04
System.out.printf("Today is %tD\n", new java.util.Date());

Console.Write("What's your name? ");
string name = Console.ReadLine();
Console.Write("How old are you? ");
int age = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("{0} is {1} years old.", name, age);
// or
Console.WriteLine(name + " is " + age + " years old.");

int c = Console.Read();  // Read single char
Console.WriteLine(c);    // Prints 65 if user enters "A"

// The studio costs $499.00 for 3 months.
Console.WriteLine("The {0} costs {1:C} for {2} months.\n", "studio", 499.0, 3);

// Today is 06/25/2004
Console.WriteLine("Today is " + DateTime.Now.ToShortDateString());

Java File I/O C#

import java.io.*;

// Character stream writing
FileWriter writer = new FileWriter("c:\\myfile.txt");
writer.write("Out to file.\n");
writer.close();

// Character stream reading
FileReader reader = new FileReader("c:\\myfile.txt");
BufferedReader br = new BufferedReader(reader);
String line = br.readLine();
while (line != null) {
  System.out.println(line);
  line = br.readLine();
}
reader.close();

// Binary stream writing
FileOutputStream out = new FileOutputStream("c:\\myfile.dat");
out.write("Text data".getBytes());
out.write(123);
out.close();

// Binary stream reading
FileInputStream in = new FileInputStream("c:\\myfile.dat");
byte buff[] = new byte[9];
in.read(buff, 0, 9);  
// Read first 9 bytes into buff
String s = new String(buff);
int num = in.read();  
// Next is 123
in.close();

using System.IO;

// Character stream writing
StreamWriter writer = File.CreateText("c:\\myfile.txt");
writer.WriteLine("Out to file.");
writer.Close();

// Character stream reading
StreamReader reader = File.OpenText("c:\\myfile.txt");
string line = reader.ReadLine();
while (line != null) {
  Console.WriteLine(line);
  line = reader.ReadLine();
}
reader.Close();


// Binary stream writing

BinaryWriter out = new BinaryWriter(File.OpenWrite("c:\\myfile.dat"));
out.Write("Text data");
out.Write(123);
out.Close();

// Binary stream reading
BinaryReader in = new BinaryReader(File.OpenRead("c:\\myfile.dat"));
string s = in.ReadString();
int num = in.ReadInt32();
in.Close();

Page last modified: 11/10/2007 07:31:19

Copyright © 2004 by Frank McCown
Please send any corrections or comments to fmccown@harding.edu.

Home

Creative Commons License
This work is licensed under a Creative Commons License.

신고

자바 이미지 저장

Projects/CoVNC 2007.01.24 17:37 Posted by soulfree >동네청년<

jdk 1.4대 버전에서 지원하는 ImageIO클래스를 이용하면 될듯 싶습니다.

--------------------------------------------------------------------------------------------------


import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import java.awt.Color;
import java.io.File;
import javax.imageio.ImageIO;

public class SaveImage {

  public SaveImage() {
  }
  public static void main(String[] args) {

   // 200 x 200 사이즈로 RGB 색생을 이용하는 BufferedImage 객체를 생성한다.
   BufferedImage image = new BufferedImage(200,200, BufferedImage.TYPE_INT_RGB);

   // 그림을 그리기 위해 Graphics2D를 얻어온다.
   Graphics2D graphics = image.createGraphics();

   // 노란색으로 설정한다.
   graphics.setColor(Color.YELLOW);

   // 0,0 부터 200 x 200 사이즈인 사각형으로 채운다.
   graphics.fillRect(0,0,200,200);

   // C:\test.jpeg 파일로 저장한다.
   try {
     File file = new File("C:\\test.jpeg");
     ImageIO.write(image, "jpeg", file);
   }
   catch (Exception e){
     e.printStackTrace();
   }

  }
}

신고

자바 드래그엔 드랍, 클립보드 튜토리얼

Projects/CoVNC 2007.01.23 15:45 Posted by soulfree >동네청년<
http://java.sun.com/docs/books/tutorial/uiswing/dnd/intro.html
신고

Cut & Paste 자바 클립보드 - 최종명

Projects/CoVNC 2007.01.23 14:23 Posted by soulfree >동네청년<

Cut & Paste
-최종명
java.awt.datatransfer 패키지에서 클립보드를 지원하기 위한 클래스들이 정의되어 있다.
현재 JDK 1.1버전에서 지원되는 클립보드는 아직 초보적인 수준이어서 문자열의
cut, copy, paste 기능만 지원한다. 다른 타입을 위한 기능은 추후에 첨가될 예정이다.

전송될 데이타를 가지고 있는 클래스는 Tansferable 인터페이스를 임플리멘츠해주어야 한다.

DataFlavor 클래스는 클립보드로 전송될 데이타의 MIME 타입을 제공하기 위해 사용된다.

Clipboard 클래스는 cut, copy, paste 기능을 제공한다.


COPY 절차
1. java.awt.Toolkit 클래스의 getSYstemClipboard() 메소드를 이용해서 클립보드를
생성한다.

2. Tansferable 인터페이스를 임플리멘츠한 클래스(ex, StringSelection)를 생성한다.

3. Tansferable 인터페이스를 임플리멘츠한 클래스를 클립보드에 setContents() 메소드를
이용해서 붙인다.
예:
  public void copy(TextField tf)  {
   StringSelection data = new StringSelection(tf.getText());
   Clipboard clipboard = Toolkit().getDefaultToolkit().getSystemClipboard();
   clipboard.setContents(data, data);
  }


PASTE 절차
1. java.awt.Toolkit 클래스의 getSystemClipboard() 메소드를 이용해서 클립보드를
생성한다.

2. 클립보드의 getContents() 메소드를 이용해서 클립보드의 내용을 얻는다.

3. getTransferData() 메소드를 이용해서 원하는 데이타를 얻는다.

4. 얻어진 데이타를 적당한 타입으로 변환한다.
예:
  public void paste(TextField tf)  {
   Clipboard clipboard = Toolkit().getDefaultToolkit().getSystemClipboard();
   Transferable data = clipboard.getContents(this);
   String s;
   try {
     s = (String) (data.getTransferData(DataFlavor.stringFlavor));
   } catch (Exception e) {
     s = data.toString();
   }
   tf.setText(s);
  }


예제: CutNPaste.java 파일


    1  import java.io.*;
    2  import java.awt.*;
    3  import java.awt.datatransfer.*;
    4  import java.awt.event.*;
    5  
    6
    7  public class CutNPaste extends Frame implements ActionListener {
    8      TextField tf;
    9      TextArea ta;
   10      String  selection = "";
   11
   12      public static void main (String args[]) {
   13          new CutNPaste().show();
   14      }
   15
   16      public CutNPaste() {
   17          super("Cut & Paste Example");
   18          add(tf = new TextField("클립보드 예제 프로그램입니다."), "North");
   19          add(ta = new TextArea(), "Center");
   20          MenuBar mb = new MenuBar();
   21          mb.add(makeEditMenu());
   22          setMenuBar(mb);
   23          setSize(250, 250);
   24      }
   25
   26      Menu makeEditMenu() {
   27          Menu editMenu = new Menu("Edit");
   28          MenuItem mi = new MenuItem("Cut");
   29          mi.addActionListener(this);
   30          editMenu.add(mi);
   31          mi = new MenuItem("Copy");
   32          mi.addActionListener(this);
   33          editMenu.add(mi);
   34          mi = new MenuItem("Paste");
   35          mi.addActionListener(this);
   36          editMenu.add(mi);
   37          mi = new MenuItem("Clear");
   38          mi.addActionListener(this);
   39          editMenu.add(mi);
   40  
   41          return editMenu;
   42      }
   43  
   44      public void actionPerformed (ActionEvent evt) {
   45          Clipboard clipboard = getToolkit().getSystemClipboard();
   46          String cmd = evt.getActionCommand();
   47          if (cmd.equalsIgnoreCase("copy")) {
   48              selection = tf.getSelectedText();
   49              if(selection == null || selection.length() == 0)
   50                  selection = tf.getText();
   51              StringSelection data = new StringSelection(selection);
   52              clipboard.setContents(data, data);
   53          } else if (cmd.equalsIgnoreCase("clear")) {
   54              tf.setText("");
   55          } else if (cmd.equalsIgnoreCase("paste")) {
   56              Transferable clipData = clipboard.getContents(this);
   57              String s;
   58              try {
   59                  s = (String)(clipData.getTransferData(DataFlavor.stringFlavor));
   60              } catch (Exception e) {
   61                  s = e.toString();
   62              }
   63              ta.append(s+"\n");
   64          } else if (cmd.equalsIgnoreCase("cut")) {
   65              StringSelection data = new StringSelection(tf.getText());
   66              clipboard.setContents(data, data);
   67              tf.setText("");
   68          }
   69      }
   70  }


신고

자바 기본 유형의 바이트 순서 변환

Projects/CoVNC 2007.01.23 13:44 Posted by soulfree >동네청년<

자바 기본 유형의 바이트 순서 변환
author : Yoon Kyung Koo(yoonforh@moon.daewoo.co.kr)
Copyright (c) 1999 Yoon Kyung Koo, All rights reserved.

LITTLE ENDIAN은 LSB가 처음에 나오고
BIG ENDIAN은 MSB가 처음에 나옵니다.
그리고 네트웍 바이트 순서는 BIG ENDIAN입니다.
만약 4바이트 (즉, 자바의 int, 32비트 기계에서 C의 int나 long)라면
Little Endian에서 1234 순서로 바이트가 배치되면
자바나 Big Endian은 4321 순서로 바이트를 해석해야 합니다.

float나 double의 경우는 시스템에 따라 좀더 복잡합니다.
하지만 IEEE 754를 따르는 경우에는 단순히 바이트 순서만 바꾸면 해석 가능합니다.
C에서
float은 보통 32비트(4바이트)이고
double은 보통 64비트(8바이트)입니다.
자바도 이에 준할 것입니다.
따라서 리틀 엔디안에서 더블을 표현할 때
12345678 바이트 순서라면
빅 엔디안에서는
87654321 바이트 순서로 해석하면 됩니다.


다음은 간단하게 자바 int를 다른 엔디안 값으로 바꿔보는 것입니다.


// htonl.java

class htonl {

       public static void main(String args[]) {

               if (args.length<1) {

                       System.out.println("Usage:htonl number");

                       System.exit(0);

               }

               int value=Integer.parseInt(args[0]);

               // all java integer is BIG-ENDIAN(network byte-order)

               byte[] bytes=new byte[4];

               bytes[0]=(byte)((value&0xFF000000)>>24);

               bytes[1]=(byte)((value&0x00FF0000)>>16);

               bytes[2]=(byte)((value&0x0000FF00)>>8);

               bytes[3]=(byte) (value&0x000000FF);

               int newValue = 0;

               newValue |= (((int)bytes[3])<<24)&0xFF000000;

               newValue |= (((int)bytes[2])<<16)&0xFF0000;

               newValue |= (((int)bytes[1])<<8)&0xFF00;

               newValue |= (((int)bytes[0]))&0xFF;

               System.out.println("big endian value="+value+" ("+bytes[0]+","+bytes[1]+","+bytes[2]+","+bytes[3]+")");

               System.out.println("little endian value="+newValue+" ("+bytes[3]+","+bytes[2]+","+bytes[1]+","+bytes[0]+")");

       }

}


신고

자바와 C/C++ 간의 데이터 통신

Projects/CoVNC 2007.01.23 13:40 Posted by soulfree >동네청년<

author : Yoon Kyung Koo(yoonforh@moon.daewoo.co.kr)
Copyright (c) 1999 Yoon Kyung Koo, All rights reserved.

자바 프로그램과 C/C++ 프로그램 사이에 데이터 통신(주로 소켓을 사용하겠지요...)을 할 때에는
자바의 객체 스트림(java.io.Serializable or java.io.Externalizable을 인터페이스를 구현하고
ObjectInput/OutputStream 사용)을 사용할 수가 없습니다.
자바의 객체 스트림은 자바에 고유한 형식을 사용하기 때문에 C/C++ 프로그램이 이해할 수 없기
(어렵기?) 때문입니다.
따라서 자바와 C/C++ 프로그램 사이에서 데이터를 주고 받으려면 기본 유형으로 변환하여
주고 받을 수밖에 없습니다.
예를 들어 다음과 같은 필드들로 구성된 자바 클래스를 C/C++ 프로그램과 주고 받는다고
생각해봅시다.

class TestData {
  byte[] bytes = new byte[100] ;
  char c; // assume this char value will not excced one byte (i.e. cannot use Hangul char)
  boolean val;
  String string;
}

대응되는 C/C++ 데이터 구조체를 다음과 같이 생각할 수 있겠습니다.

typedef struct {
  char bytes[100];
  char c; // 물론 이렇게 구현하면 안됩니다. C의 구조체 alignment에 따라
          // 사용되지 않는 몇 바이트가 채워지게 됩니다.
  bool val; // 보통 C++의 bool 유형은 int처럼 4바이트지만 컴파일러와 O/S에 따라 다릅니다.
             // 예를 들어 64비트 머신인 디지털 유닉스 4.0의 g++ 2.95에서 bool은 8바이트를
             // 차지합니다. (같은 기계에서 cxx의 경우 4바이트를 차지합니다.)
  int str_length; // 문자열의 길이
  char * string;
} Object ;

이럴 경우에 발생하는 문제는 여러 가지가 있을 수 있습니다.
1. C/C++에서 structure가 차지하는 각 필드들의 바이트 수...
위의 경우처럼 char가 중간에 혼자 들어가게 되면 3바이트가 덧붙는 경우가 생기게 됩니다.

2. 각 기본 유형들의 데이터 길이...
자바는 고정되어 있지만 C/C++의 경우에는 컴파일러와 O/S 등에 따라 차이가 납니다.
예를 들어 long의 경우 자바는 8바이트이지만 C/C++의 경우 운영 체제에 따라 4바이트와 8바이트가
각각 사용될 수 있습니다.
GNU의 C/C++ 컴파일러를 사용하면 8바이트 유형인 long long를 사용하여 자바의
long에 대응시킬 수 있습니다.
위 예제에서는 bool 유형(보통 4바이트지만 어떤 컴파일러/운영체제에서는 8바이트로 처리),
int 유형(16비트 운영체제에서는 2바이트로 처리), char *와 같은 주소 유형(CPU 종류에 따라
2바이트, 4바이트, 8바이트 등으로 처리) 등이 C/C++ 쪽에서 주의해야 할 유형입니다.

3. short, int, long 등의 바이트 순서
자바는 네트웍 순서(빅 엔디안)로 고정되어 있지만 C/C++의 경우에는 CPU 유형에 따라
달라지므로 반드시 보정해줘야 합니다.
만약 자바쪽에서 리틀 엔디안으로 변환하여 보내려면 htonl/htons 기능을 하는 메소드를
구현하여야 합니다.
참고 : 자바 기본 유형의 바이트 순서 변환

4. char의 인코딩...
자바는 String을 내부적으로 유니코드를 사용하니까 바이트로 변환하여 C/C++와 주고받아야 합니다.
특히 한글과 같은 2바이트 문자를 사용할 때에는 더욱 중요합니다.
DataOutput 혹은 ObjectOutput의 void writeBytes(String)과 같은 메소드는
무조건 문자를 1바이트로 처리하여 쓰므로 2바이트 문자가 사용될 경우에는 사용하지 말아야 할
메소드입니다.
(String의 length()와 문자열을 바이트열로 변환한 byte[]의 length 값이 다를 수 있다는 건 아시지요?)
다음은 간단한 예제입니다. 소켓 프로그램으로 할 수도 있지만 마찬가지이므로 간단하게 파일로 했습니다.
자바 프로그램이 데이터를 파일로 쓰고, C++ 프로그램이 그 파일을 읽는 것이지요.
C++ 프로그램은 위에서 말씀드린 여러 가지 이유로 운영 체제에 따라 수정할 필요가 있습니다.
제가 테스트한 운영체제는 솔라리스 2.6입니다.

=================================

/*
* @(#)FileIOTest.C 0.1 1999/09/10
*
* Copyright 1999 by Yoon Kyung Koo.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Yoon Kyung Koo. ("Confidential Information").  You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Yoon Kyung Koo.
*
*/
/**
* This program provides a test over
* communication with java apps
*
* @version 0.1 1999/09/10
* @author <A HREF="Yoon'>mailto:yoonforh@moon.daewoo.co.kr">Yoon Kyung Koo</A>
*/
#include <iostream>
#include <fstream>
extern "C" {
#include <arpa/inet.h>
}
typedef struct {
   char bytes[100];
   char c;
   bool val; // usually bool type is defined as int, but it depends on O/S
   int str_length; // length of string
   char * string; // string bytes
} Object ;
void usage(const char * name) {
   cout << "\nUsage : " << name << " file1" << endl;
}
int main(int argc, char ** argv)
{
   if (argc < 2) {
usage(argv[0]);
exit(1);
   }
    Object object;
   cout << "address of object : " << hex << &object << endl;
   cout << "offset to bytes   : " << dec << (int)&object.bytes - (int)&object << endl;
   cout << "offset to c       : " << dec << (int)&object.c - (int)&object << endl;
   cout << "offset to val     : " << dec << (int)&object.val - (int)&object << endl;
   cout << "offset to str_l   : " << dec << (int)&object.str_length - (int)&object << endl;
   cout << "offset to string  : " << dec << (int)&object.string - (int)&object << endl;
   cout << "whole size of the Object class    : " << dec << sizeof(Object) << endl;
    ifstream fs(argv[1]);
   if (fs.bad()) {
cerr << "cannot open " << argv[1] << endl;
exit(1);
   }
    // size of whole object - size of Object::string
   int len = sizeof(Object) - sizeof (char *);
    fs.read((char *)&object, len);
   if (fs.bad()) {
cerr << "stream errored." << endl;
exit(1);
   }
    // always fix byte order
   object.val = ntohl(object.val);
   object.str_length = ntohl(object.str_length);
    len = object.str_length;
   object.string = new char[object.str_length + 1];
    fs.read(object.string, len);
   if (fs.bad()) {
cerr << "stream errored." << endl;
exit(1);
   }
    object.string[object.str_length] = 0; // append null
    cout << "bytes  :" << endl;
   for (int i=0; i<100; i++) {
if (i%10 == 0)
    cout << endl;
cout << dec << (int) object.bytes[i] << " ";
   }
   cout << endl;
   cout << "c      : " << object.c << endl;
   cout << "val    : " << (object.val?"true":"false") << endl;
   //    cout << "len    : " << object.str_length << endl;
   cout << "string : " << object.string << endl;
}

=================================

/*
* @(#)FileIOTest.java 0.1 1999/09/10
*
* Copyright 1999 by Yoon Kyung Koo.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Yoon Kyung Koo. ("Confidential Information").  You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Yoon Kyung Koo.
*
*/
/**
* This class provides a test over
* communication with C/C++ apps
*
* @version 0.1 1999/09/10
* @author <A HREF="Yoon'>mailto:yoonforh@moon.daewoo.co.kr">Yoon Kyung Koo</A>
* @see java.io.Test
* @see java.io.ObjectInputStream
* @see java.io.ObjectOutputStream
*/
import java.io.*;
/**
* This class is a sample data class
*
* NOTE that object stream cannot be used for communicating with C/C++ apps.
*   java uses its proprietary format to represent objects.
*
* Corresponding C data structure will be somewhat like this
* struct {
*    char bytes[100];
*    char c; // this will be problem... this will accompany non-used three bytes
*    bool val; // bool type is defined as int
*    int str_length; // length of string
*    char * string; // string bytes
* } ;
*    
*/
class TestData {
   byte[] bytes = new byte[100] ;
   char c; // assume this char value will not excced one byte (i.e. cannot use Hangul char)
   boolean val;
   String string;
    /*
    * fill with some data
    */
   public TestData() {
for (int i=0; i<bytes.length; i++)
    bytes[i] = (byte)i;
c = 'c';
val = true;
string = "어떤 string";
   }

   public void writeDataExternal(java.io.DataOutputStream stream)
throws IOException
   {
stream.write(bytes);
stream.write(c);
for (int i=0; i<3; i++)
    stream.write(0); // fill three byte
stream.writeInt(val?1:0);
byte[] strBytes = string.getBytes("EUC_KR");
// first write the byte length of string
stream.writeInt(strBytes.length);
stream.write(strBytes);
// NOTE: never use writeBytes() method. writeBytes() methods write strings
// converting each chars to byte, so only string.length() byte will be written
// stream.writeBytes(string);
   }
    public void readDataExternal(java.io.DataInputStream stream)
throws IOException
   {
bytes = new byte[100];
stream.read(bytes, 0, bytes.length);
c = (char) stream.read();
for (int i=0; i<3; i++)
    stream.read(); // discard three byte
val=((stream.readInt()==0)?false:true);
 int len = stream.readInt();
byte[] strBytes=new byte[len];
stream.read(strBytes, 0, len);
string = new String(strBytes, "EUC_KR");
   }
    /*
    * display member fields
    */
   public void print() {
System.out.println("bytes  :");
for (int i=0; i<bytes.length; i++) {
    if (i%10 == 0)
 System.out.println();
    System.out.print(bytes[i] + " ");
}
System.out.println();
System.out.println("c      : " + (char) c);
System.out.println("val    : " + val);
System.out.println("string : "+string);
   }
}
class FileIOTest
{
   public static void usage() {
System.out.println("\nUsage : java FileIOTest filename");
   }
    public static void main(String[] args) throws IOException {
if (args.length < 1) {
    usage();
    System.exit(1);
}
 // write file
FileOutputStream f_out=new FileOutputStream(args[0]);
DataOutputStream d_out=new DataOutputStream(f_out);
 TestData td = new TestData();
 try {
    td.writeDataExternal(d_out);
    d_out.flush();
} finally {
    d_out.close();
    f_out.close();
}
 // read file
FileInputStream f_in=new FileInputStream(args[0]);
DataInputStream d_in=new DataInputStream(f_in);
 TestData td2 = new TestData();
 try {
    td2.readDataExternal(d_in);
    td2.print();
} finally {
    d_in.close();
    f_in.close();
}
   }
}
 
신고

자바프로그래머를 위한 C#

만드는 일/프로그램 2006.09.09 19:46 Posted by soulfree >동네청년<
출처 - http://218.146.252.66/tigerteam/rserver.php?mode=tb&sl=40

마이크로소프트는 2003년부터 JUMP to .NET이란 모토 아래 전국투어방식의 국내 대학교 순회 .NET 세미나를 개최해 강성재씨같은 에반젤 리스트들의 활약이 돋보였다.

타이거도 2004년정도에 대구 계명대, 부산IT교육센터에서 치러진 JUMP to .NET 순회세미나에 참석하곤했다.

JLCA(Java Language Conversion Assistant) 2.0 버전에 이어 3.0 베타 버전도 발표되였다. JLCA는 기존 자바 개발자들이 .NET 프레임웍으로 쉽게 전이할 수 있도록 자바 코드를 C#으로 변경해주는 프로그램이다.

JCLA를 이용함으로써 기존 비즈니스 로직은 변경하지 않고 자바 개발자들이 .NET 플랫폼으로 쉽게 이동할 수 있으며, 이클립스와 넷빈즈대신 마이크로소프트의 Visual Studio .NET로 갈아탈수있다.

Sun과의 협력방안으로 마이크로소프트가 독자적으로 개발한 것이기 때문에 이렇게 변환된 코드는 .NET 플랫폼 상에서만 동작한다.

비주얼스튜디오 J# 개발자도 C#으로 변경되며, JSP의 ASP.NET 코드 변경도 가능하다.

보다 자세한 사항은 아래 글들을 참고하라.



신고
TAG c#, 자바

[불펌]JBOSS 소개와 설치 2

Projects/Server 2006.09.07 21:50 Posted by soulfree >동네청년<
JBoss 탐험기를 다루는 본 기사에서는 오픈 소스 프로젝트로 진행되는 EJB 컨테이너인 JBoss의 설치부터 시작하여 간단한 예제를 만들고 실행하는 과정을 다룰 것이다. 본 기사는 EJB를 공부하고 싶어하는 자바 엔지니어(단, 초급자 제외)를 대상으로 작성되었다. 특히, 금전적인 부담으로 인해 상용 EJB 컨테이너를 살 능력이 없는 사람에게는 더욱 더 도움이 될 만한 기사이다. 왜냐… 공짜이니까…

1. 예제 프그램들

지난 기사(JBoss 탐험기 (상): JBoss 소개와 설치)에서는 설치와 간단한 테스트를 해보았다. 이제부터는 본격적인 EJB 예제를 실행해보도록 하자. 세션 빈과 엔티티 빈으로 나누어 이 두 가지에 대해 예제를 실행해 볼 것이다. 이 두 가지 모두 앞에서 설치한 예제 폴더에 있는 것들이다. 소스 설명은 따로 필요가 없다. 워낙 간단한 예제라서 EJB에 대한 상식이 있다면 누구나 쉽게 이해할 수 있기 때문이다.

1.1 Session bean

예제로는 'Interest'라는 무 상태 세션 빈을 사용할 것이다. 이 예제는 간단하게 이자 계산을 해주는 프로그램이다. 우선 JBOSS_DIST\examples\build 폴더에서 콘솔창을 열도록 한다. 그리고 'ant'라고만 입력하면 아래 [그림 1]과 같이 타겟을 지정하라는 메시지가 나올 것이다.


[그림 1] 타겟을 지정하지 않았다는 메시지

1.1.1 compile

그럼 이번에는 'ant intro-interest-compile'라고 입력해보자. 이번에는 폴더를 생성하고 컴파일을 하는 과정이 메시지로 출력된다.


[그림 2] 컴파일이 정상적으로 수행된 후

실제로 폴더에서 컴파일된 파일들을 확인할 수 있다.


[그림 3] 컴파일 후 생성된 클래스 파일들

1.1.2 jar

이번에는 컴파일된 파일들을 jar 파일로 묶어보자. 다음과 같이 입력한다.
ant intro-interest-jar 
여기까지는 이상 없이 실행될 것이다. 그리고 폴더에서 jar 파일이 생성된다.

1.1.3 deploy

이제 jar 파일을 디플로이 하도록 하자. 다음과 같이 입력한다.
ant intro-interest-deploy 
이것을 실행하면 자동으로 interest.jar 파일이 JBOSS_DIST\server\default\deploy 폴더로 복사되면서 디플로이가 되어야 한다. 그런데 동작하지 않는 것으로 보아 무엇인가 문제가 있는 것 같다. JBOSS_DIST\examples\org\jboss\docs\interest 에 있는 build.xml 파일에서 deploy-ejb-jar 타겟을 보자.
<target name="deploy-ejb-jar" depends="ejb-jar"> <copy file="${build.interest.dir}/interest.jar" todir="${jboss.dist}/deploy" /> </target> 
역시 폴더 설정이 잘못 되어있다. 아마도 JBoss 2.x 버전에서 사용하던 폴도 구조를 변경하면서 미처 반영을 하지 않은 것 같다. 다음과 같이 고치고 다시 실행하자.
<target name="deploy-ejb-jar" depends="ejb-jar"> <copy file="${build.interest.dir}/interest.jar" todir="${jboss.dist}/server/default/deploy" /> </target> 
그러면 아래 [그림 4]와 같이 성공적으로 디플로이 되었다는 메시지가 나올 것이다.


[그림 4] 정상적으로 디플로이된 화면

1.1.4 client

빈이 배치되었으니 클라이언트 프로그램을 실행해서 확인할 차례이다. 다음과 같이 입력한다.
ant intro-interest-client 
이것을 실행하면 테스트용 클라이언트 프로그램이 컴파일되고 실행된다. 그러나 아쉽게도 에러 메시지가 나타난다. 메시지를 살펴보니 몇몇 클래스를 찾을 수 없다는 내용이다. JBOSS_DIST\examples\org\jboss\docs\interest 에 있는 build.xml 파일에서 interest-client 타겟에서 아래와 같이 클래스 패스를 설정하는 부분이 있다.
<target name="interest-client" depends="compile"> <java classname="org.jboss.docs.interest.InterestClient" fork="yes"> <classpath> <pathelement path="${classpath}"/> <pathelement Location="${build.classes.dir}"/> <pathelement Location="${src.resources}"/> </classpath> </java> </target> 
여기에 아래와 같이 2줄을 추가하자.
<target name="interest-client" depends="compile"> <java classname="org.jboss.docs.interest.InterestClient" fork="yes"> <classpath> <pathelement path="${classpath}"/> <pathelement Location="${build.classes.dir}"/> <pathelement Location="${src.resources}"/> <pathelement Location="${jboss.dist}/lib/jboss-common-client.jar"/> <pathelement Location="${jboss.dist}/lib/log4j.jar"/> </classpath> </java> </target> 
다시 실행하여 [그림 5]와 같은 실행 결과가 나왔다면 성공한 것이다.


[그림 5] 클라이언트 실행 결과

1.2 Entity bean

앞에서 interest 세션 빈을 실행해 보았다. 이번에는 엔티티 빈을 실행해 볼 차례이다. 엔티티 빈을 실행하거나 데이터베이스를 사용하기 위해서는 적절한 설정이 필요한데, JBoss를 설치하고 실행하면 기본적으로 Hypersonic 이라는 데이터베이스가 설정되고 구동된다. 그냥 기본으로 제공하는 데이터베이스를 사용하도록 하자.

실행해 볼 엔티티 빈 예제는 'Music CD'이다. 우리가 인터넷으로 CD를 구매하기 위해서는 일단 어떤 CD가 있는지 살펴보게 되는데, 이 예제에서는 이러한 CD 데이터를 데이터베이스를 사용하여 관리할 것이다. 이번에 사용하는 예제는 엔티티 빈 단독으로 실행되는 것이 아니라, CD 자체를 표현하는 엔티티 빈과 CD를 관리하는데 필요한 기능을 담고 있는 CDCollection 세션 빈으로 구성된다. CD 빈은 CD의 타이틀, ID, 아티스트 등에 관련된 메소드들을 제공하며, CDCollection 빈에서는 CD의 추가, 삭제, 검색 메소드를 제공한다. (여기에서의 엔티티 빈은 Container Managed Persistence이다.)

1.2.1 compile

JBOSS_DIST\examples\build에 열려 있는 콘솔창에서 'ant cmp-cd-compile'라고 입력하면 컴파일이 되면서 cd.jar라는 파일이 생성되었다는 메시지가 출력된다. 이 파일 안에는 두 가지의 빈이 모두 포함 되어있다.


[그림 6] 컴파일이 무사히 끝나고 cd.jar 파일 생성

1.2.2 deploy

다른 과정 필요 없이 바로 디플로이 할 수 있다. 이번에는 아주 쉽게 할 수 있다. 단지 JBOSS_DIST\examples\build-examples\cmp-cd\ejb 폴더에 있는 cd.jar 파일을 JBOSS_DIST\server\default\deploy 폴더로 복사만 하면 자동으로 핫 디플로이가 이루어지기 때문이다. 디플로이가 정상적으로 끝나면 역시 아래 [그림 7]과 같은 화면을 볼 수 있다.


[그림 7] 정상적으로 디플로이 된 화면

1.2.3 client

디플로이도 끝났으니 클라이언트 프로그램으로 실행해 볼 차례가 왔다. 세션 빈에서의 클라이언트에서와 마찬가지로 클래스 패스에 누락된 것이 있다. JBOSS_DIST\examples\org\jboss\docs\cmp\cd\build 폴더에 있는 build-client.xml 파일을 수정해보자.
<target name="main" depends=""> <java classname="org.jboss.docs.cmp.cd.${client}" fork="yes" dir="${build.classes.dir}"> <classpath> <pathelement path="${classpath}"/> <pathelement path="${build.classes.dir}"/> <pathelement Location="${jboss.dist}/client/jboss-common-client.jar"/> <pathelement Location="${jboss.dist}/lib/log4j.jar"/> </classpath> </java> </target> 
디플로이만 끝난 상태로는 테이블에 CD 데이터가 아무 것도 없기 때문에 실행하는데 따르는 의미가 없을 것이다. 우선은 CD 데이터부터 입력하도록 하자. JBOSS_DIST\examples\build 콘솔창에서 'ant cmp-cd-upload'라고 실행하면 클라이언트와 서버에서 데이터가 입력되는 과정을 볼 수 있다. "앗, 어떤 데이터가 어떻게 입력이 되나요?" 당연히 이런 질문이 나와야 한다. 데이터는 cds.txt라는 파일에 있으며 파일 내용은 CD 데이터들을 CSV(Comma Separated Value) 형태로 담고 있다. 클라이언트가 실행되면서 이 파일을 읽은 후 CD 내용으로 입력하는 것이다. 아래 [그림 8]은 CD 데이터가 입력되는 서버의 화면이다.


[그림 8] CD 데이터 입력 중

CD 데이터 입력이 끝났으니 이제 CD 목록을 보는 클라이언트를 실행해보자. 'ant cmp-cd-list'는 먼저 입력 되었던 CD 데이터들을 가져 오는 예제이다. 모든 데이터를 삭제하고 싶다면 'ant cmp-cd-remove'라고 실행하면 된다.

이상으로 JBoss 탐험기를 마치겠다. 서문에서 밝혔던 것처럼 이 기사가 EJB를 공부하는 사람들에게 많은 도움이 되었기를 바란다.


참고문헌

  • http://www.jboss.org/online-manual/HTML/index.html
  • http://sourceforge.net/projects/jboss/

    저자: 한빛리포터 김영익

    출처: 한빛미디어

    http://network.hanbitbook.co.kr/view.php?bi_id=411

    http://network.hanbitbook.co.kr/view.php?bi_id=429
  • 신고

    'Projects > Server' 카테고리의 다른 글

    Installing Oracle, PHP, and Apache on Linux  (0) 2006.09.23
    proftpd 계정설정  (0) 2006.09.16
    php 업로드 용량 제한 변경하기  (0) 2006.09.16
    [불펌]JBOSS 소개와 설치 2  (0) 2006.09.07
    [불펌]JBOSS 소개와 설치 1  (0) 2006.09.07
    Tatter tools 설치 - apache 설치  (0) 2006.09.07
    TAG EJB, JSP, 자바

    [불펌]JBOSS 소개와 설치 1

    Projects/Server 2006.09.07 21:49 Posted by soulfree >동네청년<

    출처 - http://blog.naver.com/an5asis


    회사에서 톰켓을 대신해서 JBOSS를 사용한단다.

    그런데 JBOSS에는 톰켓도 내장되어있다!!

    도대체 뭐하는 놈인지 궁금해서 불펌하였다...

    어서 랩실에 서버 만들어서 블로그 돌리고파... 싸이 넘 불편스러워

    ===========================================================

    JBoss 탐험기를 다루는 본 기사에서는 오픈 소스 프로젝트로 진행되는 EJB 컨테이너인 JBoss의 설치부터 시작하여 간단한 예제를 만들고 실행하는 과정을 다룰 것이다. 본 기사는 EJB를 공부하고 싶어하는 자바 엔지니어(단, 초급자 제외)를 대상으로 작성되었다. 특히, 금전적인 부담으로 인해 상용 EJB 컨테이너를 살 능력이 없는 사람에게는 더욱 더 도움이 될 만한 기사이다. 왜냐… 공짜이니까…

    1. JBoss 소개

    http://sourceforge.net/projects/jboss/에 가면 다음과 같은 내용이 있다.

    The JBoss/Server is the leading Open Source, standards-compliant, J2EE based application server implemented in 100% Pure Java…

    쉽게 말해서 100% 자바로 구현되는 J2EE 기반의 애플리케이션 서버이며 오픈 소스 프로젝트로 진행되고 있다는 것이다. J2EE나 EJB 또는 애플리케이션 서버라는 용어에 낯선 분들은 아마도 이 글을 읽기에는 아직 무리인 듯 싶다. 좀더 내공을 쌓은 뒤에 읽어보시길…

    어쨌거나 시중에는 많은 상용 애플리케이션 서버들이 있지만 대부분이 고가의 제품이고, 가난한 개발자들에게는 그림의 떡이다. 물론 평가판을 사용할 수도 있지만 사용 기한이 지나서 사용할 수 없다는 메시지를 보면 가슴이 여간 아픈 것이 아니다. 그러나 JBoss를 사용하면 이런 상처를 받을 필요가 없다. 게다가 소스도 공개되어 있으므로 여력이 된다면 자신이 직접 개발에 참여할 수도 있다. 혹자는 "아무래도 싼 게 비지떡이 아닐까?"라고 의심하는 사람도 있을 것이다. 물론 JBoss에도 버그가 존재하고 상용 제품처럼 화려하지도 않고, 아직 미약한 부분들이 존재한다. 하지만 버그 없는 프로그램이란 어차피 존재하지 않는 것이고(그것이 상용 프로그램이라 할지라도), 공짜로 사용하면서 이 정도 기능과 성능을 내는 제품은 드물 것이다. 서론이 너무 길면 지루하므로 JBoss에 대한 탐험을 바로 시작하자. (본 기사에서는 EJB 컨테이너, J2EE 기반의 애플리케이션 서버는 같은 의미로 사용된다)

    JBoss 3.0은 J2EE 1.3을 기반으로 구현되어 있다. 지원하는 각각의 자세한 사항은 아래와 같다.

  • JDBC 2.0(3rd party)
  • JCA 1.0
  • Servlets/JSP 2.3 (Jetty + Tomcat)
  • JNDI
  • EJB 2.0, full CMP 2.0 engine
  • JMS 1.1
  • JTS/JTA
  • JavaMail
  • Clustering

    아래 [그림 1]은 JBoss의 구조를 나타낸다. JBoss는 모든 기능이 JMX(Java Management Extensions) 기반에서 수행된다. JMX는 다양한 플랫폼과 네트워크 프로토콜에 관련된 문제의 해결책을 제시하는 자바 환경의 장점을 관리 기능에서 사용하기 위해 개발되는 것이다. 현재 텔레커뮤니케이션이나 데이터 통신 분야에서 주로 사용되며, 웹로직 서버에서는 웹 기반의 개발자와 관리자들을 위한 구성과 관리, 모니터링을 위한 툴을 제공하는 데에 사용되고 있다. JMX에 대한 자세한 사항은 썬사의 홈페이지(http://java.sun.com/products/JavaManagement/)를 참고하기 바란다.


    [그림 1] JMX 기반의 JBoss 아키텍쳐

    우리의 관심은 오로지 JBoss이기 때문에 J2EE에 대한 자세한 사항은 다루지 않겠다. J2EE에 대한 보다 자세한 내용은 이미 시중에 출판된 책이나 자료도 많이 있으므로 그러한 자료들을 참고하기 바란다.

    2. 다운로드 받기

    2.1. JBoss 다운로드 받기

    JBoss 사이트(www.jboss.org)에 가면 다음과 같은 문구가 있다.

    JBoss 3.0.0 is our current beta, unstable version. It will run on 1.3+ JVMs…

    JBoss 3.0이 베타 버전이라서 아직 안정적이지 않다지만 그냥 사용하기로 하겠다. 그리고 JBoss 3.0이 JDK 1.3에서 실행된다지만 이미 JDK 1.4를 설치했기 때문에 필자는 무시했다. 별 상관 없을 것 같다.

    JBoss 사이트(www.jboss.org)에서 바이너리 파일을 다운로드 받자(참고로 http://sourceforge.net/projects/jboss에서도 다운로드 가능). 필자가 받은 파일은 Tomcat 4.0.3 버전이 포함된 것이다(jboss-3.0.0RC1_tomcat-4.0.31.zip). 파일 사이즈는 14 메가 바이트 정도로 이 파일에는 소스 코드를 포함하지 않는 바이너리만이 존재한다. 소스 코드를 원한다면 CVS를 이용하거나 소스가 압축된 파일을 받아야 할 것이다. CVS나 Ant 등에 익숙치 않은 개발자라면 바이너리를 다운로드 받는 것이 좋다. 소스 코드로부터 바이너리를 구축하는 데에는 많은 노력과 시간이 필요하기 때문이다. 마지막으로 예제와 문서들은 어디에 있을까? http://www.jboss.org/doco_files/에서 documentation-example.zip 파일을 다운 받자.

    2.2. Ant 다운로드 받기

    JBoss에서 제공하는 예제를 구축하기 위해서는 Ant라는 자바 빌드 도구가 필요하다. Ant는 Jakarta 사이트(http://jakarta.apache.org/builds/ant/release/v1.4.1/bin/)에 가면 다운 받을 수 있다. 본 기사를 쓰는 시점에서는 버전 1.4.1이 가장 최신 버전이다. 그러나 Ant도 버전에 따라 API의 변화가 있기 때문에 될 수 있다면 같은 버전을 다운 받아서 사용하기를 권장한다. Ant에 대한 다른 사항은 설치 후 매뉴얼을 참고하도록 하자.

    3. 설치

    3.1. Ant 설치

    설치는 복잡한 것이 없다. 일단 사이트에서 다운로드 받은 압축 파일(jakarta-ant-1.4.1-bin.zip)을 적당한 위치에 풀어서 놓기만 하면 된다. 이 외에 몇 가지 환경 설정을 추가로 해줄 필요가 있다.

    설치한 폴더가 c:\dev\tools\jakarta-ant-1.4.1 일 경우 다음과 같은 폴더들이 생성된다.

     /bin : Ant 실행을 위한 배치 파일이 있다(유닉스나 리눅스의 경우 쉘 파일 사용) /lib : jar 파일들 /docs : 매뉴얼과 API 문서가 있다. 

    Windows 환경에서는 환경 설정을 다음과 같이 하면 된다.

    set ANT_HOME=c:\dev\tools\jakarta-ant-1.4.1 set PATH=%PATH%;%ANT_HOME%\bin 

    유닉스나 기타 다른 OS에서의 설정에 대해서는 Ant 매뉴얼(http://jakarta.apache.org/ant/manual/install.html)을 참고하기 바란다.

    ※ 기타 ANT에 대한 더 자세한 사항은 위에서 말한 설치 후 매뉴얼 외에도 필자가 쓴
    'ANT(상): Ant 무엇에 쓰는 물건인고?''ANT(하): Ant 무엇에 쓰는 물건인고?'를 참고하면 더 자세한 사항을 쉽게 알 수 있을 것이다.

    3.2. JBoss 설치

    JBoss 설치 이전에 JDK가 설치되어야 하는 것은 너무나도 당연한 것이다.
    JAVA_HOME 환경 변수와 클래스 패스가 적절히 설정되었는지 확인하자.

    JBoss 설치는 간단하다. 적당한 위치에 압축 파일을 풀기만하면 설치는 끝난다. 필자의 시스템이 윈도우 2000이기 때문에 다른 운영체제를 사용하는 분들에게는 죄송하지만, 모든 과정은 윈도우 2000에서 작업한 결과임을 이해해 주면 고맙겠다.

    필자는 JBoss를
    D:\jboss-3.0.0RC1_tomcat-4.0.3 이라는 폴더에 설치했으며 편의상 이 폴더를 JBOSS_DIST라고 부르겠다. 그리고 환경 변수로 설정한다. 압축 파일을 풀면 [그림 2]에서 보는 바와 같이 아래와 같은 폴더들이 생성된다.


    [그림 2] JBoss 설치 후 생성된 폴더들

    3.3. 예제와 문서 설치

    JBOSS_DIST 폴더에서 documentation-example.zip 파일의 압축을 풀면 [그림 3]과 같은 폴더 구조와 파일들이 생성된다.


    [그림 3] JBoss 예제와 문서 설치 후 생성된 폴더들

    3.4. 테스트

    설치가 끝났으면 정상적으로 설치가 이루어졌는지 테스트 해보도록 하자. JBOSS_DIST 밑에 있는 bin 폴더를 보면 run.bat 파일이 있다. 사정없이 이 파일을 실행하자. 메시지가 마구 콘솔에 뿌려질 것이다. 한참을 그러다가 멈추고, 마지막에 16:17:24,235 INFO [Server] JBoss (MX MicroKernel) [3.0.0RC1 Date:200204150356] Started in 1m:3s:21ms 이런 비슷한 메시지가 보이면 서버가 실행되고 대기 상태에 있는 것이다.


    [그림 4] JBoss가 실행된 화면

    이제는 브라우저를 실행시키고 http://localhost:8080를 주소창에 입력하자. [그림 5]와 같은 화면이 보이면 일단 안심해도 된다. JBoss가 실행되면서 Tomcat도 같이 실행되기 때문이다.


    [그림 5] JBoss와 Tomcat이 같이 실행되고 있다

    브라우저에서 http://localhost:8082 를 주소창에 입력하면 아래와 같은 화면이 나온다. 여기에서는 현재 JBoss에서 실행되고 있는 컴포넌트들을 관리할 수 있다. 마치 게시판에서 관리자 화면을 제공하는 것과 같다고 할 수 있다.


    [그림 6] JBoss 관리 화면

  • 신고

    'Projects > Server' 카테고리의 다른 글

    Installing Oracle, PHP, and Apache on Linux  (0) 2006.09.23
    proftpd 계정설정  (0) 2006.09.16
    php 업로드 용량 제한 변경하기  (0) 2006.09.16
    [불펌]JBOSS 소개와 설치 2  (0) 2006.09.07
    [불펌]JBOSS 소개와 설치 1  (0) 2006.09.07
    Tatter tools 설치 - apache 설치  (0) 2006.09.07
    TAG EJB, JSP, 자바