분류 전체보기 53

HTTP Request Message : User-Agent

User agent란 무엇이고, 어떤 포맷으로 만들어야하는지 알아보자. 🔸User agent란? User agent의 사용 목적 User agent는 클라이언트가 어떤 환경에서 요청을 보냈는지 설명하는 필드이다. 우리가 user agent에 아무 정보도 주지 않고 구글에 'user agent'를 검색하는 요청을 날렸다고 생각해보자. 서버 입장에서는 이 요청을 보낸 사용자가 브라우저는 어떤걸 쓰는지, os를 뭘 쓰는지, 버전은 몇인지 알 방법이 없다. 아무리 응답의 유연성을 높인다해도 오늘날의 클라이언트 환경은 너무도 다양하기에, 사용자의 환경을 알지 못하면 기껏 서버가 응답을 보내도 제대로 작동하지 않을 수 있다. 이러한 이유로 RFC 9110에서는 서버측에서 거부하는게 아닌 이상 반드시 User age..

표준/통신 2023.07.16

compiler version error 원인

아래와 같은 에러가 발생했고, 세부적으로는 NoSuchMethodError 유형이라고 떴다. > A failure occurred while executing org.jetbrains.kotlin.compilerRunner .GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction 더보기 java.lang.NoSuchMethodError: 'void org.jetbrains.kotlin.cli.common.messages.MessageCollector.report$default(org.jetbrains.kotlin.cli.common.messages.MessageCollector, org.jetbrains.kotlin.cli.common.messag..

Android와 이미지 형식

Bitmap과 Vector 사진을 컴퓨터에 저장하는 형식은 크게 비트맵/벡터로 나눌 수 있다. 1. 비트맵방식 (Bitmap) : 그림을 아주 작은 화소(픽셀)로 분해하고 각 화소의 색상과 위치를 기록해 저장하는 방식. 비트의 지도라는 뜻으로 픽셀을 하나씩 채워가면서 전체를 표현한다. ex) JPG, PNG, GIF, WEBP 2. 벡터방식 : 그림을 구성하고 있는 점이나 직선, 곡선 등의 위치와 기울기 등을 산술적인 데이터로 기록해 저장하는 방식. 파일 하나로 여러 화면 밀도에 대응할 수 있어 apk 크기를 줄일 수 있다. 복잡한 이미지는 표현할 수 없어서 간단한 도형이나 로고 등에 주로 사용한다. API 20 이상에서부터 Vector Asset Studio로 SVG, PSD를 프로젝트에 벡터 이미지로..

헷갈리기 쉬운 TCP/IP 4계층과 TCP, IP 통신

OSI 7계층을 대체하는 TCP/IP 4계층과 TCP, IP 각각을 혼동하는 경우가 많아서 각 용어를 제대로 정리하려고 한다. OSI 7계층 : 인터넷에서 컴퓨터들이 서로 정보를 주고받는 프로토콜을 7 layer로 나눈 것. TCP/IP : 인터넷에서 컴퓨터들이 서로 정보를 주고받는 프로토콜을 4 layer로 나눈 것. TCP : Transport layer에서 정보를 주고받는 데 사용하는 프로토콜 중 하나. IP : OSI의 Network 계층, TCP/IP의 Internet 계층에서 두 컴퓨터가 정보를 주고받는 데 사용하는 프로토콜 중 하나. 1. TCP/IP 4계층이란 우리가 인터넷상에서 정보를 주고받는 데에는 여러 프로토콜이 필요하다. 유저 인풋을 안전하게 전달하는 방식부터 전기신호를 전선으로 보..

속성값으로 enum 객체 얻기 (value to enum)

아래와 같은 Enum class가 있을 때, 객체 이름이나 속성값으로 객체를 얻는 것이 가능하다. enum class Type(val num: Int) { A(1), B(2), C(3), } // "A" -> Type.A // 1 -> Type.A "A" → Type.A : valueOf 메서드 사용 Enum class에는 객체의 이름으로 enum 객체를 찾는 메서드가 이미 존재한다. 이걸 사용하자. EnumClass.valueOf(value: String): EnumClass // Type.valueOf("A") -> Type.A 반환 없는 객체를 검색하려고 시도하면 excpetion을 던진다는 점에 유의해야한다. 1 → Type.A : 직접 메서드 정의 그러나 다른 속성값에서 enum 객체를 찾고싶다..

탐색을 위한 Position Class

data class Position( var x: Int, var y: Int, ) { operator fun plus(other: Position): Position { return Position(this.x + other.x, this.y + other.y) } // 깊은 복사에는 .copy 호출(data class에서 구현해줌) } enum class Direction(position: Position) { TOP(Position(-1, 0)), BOTTOM(Position(1, 0)), LEFT(Position(0, -1)), RIGHT(Position(0, 1)) } * copy 사용시 주의할 점 : x, y에 Primitive type이 아닌 객체를 사용한다면, 직접 깊은 복사를 구현해야한다..

Kotlin의 ArrayDequeue : Stack & Queue를 손쉽게 사용하기

public class ArrayDeque : AbstractMutableList Deque는 Double Ended Queue의 줄임말이다. 덱이라고 부르면 된다. 어느 방향으로든 삽입과 삭제가 구현되어있어서 Stack으로도, Queue로도 사용 가능하다. MutableList로 구현되어있어서 index를 통한 get/set operation도 가능하다. Stack으로 사용하는 법 /* Stack */ val stack = ArrayDeque() stack.add(e) // push, list 끝에 넣는다. stack.removeLast() // pop stack.last() // peek(조회) : Java에 Vector로 구현된 Stack이 있어서 Stack은 꼭 Deque을 사용하지 않아도 된다...

삽입정렬(Insertion Sort)

문은영 교수님의 데이터구조 수업 자료입니다. 문제시 삭제하겠습니다. 방식 i가 0 ~ n-1 일 때, 왼쪽 카드가 지금 카드보다 크다면 교환한다. 그렇지 않다면 다음 iteration으로 넘어간다. 이 작업을 index i부터 1까지 매 iteration에서 반복한다. 일부 항목만 정렬이 흐트러졌을 때 사용하면 유리한데, 1. 배열이 이미 정렬되었을 경우 linear time으로 동작하고 2. 구현이 쉽기 때문이다. 시간복잡도 Avg - O(n^2) iteration i에서 벌어지는 swap과 비교 횟수의 평균은 각각 i/2회이다. 시간복잡도를 big-O natation으로 표현하면 O(T(n)) = O(n(n-1)/4) = O(n^2) 이다. Best - O(n) 배열이 이미 정렬되었을 때 각 iter..