패킷통신을 사용하는 프로그램을 짜던 중 전송한 패킷의 무결성을 위해 CRC 값을 붙여 전송해야 할 일이 생겼다.

이 참이 바이트 배열을 합치는 방법에 대해 포스팅 해 본다.


이 때 사용되는 함수는 System.arraycopy이다.

아래 코드는 byte 배열을 받아 마지막 2 byte에 0x12, 0x34를 붙여 주는 함수이다.

1
2
3
4
5
6
7
8
9
10
11
12
  
public byte[] addPacket(byte[] origin)
{               
    byte[] packet_data = new byte[origin.length + 2];
    byte[] addPacket = {0x12, 0x34};
 
    System.arraycopy(origin, 0, packet_data, 0, origin.length);
    System.arraycopy(addPacket, 0, packet_data, origin.length, 2);
         
    return packet_data;
}
  


인터페이스란
 - 표준명세서의 역활
 - 상수와 추상메소드만 존재(abstract는 생략가능)
 - interface를 implements 한 클래스는 반드시 추상메소드를 Override(재구현)해주어야 한다.
 - Override(재구현) 할때 반드시 public를 붙여야 한다.
 - 다중상속이 가능
 - 상속과 같이 쓰일때는 extends, implements 순서로 쓴다.


extends(상속)와 interface(인터페이스) 사용 차이점

1. class B extends A{}                         //참 : 클래스끼리는 extends가 가능하다
2. class B implements InterA{}              //참 : 인터페이스는 클래스에 implements가 가능하다
3. class B implements A{}                    //거짓 : 클래스끼리는  implements 할 수 없다
4. class B extends InterA{}                   //거짓 : 인터페이스는 클래스에 extends 할 수 없다
5. interface InterB  extends A{}              //거짓 : 클래스는 인터페이스에 extends 할 수 없다
6. interface InterB  implements InterA{}   //거짓 : 인터페이스끼리는 implements 할 수 없다
7. interface InterB  implements A{}         //거짓 : 클래스는 인터페이스에 implements 할 수 없다
8. interface InterB  extends InterA{}        //참 : 인터페이스끼리는 extends가 가능하다

자바 API의 java.awt.event.WindowListener에 위치하는 인터페이스이다.
윈도우창의 닫기, 큰화면, 작은화면, 내리기 등을 담당한다.

사용예시
 //WindowListener override
 public void windowActivated(WindowEvent e) {}
 public void windowClosed(WindowEvent e) {}
 public void windowClosing(WindowEvent e) {
  System.out.println("윈도우 종료...");   //윈도우창 X버튼 클릭할 때
  System.exit(0);
 }
 public void windowDeactivated(WindowEvent e) {}
 public void windowDeiconified(WindowEvent e) {}
 public void windowIconified(WindowEvent e) {}
 public void windowOpened(WindowEvent e) {}

자바 API의 java.awt.event.MouseListener
                java.awt.event.MouseMotionListener에 위치하는 인터페이스이다.
윈도우창 생성시 마우스가 담당하는 기본적인 기능을 담당한다.

사용예시

//MouseListener Override
 public void mouseClicked(MouseEvent e) {
  System.out.println("마우스 클릭");   //윈도우창안을 클릭할 때
 }
 public void mouseEntered(MouseEvent e) {
  System.out.println("마우스 인");      //윈도우창 안으로 마우스 포인트가 들어올 때
 }
 public void mouseExited(MouseEvent e) {
  System.out.println("마우스 아웃");   //윈도우창 밖으로 마우스 포인트가 나갈 때
 }
 public void mousePressed(MouseEvent e) {}
 public void mouseReleased(MouseEvent e) {}
 
 //MouseMotionListener Override
 public void mouseDragged(MouseEvent e) {
  System.out.println("마우스 드레그");  //윈도우창 안을 마우스로 드레그 할 때
 }
 public void mouseMoved(MouseEvent e) {}
 public static void main(String[] args){
  new WindowTest().init();
 }
자바 API의  java.awt.event.ActionListener 에 위치하는 인터페이스이다.
액션 리스너는 윈도우창안에 있는 버튼의 엑션을 지정하는데 사용된다.

사용 예시
public void actionPerformed(ActionEvent e){
    if(e.getSource()==exitB) System.exit(0);   //exitB는 임의로 만든 버튼이름이다
}

원하는 패턴으로 출력하는데 사용한다.

다음은 5백만원을 입력하여 환율 1195원이라는 가정하에 "$#,###,00 형태로 출력하는 예제이다

import java.text.NumberFormat;
import java.text.DecimalFormat;

class Money{
 
 public String toDoller(int a){
  
  NumberFormat nf = new DecimalFormat("$#,###.00");
  return nf.format(a/1195.0);
 }

 public static void main(String[] args){
  System.out.println("5,000,000원 = "+new Money().toDoller(5000000));
 }
}

NumberFormat에 DecimalFormat을 사용한다.
("#,###,00")으로 입력하면 소수점까지 고정으로 표현하여 준다.
소수점이 있으면 표기해주고 없으면 안해주게 하고 싶으면 ("#,###,##")으로 하면된다.

출력값


 

: casting(형변환)이 되는지 안되는지를 판별
: 객체에 원하는 클래스타입이 메모리 할당되었는지 안되었는지를 확인

class AA{}
class BB extends AA{}

class InstanceOf{
 public static void main(String[] args) {
  AA aa = new AA();
  BB bb = new BB();
  AA aa2 = new BB();

  AA aa3 = aa;
  if(aa instanceof AA)  //aa객체속에는 AA클래스가이 생성되어 있다.
   System.out.println("1. TRUE");   //참값이 나온다.
  else
   System.out.println("1. FALSE");

  AA aa4 = bb;
  if(bb instanceof AA) //bb객체속에는 AA클래스가 생성되어 있다.
   System.out.println("2. TRUE");   //참값이 나온다.
  else
   System.out.println("2. FALSE");

  // BB bb2 = (BB)aa;  //형변환해도 안된다.
  if(aa instanceof BB)
   System.out.println("3. TRUE");  
  else
   System.out.println("3. FALSE");   //거짓값이 나온다.

  BB bb3 = (BB)aa2;  //형변환하면 된다.
  if(aa2 instanceof BB)
   System.out.println("4. TRUE");   //참값이 나온다.
  else
   System.out.println("4. FALSE");

 }
}



 

- Java의 최상위 클래스
- Java의 모든 클래스는 Object로 부터 상속받는다
- extends Object라고 직접 쓰지 않아도 된다
- Object에서는 == , equals() 가 모두 참조값(reference) 만으로 비교한다.
    단, String만이 equals()가 내용을 비교한다


String의 경우 다음과 같을 때,

String a = new String("hello");
String b = a;
String c = new String("hello");

a에는 hello값을 임의의 100이란 공간에 저장   //100은 제가 임의로 정한 번지수...
b에는 a가 저장된 공간 값이 들어간다.
c에는 hello값을 임의의 200란 공간에 저장한다.  //200은 제가 임의로 정한 번지수...

따라서 a.equal(c)는 참이다. a==b는 저장된 번지가 같으므로 참
하지만 a==c는 거짓이 된다.



다음으로 Object가 다음과 같을때,

Object a = new Object ();
Object b = a;
Object c = new Object ();

a에는 100이란 공간이 할당된다   //100은 제가 임의로 정한 번지수... 
b에는 a의 저장된 공간의 값이 들어간다.
c에는 200이란 공간이 할당된다  //200은 제가 임의로 정한 번지수...

따라서 a==b는 저장공간의 값이 같으므로 참, a==c는 저장공간이 다르므로 거짓
a.equals(c)는 String의 경우 안의 값이 비교되지만 object의 경우 ==와 같은 연산이므로 거짓이 된다.

this & this()
 - this 는 자신의 클래스의 참조값을 갖고 있다
 - this() 는 Overload된 다른 생성자를 호출 할 수 있다.
 - this()는 생성자의 첫줄에 써야 한다.

super & super()
 - super 는 부모클래스의 참조값을 갖고 있다.
 - super() 는 부모클래스의 생성자를 호출 할 수 있다.
 - super() 는 생성자의 첫줄에 써야 한다.

import java.util.Random;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Lotto{

 int lotto[] = new int[6];

 public void init(){
  Random rd = new Random();  //클래스 생성

  for(int i=0; i<6; i++){
  lotto[i] = rd.nextInt(45)+1;  //1~45까지의 난수 발생
   for(int j=0; j<i; j++){
    if(lotto[i] == lotto[j]){  //중복되는 수가 나오면 다시 돌리기
     i--; break;
    }//if
   }//for j
  } //for i

 } //init

 public void sort(){  //생성된 6개의 수 오름차순 정렬
  for(int i=0; i<6; i++){
   for(int j=0; j<i; j++){
    if(lotto[j] >lotto[i]){
     int temp = lotto[i];
     lotto[i] = lotto[j];
     lotto[j] = temp;
    } //if
   } //for j
  } //for i
 } // sort

 public void disp(){
  for(int i=0; i<6; i++){
   System.out.print(lotto[i]+"\t");
  }//for i
 }//disp

 public static void main(String[] args) throws IOException {

  Lotto lt = new Lotto();
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  System.out.print("몇장사시겠습니까? : ");
  int su = Integer.parseInt(br.readLine());
  System.out.println();

  for(int i=0; i<su; i++){
   lt.init();
   lt.sort();
   lt.disp();
   System.out.println();
  }

 }
}

+ Recent posts