Showing posts with label java. Show all posts
Showing posts with label java. Show all posts

Tuesday, June 13, 2023

How to Convert Integer to Byte Array in Java

Converting an Integer to a Byte Array and Vice Versa in Java

In this guide, we will discuss how to convert an integer to a byte array and vice versa in Java. Here is the Java code for doing so:

Code for Converting an Integer to a Byte Array


public byte[] intToByteArray(int value) {
 byte[] byteArray = new byte[4];
 byteArray[0] = (byte)(value >> 24);
 byteArray[1] = (byte)(value >> 16);
 byteArray[2] = (byte)(value >> 8);
 byteArray[3] = (byte)(value);
 return byteArray;
}

Code for Converting a Byte Array to an Integer


public int byteArrayToInt(byte bytes[]) {
 return ((((int)bytes[0] & 0xff) << 24) |
 (((int)bytes[1] & 0xff) << 16) |
 (((int)bytes[2] & 0xff) << 8) |
 (((int)bytes[3] & 0xff)));
}

This code uses the big endian format, which is commonly used in Java. If you're working in C on an x86 system, you'll need to use the little endian format. This requires changing the array index order from 0, 1, 2, 3 to 3, 2, 1, 0. You can modify the code as follows:


byteArray[3] = (byte)(value >> 24);
byteArray[2] = (byte)(value >> 16);
byteArray[1] = (byte)(value >> 8);
byteArray[0] = (byte)(value);

Using the Functions

Here's an example of how to use these functions to convert an integer to a byte array and back again in Java:


int value = 123456789;
byte[] byteArray = intToByteArray(value);
int newValue = byteArrayToInt(byteArray);

I hope this guide has been helpful to you!

Tuesday, May 30, 2023

Springboot와 MySQL을 사용하여 Full-Text 검색 기능 구현하기

Springboot와 MySQL을 사용하여 Full-Text 검색 기능 구현하기

이 문서에서는 Spring과 MySQL을 사용하여 기본 Full-Text 검색 기능을 구현하는 방법을 소개합니다.

1. MySQL Full-Text 지원 테이블 생성

MySQL에서 Full-Text 검색을 사용하려면 해당 테이블에 FULLTEXT 인덱스를 만들어야 합니다. 아래 예시와 같이 필요한 열에 FULLTEXT 인덱스를 생성합니다:

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT (title, content)
) ENGINE=InnoDB;

2. Spring Boot 프로젝트에 MySQL 연결

Spring Boot에서 MySQL에 연결하려면 pom.xml에 MySQL Connector/J 의존성을 추가해야 합니다:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

그리고, application.properties 파일에 다음과 같이 MySQL 연결 정보를 설정합니다:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

3. Article Entity 및 Repository 생성

Article Entity 및 ArticleRepository를 생성하여 데이터베이스와 연결을 설정합니다:

@Entity
public class Article {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    // 생략: Getters, Setters, and Constructors
}
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}

4. Full-Text 검색을 위한 Custom Query 생성

ArticleRepository에 Custom Query를 생성하여 MySQL의 Full-Text 검색 기능을 활용할 수 있도록 합니다:

@Query(value = "SELECT * FROM articles WHERE MATCH (title, content) AGAINST (?1)", nativeQuery = true)
List<Article> fullTextSearch(String keyword);

이제 fullTextSearch 메소드를 사용하여 제목과 내용에 일치하는 키워드를 포함하는 모든 기사를 검색할 수 있습니다.

5. 검색 기능을 사용하는 REST API 구현

검색 기능을 사용하는 REST API를 구현하려면 Spring Web 의존성도 추가해야 합니다:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

이제 검색 컨트롤러를 생성할 수 있습니다:

@RestController
@RequestMapping("/api/articles")
public class ArticleController {
    private final ArticleRepository articleRepository;

    // 의존성 주입 
    public ArticleController(ArticleRepository articleRepository) {
        this.articleRepository = articleRepository;
    }

   @GetMapping("/search")
   public List<Article> search(@RequestParam String keyword) {
       return articleRepository.fullTextSearch(keyword);
   }
}
 

이렇게 하면 /api/articles/search?keyword=검색어 엔드포인트를 통해 검색 기능을 사용할 수 있습니다.

필요에 따라 Full-Text 검색 기능을 커스터마이징하거나 확장할 수 있습니다. 이 문서는 Springboot와 MySQL을 사용하여 기본 Full-Text 검색 기능을 구현하는 방법을 소개하였습니다. 원하는대로 검색 기능을 적용하기 위해 이 가이드를 참조하세요.

Implementing Full-Text Search Functionality Using Spring and MySQL

Implementing Full-Text Search Functionality Using Spring and MySQL

This document introduces how to implement basic full-text search functionality using Spring and MySQL.

1. Create MySQL Full-Text Supported Table

To use full-text search in MySQL, you need to create a FULLTEXT index on the relevant table. Create the FULLTEXT index on the required columns as shown in the example below:

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT (title, content)
) ENGINE=InnoDB;

2. Connect MySQL to a Spring Boot Project

To connect MySQL to a Spring Boot application, you need to add the MySQL Connector/J dependency to your pom.xml:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

Then, configure the MySQL connection information in the application.properties file as follows:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

3. Create Article Entity and Repository

Create the Article entity and ArticleRepository to establish a connection with the database:

@Entity
public class Article {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    // Omitted: Getters, Setters, and Constructors
}
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}

4. Create Custom Query for Full-Text Search

Create a custom query in the ArticleRepository to leverage MySQL's full-text search functionality:

@Query(value = "SELECT * FROM articles WHERE MATCH (title, content) AGAINST (?1)", nativeQuery = true)
List<Article> fullTextSearch(String keyword);

Now you can use the fullTextSearch method to search for all articles containing keywords in the title and content.

5. Implement REST API for Using the Search Functionality

To implement a REST API that uses the search functionality, you also need to add the Spring Web dependency:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

You can now create a search controller:

@RestController
@RequestMapping("/api/articles")
public class ArticleController {
    private final ArticleRepository articleRepository;

    // Dependency injection 
    public ArticleController(ArticleRepository articleRepository) {
        this.articleRepository = articleRepository;
    }

   @GetMapping("/search")
   public List<Article> search(@RequestParam String keyword) {
       return articleRepository.fullTextSearch(keyword);
   }
}
 

This allows you to use the search functionality through the /api/articles/search?keyword=search_term endpoint..

You can customize or extend your full-text search functionality as needed. This document introduced how to implement basic full-text search functionality using Spring and MySQL. Please refer to this guide to apply the search functionality as desired.

SpringとMySQLを用いた全文検索機能の実装

SpringとMySQLを使用した全文検索機能の実装

この文書では、SpringとMySQLを使用して基本的な全文検索機能を実装する方法を紹介します。

1. MySQL全文検索対応テーブルの作成

MySQLで全文検索を使用するには、該当するテーブルにFULLTEXTインデックスを作成する必要があります。以下の例のように必要な列にFULLTEXTインデックインデックスを作成します。

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT (title, content)
) ENGINE=InnoDB;

2. MySQLをSpring Bootプロジェクトに接続

MySQLをSpring Bootアプリケーションに接続するには、pom.xmlにMySQL Connector/Jの依存関係を追加する必要があります。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

次に、application.propertiesファイルに以下のようにMySQLの接続情報を設定します。

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update

3. Articleエンティティとリポジトリの作成

データベースとの接続を確立するために、ArticleエンティティとArticleRepositoryを作成します。

@Entity
public class Article {
  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String title;
  private String content;

  // 省略:Getter、Setter、およびコンストラクタ
}
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}

4. 全文検索用のカスタムクエリの作成

ArticleRepositoryにカスタムクエリを作成して、MySQLの全文検索機能を活用します。

@Query(value = "SELECT * FROM articles WHERE MATCH (title, content) AGAINST (?1)", nativeQuery = true)
List<Article> fullTextSearch(String keyword);

これで、fullTextSearchメソッドを使用してタイトルとコンテンツにキーワードが含まれるすべての記事を検索できます。

5. 検索機能を使用するためのREST APIの実装

検索機能を使用するREST APIを実装するには、Spring Webの依存関係も追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

これで、検索コントローラーを作成できます。

@RestController
@RequestMapping("/api/articles")
public class ArticleController {
    private final ArticleRepository articleRepository;

    // 依存性注入(Dependency Injection)
    public ArticleController(ArticleRepository articleRepository) {
        this.articleRepository = articleRepository;
    }

    @GetMapping("/search")
    public List<Article> search(@RequestParam String keyword) {
        return articleRepository.fullTextSearch(keyword);
    }
}

これにより、/api/articles/search?keyword=検索キーワードエンドポイントを介して検索機能を使用できます。

必要に応じて、全文検索機能をカスタマイズまたは拡張できます。この文書では、SpringとMySQLを使用して基本的な全文検索機能を実装する方法を紹介しました。必要な全文検索能力を適用するためにこのガイドラインを参照してください。

Tuesday, March 22, 2022

Android 앱의 foreground background 상태 쉽게 확인하기

안드로이드 앱의 실행 상태 확인 방법

FCM 개발 과정에서 앱의 실행 상태가 현재 활성화되어 있는지 아닌지를 판별하는 로직이 필요한 경우가 많습니다. 이러한 상황에선 앱의 실행 상태를 정확히 판별하는 것이 중요하며, 이를 위해 복잡한 과정을 거쳐야 할 수 있습니다.

이 글에서는 앱의 실행 상태를 확인하는 방법을 소개하고, 이를 위해 작성된 특정 코드를 공유합니다. 이 정보는 같은 고민을 가진 개발자들에게 도움이 될 것입니다.

안드로이드 액티비티 스택 확인
안드로이드 액티비티 스택 확인

Application 클래스에서 설정하는 방법

Application 클래스를 상속한 클래스에서는 onCreate 메소드 내에 아래와 같이 코드를 작성하여 앱의 실행 상태를 판별할 수 있습니다. 이때, 'activityStackCnt > 0'는 앱이 활성 상태(foreground)를, 'activityStackCnt == 0'은 앱이 비활성 상태(background)를 의미합니다.

이 방법은 사용자가 뒤로가기 버튼을 통해 앱을 종료하는 경우 'activityStackCnt == 0'이 되도록 설계되었습니다. 하지만 어떤 화면에서든 task kill을 통해 메모리를 제거하면 static으로 선언된 'activityStackCnt'는 int의 기본값인 0으로 초기화되므로, 이 방법은 예상치 못한 상황에서도 잘 작동합니다.

Android EditText 키보드 외부 터치로 간단히 내리는 방법

안드로이드에서 키보드를 간단하게 내리는 방법

본 글에서는 안드로이드에서 에디터 텍스트 사용 후 간편하게 키보드를 내리는 방법에 대해 설명합니다. 여러 방법 중에서도 사용자의 편의를 높이기 위해 화면을 단순히 터치하는 것만으로 키보드를 내려가게 하는 방법을 중점적으로 다룹니다.

이를 위해서는 안드로이드의 기본 백버튼 이용이나 완료(엔터)버튼 커스텀화 등의 방법도 있지만, 본 글에서는 외부 화면을 터치하는 것만으로 키보드를 내리는 방법을 주로 설명합니다.

안드로이드에서 키보드 내리는 화면
안드로이드에서 키보드를 내리는 화면

이 방법을 적용하려면, 기본 activity에 다음 코드를 오버라이드하고 상송해서 사용하면 됩니다. 이렇게 설정하면 별도의 조작 없이 외부 화면을 터치할 때마다 자동으로 키보드가 내려갑니다.

Monday, October 12, 2020

macOS에서 Java Home 위치 설정하기

macOS에서 Java Home 위치 설정하기

macOS에서 Java를 사용하다 보면, 때때로 Java Home의 위치를 알아야 하는 상황이 발생합니다. 이 글에서는 macOS에서 Java Home의 위치를 어떻게 찾을 수 있는지에 대해 설명하겠습니다.

Java Home 경로 찾기

macOS에서 Java Home의 경로는 일반적으로 다음과 같은 형태를 가집니다:

/Library/Java/JavaVirtualMachines/{SomeJAvaVersion}/Contents/Home

자바 버전 설정하기

{SomeJAvaVersion} 부분에는 자신이 사용하고 있는 특정 자바 버전을 넣어주면 됩니다. 예를 들어, 만약 JDK 1.8을 사용한다면 {SomeJAvaVersion} 대신 jdk1.8.0_221.jdk 등을 입력하면 됩니다.

Tuesday, March 19, 2019

Spring JPA와 Query By Example(QBE) 활용 가이드

Spring JPA를 이용하다 보면 복잡한 쿼리들 특히나 복잡한 where clause등을 jpa repository의 CamelCase로 기본 지원되는 것들이 한계가 있었다. 이러한 경우, @query 어노테이션을 활용해 직접 쿼리문을 만들어 사용하였지만, JPA에는 QBE(Query By Example)라는 좋은 기능이 있습니다.

QBE의 핵심은 ExampleMatcher에 있습니다. ExampleMatcher에서 지원하는 여러 메소드를 이용해 검색 대상을 선정할 수 있습니다.

QBE 사용 예시


Example<Person> example = Example.of(new Person("Jon", "Snow"));
repo.findAll(example);

ExampleMatcher matcher = ExampleMatcher.matching().
    .withMatcher("firstname", endsWith())
    .withMatcher("lastname", startsWith().ignoreCase());

Example<Person> example = Example.of(new Person("Jon", "Snow"), matcher); 
repo.count(example);

위 코드에서 첫 번째 예제는 이름과 성이 각각 "Jon"과 "Snow"인 사람들을 찾아내고, 두 번째 예제는 이름이 'n'으로 끝나고 성은 대소문자 구분 없이 'S'로 시작하는 사람들의 수를 찾아냅니다.

참고 링크

더 자세한 내용은 위 링크에서 확인하실 수 있습니다.

Tuesday, January 15, 2019

JPA와 MySQL을 이용한 월별 로그 카운팅을 위한 효율적인 쿼리 작성 방법

JPA와 MySQL을 활용한 월별 로그 카운팅 처리 방법

데이터 분석에 있어서 로그 데이터는 매우 중요한 정보를 제공합니다. 특히, 웹 서비스에서의 사용자 행동 패턴, 시스템 성능 등 다양한 정보를 로그 데이터로부터 얻을 수 있습니다. 이번 글에서는 JPA와 MySQL을 사용하여 월별 로그 카운팅 처리하는 방법에 대해 알아보겠습니다.

JPA와 MySQL 환경에서의 문제 상황

JPA를 사용하면서 통계 자료를 추출하기 위해 매월 로그 카운팅이 필요한 상황이 발생했습니다. 참고로 필자의 환경은 MySQL 이고, 시간은 LocalDate(또는 LocalDateTime)을 사용했습니다. 월별 데이터를 추출하기 위해 GROUP BY 절을 사용했지만, 같은 달이라도 날짜나 시간의 차이로 인해 데이터가 올바르게 묶이지 않는 문제가 발생했습니다.

문제 해결 방법: 포맷 조정으로 로그 카운팅 정확성 향상

위 문제는 쿼리의 포맷 조정으로 해결할 수 있습니다. 아래 쿼리 예시처럼 `DATE_FORMAT` 함수를 이용하여 '년-월' 형태로 날짜 포맷을 조정하면 원하는 결과를 얻을 수 있습니다.

SELECT DATE_FORMAT(registDate, '%Y-%m'), COUNT(e) FROM PlayLog e GROUP BY DATE_FORMAT(registDate, '%Y-%m')

%d 코드 추가로 일(day) 정보도 함께 얻기

%d 코드 추가로 일(day) 정보도 함께 얻으실 수 있습니다. 그러나 일반적인 MySQL 쿼리에서 사용되는 'column as c' 등의 별칭(alias) 기능은 동작하지 않으니 주의하세요!

JPA와 MySQL 활용: 강력한 데이터 분석 도구

위의 방법을 통해 JPA와 MySQL을 활용하여 월별 로그 카운팅 처리를 정확하게 할 수 있습니다. 이를 통해 시스템 성능 개선, 사용자 행동 분석 등 다양한 인사이트를 얻을 수 있습니다. 데이터는 가장 강력한 비즈니스 도구 중 하나입니다. JPA와 MySQL로 데이터의 힘을 최대한 활용해보세요.

Friday, December 14, 2018

1초만에 JAVA LocalDateTime.now()에서 밀리세컨드 제거하기

LocalDateTime.now() 사용 시 밀리세컨드 제거하기

LocalDateTime 예시
그림 1. LocalDateTime

LocalDateTime.now()를 사용하여 날짜와 시간을 처리할 때, yyyy-MM-dd HH:mm:ss 패턴으로 설정하면 동일한 시간임에도 불구하고 1초씩 차이가 발생하는 문제가 있습니다.

이 문제의 원인은 0.xxxx초의 밀리세컨드가 반올림되어서입니다. 일반적으로는 DateTimeFormatter를 사용하여 포맷을 맞추는 것이 권장되지만, LocalDateTime 객체가 필요한 경우에는 이 방법이 번거로울 수 있습니다.

밀리세컨드 제거 방법

다행히도, 생성부터 밀리세컨드를 제외하는 간단한 방법이 있습니다. 아래 코드와 같이 .withNano(0) 옵션을 사용하면 됩니다.

LocalDateTime.now().withNano(0)

.withNano(0) 옵션을 적용하면, 생성될 때부터 밀리세컨드가 제외된 시간 정보를 얻을 수 있습니다.

Tuesday, December 11, 2018

Spring Boot JPA를 사용하면서 'No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor' 에러를 해결하는 방법

JPA에서 'No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor' 에러 해결 방법

프로젝트를 진행하다가 잘 동작하던 코드가 갑자기 'No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor' 에러를 발생시키는 경우가 있습니다. 이 문제를 해결하기 위한 몇 가지 방법에 대해 알아보겠습니다.

.properties 파일 수정

첫 번째로 시도할 수 있는 방법은 .properties 파일에 'spring.jackson.serialization.fail-on-empty-beans=false' 옵션을 추가하는 것입니다. 이 설정을 적용한 후, 응답값에서 'hibernateLazyInitializer'라는 키값으로 빈 오브젝트({})가 반환되는 것을 확인할 수 있습니다.

@JsonIgnoreProperties 어노테이션 추가

그러나 이렇게 해도 완전히 문제가 해결된 것은 아닙니다. 따라서 두 번째로 시도해볼 수 있는 방법은 해당 엔티티마다 '@JsonIgnoreProperties({"hibernateLazyInitializer"})' 어노테이션을 추가하는 것입니다.

JPA 지연 로딩(lazy load) 관련 현상

원인을 계속해서 조사해 보니, 이 현상은 JPA의 지연 로딩(lazy load)과 관련된 것으로 파악되었습니다. 특정 설정 변경 없이도 갑자기 발생하는 이 현상에 대해 좀 더 깊게 파고들어야 했습니다.

getOne(id)과 findById(id)의 동작 방식 차이

코드를 다시 검토하니, JpaRepository에서 findById(id) 메소드를 사용하여 하나의 레코드를 가져오던 부분을 getOne(id) 메소드로 변경한 후부터 문제가 생긴 것으로 보였습니다.

'No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor' 에러 원인 및 해결방안 결론

따라서, getOne(id)의 동작 방식이 findById(id)와 다르며, 이 차이 때문에 'No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor' 에러가 발생하는 것으로 결론지었습니다. 이를 통해 문제의 원인을 찾고 해결할 수 있었습니다.

Friday, December 7, 2018

Spring Boot에서 대용량 파일 업로드 제한 해결하기(multipart)

Spring Boot2에서 대용량 파일 업로드 제한 해결하기

파일 업로드를 개발하다 보면 대용량 파일을 처리하는 과정에서 제한(limit)에 부딪히는 경우가 있습니다. 이러한 문제는 Spring Boot2를 사용하면 간단히 해결할 수 있습니다.

파일 업로드 제한 설정 변경하기

대용량 파일 업로드 제한을 해결하기 위해, 다음 두 가지 옵션을 추가하면 됩니다.

spring.servlet.multipart.max-file-size=200MB
spring.servlet.multipart.max-request-size=200MB

(참고 : 여기서 '200MB'는 예시이며, 실제 용량은 프로젝트의 요구사항에 따라 조절하시면 됩니다.)

마치며

이렇게 간단히 설정 변경만으로 Spring Boot2에서 대용량 파일 업로드 제한 문제를 해결할 수 있습니다. 이 정보가 파일 업로드 기능 개발 시 도움이 되길 바랍니다.

Springboot, JPA, mysql 환경에서 @Column(unique=true) 사용시 DDL 에러 해결법

Springboot2에서 JPA를 사용 하면서 개발기간 동안은 설정파일에 [spring.jpa.hibernate.ddl-auto=create] 옵션을 두고 개발하는 사람들이 있을텐데 Entity에 @Column(unique=true)를 설정 할 경우 아래와 같은 오류를 볼 때가 가끔 있습니다.

Error executing DDL "alter table TABLE_NAME add constraint UK_eke0p6056qepc3h537i4xgban unique (COL_NAME)" via JDBC Statement

이 경우 Springboot2에서 간단하게 처리가 가능합니다. 설정파일 안에 아래의 옵션을 추가해주기만 하면 됩니다.

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

그러나, 다른 데이터베이스를 사용하는 경우에는 해당 데이터베이스에 맞는 Hibernate Dialect를 설정해야 합니다. 예를 들어 PostgreSQL을 사용한다면 "org.hibernate.dialect.PostgreSQLDialect"를 사용할 수 있습니다.

또한, 이 방법은 JPA가 자동으로 스키마를 생성/변경할 때만 적용됩니다. 이미 생성된 스키마에 대해서는 DBMS에서 직접 제약 조건을 수정해야 할 수도 있습니다. 따라서 이 점도 함께 고려하시는 것이 좋습니다.

Monday, November 26, 2018

Android Mediaplayer에서 JNI 에러로 인한 음원 중지 현상 해결 방법

MediaPlayer 재생시 Mediaplayer finalized without being released (JNI) 등의 에러로 음원이 중지될 경우 여러 이유가 있겠지만 아래의 예를 한번 들어보겠습니다.

android mediaplayer1
android mediaplayer1

위와 같이 미디어 플레이어를 만들고 시작을 하면 어느 순간 갑자기 Mediaplayer finalized without being released (JNI) 에러가 나면서 꺼지는 경우가 있습니다.

해결법은 의외로 간단합니다.

android mediaplayer2
android mediaplayer2

위와 같이 로컬변수(local variable)를 멤버변수(member variable, class variable)로 변경해주면 해결 됩니다. 아마 로컬에서 사용된 Mediaplayer를 가비지 콜렉터(GC)가 수집해가서 발생하는 이슈인듯 보입니다.

Tuesday, May 29, 2018

Java와 Javascript에서 상수 선언에 대한 이해

자바와 ES6에서의 상수 선언과 불변성에 대한 이해

자바와 ES6에서 상수를 선언하는 방법과 그 불변성에 대해 알아보겠습니다.

자바에서의 상수 선언

자바에서는 'static final'을 사용하여 불변하는 값을 선언합니다. 예를 들어, public static final int constInt = 1;이라고 선언하면, constInt = 2;로 변경하려고 하면 에러가 발생합니다.

ES6에서의 상수 선언

ES6도 유사한 방식으로 작동합니다. 'const' 키워드를 사용하여 변수를 선언하면 재선언이 불가능합니다. 예시로, const constInt = 1;, 그리고 다시 constInt = 2;;라고 하면 에러가 발생합니다.

'불변'에 대한 오해

'불변한다'라는 표현은 사람들이 쉽게 오해할 수 있습니다. 실제로는 자료형에 따라 동작 방식이 다릅니다.

'불변'의 의미: 기본 자료형 vs 참조 자료형

(1) 기본 자료형(Primitive Type): 이 경우 '불변'은 완전히 적용됩니다.
(2) 참조 자료형(Reference Type): 이 경우 해당 변수에 연결된 주소값은 불변하지만 내부 속성은 변화 가능합니다.
예를 들어 아래와 같은 클래스가 있다고 가정합시다:


class Dog{
    String name = "dd";
    int age = 1;
}
static final Dog dog = new Dog();

'dog', 즉 'dd' 이름과 1살 나이의 Dog 인스턴스는 변경할 수 없지만, 'dog.name'= "pp" 처럼 내부 속성인 이름을 바꾼다면 문제 없습니다.

'불변'의 의미: ES6에서 객체 속성 변경 가능성

ES6에서도 비슷한 방식으로 작동합니다. 아래와 같이 객체의 속성값은 언제든 변경 가능합니다:


const foo = {};
foo.bar = 11; 
foo.bar = 22;

마무리

'불변'이라는 개념은 상황에 따라 다르게 해석될 수 있으니 주의해야 합니다. 이 글에서 설명한 내용에 대해 피드백은 언제든 환영입니다!

Saturday, December 2, 2017

추가 변수 선언 없이 이루어지는 두 변수 값 교환 방법: 효율적인 Variable Swap

임시 변수 없이 두 변수의 값을 스왑하는 방법

두 변수의 값을 서로 교환하려면 보통 임시 변수를 사용합니다. 하지만, 비트 연산을 이용하면 임시 변수 없이도 두 변수의 값을 교환할 수 있습니다. 이 방식은 JAVA에서 작동하지만, 대부분의 프로그래밍 언어에서 비트 연산을 지원하기 때문에 다양한 언어에 적용할 수 있습니다.


int a = 1; // 0000 0001
int b = 2; // 0000 0010 
a = a ^ b; // 0000 0001 ^ 0000 0010 = 0000 0011
b = b ^ a; // 결과 : a=2, b=1;

위와 같은 방법은 필요없는 변수 선언을 줄여 성능 향상을 기대할 수 있지만, 가독성 면에서는 임시변수를 사용하는 것이 더 좋을 수도 있습니다.

자바(JAVA)에서 int를 byte array(byte[])로, byte array(byte[])를 int로 변환하는 함수

자바에서 정수를 바이트 배열로 변환하고, 바이트 배열을 정수로 변환하는 방법

자바 프로그래밍에서 데이터를 다루다 보면 때때로 정수를 바이트 배열로 변환하거나 그 반대의 작업을 해야 할 경우가 있습니다. 이 글에서는 이러한 변환을 수행하는 두 가지 함수에 대해 설명합니다.

정수를 바이트 배열로 변환하는 함수

먼저, 정수를 바이트 배열로 변환하는 함수입니다. 이 함수는 4개의 요소를 가진 새로운 바이트 배열을 생성하고, 각 요소에 대해 입력된 정수 값을 오른쪽으로 비트 시프팅하여 해당 부분의 값을 추출합니다.

public byte[] intToByteArray(int value) {
  byte[] byteArray = new byte[4];
  byteArray[0] = (byte)(value >> 24);
  byteArray[1] = (byte)(value >> 16);
  byteArray[2] = (byte)(value >> 8);
  byteArray[3] = (byte)(value);

return byteArray;
}

바이트 배열을 정수로 변환하는 함수

다음으로, 바이트 배열을 다시 원래의 정수 값으로 복원하는 함수입니다. 각 요소는 왼쪽으로 비트 시프팅되어 원래 위치에 맞게 조정되며, 이렇게 복원된 값들은 OR 연산자(|)를 통해 결합됩니다.

public int byteArrayToInt(byte bytes[]) {
    return ((((int)bytes[0] &0xff) <<24) |
            (((int)bytes[1] &0xff) <<16) |
            (((int)bytes[2] &0xff) <<8 ) |
            (((int)bytes[3] &0xff)));
}

함수 사용 예시

아래 코드는 위에서 설명한 두 가지 함수를 어떻게 사용할 수 있는지 보여줍니다.

int value =123456789;
byte[] byteArray = intToByteArray(value);
int newValue = byteArrayToInt(byteArray);

위 코드에서 `value`라는 변수에 저장된 정수 값은 `intToByteArray`라는 메서드에 의해 바이트 배열 형태로 변환되고, 이렇게 변환된 바이트 배열은 다시 `byteArrayToInt`라는 메서드에 의해 원래의 정수 값으로 복원됩니다.