네로개발일기

개발자 네로의 개발 일기, 자바를 좋아합니다 !

'programming language'에 해당되는 글 67건


반응형

 

BigDecimal 을 0과 비교하기

 

equals() 메서드 대신에 compareTo(BigDecimal)을 사용하여 비교한다.

 

BigDecimal price; // 선언 및 초기화를 한 변수

if (price.compareTo(BigDecimal.ZERO) == 0) {
    …
}

 

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true

 

signum() 메서드를 사용해서 비교할 수 있지만, compareTo(BigDecimal.ZERO) 메서드가 더 가독성이 좋다.

if (price.signum() == 0) {
    return true;
}
728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

문자열 앞뒤의 공백을 제거하기 위해서 java.lang.String 클래스의 trim(), strip() 메소드를 사용할 수 있다.

trim()

public class StringSpace {
    public static void main(String[] args) {
        // 앞뒤로 공백이 있는 문자열
        String str = " Hi Anna! ";
        // 공백 제거 (trim())
        String trimStr = str.trim();
        // 공백 제거 문자열 출력
        System.out.println("원본 문자열 : '" + str + "'");
        System.out.println("trim 문자열 : '" + trimStr + "'");
    }
}

// 원본 문자열 : ' Hi Anna! '
// trim 문자열 : 'Hi Anna!'

strip()

java11부터 strip() 메서드를 지원한다.

public class StringSpace {
    public static void main(String[] args) {
 
        // 앞뒤로 공백이 있는 문자열
        String str = "  Hi Anna!     ";
 
        // 공백 제거 (strip())
        String stripStr = str.strip();
 
        // 공백 제거 문자열 출력
        System.out.println("원본 문자열 : '" + str + "'");
        System.out.println("strip 문자열 : '" + stripStr + "'");
 
    }
}

// 원본 문자열 : '  Hi Anna!     '
// strip 문자열 : 'Hi Anna!'

trim() 메서드와 strip() 메서드의 차이


trim()
'\u0020' 이하의 공백들만 제거한다.

strip()
유니코드의 공백들을 모두 제거한다.

유니코드에는 스페이스 '\u0020', 탭 '\u0009' 이외에도 더 많은 종류의 공백문자들이 있기 때문에 strip() 메서드가 더 많은 종류의 공백을 제거할 수 있다.

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

파일 문자셋 확인 라이브러리 / Encoding Detector / juniversalchardet 

파일의 문자셋 encoding을 확인하고 싶을 때 사용하는 라이브러리이다.

감지할 수 있는 인코딩 종류

  • Chinese
    • ISO-2022-CN
    • BIG-5
    • EUC-TW
    • HZ-GB-2312
    • GB-18030
  • Cyrillic
    • ISO-8859-5
    • KOI8-R
    • WINDOWS-1251
    • MACCYRILLIC
    • IBM866
    • IBM855
  • Greek
    • ISO-8859-7
    • WINDOWS-1253
  • Hebrew
    • ISO-8859-8
    • WINDOWS-1255
  • Japanese
    • ISO-2022-JP
    • Shift_JIS
    • EUC-JP
  • Korean
    • ISO-2022-KR
    • EUC-KR
  • Unicode
    • UTF-8
    • UTF-16BE / UTF-16LE
    • UTF-32BE / UTF-32LE / X-ISO-10646-UCS-4-3412 / X-ISO-10646-UCS-4-2143
  • Others
    • WINDOWS-1252
    • US-ASCII

 

Dependency

사용하기 위해선 dependency를 추가해줘야 한다.

maven인 경우 pom.xml에 다음 dependency를 추가한다.

<dependency>
	<groupId>com.github.albfernandez</groupId>
	<artifactId>juniversalchardet</artifactId>
	<version>2.4.0</version>
</dependency>

gradle인 경우 build.gradle에 다음 dependency를 추가한다.

implementation 'com.github.albfernandez:juniversalchardet:2.4.0'

 

Sample Code

import org.mozilla.universalchardet.UniversalDetector;

public class TestDetectorFile {

	public static void main (String[] args) throws java.io.IOException {
		if (args.length != 1) {
			System.err.println("Usage: java TestDetectorFile FILENAME");
			System.exit(1);
		}
		java.io.File file = new java.io.File(args[0]);
		String encoding = UniversalDetector.detectCharset(file);
		if (encoding != null) {
			System.out.println("Detected encoding = " + encoding);
		} else {
			System.out.println("No encoding detected.");
		}
	}
}

 

 출처 

https://github.com/albfernandez/juniversalchardet

 

GitHub - albfernandez/juniversalchardet: Originally exported from code.google.com/p/juniversalchardet

Originally exported from code.google.com/p/juniversalchardet - GitHub - albfernandez/juniversalchardet: Originally exported from code.google.com/p/juniversalchardet

github.com

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

The difference between String.valueOf and + ""(concatenation with empty string)

일을 하다가 발견한 코드...

int seqNo = 1;
System.out.println(seqNo + "");

충격적이었다. 나는 분명 String.valueOf() 메서드나 Integer.toString() 메서드를 기대했지만 왜... + "" 나오는 것인가.

 

아무튼 String.valueOf()를 찾아봤다. 

// String.java

public static String valueOf(int i) {
    return Integer.toString(i);
}

Integer.toString()을 반환한다.

// Integer.java

public static String toString(int i) {
    if (i == Integer.MIN_VALUE)
        return "-2147483648";
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = new char[size];
    getChars(i, size, buf);
    return new String(buf, true);
}

int 범위에 맞게 크기를 설정해주고 하나씩 넣어준다.

 

그리고 두 번째 의문, 빈 문자열을 + 연산으로 문자열 연결을 해주는 것과 String.valueOf() 메서드와의 성능 차이는 얼마나 있을까?

// 빈 문자열을 연결해줄 경우, StringBuilder를 사용해서 String을 만들어준다.
public void foo(){
    int intVar = 5;
    String strVar = intVar+"";    
}
public void foo();
  Code:
   0:   iconst_5
   1:   istore_1
   2:   new     #2;			//class java/lang/StringBuilder
   5:   dup
   6:   invokespecial   #3;	//Method java/lang/StringBuilder."<init>":()V
   9:   iload_1
   10:  invokevirtual   #4;	//Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
   13:  ldc     #5; 		//String
   15:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
   18:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
   21:  astore_2
   22:  return

 

// String.valueOf()를 사용할 경우, String의 static 메서드를 사용한다.
public void bar(){
    int intVar = 5;
    String strVar = String.valueOf(intVar);
}
public void bar();
  Code:
   0:   iconst_5
   1:   istore_1
   2:   iload_1
   3:   invokestatic    #8; //Method java/lang/String.valueOf:(I)Ljava/lang/Stri
ng;
   6:   astore_2
   7:   return

 

String.valueOf() 메서드를 사용하여 문자열로 바꿔주는 것이 좀 더 효율적이다.

 

 출처 

https://stackoverflow.com/questions/7752347/string-valueof-vs-concatenation-with-empty-string

 

String valueOf vs concatenation with empty string

I am working in Java code optimization. I'm unclear about the difference between String.valueOf or the +"" sign: int intVar = 1; String strVar = intVar + ""; String strVar = String.valueOf(intVar);

stackoverflow.com

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

DTO(Data Transfer Object)

계층(Layer)간 데이터를 교환하기 위한 객체

DTO의 특징

1. DTO는 데이터 접근 메서드 외 기능을 가지고 있지 않는다. (getter, setter 메서드 외에 비즈니스 로직을 가지지 않는다.)

- 정렬, 직렬화 등 데이터 표현을 위한 기능은 가질 수 있다.

2. 값을 유연하게 변경할 수 있다. (가변성, mutable)

3. 데이터 캡슐화를 통해 유연한 대응이 가능하다.

- 데이터 요청 수 감소 효과

 

VO (Value Object)

값을 가지는 객체

VO의 특징

1. 변하지 않는 값을 가지는 객체(불변성, immutable)

- 값이 변하지 않음을 보장하며 코드의 안정성과 생산성을 높임

2. 값이 같다면 동일한 객체

- 각 객체를 비교하는데 사용되는 ID가 없음

- 같은 객체인지 판단하기 위해 각 속성들의 값을 비교함

- equals() 메서드와 hashCode() 메서드를 오버라이드해서 객체 비교를 구현함

 

공통점 및 차이점

공통점

- 레이어 간 데이터를 전달할 때 사용 가능

- VO는 불변을 보장하기 때문에 데이터 전달 용도로 사용 가능

차이점

DTO VO
값이 변할 수 있음 (가변 객체) 값이 변하지 않음 (불변 객체)
레이어와 레이어 사이에서 사용 가능 모든 레이어에서 사용 가능
내부의 속성(필드)값이 같아도 다른 객체로 식별 내부의 속성(필드)값들이 같다면 같은 객체로 식별
데이터 접근 이외의 기능을 가지지 않음 특정 비즈니스 로직을 가질 수 없음

 

 참고 

https://parkadd.tistory.com/53

 

DTO와 VO 둘 의 사실과 오해 (그리고 Entity)

보통 DTO == VO 즉, DTO와 VO는 혼용해도 된다, DTO와 VO는 같은것이다. 라는 오해가 많이 있습니다. (그런 오해를 가진 분들을 위한 글입니다!! 이미 알고 계신분은 글을 읽고 검수 해주시면 더욱 감사

parkadd.tistory.com

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !