Language/Java

    Java의 BigInteger를 알아보자.

    Java의 BigInteger를 알아보자.

    22.03.12 SK ICT 코테를 보고 충격에 빠졌다.. 4문제 중 2솔.. 2번과 4번만 맞추고 떨어진것 같다.. 솔직히 3번은 쉽게 풀수 있겠다고 생각하고 도전했던 DP문제인데, 값이 너무 커질수 밖에 없다고 생각해서 long을 써서 해결하려고 하였는데 결국 실패했다. 근데 1번은 왜 나중에 풀려고 아껴둔거지?(아직도 자신에게 의문) 코테가 끝나고, Java의 자료형에 대한 공부를 하다가 BigInteger를 알게 되었다..(좀 더 빨리 알았으면 3번을 금방 풀었을텐데..) BigInteger Class의 범위는? Big Integer의 클래스의 범위는 무한대다. 예전에 자료구조 수업을 처음 들을 때 첫 과제가 BigInt라는 자료형을 만들어보는 문제였는데, 그게 사실 Java에서 지원해주는 api..

    Java8의 Annotation

    Java8의 Annotation

    Annotation의 변화 Java8의 Annoataion 제너릭 타입 선언부에 선언이 가능하다. 중복해서 사용이 가능하다. Annoation 다양한 위치에 선언하기 Annotaiton을 다양한 위치에 선언하기 위해서는 @Target을 정의해주어야한다. @Target(ElementType.TYPE_PARAMETER) // Generic Type으로 선언 가능 @Target(ElementType.TYPE_USE) // Type선언하는 모든 곳에서 사용 public @interface Chicken { } ElementType.TYPE_PARAMETER : 제너릭의 Type parameter에 선언이 가능하게 해준다. static class FeelsLikeChicken{ public static void ..

    CompletableFuture로 비동기 프로그래밍 공부하기!

    CompletableFuture로 비동기 프로그래밍 공부하기!

    CompletableFuture Future에서도 어느정도 비동기 프로그래밍을 가능하게 만들어 주었지만, 부족한 부분이 많았다. get()을 사용하여 블로킹을 통해서만 콜백을 실행시킬 수 없다. Future들을 조합하는 것에 있어서 제한된다. (과목의 정보를 가져온 뒤 그 과목을 수강하는 학생들을 가져오는 것이 제한된다.) 예외처리가 불가능하다. 이러한 문제점을 해결하고 좀 더 완벽한 비동기 프로그래밍을 위해 Java8에 새로 추가된 인터페이스가 CompletableFuture이다. CompletableFuture 생성 CompletableFuture future = new CompletableFuture(); future.complete("jins"); future.get(); //String jins..

    자바 쓰레드 Callable과 Future

    자바 쓰레드 Callable과 Future

    Callable과 Future Runnable로 동작을 실행할 때 return받는 값이 없다. 따라서 쓰레드를 처리하고 그 결과로 값을 얻어야한다면 Runnable을 사용하면 안된다. Callable은 제너릭타입을 리턴타입으로 갖고 있기 때문에 return타입이 필요하다면 Callable사용하면 된다. Future는 이렇게 동작하는 비동기 작업의 현재상태를 조회하거나 결과를 가져올 수 있는 역할을 수행한다. ExecutorService ex = Executors.newFixedThreadPool(3); Callable hello = () -> { Thread.sleep(5000L); return "Hello"; }; Future future = ex.submit(hello); System.out.prin..

    자바 Excuter로 쓰레드 처리하기

    자바 Excuter로 쓰레드 처리하기

    Excutors 엄청나게 많은 쓰레드를 개발자가 관리하는 것은 사실상 불가능하다. 따라서 Executor를 활용하여 쓰레드를 관리하게 된다. Executer는 ExcutorServie와 ScheduledExecutorService가 있다. ExcutorService는 쓰레드를 만들어주고 동작하는 역할만 수행한다면, ScheduledExecutorService는 쓰레드들을 각자 얼마나 뒤에 실행할지를 입력할 수 있어, 스케쥴링하여 실행해준다. ExecutorService //사용되는 runnable 메소드 private static Runnable getRunnable(String message) { return () -> { System.out.println(message + ":" + Thread.cu..

    자바 쓰레드의 기초

    자바 쓰레드의 기초

    Thread 기초 쓰레드를 만드는 방법 Thread thread = new Thread(()->{ System.out.println("Hello Thread"); }); 쓰레드를 만드는 방법은 new Thread()를 할 때 Runnable 함수형 인터페이스를 넣어줌으로써 만들어줄 수 있다. 쓰레드 start thread.start(); 쓰레드를 생성하여 실행하기 위해서는 start()를 사용해주면 된다. 쓰레드 sleep thread.sleep(1000); 쓰레드에서 잠시 리소스를 빼앗기 위해서 sleep을 할 수 있다. 그렇게 되면 쓰레드가 하던 일을 잠시 멈추고 리소스를 다른 쓰레드에서 넘겨주게 된다. 쓰레드 interrupt Thread thread = new Thread(()->{ while (..

    Java8의 시간 API 알아보기(LocalDateTime, Instant 등)

    Java8의 시간 API 알아보기(LocalDateTime, Instant 등)

    Date/Time API 과거 API의 문제점 시간 API로는 Date와 GregorianCalendar가 있다. 이름이 이상하다. 분명 Date인데, 시간을 가져올 수 있다. Date의 시간을 출력해보면 long타입의 숫자가 나온다.(이는 자바의 epoch로1970년 1월 1일 00시 기준으로 현재까지의 초를 의미한다. -> 먼가 성능을 측정할 때 쓰일 것 같은 기계적인 시간이다.) mutable하다. 시간에 값을 넣어 변경시킬 수 있다.(서비스에 장애를 일으키는 굉장히 큰 원인) 오늘날의 API 오늘날의 API는 값을 변경할 수 없으며 만약 변경을 하려고 하면 새로운 객체를 반환해주는 방법으로 변경이 이루어진다. 즉 Immutable하다. LocalDateTime 사람들이 주로 사용하는 시간을 의미한..

    Optional을 알아보자!

    Optional을 알아보자!

    Optional이란? null을 리턴받아 사용하면 nullPointException이 발생한다. if(xx != null)와 같은 조건문으로 null을 체크해서 사용하면 해결할 수 있음. 하지만 매번 그렇게 하기가 번거로움. 두번째로 null을 return받을 상황에 Exeception을 던져줄 수 있음.(이 경우는 비효율적인 리소스를 사용해야함.) Optional을 활용하여 null에 대한 처리를 할 수 있다. 어디서 쓰는가? public Optional getProgress() { // Optional로 감싸서 보내준다. return Optional.ofNullable(progress); } 되도록이면 return되는 위치에서 사용하면된다. 사용하면 안되는 곳 : Map의 key(Map의 key는 n..

    Java8의 Stream을 알아보자!

    Java8의 Stream을 알아보자!

    Stream Stream은 자바8에서 가장 주목받은 기술 중 하나이다. 데이터를 병렬적으로 처리함에 있어 굉장히 효과적인 스트림에 대해 알아보겠다. 스트림의 특징 스트림은 데이터를 저장하는 저장소가 아니고, 데이터를 처리하는 방법이다. 스트림을 거쳐 데이터를 처리했다고 하여 데이터가 변경되지는 않는다. names.stream().map(String::toUpperCase); 이처럼 스트림을 활용해 대문자로 변경하는 코드를 작성했다고 해서, names의 데이터들이 모두 대문자로 변경되지않는다. 이 결과는 스트림으로 나오게 되며 데이터에 직접 영향을 미치지 않는다. 스트림의 파이프라인 스트림은 중계오퍼레이션과 종료 오퍼레이션으로 구성된다. 중계 오퍼레이션은 리턴값이 스트림이고, 종료 오퍼레이션은 스트림이 아..

    인터페이스의  default와 static 메소드 java8

    인터페이스의 default와 static 메소드 java8

    java8의 인터페이스 default Method java8에서 새로 추가된 기능으로 인터페이스에 기본 메소드를 정의할 수 있게 되었다. 기본메소드를 정의하는 이유는 인터페이스를 구현하는 구현체들이 공통된 역할을 수행하는 메소드를 사용하기 위함이다. default로 추가해줌으로써 원래 인터페이스를 구현하고 있던 구현체에서 새로운 메소드를 정의할 필요가 없어진다. Default Method 구현 방법 public interface Foo { String getName(); default void printUpperName() { System.out.println(getName().toUpperCase()); } } 위 처럼 default를 활용해 메소드를 interface에서 구현해 줄 수 있다. 이 인터..

    함수형 인터페이스와 람다식

    함수형 인터페이스와 람다식

    함수형 인터페이스와 람다식 함수형 인터페이스메소드가 하나만 존재하는 인터페이스를 의미한다. @FunctionalInterface public interface RunSomething { //추상 메소드가 하나만 있으면 함수형 인터페이스 abstract int doIt(int number); // static void printName(){ // System.out.println("jinseop"); // } // // default void printAge(){ // System.out.println("26"); // } } @FunctionalInterface annotation을 반드시 붙여주어 정의하고 추상메소드 하나만 존재하면 됨(abstract는 생략가능) 이 때 default와 static 어..