1. java.text. SimpleDataFormat
=> java.util.Data 클래스와 같이 사용되는데 날짜를 원하는 형식의 문자열 포맷으로 변경하거나 날짜가 문자열로 만들어졌을 때 java.util.Data 형식으로 변환해주는 클래스
Data를 String 으로 전환
// Date 객체 생성
Date 변수명 = new Date();
= new Data(Calendar객체.get TimeInMillis());
SimpleDataFormat 포맷객체 = new SimpleDateFormat("포맷 성정");
String 문자열 = 포맷객체.format(날짜객체);
package java0110;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateFormatMain {
public static void main(String[] args) {
//Calendar 객체 생성
//월은 0부터 시작하므로 하므로 하나 적게 써야한다.
Calendar cal = new GregorianCalendar(1992,1,5);
//Calendar 객체를 Date 객체로 변환
Date date = new Date(cal.getTimeInMillis());
//원하는 포맷의 문자열 만들기
//1953년 2월 5일 형식의 문자열 만들기
SimpleDateFormat f = new SimpleDateFormat("yyyy년 MM월 dd일");
String msg = f.format(date);
System.out.println(msg);
}
}
2. java.text.DecimalFormat
=> 숫자 데이터와 같이 사용되는데 숫자를 원하는 형식의 문자열 포맷으로 변경해주는 클래스
숫자를 원하는 포맷의 String으로 변환
DecimalFormat 포맷객체 = new DecimalFormat("포맷 설정");
String 문자열 = 포맷객체.format(숫자);
package java0110;
import java.text.DecimalFormat;
public class DecimalFormatMain {
public static void main(String[] args) {
double money1 = 1234.234;
double money2 = -123.643;
//양수와 음수 포맷 설정
//음수는 괄호로 표현 - 회계분야에서 음수를 괄호로 표시하거나 빨강색으로 표현하는 경우가 있다.
DecimalFormat f = new DecimalFormat("#,###.00;(#,###.00)");
String str1 = f.format(money1);
String str2 = f.format(money2);
System.out.println(str1);
System.out.println(str2);
}
}
3. java.util.Scanner
=> 파일이나 네트워크 및 키보드로부터 입력을 받기 위한 클래스
4. java.time 패키지
=> 시계열 데이터를 표현하기 위한 패키지로 1.8버전에서 추가된 패키지
=> 날짜와 시간을 구분합니다.
=> LocalDate 와 LocalTime 클래스로 구분
=> 날짜와 시간의 간격을 나타내기 위한 Period 와 Duration 클래스도 있습니다.
5. 정규 표현식(Reqular Expression)
=> 문자열의 패턴을 표현하는 식으로 Perl에서 시작되었습니다.
=> 현재 사용되고 대다수의 프로그래밍언어에서 채택하고 있습니다.
=> 대량의 문자열에서 특정한 패턴을 갖는 문자열을 찾을 때 많이 사용하고 문자열이 특정 패턴을 갖고 있는지 확인 하기 위한 용도로 사용합니다.
=> javascript에서 사용자의 입력체크를 하는데도 사용합니다.
=> 문법이 조금 어렵습니다.
package java0110;
public class RegMain1 {
public static void main(String[] args) {
//String 클래스의 matches 메소드를 이용한 패턴 검색
String [] ar = {"cillaprie","김수현","hestamagi87","김영우","knight","도적"};
for(String id : ar) {
//id는 문자로 시작하고 숫자와 문자 5자리 이상
//^ 영어로 시작하는
//숫자나 영어 포함
//5자리 이상의
//특수문자도 포함가능 ex) - 등등
System.out.println(id.matches("^[a-zA-z][0-9a-zA-Z]{5,}"));;
}
}
}
=> Pattern 클래스와 Matcher 클래스를 이용하면 좀 더 다양한 정보를 추출할 수 있습니다.
=> Pattern 클래스는 정규식 객체를 만드는 클래스
=> Matcher 클래스는 정규식 객체를 가지고 문자열을 조회했을 때 결과를 저장하는 클래스
package java0110;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegMain2 {
public static void main(String[] args) {
//정규식 객체 만들기
//a로 시작하고 한글자가 와야하고 c로 끝나는 정규식
//$가 뭘까? 끝나는 문자
// . 은 문자수
Pattern pattern = Pattern.compile("^a...c$");
//검사할 문자열 리스트를 생성
List <String> list = new ArrayList<String>();
list.add("abc");
list.add("abddc");
list.add("bbc");
list.add("abe");
for(String str: list) {
//정규식 검사를 하고 그 결과를 m에 저장
Matcher m = pattern.matcher(str);
System.out.println(m.find());
}
}
}
6. Thread
Process : 실행 중인 프로그램, 독자적으로 수행, 실행 중에 제어권 이동이 안됌
Thread : Process 안에 만들어지는 작업단위
독자적으로는 수행할 수 없음, 실행 중에 제어권 이동이 가능
Tank : Process 와 Thread를 합쳐서 일컫는 용어
MultiProcessing : 프로세스가 2개 이상 동시에 수행되는 것
병렬처리나 분산처리: 프로세서가 여러 개
MultiThreading : 하나의 프로세서가 2개 이상의 스레드를 번갈아 가면서 처리
Thread 클래스, Runnable 인터페이스 : 리턴없음
Collable 인터페이스: 리턴가능
package java0110;
//Thread 클래스를 상속받은 ThreadEx 클래스
class ThreadEx extends Thread{
public void run() {
for(int i=0; i<10; i=i+1) {
try {
System.out.println(getName()+"작업중");
Thread.sleep(1000);
}catch(Exception e) {}
}
}
}
public class ThreadMain1 {
public static void main(String[] args) {
//일반적인 메소드 호출을 이용해서 메소드 수행
ThreadEx th1 = new ThreadEx();
th1.run();
ThreadEx th2 = new ThreadEx();
th2.run();
//스레드를 이용한 호출
ThreadEx th3 = new ThreadEx();
th3.setName("하이");
th3.start();
ThreadEx th4 = new ThreadEx();
th4.setName("Hello");
th4.start();
}
}
7. .스레드를 생성하는 방법
1) java.lang.Thread 클래스를 이용하는 방법
=>Thread 클래스를 상속하는 클래스를 생성
=>run 메소드를 재정의합니다.
=>클래스의 객체를 생성해서 start()를 호출하면 됩니다
package java0110;
//Thread 클래스로부터 상속받는 클래스
class ThreadEx1 extends Thread{
//run 메소드 재정의
//스레드로 수행할 내용 작성
public void run() {
for(int i=0; i<10; i=i+1) {
try {
Thread.sleep(1000);
System.out.println("Hello Java");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class ThreadMain2 {
public static void main(String[] args) {
//Thread를 상속받은 클래스의 객체를 생성
ThreadEx1 th1 = new ThreadEx1();
//스레드로 시작
th1.start();
ThreadEx1 th2 = new ThreadEx1();
//스레드로 시작
th2.start();
}
}
2) Runnable 인터페이스를 이용하는 방법
=>Runnable 인터페이스를 구현하는 클래스를 생성
=>run 메소드를 재정의합니다.
=>클래스의 객체를 생성
=>Thread 객체의 생성자에 앞에서 만들 객체를 대입해서 Thread 객체를 객체를 생성해서 start()를 호출하면 됩니다.
package java0110;
//Runnable 인터페이스를 implements 한 클래스
class ThreadEx2 implements Runnable{
@Override
public void run() {
for(int i=0; i<10; i=i+1) {
System.out.println("인터페이스를 이용한 스레드");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class ThreadMain3 {
public static void main(String[] args) {
//Runnable 인터페이스를 implemetns 한 클래스의 객체 만들기
ThreadEx2 t1 = new ThreadEx2();
ThreadEx2 t2 = new ThreadEx2();
//위의 객체를 이용해서 Thread 객체를 생성
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
th1.start();
th2.start();
}
}
3) annonymous class를 이용하는 방법
annonymous class: 클래스나 인터페이스를 상속받을 때 상속받는 클래스를 만들지 않고 바로 상속받는 객체를 생성해서 사용하는 방법으로 클래스나 인터페이스를 상속받아서 1번만 사용하는 경우 메모리를 절약하기 위해서 사용하는 방법
클래스이름이나 인터페이스이름 변수 = new 클래스이름이나 인터페이스 이름(){
필요한 메소드를 정의
};
package java0110;
public class ThreadMain4 {
public static void main(String[] args) {
//Thread 클래스를 상속하는 annoymous class 생성
Thread th1 = new Thread() {
public void run () {
for(int i=0; i<10; i=i+1) {
System.out.println("anonymous class");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
th1.start();
Runnable r1 = new Runnable() {
public void run() {
for(int i=0; i<10; i=i+1) {
System.out.println("anonymous class");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Thread th = new Thread(r1);
th.start();
}
}
8. Daemon Thread
=> Daemon이 아닌 스레드가 1개도 없으면 자동으로 중지되는 스레드
=> 다른 스레드를 도와주는 보조적인 역할을 수행하는 스레드
=> 응용 프로그램에서 자동 저장이 대표적인 Daemon
=> start( ) 를 호출하기 전에 setDaemon(true)로 설정
9. 스레드 종료
1) run 메소드의 수행 종료
2) Interrupted Exception 이 발생한 경우 return 하도록 작성하고 Thread 객체가 interrupt( ) 호출
10. Priority (우선순위)
=> Thread 도 우선순위 설정이 가능
=> 우선순위를 리턴하는 메소드는 getPriority( )
=> 우선순위를 설정하는 메소드는 setPriority(int value)
=> 기본 값은 중간
=> 설정할 때는 1~10까지의 정수로 설정할 수 있지만 Thread 클래스의 static 필드(변수)이용을 권장
=> Thread MAX_PRIORITY
MIN
NORM
=> 우선순위는 10이 높은 것
11. MultiThread
=> 2개 이상의 Thread가 동작 중인 상황
1) 동시에 수행되는 개수는? Traching : Overhead가 커지는 현상
2) Overhead => 실제 작업을 수행하는 것이 아닌 시간이나 자원
ex) 식당까지 가는데 걸리는 시간(실제 식사하는 시간이 아닌)
3) 상호배제(Mutual Exclusion)
=> 하나의 스레드가 수정하고 있는 자원을 다른 스레드가 수정하면 안된다.
=>java에서는 메소드를 synchronized로 만들어서 독립적으로 동작하는 메소드를 만들면 해결할 수 있습니다.
12. Critical Section
=> 공유 자원을 사용하는 영역
=>공유 자원을 사용하는 코드 영역(Critical Section - 임계영역)을 synchronized 블럭으로 만들어서 자원을 공유해서 생기는 문제점을 해결할 수 있습니다.
13. notify( ) & wait( )
생산자가 notify 를 해주는것. 알림!
14. Semaphore => 동시에 수행되는 개수 설정
15. Dead Lock => 무한 대기
package java0110;
public class Account {
public static int balance = 100000;
}
package java0110;
//Thread 클래스로부터 상속받는 클래스
public class ThreadBal extends Thread {
//Account.balance의 값을 출력하고
//1000을 빼고 1초 대기 후
//Account.balance 값을 출력하는 메소드
//리턴타입은 void 이고 매개변수도 없는 메소드
public void show_bal(){
System.out.println(getName()+"의 현재잔액(찾기전):"+Account.balance);
Account.balance= Account.balance-1000;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(getName()+"의 현재잔액(찾은후):"+Account.balance);
}
public void run() {
//show_bal 2번 호출
for(int i=0; i<2; i=i+1) {
show_bal();
}
}
}
package java0110;
public class ThreadMain5 {
public static void main(String[] args) {
//Thread 클래스로부터 상속받은 ThreadEx 클래스를 스레드로 동작
ThreadBal t1 = new ThreadBal();
t1.start();
ThreadBal t2 = new ThreadBal();
t2.start();
}
}
package java0110;
public class ShareData implements Runnable {
//합의 결과를 저장할 변수
private int result;
//1부터 계속 증가할 인덱스 변수
private int idx;
//idx의 값을 10000번 증가시키면서 result에 더해주는 메소드
//synchronized 나 끝나면 해
public synchronized void sum() {
for(int i=0; i<10000; i=i+1) {
idx = idx + 1;
try {
Thread.sleep(1); //다른 Thread로 넘어갈 수 있다.
}catch(Exception e) {}
result=result+idx;
}
}
@Override
public void run() {
sum();
}
public int getResult() {
return result;
}
}
package java0110;
public class ThreadMain6 {
public static void main(String[] args) {
ShareData data = new ShareData();
Thread th1 = new Thread(data);
th1.start();
Thread th2 = new Thread(data);
th2.start();
//30초 대기
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//data의 result 값 출력
System.out.println(data.getResult());
}
}
'IT > JAVA (17.12.18~)' 카테고리의 다른 글
18일 JAVA(18) (0) | 2018.01.12 |
---|---|
17일 JAVA(17) (0) | 2018.01.11 |
15일 JAVA(15) (0) | 2018.01.10 |
14일차 JAVA(14) (0) | 2018.01.09 |
13일차 JAVA(13) (0) | 2018.01.05 |