본문 바로가기
728x90

츄Log/기타 끄적20

헷갈리는 compare/compareTo 이해하기 안녕하세요! JAVA에서는 객체간 비교를 하기 위해 Comparable/Comparator 인터페이스를 많이 사용합니다. 단순 객체간 비교를 할 때는 어렵지 않은데, 정렬에서 이 인터페이스의 compareTo를 구현할 때는 구현할 때마다 헷갈리는 것 같습니다. (머리가 좋으신 분들은 헷갈리지 않을 수 있습니다..) 더이상 헷갈리면 안되겠다 싶어서 핀 선생님의 도움을 받아 차근히 공부를 했고, 오늘은 제가 이해한 방법을 한 번 공유해볼까 합니다. 외워야할 것들 비교대상 : A, B 공식 : A를 기준으로 A를 앞에 보내고 싶으면 -1, A를 뒤로 보내고 싶으면 1 (같으면 0 이지만 이건 딱히 헷갈리지 않으니 제외) 오름차순 : 작은 수가 앞에 옴 / 내림차순 : 큰 수가 앞에 옴 point : 함수가 완.. 2023. 12. 9.
Java 스트림 (Stream)의 특징 안녕하세요! 오늘은 Java8에 추가된 Stream에서 중요한 키워드 몇가지를 살펴보려고 합니다. 먼저 스트림이란 무엇일까요? 스트림이란 선언형으로 컬렉션 데이터를 처리할 수 있는 기능입니다. 소스에서 추출되는 연속된 요소를 가지고 스트림API가 제공해주는 많은 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있습니다. 또한 스트림을 사용하면 멀티스레드 코드를 구현하지 않아도 데이터를 tranperant하게 병렬로 처리할 수 있습니다. (Transparency, 투명성 : 어떤 시스템이나 기능을 사용할 때 사용 방법이 내부 복잡성을 숨기고 명확하게 제공되는 경우) 정리하면, 스트림 API의 특징은 선언형(declarative) : 간결하고 가독성이 좋아집니다. 조립할 수 있음(pipe.. 2023. 12. 8.
숫자 문자열 비교하기 (JAVA String compareTo) 안녕하세요! 오늘은 헷갈리기 쉬운 숫자로된 문자열을 비교하는 compareTo에 대해 알아보겠습니다. Comparable을 사용하면서 compareTo를 많이 보았을 것입니다. 오늘은 String class에 구현된 compareTo를 살펴보려고 합니다. 먼저 Comparable의 compareTo() 인터페이스의 시그니쳐를 살펴보겠습니다. 원본과 비교대상이 있을 때 compareTo의 리턴값이 음수면 비교대상이 큰 것, 양수면 원본이 큰 것, 0이면 두 객체는 같다고 판단합니다. 그럼 String class는 이 compareTo를 어떻게 구현하고 있는지 보겠습니다. 원본과 비교대상의 길이를 구합니다. 두 길이 중 짧은 길이를 선택하여 반복문을 돕니다. 각 문자열을 첫번째 문자부터 비교합니다. 두 문자.. 2023. 12. 7.
Base64 Encoding 안녕하세요! 오늘은 Base64 인코딩을 알아보겠습니다. Base64인코딩은 문자열 인코딩이 아닌 바이트열을 문자열로 인코딩하는 방법 중 하나입니다. Base64는 원본 바이트열을 6bit씩 잘라서 ASCII 코드로만 이뤄진 문자열로 인코딩하는 방식입니다. ASCII 코드는 8bit로 표현되는데, 6bit로 쪼개서 ASCII 코드로 변환된다면 전체 사이즈는 늘어나게 됩니다. 사이즈가 느는 만큼 장점이 필요한데요, 모든 시스템이 알고 있는 ASCII 코드로 처리되기 때문에 시스템간 규격을 맞추지 않아도 됩니다. 왼쪽 사진이 6bit 값에 대응되는 ASCII 문자이고, 오른쪽 사진은 6bit binary열에 대응되는 ASCII 문자입니다. 이 표를 활용하여 Base64 인코딩을 해보겠습니다. 원본 Hi AS.. 2023. 12. 6.
ASCII Code / Unicode / UTF-8 Encoding / URL Encoding 안녕하세요! 오늘은 헷갈리는 개념인 인코딩에 대해 한번 정리해보겠습니다. 인코딩이란 어떤 데이터를 규칙을 가지고 변환하는 행위입니다. 디코딩은 그 반대겠죠. 그럼 문자 인코딩(Charterset Encoding)은 무엇일까요? 아시다시피 컴퓨터는 모든 데이터를 0과 1인 binary data로 바라봅니다. 그래서 우리는 문자를 컴퓨터가 이해할 수 있는 byte로 변환해야 합니다. 인코딩을 이해하기 전에 먼저 '코드체계'라는 개념을 살펴보겠습니다. 코드체계는 컴퓨터가 이해할 수 있는 2진수로 인코딩 하기 위해 인간의 문자를 숫자에 매핑한 것입니다. ASCII Code와 Unicode가 이에 해당합니다. 1. ASCII Code ASCII Code는 가장 널리 쓰이는 코드체계로 오로지 영문자를 위한 것입니다.. 2023. 12. 6.
싱글톤 안전하게 초기화하기 (thread-safe initialization) 안녕하세요! 지난번 Double Check Locking을 싱글톤 패턴을 통해 알아보면서, 싱글톤 객체 초기화를 개발자가 처리하는 것이 아닌 JVM에게 위임하여 해결할 수는 없을까? 고민하였습니다. JVM에게 위임하여 thread-safe하게 초기화하는 4가지 방법을 소개하겠습니다. 1. static field를 사용한 Early Initalization (Eager Initialization) public class EarlyInitSingleton { private static final EarlyInitSingleton INSTANCE = new EarlyInitSingleton(); public static EarlyInitSingleton getInstance() { return INSTANCE.. 2023. 12. 3.
Double Check Locking (DCL, 이중잠금) 안녕하세요! 오늘은 스레드간 동기화 작업에서 알고 있으면 유용한 패턴인 Double Check Locking(이중잠금)에 대해서 알아보겠습니다. Double Check Locking은 동기화 블록에서 불필요한 lock 획득을 줄여주는 패턴입니다. (즉, 동기화 구문을 최소화 시켜주는 전략입니다.) 아시다시피 lock획득은 비싼 비용이 들기 때문에 불필요한 lock 획득 작업을 없애면 성능 향상을 기대해볼 수 있습니다. 싱글톤 패턴을 사용하는 코드를 예제로 Double Check Locking을 알아보겠습니다. public class Singleton { private static TestObject instance; public static synchronized TestObject getInstance.. 2023. 12. 1.
Zero Copy Transfer (제로 카피 전송) 안녕하세요! 오늘은 Zero Copy Transfer에 대해 알아보겠습니다. 제로카피 전송이란? 데이터를 복사하거나 전송하는 과정에서 중간 버퍼를 사용하지 않고 데이터를 직접 전송하는 방법으로 데이터 이동을 최적화하고 시스템 성능을 향상시키기 위한 방법입니다. 먼저 전통적인 방법과 개선된 방법, 보다 개선된 방법까지 총 3단계를 거쳐 어떻게 달성하게 되었는지 확인해보겠습니다. 단계 1. 전통적인 방법 보통 우리는 파일을 읽고 전송한다면 아래와 같은 코드를 작성할 것입니다. File.read(fileDesc, buf, len); Socket.send(socket, buf, len); 이것은 내부적으로 아래와 같은 과정을 거치게 됩니다. 이 전통적인 과정에서는 총 두 개의 불필요한 작업이 있습니다. (파일을.. 2023. 11. 24.
728x90