[java] wrapper class

참고

Java tutorial : Numbers and Strings-The Numbers Classes

Wrapper Class

보통은 숫자로 작업을 할 때, 원시 자료형을 사용한다. 각 원시 자료형에는 대응하는 래퍼 클래스가 있다. 이 클래스는 객체로 원시 자료형을 감싸고 있다.
객체를 써야 하는 곳에 원시 자료형을 사용하면 컴파일러가 알아서 박싱을 하고 그 반대로 원시 자료형을 써야 할 때 객체를 사용하면 역시 컴파일러가 언박싱을 한다.

모든 숫자형 래퍼 클래스는 Number 클랙스의 하위에 있다.

  • Number
    • Byte
    • Integer
    • Double
    • Short
    • Float
    • Long

하지만 원시 자료형보다 객체를 사용해햐 하는 이유들이 있다.

1) 메서드 인수로 객체가 필요할때 e.g. collections of numbers 2) 클래스에서 정의한 상수를 사용하기 위해 e.g. MIN_VALUE, MAX_VALUE
3) 다른 원시 자료형, 문자열, 숫자 시스템간의 값을 변환하기 위해 제공되는 클래스 메서드를 사용하기 위해 e.g. decimal, octal, hexadecimal, binary

Methods Implemented by all Subclasses of Number

Method Description
byte byteValue() 숫자형객체를 byte 형으로 변환
short shortValue() 숫자형객체를 short 형으로 변환
int intValue() 숫자형객체를 int 형으로 변환
long longValue() 숫자형객체를 long 형으로 변환
float floatValue() 숫자형객체를 float 형으로 변환
double doubleValue() 숫자형객체를 double 형으로 변환
int compareTo(Byte anotherByte) 숫자형객체를 인수와 비교 객체가 크면 양수, 작으면 음수
int compareTo(Double anotherDouble) 숫자형객체를 인수와 비교 객체가 크면 양수, 작으면 음수
int compareTo(Float anotherFloat) 숫자형객체를 인수와 비교 객체가 크면 양수, 작으면 음수
int compareTo(Integer anotherInteger) 숫자형객체를 인수와 비교 객체가 크면 양수, 작으면 음수
int compareTo(Long anotherLong) 숫자형객체를 인수와 비교 객체가 크면 양수, 작으면 음수
int compareTo(Short anotherShort) 숫자형객체를 인수와 비교 객체가 크면 양수, 작으면 음수
boolean equals(Object obj) 숫자형 객체와 인수가 같은지 비교하여 true/fasle 리턴, 인수가 숫자형 객체와 같은 형의 원시타입이라면 true 리턴한다.
public void testObjcetNumberToPrimitiveType() {

  Integer i = new Integer(10);

  byte b = i.byteValue();
  short s = i.shortValue();
  int ii = i.intValue();
  long l = i.longValue();
  float f = i.floatValue();
  double d = i.doubleValue();

  int a = i.compareTo(new Integer (11));
  logger.debug("{}", a); // -1 :음수이면  좌변이 작은거

  logger.debug("{}", i.equals(10)); // false
}

Conversion Methods, Integer Class

Method Description  
static Integer decode(String s) Decodes a string into an integer. Can accept string representations of decimal, octal, or hexadecimal numbers as input.  
static int parseInt(String s) Returns an integer (decimal only).  
static int parseInt(String s, int radix) Returns an integer, given a string representation of decimal, binary, octal, or hexadecimal (radix equals 10, 2, 8, or 16 respectively ) numbers as input.  
String toString() Returns a String object representing the value of this Integer.  
static String toString(int i) Returns a String object representing the specified integer.  
static Integer valueOf(int i) Returns an Integer object holding the value of the specified primitive.  
static Integer valueOf(String s) Returns an Integer object holding the value of the specified string representation.  
static Integer valueOf(String s, int radix) Returns an Integer object holding the integer value of the specified string representation, parsed with the value of radix. For example, if s = "333" and radix = 8, the method returns the base-ten integer equivalent of the octal number 333.
public void testConversion() {

  String s = new String("123");
  int convInt = Integer.parseInt(s);
  logger.debug("int: {}", convInt); // 123
  String ss = Integer.toString(convInt);
  logger.debug("String: {}", ss); // 123
  Integer bigInt = Integer.valueOf(convInt);
  logger.debug("Integer: {}", bigInt);
}

Formatting Numeric Print Output

숫자 타입에 맞게 출력을 하려면 아래와 같이 사용하면 된다.
System.out.format(String format, Object... args) System.out.printf(String format, Object... args)

타입에 맞게 출력을 하려면 %converter 형태로 % 다음에 타입을 가리키는 문자를 넣으주면 된다.

int i = 461012;
System.out.format("The value of i is: %d%n", i);
// %d = decimal integer
// %n = newline character
Converter Flag Explanation
d   A decimal integer.
f   A float.
n   A new line character appropriate to the platform running the application. You should always use %n, rather than \n.
tB   A date & time conversion—locale-specific full name of month.
td, te   A date & time conversion—2-digit day of month. td has leading zeroes as needed, te does not.
ty, tY   A date & time conversion—ty = 2-digit year, tY = 4-digit year.
tl   A date & time conversion—hour in 12-hour clock.
tM   A date & time conversion—minutes in 2 digits, with leading zeroes as necessary.
tp   A date & time conversion—locale-specific am/pm (lower case).
tm   A date & time conversion—months in 2 digits, with leading zeroes as necessary.
tD   A date & time conversion—date as %tm%td%ty
  08 Eight characters in width, with leading zeroes as necessary.
  + Includes sign, whether positive or negative.
  , Includes locale-specific grouping characters.
  - Left-justified..
  .3 Three places after decimal point.
  10.3 Ten characters in width, right justified, with three places after decimal point.

다른 타입 포맷팅의 자세한 내역은 아래 사이트를 참고 한다.
https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html

public void testFormattingNumeric() {
  // 숫자타입을 포맷팅하기 위해서 `%converter`를 사용한다.
  // `8%d' =  8자리 정수

    long n = 461012;
      System.out.format("%d%n", n);      //  -->  "461012"
      System.out.printf("%d%n", n);      //  -->  "461012"

      System.out.format("%08d%n", n);    //  -->  "00461012"
      System.out.format("%+8d%n", n);    //  -->  " +461012"
      System.out.format("%,8d%n", n);    // -->  " 461,012"
      System.out.format("%+,8d%n%n", n); //  -->  "+461,012"

      double pi = Math.PI;

      System.out.format("%f%n", pi);       // -->  "3.141593"
      System.out.format("%.3f%n", pi);     // -->  "3.142"
      System.out.format("%10.3f%n", pi);   // -->  "     3.142"
      System.out.format("%-10.3f%n", pi);  // -->  "3.142"

      //로케일에 따라 소수점을 콤마로 표현하기도 한다.
      System.out.format(Locale.FRANCE,"%-10.4f%n%n", pi); // -->  "3,1416"

      Calendar c = Calendar.getInstance();
      System.out.format("%tB %te, %tY%n", c, c, c); // -->  "May 29, 2006"
      System.out.format("%tl:%tM %tp%n", c, c, c);  // -->  "2:34 am"
      System.out.format("%tD%n", c);    // -->  "05/29/06"
}

이 외에도 세자리마다 점을 찍는 포맷(The DecimalFormat Class)
간단한 수식 (Class Math)
난수 (Random Numbers, Math.random()) 등이 있다.