IT/JAVA (17.12.18~)

16일 JAVA(16)

만두토끼 2018. 1. 10. 12:35

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