프로그래밍
-
[Java] JVM 메모리 구조(Runtime Data Area) 정리프로그래밍/JAVA 2022. 10. 17. 21:29
개요 자바 개발자로서 JVM 런타임 데이터 영역에 대한 이해는 매우 중요하다. 자바로 개발을 하면서 가장 무서운 에러중 하나는 OOM(OutOfMemoryError)이다. 이것은 JVM의 메모리 영역과 관련이 있기 때문에 JVM 내부의 메모리 영역이 어떻게 동작하는지에 대한 이해가 필요하다. 런타임 데이터 영역의 종류 이러한 6가지 JVM 런타임 데이터 영역은 두 개의 그룹으로 분류될 수 있다. PC 레지스터, JVM 스택, 네이티브 메서드 스택은 스레드마다 독립적으로 할당된다. 이러한 영역들은 스레드가 생성될 때 같이 초기화되고, 스레드가 종료될 때 같이 회수된다. 힙 영역, 메서드 영역, 런타임 컨스탄트 풀은 공유자원이다. JVM이 실행될 때 초기화되고, 종료될 때 같이 회수된다. PC(Program..
-
[Java] 자바 스트림(Stream) API 내부 동작 알아보기프로그래밍/JAVA 2022. 10. 14. 10:59
자바 스트림 작업은 모두 LinkedList 구조를 통해 내부적으로 저장되고 내부 저장 구조에서 각 단계에는 다음 구조를 따르는 비트맵이 할당된다. (Stream Flags) SIZED : 스트림의 크기를 아는가? DISTINCT : 스트림의 요소가 전부 중복이 없는가? SORTED : 요소가 원래 순서대로 정렬되었는가? ORDERED : 요소가 스트림화 되는 순서가 컬렉션에서도 유지되는가? 위와 같은 비트맵 정보를 통해 자바는 스트림 최적화를 실행하기 때문에 이는 매우 중요하다. 각각의 작업은 다른 비트맵을 지우고, 설정하고, 유지하게 된다. 예를들어, 스트림의 map 메서드같은 경우 데이터가 변경될 수 있으므로 DISTINCT와 SORTED 비트맵을 지운다. 그러나 스트림의 크기는 수정되지 않으므로 ..
-
[Java] 자바로 인접행렬, 인접리스트 구현하기프로그래밍/JAVA 2022. 10. 13. 11:57
작성 코드 public class Main { static int n, m; static int[][] arr; static ArrayList[] list; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); m = Integer.parseInt(st.nextToken()); /* 배열 & 리스트 초기화 */ arr = new int[n + 1][n +..
-
[Java/Spring] 롬복(Lombok)이란? 활용법 정리프로그래밍/JAVA 2022. 10. 12. 22:30
개요 lombok의 다양한 활용법을 정리해보는 시간을 가져볼까 한다. 자바를 이용하여 개발을 진행하다보면 반복적인 코드의 작성이 발생하는 경우가 있다. 예를들어, 데이터 클래스(Data Class)를 만들 때, 각각의 필드에 대한 getter & setter 메서드를 만들어 캡슐화 작업을 해줘야하고, 생성자 작성 등 번거롭다. 이때 lombok을 활용하면 아주 유용한데, 빌드 과정에서 특정 어노테이션에 따라 .class 파일에 자바 바이트코드를 자동으로 생성해줌으로써 위에서 언급한 번거로운 작업을 해결할 수 있다. lombok을 사용하기 위한 사전 준비는 간단하다. maven 혹은 gradle 환경에 맞게끔 의존성을 다음과 같이 추가해주면 된다. org.projectlombok lombok 1.18.20..
-
TDD(Test-Driven Development) 공부 정리프로그래밍 2022. 9. 7. 22:15
TDD(Test-Drivent Development)란? 테스트 주도 개발, 테스트로부터 시작하는 개발 방식을 의미한다. 실패하는 테스트 코드를 작성하고, 테스트를 통과시킬 만큼 구현한 후, 리팩토링하는 작업을 반복한다. TDD의 장점 테스트 코드가 있으면 문제 범위를 좁혀서 디버깅하는게 수월하다. 리팩토링 등 코드를 수정할 때 실패하는 테스트 코드가 발생하면 문제를 빨리 찾아낼 수 있다. 테스트가 가능하려면 의존 대상을 대역(Mock)으로 교체할 수 있어야 하는데, 대역으로 교체할 수 있는 구조는 역할별로 잘 분리되어 있는 설계 구조를 가졌다고 볼 수 있다. 예제 코드 1 /** * 암호화 검사기 TDD 예제 * * 사용하는 규칙 * - 길이가 8글자 이상 * - 0 ~ 9 사이 숫자 포함 * - 대문..
-
[Java] 다형성을 이용하여 null 처리하기프로그래밍/JAVA 2022. 8. 30. 00:05
개요 자바를 이용하여 개발하면 NPE(NullPointerException)을 방지하기 위해 null 체크를 하여 예외 로직을 작성하는 일이 잦다. 자바 8부터는 Optional API를 통해 좀 더 편리하고 깔끔하게 null 처리를 할 수 있지만, 현재 나의 팀에서는 자바 8을 사용하고 있지 않기 때문에 이를 활용할 수 없었다. 이러한 문제점을 해결하기 위해 다형성을 이용한 null 처리를 적용하였고, 다형성을 이용해서 어떻게 null 처리가 가능한 지 공유하려고 한다. 일반적인 null 처리 실습의 내용은 고객이 신한/하나/현대/삼성 카드 중 유효한 카드를 체크하여 결제를 진행한다고 가정한다. public interface Card { void pay(); } public class ShinhanCa..
-
[Python] 파이썬 문법 정리프로그래밍/Python 2022. 1. 22. 23:44
자료형 # 지수 표현 방식 a = 1e9 print(a) a = int(1e9) print(a) a = 75.25e1 print(a) a = 3954e-3 print(a) # IEEE754 표준에서는 실수형을 저장하기 위해 4 혹은 8바이트의 고정된 크기의 메모리를 할당 # 따라서 실수 정보를 표현햐는 정확도에 한계가 존재 a = 0.3 + 0.6 print(a) if a == 0.9: print(True) else: print(False) # 따라서 round 함수를 이용해 반올림을 해준다. a = 0.3 + 0.6 if round(a, 2) == 0.9: # 소수 셋째 자리에서 반올림 print(True) else: print(False) # 파이썬에서 / 연산자는 나눠진 결과를 실수형으로 반환한다...