개발 일지/Java 54

[Java] serialVersionUID

Java에서 serialVersionUID는 직렬화(serialization)와 관련된 필드이다. 직렬화는 객체를 바이트 스트림으로 변환해서 저장하거나 네트워크를 통해 전송하는 과정을 말한다. 이렇게 직렬화된 객체는 나중에 역질렬화(deserialization)해서 원래 객체로 복원할 수 있다. 하지만 클래스의 구조가 변경되거나 버전이 업데이트된 경우에 문제가 발생할 수 있다. 이 때 'serialVersionUID'를 사용해서 객체 버전을 명시적으로 관리하는 것이다. serialVersionUID의 목적 serialVersionUID는 직렬화된 객체의 버전 번호를 나타낸다. 객체가 직렬화되면 버전 번호가 함께 저장되며, 역직렬화될 때 같은 버전 번호를 가진 클래스로만 역직렬화가 가능하다. 이는 클래스의..

개발 일지/Java 2023.07.29

함수형 인터페이스 - Supplier와 Consumer

프로젝트에서 작성한 코드를 리팩토링할 방법을 찾다가 Supplier와 Consumer라는 함수형 인터페이스를 찾게 되었다. 함수형 인터페이스(Functional Interface)는 단일 추상 메서드를 가지고 있는 인터페이스로, 람다식이나 메서드 참조를 활용해서 함수형 프로그래밍을 지원한다. Supplier Supplier는 매개변수가 없고 값을 반환한다. get() 메서드를 호출해서 값을 생성하거나 가져올 수 있다. 일반적으로는 데이터를 생성하거나 외부에서 값을 가져오는 용도로 사용하며, 'Supplier 변수명'으로 선언하고 그에 따른 람다식을 작성하면 된다. 예를 들어, Supplier는 정수 값을 생성하고 Supplier은 문자열 값을 가져올 수 있다. Consumer Consumer는 매개변수를..

개발 일지/Java 2023.06.24

DIP에 나오는 저수준 모듈 / 고수준 모듈의 의미

자바를 통해 개발 공부를 진행하고 있지만, 정작 가장 중요한 객체지향의 5대 원칙에 대해서 이해하고 프로젝트에 적용하고 있는가?라는 의문이 들었다. 그래서 객체지향 5대 원칙(SOLID)을 다시 공부하던 도중, 의존관계 역전 원칙에서 고수준 모듈과 저수준 모듈이 나오는데, 정확한 의미가 무엇인지 궁금하여 찾아보았다. 의존 역전 원칙 (Dependency Inversion Principle) - 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다. 우선 저 말을 내가 이해하는 말로 다시 쓰면, '추상화에 의존해야지 구체화에 의존하면 안된다'라는 의미이다. 저수준 모듈은 고수준 모듈이 정의한 추상 타입에 의존해야 한다는 것이다. 고수준 모듈과 저수준 모듈이 뭔데..? 고/저는 무엇을 기준으로 나뉘는 거지...

개발 일지/Java 2023.06.12

String concatenation as argument to 'StringBuilder.append()' call

인텔리제이로 알고리즘 문제를 풀던 도중 index 라는 변수를 줄 별로 출력하기 위해 다음과 같이 코드를 작성하니까 노란 밑줄이 생겼다. 인텔리제이가 다음과 같이 친절하게 교체할 것을 권장하면서 이유를 말해줬다. 두 코드는 사실 동일한 결과를 만들어준다. 하지만 수정된 코드를 권장하는 이유는 해당 방법이 성능 면에서 더 효율적이기 때문이다. sb.append(index + "\n"); 는 index 와 "\n"을 연결한 후에 그 결과를 StringBuilder에 추가한다. 따라서 연결하는 과정에서 연결 연산자인 '+' 를 사용하여 작업을 수행한다. 하지만 sb.append(index).append("\n"); 는 index를 StringBuilder에 추가한 다음 "\n" 문자열을 주가한다. 따라서 중간..

개발 일지/Java 2023.06.04

BufferedReader close() 사용 이유에 대해

알고리즘 문제를 풀면서 문득 생긴 궁금증이 있었다. 'BufferedReader를 사용해서 입력을 받고 실행하면 굳이 close()를 사용하지 않아도 정상적으로 컴파일 되는데 close()를 사용하지 않아도 되는가?' 찾아 본 결과, BufferedReader의 경우 close() 메소드를 명시하지 않아도 가비지컬렉터에 의해 BufferedReader가 자동으로 정리된다고 한다. 하지만 프로그램이 오랫동안 실행되거나 대용량의 데이터를 처리하는 경우에는 버퍼링된 데이터가 모두 출력되지 않거나 리소스가 해제되지 않을 수 있기 때문에 close()를 호출하는 것이 좋다. 이렇게 함으로써 버퍼를 비우고 안전하게 해제하여 메모리 누수나 시스템 리소스 부족 문제를 방지할 수 있다. 물론 가비지컬렉터가 적절하게 처리..

개발 일지/Java 2023.05.31

[Java] @NotNull / @NotEmpty / @NotBlank

DTO에 유효성 검사를 적용하던 도중, 값이 비어있지 않도록 설정하기 위해 사용하는 애너테이션이 여러 개인 것을 확인했다. 모두 값이 비어있는 것을 허용하지 않는 애너테이션인데 왜 여러 개로 나뉘어 있을까라는 의문이 들어 알아보게 되었다. 먼저, @NotNull, @NotEmpty, @NotBlank 모두 프로그래밍에서 사용되는 데이터 유효성 검사에 관련한 애너테이션이다. 이 애너테이션들은 공통적으로 데이터가 null 인지 확인하고 추가적으로 공백 여부를 확인하느냐 마냐에 차이점이 있었다. @NotNull 데이터가 null 인지만 확인하는 애너테이션이다. 데이터가 null일 경우 유효성 검사를 통과하지 못하며, null이 아닌 경우에만 유효성을 갖는다. @NotEmpty 데이터가 null이 아니며, 길이..

개발 일지/Java 2023.04.18

[Java] JPA

JPA(Java Persistence API)는 자바에서 ORM(Object-Relational Mapping) 기술을 구현하기 위한 API이다. JPA를 통해 객체지향적인 방식으로 데이터베이스와 상호작용할 수 있으며, 코드의 유지보수성을 높이고 생산성을 향상하는 데 큰 도움이 된다. JPA 표준 사양을 구현한 구현체는 Hibernate ORM, EclipseLink, DataNucleus 등이 있다. 영속성 컨텍스트(Persistence Context) JPA에서 P는 Persistence로 영속성, 지속성이라는 뜻을 가지고 있다. 즉, 무언가를 오래 지속되게 하는 것이 Persistence의 목적이다. ORM은 객체와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 ..

개발 일지/Java 2023.02.23

[Java] JDBC

JDBC(Java Database Connectivity)란 Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 접근할 수 있도록 하는 자바 API이다. Java 개발자는 JDBC API를 사용해서 다양한 벤더(Oracle, MySQL등)의 데이터베이스와 연동할 수 있고 데이터베이스에서 데이터를 쿼리하거나 업데이트하는 등의 작업을 수행하는 데 사용된다. JDBC의 사용 JDBC를 사용하려면 먼저 데이터베이스 드라이버를 로드해야 한다. JDBC 드라이버는 DrivcerManager라는 클래스를 통해 로딩된다. 드라이버를 로드한 후, DriverManager를 통해 데이터베이스와 연결되는 세션인 Connection 객체를 생성하여 데이터베이스와의 연결을 설정한다. 다음으로 Statem..

개발 일지/Java 2023.02.20

[Java] 자바 가상머신(JVM)

자바 가상머신(Java Virtual Machine, JVM)이란, 자바 프로그램 실행환경을 만들어 주는 소프트웨어이다. 자바가 탄생하기 이전에는 C++이 프로그래밍 언어로 많이 사용되고 있었는데 이 C++은 운영체제로부터 독립적이지 못하다는 단점이 있었다. 만약 Windows를 위해 만든 프로그램은 Windows에서만 작동이 가능했고 Mac OS에서 그 프로그램을 실행시키려면 Mac OS에 맞게 새로 프로그램을 만들고 컴파일해야 한다는 것이다. 이러한 문제를 해결하고자 탄생한 것이 자바이며, 자바는 C++처럼 객체지향 프로그래밍이 가능하면서도 운영체제로부터 독립되어있다. 이와 같은 운영체제로부터의 독립성은 JVM이라는 별도의 프로그램을 통해서 구현된다. 즉, 자바는 JVM을 매개해서 운영체제와 소통하며..

개발 일지/Java 2023.01.10

[Java] 스레드(thread)

어떤 애플리케이션이 실행되면 운영체제가 해당 애플리케이션에게 메모리를 할당해주며 애플리케이션이 실행되는데, 이렇게 실행 중인 애플레케이션을 '프로세스'라고 한다. 그리고 프로세스 내에서 실행되는 소스 코드의 실행 흐름을 '스레드'라고 한다. 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행한다. 즉, 스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미한다. 모든 프로세스에는 한 개 이상의 스레드가 존재한다. 메인 스레드(Maint thread) 자바 애플리케이션을 실행하면 가장 먼저 실행되는 메서드는 main 메서드이며, 메인 스레드가 main 메서드를 실행시켜준다. 메인 스레드는 main 메서드의 코드를 처음부터 끝까지 순차적으로 실행시키며..

개발 일지/Java 2023.01.10