본문 바로가기
728x90
반응형
SMALL

JAVA공부32

[JAVA]Jsoup 라이브러리를 이용한 크롤링 - Jsoup 사용법 + 라이브러리 저장하는 법 안녕하세요~! ㅎㅎ 오늘 포스팅은 그동안 크롤링를 하여 네이버 금융의 정보를 가져왔었는데 크게 사용되었던 라이브러리인 Jsoup 라이브러리 사용법 에 대해서 알아보겠습니다! 1. 라이브러리 적용 및 설치 2. 사용 방법 및 매서드 소개 크게 두가지로 진행하고자합니다.!! 그리고 우리가 그 동안 프로젝트로 진행하고 사용했던 프로젝트도 링크로 걸어 드릴테니 '아 이렇게 사용했구나' 하는 정도로 봐주면 감사하겠습니다!! https://uno-kim.tistory.com/206 - 코스피정보 가져오기 네이버 금융페이지를 몽땅 가져와보자! - 코스피, 코스닥을 긁어오자! 안녕하세요!~ 오랜만입니다. ㅎㅎㅎ 저번 포스팅은 값들을 가져오는 환경과 데이터만 가져오는 방법으로만 구현했네요 이제 크롤링을 간단하게 해서 직.. 2022. 11. 1.
java.util.function 패키지 대부분의 메서드는 타입이 비슷하다. 매개변수가 없거나 한 개 또는 두개 , 반환 값은 없거나 한개 , 게다가 지네릭 매서드로 정의하면 매개변수나 반환 타입이 달라도 문제가 되지 않는다. 그래서 java.uitl.function 패키지에 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓았다. 매번 새로운 함수형 인터페이스를 정의하지 말고, 가능하면 이 패키지의 인터페이스를 사용한다. -> 그래야 함수형인터페이스에 정의된 메서드 이름도 통일되고, 재사용성이나 유지보수 측면에서도 좋습니다. 기본적인 함수형 인터페이스 함수형 인터페이스 메서드 설명 java.lang.Runnable void run() 매개변수도 없고, 반환값도 없음 Supplier T get() -> T 매개변수는 없고.. 2021. 12. 8.
함수형 인터페이스 함수형 인터페이스 단 하나의 추상 메서드만 선언된 인터페이스이다. 예를 들면 interface MyFunction{ public abstract int max(int a, int b); } 인터페이스에 선언된 메서드는 추상메서드 이고, 이게 하나밖에 없으니 함수형 인터페이스라고 한다. 그리고 이렇게 함수형 인터페이스인 경우에는 @FunctionalInterface라고 어노테이션을 붙여야한다. 안붙여도 에러는 안나지만, 붙이면 함수 인터페이스를 올바르게 작성했는지 컴파일러가 확인해준다. 그래서 붙여주는것이 좋다. 지금 함수형 인터페이스에서 max라는 함수를 가지고있고 이것을 구현하면 MyFunction f = new MyFunction(){ public iont max(int a, int b){ retur.. 2021. 12. 7.
람다식 자바가 1996년에 처음 등장한 이후로 두 번의 큰 변화가 있었다. 지네릭스의 등장과 람다식의 등장이다. 람다식의 도입으로 인해, 객체지향언어인 동시 함수형 언어가 되었다. 즉 OOP와 함수형 동시가지고있다. 함수형 언어라기엔 기능이 조금 약하고, 유명한 함수언어는 Haskell, Scala 등 엄청난 데이터를 처리하기 위해 함수형언어가 필요하게 되었다. 지금 파이썬도 그렇고 JS도 그렇고 함수형언어 기능을 가지고있다. 현재 자바를 배우고있지만 함수형언어의 기능이 다른 함수형언어를 배울때 도움이 많이 될것이다. 람다식이란? 메서드를 하나의 '식'으로 표현한 것이다. 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다. 메서드를 람다 식으로 표현하면 메서드의 이름과 반환값이 없어지므로, 람다식을 '익.. 2021. 11. 2.
쓰레드의 동기화(4) volatile 싱글 코어 프로세서가 장착된 컴퓨터에서는 크게 문제가 없이 실행될 것이다. 그러나 요즘 대부분 멀티코어 프로세서가 장착된 컴퓨터를 사용하기 때문에, 문제가 많아질 수 있다. 왜냐하면 멀티 코어 프로세서에서 코어마다 별도의 캐시를 가지고 있기 때문이다. 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업한다. 다시 같은 값을 읽어올때는 머넞 캐시에 있는지 확인하고 없을 때만 메모리에서 읽어온다. 그러다보니 도중에 메모리에 저장된 변수의 값이 변경되었는데도 캐시에 저장된 값이 갱신되지 않아서 메모리에 저장된 값이 다른 경우가 발생한다. 그래서 변수 stopped의 값이 바뀌었는데도 쓰레드가 멈추지않고 계속 실행된다. 변수에 volatile을 붙이는 대신에 synchron.. 2021. 10. 16.
쓰레드의 동기화(3) Lock과 Condition을 이용한 동기화 동기화 할 수 있는 방법은 synchronized블럭 외에도 java.util.concurrent.locks패키지가 제공하는 lock클래스들을 이용하는 방법이 있다. lock 클래스의 종류는 다음과 같다. ReentrantLock // 재진입이 가능한 lock, 가장 일반적인 배타 lock ReentrantReadWriteLock //읽기에는 공유적이고, 쓰기에는 배타적인 lock StampedLock //ReentrantReadWriteLock 에 낙관적인 lock의 기능을 추가 ReentrantLock 은 가장 일반적인 lock이다. reentrant(재진입할 수 있는)이라는 단어가 앞에 붙은 이유는 우리가 앞서 wait(), notify()에서 배운것 처.. 2021. 10. 15.
쓰레드의 동기화(2) 동기화 하는 이유 : 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막기위함 동기화의 단점이 동기화를 하면 데이터는 보호는 되지만 비효율적이다. 한번에 한쓰레드만 사용되니까! 그래서 동기화를 하면 프로그램의 효율이 떨어진다. 그래서 그 떨어진 효율을 높이기 위해서 만들어진 메서드가 wait, notify를 사용한다. 즉 synchronized로 동기화 해서 공유 데이터를 보호하는 것 까지는 좋은데, 특정 쓰레드가 객체의 락을 가진 상태로 오랜 시간을 보내지 않도록 하는 것도 중요하다. 만일 계좌에 추름할 돈이 부족해서 한 쓰레드가 락을 보유한 채로 돈이 입금될때까지 오랜시간을 보낸다면, 다른 쓰레드들은 해당 객체의 락을 기다리느라 다른 작업들도 원활히 진행되지 않기 때문이다. 이러한 상황.. 2021. 10. 15.
쓰레드의 동기화 싱글 쓰레드 프로세스의 경우 프로세스 내에서 단 하나의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별 문제가 없지만, 멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있다. 만일 쓰레드 A가 작업도중에 다른 쓰레드 B에게 제어권이 넘어갔을때, 쓰레드A가 작업하던 공유데이터를 B가 임의로 변경하였다면, A가 제어권을 받아 나머지 작업을 마쳤을때, 원래 의도했던 것과는 다른 결과를 얻을 수 있다. 멀티쓰레드 프로세스에서는 여러 쓰레드가 같은 자원을 공유하기 때문에 메모리도 공유함, 어떤 한 쓰레드가 작업하는 것을 마치지 못하고 다른쓰레드에게 차례가 넘어갔을 때 그 쓰레드가 다른 쓰레드에게 영향을줄 수가있다. 그래서 작업이 끝나지 않은 경우에 다른쓰레드가 다른쓰레드가 그 작업.. 2021. 10. 15.
쓰레드 제어문(4) join() 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다. 무슨말이야 A라는 쓰레드와 B라는 쓰레드가 있는데 A라는 작업을 하다가 B가 작업을 끝낸뒤 A쓰레드가 더 진행되게 하도록 해준다. void join() //작업이 모두 끝날 때까지 void join(long millis) // 천분의 일초동안 void join(long, millis, int nanos) // 천분의 일초 + 나노초 동안 그리고 sleep() 와 동일하게 에외처리를 한다. try{ t1.join(); }catch(InterruptedException e){} 만약 interrupt가 발생하면 멈추던걸 멈추고 실행한다. 시간을 지정하지 않으면 , 해당 쓰레드가 작업을 모두 마칠때까지 기다린다. 작업 중에 다른 쓰레드의 작업.. 2021. 10. 14.
쓰레드 제어문(3) suspend(), resume(), stop() 쓰레드의 실행을 일시정지, 재개, 완전정지 시키는 메서드에 대해 알아보자! void suspend() //쓰레드를 일시정지 시킨다. void resume() //suspend()에 의해 일시정지된 쓰레드를 실행대기 상태로 만든다. void stop() //쓰레드를 즉시 종료시킨다. 우선 쓰레드의 생성주기를 다시 복습해보자 쓰래드는 생선된다 (new!) 그리고 start() 당한다. 그리고 자기차례때 줄서다가 진짜 실행이되고, 그사이사이 waiting, bloked 당하고 시간이 다되어 종료되되고 그런다. 그런데 suspend, resume, stop 메서드들은 쓰레드의 실행을 제어하는 가장 손쉬은 방법이지만, 교착상태를 일으키기 쉽게 작성되어있어서 권장하.. 2021. 10. 14.
쓰레드 제어문(2) interrupt() 대기상태( waiting)인 쓰레드를 실행대기 상태로 만든다. 잠자거나, 쉬고있거나 등등 진행 중인 쓰레드의 작업이 끝나기 전에 취소시켜야 할 때가 있다. 예를 들어 큰 파일을 다운로드 받을때 시간이 너무 오래 걸리면 중간에 다운로드를 포기하고 취소할 수있어야 한다. interrupt는 쓰레드에게 작업을 멈추라고 요청하는 것이다. 단지 멈추라고 요청만 하는 것일 뿐 쓰레드를 강제로 종료시키지는 못한다! void interrupt() //쓰레드의 interrypted상태를 false에서 true로 변경, boolean isInterrupted() //쓰레드의 interrupted 상태를 반환 static boolean interrupted() // 현재 쓰레드의 interrupted상.. 2021. 10. 13.
쓰레드 제어문(1) Sleep() -현재 쓰레드를 지정된 시간동안 멈추게 한다. static void sleep(long millis); static void sleep(long millis, int nanos); -static 메서드인 특성상 자기 자신만 제어할 수있다. 다른 쓰레드를 제어할 순없다. 매개변수 내에 잠잘 시간을 정해준다. 밀리세컨드(3초 = 3000밀리세컨드)와 나노세컨드의 시간단위로 세밀하게 값을 지정할 수 있지만 어느정도 오차가 발생할 수 있다. try{ Thread.sleep(1, 500000); }catch(InterruptedException e){} sleep()메서드는 예외를 발생시킬수 있으므로 예외문과 함께 다닌다. Exception 클래스의 자손인 InterruptedException이기 .. 2021. 10. 13.
728x90
반응형
LIST