Language
seaborn을 활용한 시각화
지난 시간에 matplotlib을 활용하여 데이터를 시각화하는 방법에 대하여 알아보았습니다. matplotlib보다 좀 더 편리하게 시각화를 사용할 수 있도록 만들어주는 것이 seaborn 라이브러리입니다. 이번 시간에는 seaborn 라이브러리를 활용하여 데이터를 시각화하는 방법을 알아보도록 하겠습니다. 지난 글 : 2022.08.29 - [Language/Python] - matplotlib을 활용한 시각화 기초 matplotlib을 활용한 시각화 기초 머신러닝, 딥러닝 공부를 하다보면 항상 모델의 평가와 데이터 분석에서 그래프로 시각화하는 코드를 마주하게 됩니다. 코드가 다소 직관적이고 간단하게 그래프를 그릴 수 있어서 읽고 이해하 cnu-jinseop.tistory.com seaborn 라이브러리..
matplotlib을 활용한 시각화 기초
머신러닝, 딥러닝 공부를 하다보면 항상 모델의 평가와 데이터 분석에서 그래프로 시각화하는 코드를 마주하게 됩니다. 코드가 다소 직관적이고 간단하게 그래프를 그릴 수 있어서 읽고 이해하는데는 무리가 전혀 없었습니다. 하지만 직접 시각화를 위해 그래프를 그릴 때는 굉장히 막막하고 어려움을 느꼈습니다. 이번 포스팅을 통해 matplotlib을 활용하여 그래프를 시각화하는 코드들을 정리하고 이해해보려고 합니다. 시각화는 눈으로만 이해하는 것보다 직접 코드를 따라 구현해가며 이해하는 것이 직접 사용하기 위해 훨씬 많은 도움이 되므로 직접 코드들을 따라치면서 이해하는 것을 추천드립니다. matplotlib matplotlib는 Python의 그래프를 그려주는 굉장히 유용한 라이브러리입니다. matplotlib를 활..
파이썬스러운 코드 개발(PEP-8)
클린 코드의 중요성 우리가 코드를 개발하는 이유는 무엇일까? 학교에서 코드를 작성하는 목적은 컴퓨터에 명령을 하기 위해서라고 배웠었다. 하지만 나는 최근 개발공부를 하며 컴퓨터에게 더욱 잘 명령을 내리기 위한 공부를 한다기보다는 다른 개발자분들이 나의 코드를 잘 이해할 수 있도록 짜기위해 노력한다. 나는 다른 개발자분들이 잘 이해할 수 있는 코드를 클린코드라고 생각한다. 클린한 코드를 개발하면 다른 개발자분이 나의 코드를 유지보수하는데 코드를 이해하는 시간을 줄일 수 있어 기술부채를 최소화할 수 있다. PEP-8이란? Java도 변수명, 클래스명에 대한 명명규칙과 같은 표준 코딩스타일이 있다. 그와 같이 파이썬도 PEP-8이라는 표준 코딩스타일을 가지고 있다. 이는 이미 파이썬 구문의 많은 특수성을 고려..
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
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 Future에서도 어느정도 비동기 프로그래밍을 가능하게 만들어 주었지만, 부족한 부분이 많았다. get()을 사용하여 블로킹을 통해서만 콜백을 실행시킬 수 없다. Future들을 조합하는 것에 있어서 제한된다. (과목의 정보를 가져온 뒤 그 과목을 수강하는 학생들을 가져오는 것이 제한된다.) 예외처리가 불가능하다. 이러한 문제점을 해결하고 좀 더 완벽한 비동기 프로그래밍을 위해 Java8에 새로 추가된 인터페이스가 CompletableFuture이다. CompletableFuture 생성 CompletableFuture future = new CompletableFuture(); future.complete("jins"); future.get(); //String jins..
자바 쓰레드 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로 쓰레드 처리하기
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 등)
Date/Time API 과거 API의 문제점 시간 API로는 Date와 GregorianCalendar가 있다. 이름이 이상하다. 분명 Date인데, 시간을 가져올 수 있다. Date의 시간을 출력해보면 long타입의 숫자가 나온다.(이는 자바의 epoch로1970년 1월 1일 00시 기준으로 현재까지의 초를 의미한다. -> 먼가 성능을 측정할 때 쓰일 것 같은 기계적인 시간이다.) mutable하다. 시간에 값을 넣어 변경시킬 수 있다.(서비스에 장애를 일으키는 굉장히 큰 원인) 오늘날의 API 오늘날의 API는 값을 변경할 수 없으며 만약 변경을 하려고 하면 새로운 객체를 반환해주는 방법으로 변경이 이루어진다. 즉 Immutable하다. LocalDateTime 사람들이 주로 사용하는 시간을 의미한..
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을 알아보자!
Stream Stream은 자바8에서 가장 주목받은 기술 중 하나이다. 데이터를 병렬적으로 처리함에 있어 굉장히 효과적인 스트림에 대해 알아보겠다. 스트림의 특징 스트림은 데이터를 저장하는 저장소가 아니고, 데이터를 처리하는 방법이다. 스트림을 거쳐 데이터를 처리했다고 하여 데이터가 변경되지는 않는다. names.stream().map(String::toUpperCase); 이처럼 스트림을 활용해 대문자로 변경하는 코드를 작성했다고 해서, names의 데이터들이 모두 대문자로 변경되지않는다. 이 결과는 스트림으로 나오게 되며 데이터에 직접 영향을 미치지 않는다. 스트림의 파이프라인 스트림은 중계오퍼레이션과 종료 오퍼레이션으로 구성된다. 중계 오퍼레이션은 리턴값이 스트림이고, 종료 오퍼레이션은 스트림이 아..
인터페이스의 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 어..
[swift_10]Optional
Optional Optional 변수 swift에서 지금까지 배운 변수는 항상 초기화를 시켜주었음. nil값이 있으면 연산중에 runtime에 프로그램이 종료되기 때문에 문제가 됨. 따라서 Optional를 활용하여 nil값이 있을 경우 문제를 해결 할 수 있음. Optional 선언 var varName:Int? ?를 타입 뒤에 붙여서 선언 초기화를 시켜주지 않아도 됨 캐스팅 let possibleNumber = "f" let convertedNumber = Int(possibleNumber) 캐스팅을 시켜주면 optional 변수로 캐스팅이 됨 그 이유는, 위 예처럼 string을 integer로 캐스팅 할 경우 nil값으로 캐스팅해 주어야 하기 때문이다. optional 변수 사용 1 if conv..
[swift_09]구조체
구조체 구조체가 필요한 이유 var name = ["Park","Choi","Kim","Lee"] var age = [3,4,5,6] var height = [40,50,60,70] 한 인물의 데이터를 위처럼 배열을 활용해 넣으면 가독성이 떨어지고, 배열 각각을 일일히 써야하기에 어려움 구조체 선언 struct Student{ var name: String var age: Int var height: Int } 구조체를 선언하는 방법 구조체 생성 var student1 = Student(name: "Park", age: 3, height: 40) var student2 = Student(name: "Choi", age: 4, height: 50) 구조체를 생성하는 방법은 위 처럼 각각의 변수에 데이터를 ..
[swift_08]클래스
클래스 Class 선언 class Vehicle{ var currentSpeed = 0.0 var description:String { return "Traveling at \(currentSpeed) miles per hour"; } func makeNoise(){ print("noiseless") } } 클래스 선언 Class 사용 let someVehicle = Vehicle() someVehicle.currentSpeed = 1.0 print(someVehicle.currentSpeed) someVehicle.makeNoise() print(someVehicle.description) class 상속 class Tandem:Bicycle{ var currentNumberOfPassengers = ..
[swift_07]함수
함수 void형 함수 func hello(){ print("Hello") } 반환하는 타입이 없음 Return func hello2() -> String{ return "Say Hello" } 반환하는 타입 : String Parameter func add(a:Int, b:Int) -> Int{ return a + b } add(a:3 , b:4) parameter와 argument label이 동일 Default parameter func add2(a:Int = 3, b:Int) -> Int{ return a + b } a 파라미터에 기본값 3, 만약 argument a에 대입이 없으면 a = 3 Argument Label func add3(a first:Int, _ second:Int) -> Int{..