분류 전체보기
-
Java 불변 객체 - Immutable ObjectJava & Kotlin 2021. 4. 24. 13:57
1. 서론 자바의 객체를 불변 객체로서 보호하는 방법입니다. 2. 불변 객체란 (Immutable Object) 객체가 불변하다는 것은 생성된 이후에 변하지 않는 것을 의미합니다. 아마도 자바 언어를 처음 배울 때 쓰레드 공유를 통해서 은행에 잔고를 확인하는 코드는 익숙하실 것 같습니다. 쓰레드 동기화 기능을 사용하지 않으면, 동시에 여러 곳에서 잔고를 빼가고 잔액이 마이너스를 기록하는 것을 볼 수 있는데요. 불변 객체도 비슷합니다. 결국에는 여러 곳에서 참조를 많이 하는, 동시적으로 이벤트가 발생하는 애플리케이션에서 변하지 않는 값을 가질 때 사용될 수 있습니다. 하지만 당연히 불변 객체의 단점도 있겠죠? 생성할 때 초기값이 아닌, 새로운 값을 입력하려면 새 객체를 만들어야 합니다. 그만큼 자원의 소모..
-
Git commit 삭제 후 복구 경험담Linux 2021. 4. 16. 23:05
1. 서론 Linux 명령어로 git을 다룰 수 있다는 것을 알게 된 후 이것저것 눌러봤습니다. 덕분에 커밋, 파일을 통째로 삭제 해서 눈물을 흘리다가 복구하는 법도 배우게 됐습니다. 2. 파일은 그대로, 커밋은 삭제 git reset --soft HEAD~~~ 이전 3개의 커밋을 삭제하는 명령어 입니다. 물결 표시를 1개만 하면, 1개만 삭제됩니다. git reset --soft ORIG_HEAD 삭제한 커밋을 복구하는 명령어입니다. 3. 파일, 커밋 모두 삭제 주의해야 합니다. 제가 방금 날려보고, 쓰는 글입니다. git reset --hard HEAD~~~ /* * 명시적으로 숫자를 입력해주는 방법 */ git reset --hard HEAD~1 git reset --hard HEAD~2 '~' 표..
-
(Java)for문 / Collection.size() 성능 개선Java & Kotlin 2021. 4. 4. 03:07
1. 문제 크롤링한 데이터를 배열에 임시 저장 후 다시 꺼내서 DB에 저장하는 for문 입니다. 이때 데이터의 개수는 약 800개가 되고, 평균 131초가 걸립니다. 어떻게 단축 할까요? 2. 연구 for loop안에서 size() 메서드를 계속해서 호출하게 되면, 해당 List 사이즈를 계속 해서 측정 후 돌려주는 연산이 일어납니다. 즉 JVM의 overhead가 발생하게 됩니다. 하지만 두번째 코드에서는 같이 for문 밖, 객체변수에 size()을 할당합니다. 즉 List의 size를 측정하는 size() call이 한 번만 발생합니다. 최초에 측정한 사이즈를 가지고 그대로 사용하게 됩니다. 실제로 측정해봤습니다. 약 800개 데이터, 3회 평균 측정 시간 입니다. 각각 131571ms, 119916..
-
(java)String vs StringBuilder 수행 시간 차이Java & Kotlin 2021. 3. 28. 18:14
1. 서론 일반적으로 문자열을 저장할 때 String 클래스를 사용합니다. 하지만 이미 저장된 String 문자열에 반복적으로 추가 저장할 때도 좋은 방법일까요? 2. String - Immutable Object String은 불변(immutable) 객체입니다. 불변하다는 것을 어떤 의미일까요? 불변하다는 것은 만들어진 상태 그대로 상수로서 존재합니다. 즉 객체로서 생성된 후 상태를 변경하지 못합니다. 그렇다면 이미 만들어진 String 객체에 추가적인 데이터를 저장할 때는 어떻게 될까요? 이때는 메모리에서 추가 공간을 할당해 새 객체를 만듭니다. 즉 추가적이 메모리 주소의 할당이 발생합니다. 같은 참조 변수를 사용하더라도 메모리를 추가로 할당해야 합니다. 예를 들어 String hello1 = ne..
-
(Java)파사드 디자인 패턴 - Facade Design PatternJava & Kotlin 2021. 3. 28. 15:53
1. 서론 자바를 이용해 개발할 때 Slf4j를 구현한 Log4j2를 많이 사용합니다. 이때 Slf4j 공식 문서를 보면, 'Facade Pattern'을 이용했다고 합니다. 그래서 Log4j2가 이를 구현해 사용한다고 하는데요. 그래서 Facade Pattern은 뭘까요? 2. 영어사전의 정의 영어는 영어로서 먼저 받아드려야 한다고 생각합니다. 해당 단어의 사전적 의미를 먼저 파악 후 프로그래밍적 측면으로 바라보면 좀 더 쉽다고 생각합니다. 빌딩의 표면, 특히 거리 혹은 열린 공간을 바라보고 있는 주요한 정면이 덜 좋거나 칭찬할만한 현실을 감추는데 사용하는 바깥을 바라보는 표면 사전에는 위와 같이 정의되어 있습니다. Origin을 보게 되면 French의 face라는 단어에서 왔다는 것을 알 수 있습니..
-
(Java)Arrays.deepToString - 2차원 배열 출력Java & Kotlin 2021. 3. 11. 21:38
오늘은 2차원 배열의 출력에 대해서 알아보려고 합니다. 사실 1차원 배열은 아주 간단합니다. 위의 코드에서처럼 컬렉션 프레임워크의 Arrays 클래스를 이용해서 toString 메소드를 사용하면 됩니다. Arrays 클래스의 사용은 익숙하지 않은 경우가 있더라도, toString 메소드는 무엇인가 출력할 때 많이 사용하기 때문에 익숙할 것입니다. 하지만 'int[][] arr'와 같이 2차원 배열을 출력하게 되면 값이 출력되는 것이 아니라, 각 객체의 주소가 나오게 됩니다. 실제 메모리의 주소는 아니고, IDE에서 임의로 붙이는 번호지 않나 추측합니다. 그렇다면 2차원 배열의 값이 잘 들어갔는지 확인하려면 어떻게 해야 할까요? Arrays.deepToString 간단하게 deepToString 메소드를 ..
-
(Java)Comparator 인터페이스 / compare 메소드Java & Kotlin 2021. 3. 4. 09:33
1. 서론 백준 문제 1931 문제를 풀던 중 2차원 배열의 순서를 정렬해야 했습니다. 즉 time[i][1] vs time[i+1][1]을 비교해야 했습니다. 문제는 단순히 Arrays.sort()를 하게 되면 기본적인 오름차순 정렬 밖에 되지 않습니다. i의 순서가 아닌, 2차원 배열의 두 번째 요소를 작은 순서대로 정렬을 하려면 어떻게 해야 할까요? 2. Comparator 인터페이스 / ompare 메서드 Comparator 인터페이스는 compare(T o1, T o2) 메서드를 구현하고 있습니다. 특징은 compare 메서드를 원하는 대로 커스텀해서 비교를 할 수 있습니다. 어떤 문자 혹은 숫자를 단순 오름차순이 아닌, 필요에 따라 비교하기에 좋습니다. 아래는 return 값입니다. if (o..
-
(Java)ArrayList vs LinkedList 시간 복잡도Java & Kotlin 2021. 2. 22. 10:49
1) 서론 Selenium과 JSoup을 이용해서 크롤링을 하다 보면 데이터를 가지고 오고, 추가하는 작업을 많이 하게 됩니다. 그럴 때 반복적으로 사용하게 되는 것이 List 인터페이스와 For loop입니다. 하지만 List 인터페이스를 사용할 때는 습관적으로 ArrayList 클래스만 사용하고 있었습니다. 하지만 List 인터페이스를 구현한 것은 LinkiedList 클래스도 추가로 있습니다. Vector도 있긴 하지만, ArrayList와 동일한 동작을 하며 자바 1.8 이상부터는 사용하지 않는 것으로 알고 있습니다. 그래서 LinkedList와 ArrayList의 성능상 차이점은 뭐가 있을까 고민을 해봤습니다. 2) ArrayList vs LinkedList 기본적인 차이점 두 개의 가장 큰 차..