연산자란 변수에 값을 대입하거나 변수의 값을 변경하는데 사용하는 표현식을 말한다.

연산자에는 산술연산자, 증감연산자, 대인연산자, 연산 후 대입 연산자 , 관계연산자, 논리연산자, 비트연산자, 삼항연산자 등이 존재 한다.

  1. 산술연산자 : 수학적 연산과 관련한 연산자를 말하며 산칙연산자라고도 한다.

    산술연산자의 종류에는 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%) 등의 연산자가 있다.

    산술연산자의 우선 순위는 기본적인 사칙연산의 우선순위와 동일하다.

  2. 증감연산자 : 사용 변수의 앞이나 뒤에 붙어서, 변수의 값을 1 증가시키거나 감소시킬 때 사용한다.

          주로 제어문중 for / while 등의 반복문에서 많이 사용된다.

    증감 연산자의 종류로는 ++ 와 -- 가 있다.

    증감 연산자 사용 시, 변수의 앞 부분에 증감 연산자가 붙은 경우 해당 변수를 실행하기 전에 1 증가하거나 감소한 후 실행하게되며, 증감 연산자가 변수의 뒷부분에 붙은 경우에는 변수를 수행한 후 1 증가하거나 감소 시킨다.

    작성 예제)

    int x = 1;                     int x = 1;

    int y = ++x;                   int y = x++;

    결과 값 : x = 1 / y = 2         결과값 : x = 2 / y = 1

  3. 대입연산자 : 연산후 값을 변수에 대입하는 연산자이다.

          대입 연산자로는 '='를 사용한다.

    기호와 역할 : 기호는 "=", '변수1=변수or상수' 연산자 왼쪽에 할당된 변수나 상수, 혹은 연산 결과의 값을 오른쪽 변수에 대입하는 동작을 한다.
    작성 예제)

    a = 4; //대입 연산자 사용시 a변수에 4라는 값이 대입 된다.
    주의점 : = 연산자의 오른쪽에 일반적으로 상수 값을 적용하지 않는다.

  4. 연산후 대입연산자 : 연산자와 대입 연산자를 결합하여 사용한다.

    연산 후 대입 연산자의 경우 산술 연산자 및 비트연산자와 대입 연산자를 합쳐서 사용한다.

    작성 예제)

    int x = 1;

    int y = 0;

    y += x;      (y = y + x; 의 의미)

  5. 관계연산자 : 두 피연산자 사이의 값을 크기 또는 관계를 비교하는 연산자로서 true, false 로 구분한다.

    관계 연산자의 종류는 다음과 같다.

     

    연산자

    연산식

    설명

    A > B

    A B보다 크면 참

    >=

    A >= B

    A B보다 크거나 같으면 참

    A < B

    A B보다 작으면 참

    <=

    A <= B

    A B보다 작거나 같으면 참

    ==

    A == B

    A B가 같으면 참

    !=

    A != B

    A B가 다르면 참

    instance of

    A instance of B

    A B의 인스턴스이면 참

  6. 논리연산자 : 두개의 논리값을 평가하여 true, false 의 논리형 결과를 반환하는 연산자를 말한다.

     

    연산자

    연산식

    설명

    !

    !A

    A가 거짓(false)이면 참(true)

    &&

    A&&B

    A B가 모두 참이면 참
    A
    이 거짓이면 B를 평가하지 않음

    ||

    A|| B

    A이나 B 둘 중 하나라도 참이면 참
    A
    이 참이면 B를 평가하지 않음

    &

    A & B

    A B가 모두 참이면 참
    A
    이 거짓이어도 B를 평가함

    |

    A | B

    A이나 B 둘 중 하나라도 참이면 참
    A
    이 참이어도 B를 평가함

     

    C/C++ 언어에서와 마찬가지로 자바에서는 논리 연산자 ‘&&’ 또는 ‘||’를 사용하여 논리 연산을 수행할 때, ‘short circuit’ 법칙을 적용한다. 이는 ‘&&’ 연산에서는 피연산자 중 하나라도 거짓이면 전체 논리식은 거짓이 되고, ‘||’ 연산에서는 피연산자 중 하나라도 참이면 전체 논리식은 참이 된다는 특성을 이용하는 것이니다.

    자바 언어에서 논리식은 왼쪽에서 오른쪽으로 평가되는데, ‘&&’ 연산의 경우 왼쪽에서부터 평가해 갈 때, 하나의 피연산자라도 거짓이면, 나머지 피연산자를 평가할 필요도 없이 전체 논리식은 거짓이 되므로 더 이상 논리식을 평가하지 않게 된다.

    또한, ‘||’ 연산의 경우 왼쪽에서부터 평가해 갈 때, 하나의 피연산자라도 참이 나오면, 나머지 피연산자를 평가할 필요도 없이 전체 논리식은 참이 되므로 더 이상 논리식을 평가하지 않는다. 이를 ‘short circuit’ 이라 합니다.

    이러한 ‘short circuit’ 법칙은 프로그램 개발자에게 혼동을 줄 수 있고, 착각을 일으킬 수 있는데, 자바에서는 개발자의 실수를 줄이기 위해, ‘short circuit’ 법칙을 적용하지 않는 ‘&’와 ‘|’ 연산자를 제공해 주고 있다.

  7. 비트연산자 : 데이터를 비트 단위로 처리할 수 있는 연산자를 말한다.( 정수형 자료에서만 사용 )

    • 정수형 데이터 표현방식(bit 연산을 하는데 있어서)
          - 정수형 데이터가 자바에서 2진수로 2의 보수로 표현한다.
          - 양수 : 일반적인 2진수 정수형으로 표현
          - 음수
                 ① 1의 보수를 한다. (양수 데이터 비트 반전)
                 ② 2의 보수를 한다. (1의 보수 후 1을 더한다.)
                 ex) 1을 음수로 만들기 :1(0000 0001) → ①번 적용(1111 1110) → ②번적용(1111 1111) 결과: -1
                       중요 : 왼쪽 비트가 1이면 음수, 0이면 양수
    • 비트논리(Bitwise) 연산 : 변수의 각 비트 값에 논리곱(AND), 논리합(OR), XOR 연산을 한다.
         ① AND(논리곱) : 연산대상1 & 연산대상2 = 연산대상1 x 연산대상2
            작성예제)
            byte bi = 0x11; //0001 0001
            byte bi2= 0x22; //0010 0010
            int a= bi&bi2 //0000 0000
            답 : 0 (10진수)   
         ② OR연산(논리합) : 연산에 사용되는 비트의 값이 하나라도 1인 경우 결과값이 1이다.
            작성예제)
            byte bi = 0x11; // 0001 0001
            byte bi2= 0x22; // 0010 0010
            int a=bi|bi2 // 0011 0011(bi와 bi2의 OR연산, '|'는 가격표시 쉬프트 키)
            결과 : 51 (10진수)
         ③ XOR연산 : 연산에 사용되는 비트의 값이 두 값이 다른 경우에는 1, 같은 경우에는 0이 결과 값이 되는 연산 연산대상1 
                            연산대상2 결과값 
            작성예제)
            byte bi = 0x31; //0011 0001
            byte bi2= 0x22; //0010 0010
            int c=bi^bi2 //0001 0011
            결과 : 19 (10진수)
    • 비트 이동 연산자(Shift 연산)
      - 주의점 : 비트 연산중의 하나로서 정수형 데이터만이 이 연산자를 사용할 수 있다. 시프트연산자라고도 함.
      - 연산자 기능 
            ' <<  ' 왼쪽으로 정해진 숫자만큼 비트이동, 0을 나머지 비트에 채움 
            ' >>  ' 오른쪽으로 정해진 숫자만큼 비트이동, 부호와 같은 비트 채워 넣음, 양수는 0 음수는 1 
            ' >>> ' 오른쪽으로 정해진 숫자만큼 비트이동, 부호 비트와 상관없이 0을 채움

  8. 삼항연산자 : 조건 연산자라고도 한다. 조건문을 대신해서 사용된다. 대부분 대입 연산자와 같이 사용되는 경우가 많다.

    사용법 : 변수 = (조건) ? 값1 : 값2
    조건이 참이면 값1이 변수에 대입, 거짓이면 값2가 변수에 대입.


연산자의 우선 순위는 다음과 같다. 연산자의 수행 시 여러 연산자가 혼용된 경우 연산자의 우선순위에 따라 수행하도록 한다.

1

 ( ), [ ]

2

 ++, --, ~, (+), (-)

3

 *, / ,%

4

 +, -

5

 >>, <<, >>>

6

 <, <=, >=, >

7

 ==, !=

8

 &

9

 ^

10

 |

11

 &&

12

 ||

13

 expr?op1:op2

14

 =, +=,-=, *=, /=, %=



출처 - http://jmonster.springnote.com/pages/902844




'Development > JavaEssential' 카테고리의 다른 글

java - override  (0) 2012.11.03
java - 배열(Array)  (0) 2012.10.25
java - 반복문  (0) 2012.10.03
java - 변수  (0) 2012.09.24
String과 StringBuffer의 성능에 대해서...  (0) 2012.05.02
Posted by linuxism
,


JDK1.3에 새롭게 추가된 java.util.Timer 클래스를 사용하여 이벤트의 실행을 제어하는 것에 대해서 알아본다.

java.util.Timer 클래스와 java.util.TimerTask 클래스

유닉스나 리눅스에서 특정 시간에 어떤 프로세스를 실행시키고자 할 경우에 많이 사용되는 것이 cron 명령어와 at 명령어이다. 이 두 명령어는 임시 파일을 주기적으로 삭제하거나 중요 데이터를 일정 주기로 백업하고자 할 때 많이 사용된다. 윈도우 2000 서버 역시 이와 비슷한 기능을 제공하고 있다. 하지만, 아쉽게도 JDK1.2 까지는 유닉스나 리눅스의 cron 이나 at 명령어와 비슷한 기능을 수행하기 위해서는 개발자가 직접 쓰레드를 이용하여 구현해주어야 했다.

하지만, JDK1.3에 새롭게 추가된 클래스인 java.util.Timer 클래스와 java.util.TimerTask 클래스를 사용하면 이런 기능을 매우 손쉽게 구현할 수 있게 된다. 이 글에서는 Timer 클래스와 TimerTask 클래스에 대해서 알아보고, 어떻게 사용될 수 있는 지 예를 통해 살펴보자.

java.util.Timer 클래스는 백그라운드에서 특정한 시간 또는 일정 시간을 주기로 반복적으로 특정 작업을 실행할 수 있도록 해 준다. Timer 클래스는 크게 다음과 같이 세 가지 종류의 메소드를 제공한다.

  • schedule
  • scheduleAtFixedRate
  • cancel
위에서 schedule() 메소드는 특정한 시간에 원하는 작업을 수행하고자 할 때 사용하는 메소드로 다음 표와 같이 4가지 형태가 존재한다.

voidschedule(TimerTask task, Date time)
지정한 시간(time)에 지정한 작업(task)을 수행한다.
voidschedule(TimerTask task, Date firstTime, long period)
지정한 시간(firstTime) 부터 일정 간격(period)으로 지정한 작업(task)을 수행한다.
voidschedule(TimerTask task, long delay)
일정 시간(delay)이 지난 후에 지정한 작업(task)을 수행한다.
voidschedule(TimerTask task, long delay, long period)
일정 시간(delay)이 지난 후에 일정 간격(period)으로 지정한 작업(task)을 수행한다.
schedule() 메소드 중에는 지정한 시간부터 작업을 수행하는 것이 두 개 존재한다. 이 두 메소드는 지정한 시간이 현재 시간보다 과거일 경우 바로 TimerTask 작업을 수행한다. 그리고 schedule() 메소드에서 일정 간격으로 작업을 수행하는 메소드가 있는데, 이들 메소드는 fixed-delay 방식으로 작업을 진행한다. fixed-delay 방식은 만약 선행 작업이 가비지 콜렉션이나 기타 다른 이유 때문에 지연될 경우 그 다음에 수행되는 작업의 시작이 그 시간만큼 지연된다. 따라서, schedule() 메소드는 일정 주기로 실행되는 작업들이 정확한 시간에 실행될 필요가 없는 경우에 알맞다.

정확하게 일정 시간 간격으로 작업을 실행하기 위해서는 scheduleAtFixedRate() 메소드를 사용해야 한다. scheduleAtFixedRate() 메소드는 fixed-rate 방식으로 작업을 진행한다. fixed-rate 방식은 선행 작업이 지연되는 여부에 상관없이 지정된 시간에 작업을 실행한다. 따라서, 정확하게 특정 시간 마다 실행해야 하는 작업의 경우에는 schedule() 메소드가 아닌 scheduleAtFixedRate() 메소드를 사용하는 것이 좋다. 다음 표는 scheduleAtFixedRate() 메소드를 정리한 것이다.

voidscheduleAtFixedRate(TimerTask task, Date firstTime, long period)
지정한 시간(firstTime)부터 일정 간격(period)으로 지정한 작업(task)을 수행한다.
voidscheduleAtFixedRate(TimerTask task, long delay, long period)
일정한 시간(delay)이 지난후에 일정 간격(period)으로 지정한 작업(task)을 수행한다.
Timer 클래스는 스케쥴을 중지할 수 있도록 cancel() 메소드를 제공한다. cancel() 메소드는 Timer를 중지시키며, 실행될 예정인 모든 작업을 취소한다. 하지만, 현재 실행되고 있는 TimerTask 작업에 대해서는 영향을 미치지는 않는다.

이제 TimerTask 클래스에 대해서 알아보자. TimerTask 클래스는 Timer 클래스가 수행할 작업을 나타낸다. TimerTask 클래스는 Runnable 인터페이스를 implements 하고 있으며, 그 외에 몇 가지 필요한 메소드를 정의하고 있다. 다음 표는 TimerTask 클래스가 제공하고 있는 메소드를 정리한 것이다.

booleancancel()
이 TimerTask 작업을 취소한다.
abstract voidrun()
이 TimerTask가 실행할 작업
longscheduledExecutionTime()
가장 최근에 이 작업이 실행된 시간을 리턴한다.
TimerTask 클래스를 보면 추상 메소드인 run()이 있는데 개발자는 TimerTask 클래스를 상속받은 후에 run() 메소드를 알맞게 구현해주면 된다.

간단한 예제

간단하게 Timer 클래스를 사용하여 3초마다 문자열을 현재 시간을 출력해주는 프로그램을 작성해보자. 이 프로그램은 다음과 같다.

import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;

public class PrintTimer {
   
   public static void main(String[] args) {
      ScheduledJob job = new ScheduledJob();
      Timer jobScheduler = new Timer();
      jobScheduler.scheduleAtFixedRate(job, 1000, 3000);
      try {
         Thread.sleep(20000);
      } catch(InterruptedException ex) {
         //
      }
      jobScheduler.cancel();
   }
}

class ScheduledJob extends TimerTask {
   
   public void run() {
      System.out.println(new Date());
   }
}

PrintTimer는 main() 메소드에서 Timer 객체를 생성한 후, scheduleAtFixedRate() 메소드를 사용하여 1초 후부터 3초 간격으로 ScheduledJob 클래스의 run() 메소드를 실행한다. PrintTimer 클래스를 실행해보면 다음과 같은 결과가 출력될 것이다.

Fri Apr 13 15:26:47 GMT+09:00 2001
Fri Apr 13 15:26:50 GMT+09:00 2001
Fri Apr 13 15:26:53 GMT+09:00 2001
Fri Apr 13 15:26:56 GMT+09:00 2001
Fri Apr 13 15:26:59 GMT+09:00 2001
...

Daemon Thread?

Timer 클래스의 기본 생성자(즉, 파라미터가 없는 생성자)를 사용하여 Timer 클래스를 생성할 경우 Timer 클래스와 관련된 작업을 실행할 때 사용되는 쓰레드는 데몬 쓰레드로 실행되지 않는다. 데몬 쓰레드로 실행되지 않는다는 것은 Timer 객체와 관련된 클래스가 종료되지 않는 한 어플리케이션의 실행이 끝나지 않는다는 것을 의미한다. 따라서 앞에 예제에서도 cancel() 메소드를 사용하여 강제적으로 Timer 클래스와 관련된 쓰레드의 실행을 종료했었다. 실제로 앞의 PrintTimer 예제에서 jobScheduler.cancel() 부분을 삭제한다면 어플리케이션은 종료하지 않고 계속해서 실행될 것이다.

하지만, 때때로 Timer 클래스와 관련된 쓰레드를 데몬 쓰레드로 실행하고 싶은 경우가 있다. 이런 경우를 위해 Timer 클래스는 데몬 쓰레드로 지정할 지의 여부를 입력받을 수 있는 생성자를 제공하고 있다. 이 생성자는 boolean 값을 갖는 한 개의 파라미터를 입력받는다. 이 때, boolean 값이 true이면 Timer 클래스와 관련된 쓰레드들은 데몬 쓰레드로 설정된다. 예를 들어, 다음의 NewPrintTimer 클래스를 살펴보자.

import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;

public class NewPrintTimer {
   
   public static void main(String[] args) {
      NewScheduledJob job = new NewScheduledJob();
      Timer jobScheduler = new Timer(true);
      jobScheduler.scheduleAtFixedRate(job, 1000, 3000);
      try {
         Thread.sleep(20000);
      } catch(InterruptedException ex) {
         //
      }
      // cancel() 메소드를 호출하지 않는다.
   }
}

class NewScheduledJob extends TimerTask {
   
   public void run() {
      System.out.println(new Date());
   }
}

NewPrintTimer 클래스의 mani() 메소드를 살펴보면 Timer 클래스를 생성할 때 Timer(true) 생성자를 사용하여 Timer 객체와 관련된 쓰레드를 데몬으로 설정하고 있으며, Timer 클래스의 cancel() 메소드를 호출하지 않고 있다. main() 메소드의 실행이 끝나게 되면 Timer 클래스와 관련된 쓰레드는 모두 데몬 쓰레드이기 때문에 어플리케이션은 종료하게 된다. 실제로 NewPrintTimer를 실행해보면 이 사실을 확인할 수 있다.

결론

java.util.Timer 클래스와 java.util.TimerTask 클래스를 사용하여 반복적으로 또는 특정한 시간에 원하는 작업을 실행할 수 있게 되었다. JDK1.3 이전에는 이러한 기능을 언어 차원에서 지원하지 않았기 때문에 필요할 경우 개발자가 직접 구현을 해 주어야 했었지만, 이제는 매우 손쉽게 구현할 수 있게 되었다. 이제 개발자들은 이 두 클래스를 사용하여 좀더 간단하고 좀더 빠르게 시간과 관련해서 스케쥴링이 필요한 기능을 구현할 수 있을 것이다.


출처 - http://javacan.tistory.com/entry/29




Posted by linuxism
,


시꺼먼 cmd창에서 adb 명령어에 적응안되는 사람들을 위한 데이터베이스 를 쉽게 볼 수 있는 GUI 프로그램.

프로그램 용량도 작으며, 데이터 추가하는 일들도 쉽게 마우스만으로도 조작이 가능하다.

다운로드 링크
http://sourceforge.net/projects/sqlitebrowser/


물론 에뮬레이터에서 db 파일을 꺼내고, 다시 집어 넣을 수 있다.


이클립스에서는 db 확인하는 인터페이스가 없으므로,
파일을 꺼내어서 SQLite DataBase Browser 로 불러 들여 데이터를 확인하는데 편리하다.

조작이 간단하며, 매우 편리하다.

사용자 삽입 이미지


출처 - http://stbaeya.com/tc/230?TSSESSIONstbaeyacomtc=697919e934be2cf159d6a4bf632f3c01




Posted by linuxism
,