프로그래밍/JAVA
-
[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..
-
[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..
-
[JAVA] 문자열 클래스프로그래밍/JAVA 2020. 9. 7. 21:54
String 클래스 java.lang 패키지에 포함된 클래스로 문자열을 나타냄 String을 선언하는 방법은 크게 다음과 같이 두가지가 존재 // 리터털 String str2 = "JAVA"; // new 연산자 char data[] = {'J', 'A', 'V', 'A'}; String str2 = new String(data); String str3 = new String("JAVA"); // str2, str3 모두 "JAVA" 문자열 여기서 String을 리터럴로 선언하는 것과 new 연산자를 이용해 선언하는 것과 굉장히 중요한 차이점이 존재! String str1 = "JAVA"; String str2 = "JAVA"; if(str==str2) { // 두 객체의 메모리 주소를 비교 System..
-
[JAVA] 추상 클래스와 인터페이스프로그래밍/JAVA 2020. 9. 7. 17:49
추상클래스 추상 클래스는 상속에서 슈퍼클래스로 사용 (계층 구조를 만들기에 좋음) 추상 클래스는 추상 메소드를 포함하는 경우, 포함하지 않는 경우가 있음 /* 추상 메소드를 포함하는 클래스 */ abstract class Shape { public Shape() { } public void paint() { draw(); } abstract public void draw(); // 추상 메소드 선언 } /* 추상 메소드가 없는 클래스 */ abstract class MyComponent { String name; public void load(String name) { this.name = name; } } 추상 메소드란 선언은 되어 있으나 코드 구현은 되어 있지 않은 메소드를 의미 추상 메소드의 구현은..
-
[JAVA] 배열 사용법프로그래밍/JAVA 2020. 9. 3. 00:37
/* 20200903 - 자바 배열의 개념, 사용법 스터디 */ import java.util.Arrays; import java.util.Scanner; import java.util.stream.IntStream; public class MainClass { public static void main(String[] args) { // 배열 선언 후 초기화 int[] arr1 = new int[5]; IntStream.range(0, arr1.length).forEach(i -> { arr1[i] = 100 * (i + 1); System.out.println("arr1[" + i + "] : " + arr1[i]); }); // 배열 선언과 동시에 초기화 int[] arr2 = {10, 20, 30..