-
11/23 java 기초 마지막 날!JAVA 2021. 11. 23. 21:18
이십 며칠 동안 자바 기초를 다졌는데 오늘 마무리를 짓는다고 하신다.
선생님도 신혼 여행에서 다시 돌아오셨고~
18일차에 배운 Regex를 복습.
package regex.pattern;import java.util.regex.Matcher;import java.util.regex.Pattern;public class RegexEx01 {public static void main(String[] args) {/*# 정규 표현식 (regular expression)- 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어입니다.- 지정한 패턴과 일치하는 문자열을 검증할 수 있습니다.# Pattern 클래스- 정규 표현식을 다루는 클래스입니다# Matcher 클래스- 패턴을 이용하여 대상 문자열을 검색할 때 사용하는 클래스입니다.*/String info = "30세/서울시 마포구/02-123-4567/010-2345-6789/kkk@naver.com";/*전화번호 형식\\d: 숫자 형식인지를 파악합니다.\\\d{3}: 숫자 3개를 찾습니다.\\d{3,4}: 숫자가 3이상 4이하를 찾습니다.*/String pattern = "\\d{2,3}-\\d{3,4}-\\d{4}";//비교 및 검증이 가능한 정규 표현식을 만들어 내는 메서드입니다.Pattern p = Pattern.compile(pattern);//데이터를 비교해서 Matcher 클래스로 반환합니다.Matcher m = p.matcher(info);if(m.find()) {System.out.println("시작 인덱스: " + m.start());System.out.println("끝 인덱스: " + m.end());System.out.println("찾은 값: " + m.group());}/*이메일 형식\\w: 영문자와 숫자를 찾습니다.\\w+: 영문자와 숫자 여러 개를 찾습니다.*/String pattern2 = "\\w+@\\w+.\\w+";Matcher m2 = Pattern.compile(pattern2).matcher(info);while(m.find()) {System.out.println("시작 인덱스: " + m2.start());System.out.println("끝 인덱스: " + m2.end());System.out.println("찾은 값: " + m2.group());}}}이것을 기반으로 선생님께서 문제를 내 주셨다.
/*
* 가격 형식만 찾아서 순서대로 출력해 보세요.
ex)
4,500원...
두 패턴을 모두 만족시킬 정규 표현식을 작성해야 합니다.
*: 0회 이상 반복: 있어도 되고 없어도 되는 경우
*/package regex.pattern;import java.util.regex.Matcher;import java.util.regex.Pattern;public class RegexQuiz01 {public static void main(String[] args) {String str = "헠4,500원 힣~ 1,200원엌? 6000원엨 120000원";String pattern = "\\d+,*[0-9]+원";Matcher m = Pattern.compile(pattern).matcher(str);while(m.find()) {System.out.println(m.group());}}}이렇게 코드 작성을 해 주면,
콘솔에 가격 + 원이 적힌 순서대로 나온다.
4,500원
1,200원
6000원
120000원다음, 스레드에 대한 개념을 배웠다
스레드(thread): 사전적 의미로 한 가닥의 실이라는 뜻인데, 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 실처럼 이어 놓았다고 해서 유래된 이름이다. 하나의 스레드는 하나의 코드 실행 흐름이기 때문에 한 프로세스 내에 스레드가 두 개라면 두 개의 코드 실행 흐름이 생긴다는 의미이다.
package thread.ex01;public class ThreadTest implements Runnable{ //implements Runnable을 해 줘야 합니다.int num = 0;@Overridepublic void run() {System.out.println("현재 쓰레드: " + Thread.currentThread());System.out.println("쓰레드 시작!");for(int i=1; i<=10; i++) {if(Thread.currentThread().getName().equals("쓰레드1")) {System.out.println("-==================");num++;}System.out.println("현재 쓰레드:" + Thread.currentThread());System.out.println("num: " + num );try {Thread.sleep(1000); //1초간 일시 정지} catch (InterruptedException e) {e.printStackTrace();}}}}MainClass에서 메서드를 생성한다.package thread.ex01;public class MainClass02 {public static void main(String[] args) {//객체 1개, 쓰레드 n개 (1개의 객체를 실행합니다.)ThreadTest t1 = new ThreadTest();Thread thread1 = new Thread(t1, "쓰레드1");Thread thread2 = new Thread(t1, "쓰레드1");thread1.start();thread2.start();System.out.println("메인 종료~!");}}그럼 콘솔에 이렇게 나온다.
이를 바탕으로 동기화와 양보(yield), 조인까지 배웠다.
동기화
package thread.ex03_syncro;public class ThreadTest implements Runnable {int num = 0;@Overridepublic synchronized void run() { //동기화하라는 키워드를 붙여줌.//동시 작업이 진행되는 동안 충돌이 일어날 수 있는 메서드라면,//한 곳에서 먼저 완료하고 진행되게System.out.println("현재 쓰레드: " + Thread.currentThread());System.out.println("쓰레드 시작!");for(int i=1; i<=10; i++) {if(Thread.currentThread().getName().equals("쓰레드1")) {System.out.println("-==================");num++;}System.out.println("현재 쓰레드:" + Thread.currentThread());System.out.println("num: " + num );try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}MainClass
package thread.ex03_syncro;
public class MainClass {
public static void main(String[] args) {
ThreadTest t1 = new ThreadTest();
Thread thread1 = new Thread(t1, "쓰레드1");
Thread thread2 = new Thread(t1, "쓰레드2");
thread1.start();
thread2.start();
System.out.println("메인 종료~!");
}
}스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없도록 하려면 스레드 작업이 끝날 때까지 객체에 잠금을 걸어서 다른 스레드가 사용할 수 없도록 해야 한다. 스레드가 객체 내부의 동기화 메소드 또는 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 임계 영역 코드를 실행하지 못하도록 한다.
동기화 메소드는 메소드 전체 내용이 임계 영역이므로 스레드가 동기화 메소드를 실행하는 즉시 객체에는 잠금이 일어나고, 스레드가 동기화 메소드를 실행 종료하면 잠금이 풀린다.
양보(yield)
/*Thread.yield()는 스레드를 일시 정지 상태로 만들거나,정지된 스레드를 다시 실행시키거나 하는 행위, 즉 실행중인 스레드의 상태를 변경하는 것을스레드 상태 제어라고 하는데, 그 중 yield는 일시 정지를 구현할 수 있다.*/package thread.ex04_yield;public class TestA implements Runnable {public boolean work = true;@Overridepublic void run() {while(true) {if(work) {System.out.println("A쓰레드 실행 중!");}else {Thread.yield(); //실행 양보}try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}package thread.ex04_yield;public class TestB implements Runnable{@Overridepublic void run() {while(true) {System.out.println("B쓰레드가 실행 중!");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}package thread.ex04_yield;public class MainClass {public static void main(String[] args) {TestA a = new TestA();TestB b = new TestB();Thread t1 = new Thread(a);Thread t2 = new Thread(b);t1.start();t2.start();try {Thread.sleep(3000);a.work = false;Thread.sleep(3000);a.work = true;} catch (InterruptedException e) {e.printStackTrace();}}}yield(): 실행 중에 우선순위가 동일한 다른 스레드에게 실행을 양보하고 실행 대기 상태가 된다.
처음 실행 후 3초 동안은 Thread t1과 Thread t2가 번갈아가며 실행된다. 3초 뒤에 메인 스레드가 Thread t1의 work 필드를 false로 변경함으로써 Thread t1은 yield() 메소드를 호출한다. 따라서 이후 3초 동안에는 Thread t2가 더 많은 실행 기회를 가지게 된다. 메인 스레드는 3초 뒤에 다시 Thread t1과 Thread t2가 번갈아가며 실행하도록 한다.
join(): join() 메소드를 호출한 스레드는 일시 정지 상태가 된다. 실행 대기 상태로 가려면, join() 메소드를 멤버로 가지는 스레드가 종료되거나, 매개값으로 주어진 시간이 지나야 한다.
자바 기초를 짧다면 짧고, 길다면 긴 시간 동안 배우게 되었는데 이를 바탕으로 더 열심히 배워야겠다는 생각이 들었다.
'JAVA' 카테고리의 다른 글
[JAVA] Editor does not contain a main type 오류 해결 (0) 2021.11.02