언어
-
[Python] asyncio 파헤치기언어/파이썬 & 장고 2021. 3. 1. 20:12
asyncio는 파이썬 버전 별로 사용하는 형태가 조금씩 다릅니다. 아래 설명에서는 파이썬 3.8 기준으로 작성했습니다. asyncio란? 파이썬 3.5부터 지원하는 asyncio는 비동기 프로그래밍을 위한 모듈입니다. 동기란 빨래를 시작하고 종료가 되면 설거지를 시작하고 완료가 되면 TV를 보는 것처럼 한 번에 하나의 작업을 하는 것이고, 비동기는 빨래를 시작시키고 설거지를 하면서 TV를 보는 것과 같이 여러 작업을 동시에 하는 것과 같은 행동을 하는 것입니다. 하지만 파이썬에서는 GIL때문에 비동기 프로그래밍이 동기 프로그래밍보다 느릴 수도 있습니다. asyncio는 이벤트 루프와 코루틴을 기반으로 동작하며 데이터를 요청하고 응답을 기다리는 I/O bound한 작업에서 효율적입니다. 코루틴 기반이므로..
-
[Java] Stream언어/Java 2021. 2. 27. 18:38
Stream 자바 8에서 추가된 스트림은 람다를 활용할 수 있는 기술 중 하나로 배열과 컬렉션을 함수형으로 처리할 수 있습니다. 스트림 생성 배열 String[] arr = new String[]{"1", "2", "3"}; Stream stream = Arrays.stream(arr); 컬렉션 List list = Arrays.asList("1", "2", "3"); Stream stream = list.stream(); stream.of stream.of() 메소드를 사용하면 스트림 객체를 바로 생성할 수 있습니다. Stream stream = Stream.of("1", "2", "3"); // [1, 2, 3] 빈 리스트 Stream stream = Stream.empty(); builder bui..
-
[Python] dataclasses 모듈 사용하기언어/파이썬 & 장고 2021. 2. 13. 20:15
들어가기 전에 파이썬 3.6부터 컴파일 언어와 같이 정적 타입을 미리 선언하여 사용할 수 있습니다. from typing import Dict def test(number: int, name: str) -> Dict[str, int]: return {name: number} test(1234, 'Kim') # {'Kim': 1234} test(1234, 1224) # 에러가 나진 않음 # {1224: 1234} 이는 개발을 할 때, hint를 줄 뿐이지 구문 오류와 같은 에러는 발생시키지 않습니다. 아래에서 설명할 때, 위 개념을 사용하여 설명합니다. 개요 파이썬 3.7부터 dataclasses 모듈이 도입되어 인스턴스 생성 시, 변수 할당부터 코드의 양을 줄일 수 있는 많은 기능이 생겼습니다. AS-I..
-
[Python] Enum 타입언어/파이썬 & 장고 2021. 2. 11. 17:03
파이썬 3.4부터 enum 타입을 지원하고 있습니다. 보통 enum은 연관 있는 여러 개의 상수를 선언할 때 사용하게 됩니다. enum 클래스를 사용하면 인스턴스의 종류를 제한할 수 있어서 프로그래밍에 있어 도움이 됩니다. 클래스 타입 enum 타입의 상수는 기본적으로 name과 value를 가지고 있습니다. from enum import Enum class Status(Enum): SUCCESS = 1 FAILURE = 2 RETRY = 3 Status.SUCCESS Status.SUCCESS.name Status.SUCCESS.value # Status.SUCCESS # SUCCESS # 1 이터레이션을 지원하므로 반복문을 통해 접근할 수 있고 value나 name으로도 직접 접근이 가능합니다. fo..
-
[Java] 제네릭 (Generic)언어/Java 2021. 1. 30. 19:16
제네릭은 JDK 1.5에서 첫 도입이 되었고 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법이며 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해줍니다. 즉, 타입을 외부에서 동적으로 정의할 수 있고 런타임에서 발생할 오류들을 컴파일 타임에 발견할 수 있도록 해줍니다.처음에는 제네릭에 대해 잘 몰랐을 때, 최상위 객체로 값을 받아서 형변환만 해주면 되지 않나? 라고 생각했는데 아래와 같은 한계를 보고 제네릭이 무엇인지 감을 잡았습니다.public class CustomArrayList { private int size; private Object[] data = new Object[3]; public void add(Object value) { data[siz..
-
[Java] Map 컬렉션언어/Java 2021. 1. 30. 17:48
Map 컬렉션은 key와 value로 구성된 Map.Entry 객체를 저장하는 구조를 가지고 있습니다. Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스입니다. 여기서 key와 value는 모두 객체입니다. key는 중복 저장될 수 없지만 value는 중복 저장될 수 있습니다. 기존 저장된 key와 동일한 key로 value를 저장하려 하면 기존 값은 사라지고 새로운 값으로 대체됩니다.HashMapHashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정의해야합니다. 객체가 달라도 동등 객체라면 같은 키로 간주하고 중복 저장되지 않도록 하기 위함입니다. 키와 값의 타입은 기본 타입(primitive type) 을 사용할 수 없고 클래..
-
[Java] Set 컬렉션언어/Java 2021. 1. 30. 17:25
List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않습니다. 또한 객체를 중복 저장할 수 없고 null도 단 1개만 저장합니다. Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없습니다. 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 Iterator를 제공합니다. Iterator에서 하나의 객체를 가져올 땐 next() 메소드를 사용합니다.Set set = new HashSet(); set.add("김"); set.add("김"); // 중복 set.add("이"); set.add("박"); // [김, 이, 박] Iterator iterator = set.iterator(); // 방법 1 for (String str : set) { System.out...
-
[JAVA] 익명 객체언어/Java 2021. 1. 16. 20:12
익명 객체는 이름이 없는 객체입니다. 어떤 클래스를 상속하거나 인터페이스를 구현해야만 익명 객체를 만들 수 있습니다. /* 일반적인 케이스 */ // 상속 class 클래스이름1 extends 부모클래스 {...} 부모클래스 변수 = new 클래스이름1(); // 구현 class 클래스이름2 implements 인터페이스 {...} 인터페이스 변수 = new 클래스이름2(); /* 익명 객체 */ // 상속 부모클래스 변수 = new 부모클래스() {...}; // 구현 인터페이스 변수 = new 인터페이스() {...}; 익명 객체의 경우, 부모 클래스 변수는 이름이 없는 자식 객체를 참조하고 인터페이스 변수는 이름이 없는 구현 객체를 참조합니다.익명 자식 객체 생성부모 타입의 필드 또는 변수를 선언하..
-
[Java] 중첩 클래스와 중첩 인터페이스언어/Java 2021. 1. 16. 17:47
중첩 클래스는 클래스 내부에 선언한 클래스입니다. 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 사용할 수 있고 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있습니다. public class ClassName { class NestedClass { } } 인터페이스도 클래스 내부에 선언할 수 있는데 이를 중첩 인터페이스라 합니다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 인터페이스를 만들기 위해서입니다.public class ClassName { interface NestedInterface { } }중첩 클래스클래스의 멤버로 선언되는 중첩 클래스를 멤버 클래스라 하고 메소드 내부에서 선언되는 중첩 클래스를 로컬 클래..
-
[Java] 인터페이스언어/Java 2021. 1. 10. 19:07
인터페이스는 객체의 사용 방법을 정의한 타입입니다. 인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있습니다. 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 합니다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킵니다. 그렇게 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 됩니다.개발 코드가 직접 객체의 메소드를 호출하면 간단한데 왜 중간에 인터페이스를 둘까?개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서입니다. 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴 값이 다를 수 있습니다. 따라서 개발 코드 측면에서는 코드..