본문 바로가기
Backend/Java

[자바의 신] 20장

by unknownomad 2022. 7. 26.

20장 - 가장 많이 쓰이는 패키지는 자바랭


java.lang 패키지

  • 자바 패키지 중 유일하게 java.lang 패키지에 있는 클래스들은 import 안 해도 사용 가능
  • 자바에 꼭 필요한 기능 제공

 

java.lang 패키지에 정의된 중요한 에러

OutOfMemoryError (OOME)

  • 메모리 부족으로 발생하는 에러
  • 자바는 가상 머신에서 메모리를 관리하나, 프로그램을 잘못 작성하거나 설정이 제대로 되어있지 않은 경우에 해당 에러 발생함

StackOverFlowError

  • 호출된 메서드의 깊이가 너무 깊을 때 발생함
  • 자바에서는 스택(Stack)이라는 영역에서 어떤 메서드가 어떤 메서드를 호출했는지에 대한 정보를 관리함
  • 예를 들어 메서드가 자기 자신을 호출하는 재귀 메서드를 잘못 작성하면 스택에 쌓을 수 있는 메서드 호출 정보의 한계를 넘어서 해당 에러 발생함

 

java.lang 패키지에 선언된 기본 어노테이션

  • Override
  • Deprecated
  • SuppressWarnings

숫자 처리 클래스

  • 자바에서는 간단한 계산 시 대부분 기본 자료형(Primitive type) 사용
  • 기본 자료형은 자바의 힙(Heap)이라는 영역에 저장되지 않고, 스택이라는 영역에 저장되어 관리됨
  • ➡ 계산 시 보다 빠른 처리 가능
  • But 이런 기본 자료형의 숫자를 객체로 처리해야 할 때가 있음
    • Byte
    • Short
    • Integer
    • Long
    • Float
    • Double
    • Character
    • Boolean

 

감싼(Wrapper) 클래스

  • 숫자 처리하는 클래스 Byte, Short, Integer, Long, Float, Double (Character, Boolean 제외)
  • 모두 Number라는 abstract 클래스를 확장(extends)함
  • 겉보기엔 참조 자료형이나, 기본 자료형처럼 사용 가능(자바 컴파일러에서 자동으로 형변환 해주기에)

 

parse타입이름()과 valueOf()

  • 둘 다 static 메서드(타입 객체 생성할 필요 없이 바로 사용 가능)
  • Character 클래스 제외 공통 메서드로 제공됨
public void numberTypeCheck() {
    String value1 = "3";
    String value2 = "5";
    
    byte byte1 = Byte.parseByte(value1);
    byte byte2 = Byte.parseByte(value2);
    
    System.out.println(byte1 + byte2); //8
    
    Integer refInt1 = Integer.valueOf(value1);
    Integer refInt2 = Integer.valueOf(value2);
    System.out.println(refInt1 + refInt2 + "7"); //87
}
  • 둘 다 String과 같은 문자열 ➡ 숫자 타입으로 변환하나, 차이가 있음
parse타입이름() valueOf()
기본 자료형 리턴 참조 자료형 리턴

 

public void numberTypeCheck2() {
    Integer refInt1;
    refInt1 = 100;
    System.out.println(refInt1.doubleValue());
}

컴파일 이상 x, 실행도 잘 됨 ➡ 이런 숫자 처리하는 참조 자료형 만든 이유?

  • 매개 변수를 참조 자료형으로만 받는 메서드 처리 위해
  • 제네릭처럼 기본 자료형을 사용하지 않는 기능 사용 위해
  • MIN_VALUE (최소값)나 MAX_VALUE (최대값)와 같이 클래스에 선언된 상수 값 사용 위해
  • 문자열 ➡ 숫자로, 숫자열 ➡ 문자로 쉽게 변환하고, 2, 8, 10, 16 진수 변환 쉽게 처리 위해

MIN_VALUE와 MAX_VALUE

  • 기본 자료형을 참조 자료형으로 만든 클래스들은 Boolean 클래스 제외, 모두 MIN_VALUE와 MAX_VALUE라는 상수 가지고 있음
  • 해당 타입이 나타낼 수 있는 값의 범위 확인하려면 static으로 선언된 이 상수들 사용하면 됨
public void numberMinMaxCheck() {
    System.out.println("Byte min=" + Byte.MIN_VALUE + " max=" + Byte.MAX_VALUE);
    System.out.println("Short min=" + Short.MIN_VALUE + " max=" + Short.MAX_VALUE);
    System.out.println("Integer min=" + Integer.MIN_VALUE + " max=" + Integer.MAX_VALUE);
    System.out.println("Long min=" + Long.MIN_VALUE + " max=" + Long.MAX_VALUE);
    System.out.println("Float min=" + Float.MIN_VALUE + " max=" + Float.MAX_VALUE);
    System.out.println("Double min=" + Double.MIN_VALUE + " max=" + Double.MAX_VALUE);
    System.out.println("Character min=" + (int)Character.MIN_VALUE + " max=" + (int)Character.MAX_VALUE);
}

어떤 값을 원하는 진수의 숫자로 표현하고 싶을 때

  • 숫자 클래스에서 제공되는 메서드 사용
  • Integer나 Long 타입인 값의 숫자가 너무 많을 때 2진수나 16진수로 표현하면 보다 보기 편함
public void integerMinMaxCheckBinary() {
    System.out.println("Integer BINARY min=" + Integer.toBinaryString(Integer.MIN_VALUE));
    System.out.println("Integer BINARY max=" + Integer.toBinaryString(Integer.MAX_VALUE));
    
    System.out.println("Integer HEX min=" + Integer.toHexString(Integer.MIN_VALUE));
    System.out.println("Integer HEX min=" + Integer.toHexString(Integer.MAX_VALUE));
}

 

돈 계산 등 중요한 연산 수행 시 정확한 계산 위해 사용해야 하는 클래스

정수형 소수형
BigInteger BigDecimal
모두 java.lang.Number 클래스 상속 받음
java.math 패키지에 선언되어 있음

System 클래스

  • 생성자 x
  • 시스템에 대한 정보 확인하는 클래스
선언 및 리턴 타입 변수명 설명
static PrintStream err 에러 및 오류 출력 시 사용
static InputStream in 입력값 처리 시 사용
static PrintStream out 출력값 처리 시 사용

 

System.out.println()

  • System = 클래스 이름
  • out = System 클래스에 static으로 선언된 변수(클래스 변수) 이름, PrintStream 타입
  • println() = PrintStream 클래스에 선언되어 있으며, static 메서드
  • out과 println() 모두 static으로 선언되어 있음 = 별도의 클래스 객체 생성할 필요 x
  • ➡ 출력 관련된 메서드는 System 클래스에서 찾으면 안 되고, PrintStream 클래스에서 찾아야 함

 

PrintStream과 InputStream

  • 모두 java.io 패키지에 선언되어 있음

 

System 클래스에서 제공하는 메서드

  • 시스템 속성(Property)값 관리
  • 시스템 환경(Environment)값 조회
  • GC 수행
  • JVM 종료
  • 현재 시간 조회
  • 기타 관리용 메서드
  • (GC 수행 및 JVM 종료 메서드 : 절대 수행하면 안 됨)

 

시스템 속성(Property)값 관리

리턴 타입 메서드 이름 및 매개 변수 설명
static String clearProperty(String key) key에 지정된 시스템 속성 제거
static Properties getProperties() 현재 시스템 속성을 Properties 클래스 형태로 제공
static String getProperty(String key) key에 지정된 문자열로 된 시스템 속성값(value) 얻음
static String getProperty(String key, String def) key에 지정된 문자열로 된 시스템 속성값(value) 얻고, 만약 없으면 def에 지정된 값 리턴
static void setProperties(Properties props) Properties 타입으로 넘겨주는 매개 변수에 있는 값들을 시스템 속성에 넣음
static String setProperty(String key, String value) key에 지정된 시스템 속성 값을 value로 대체

 

Properties 클래스

  • java.lang 패키지에 속함
  • Hashtable 상속 받은 클래스
Hashtable 배열
key와 value의 쌍으로 이루어진 여러 개의 값 갖는 Map 형태의 자료 구조
Map 형태의 자료 구조는 순서 x
key-value 쌍으로 되어 있음
이 객체에서 원하는 값 찾을 때에는 위치가 아닌 key로 찾음
하나의 객체 만들고 거기에 여러 개의 값 순서대로 들어감
그 위치(index)로 원하는 값 찾음
  • 자바 프로그램 실행 시 자동으로 Properties 객체 생성됨
  • Properties의 값은 언제든 같은 JVM 내에서는 꺼내 사용할 수 있음
package d.lang;

public class JavaLangSystem {
    public static void main(String[] args) {
        JavaLangSystem sample = new JavaLangSystem();
        sample.systemPropertiesCheck();
    }
    public void systemPropertiesCheck() {
        System.out.println("java.version=" + System.getProperty("java.version"));
    }
}

 

시스템 환경(Environment)값 조회

리턴 타입 메서드 이름 및 매개 변수 설명
static Map<String, String> getenv() 현재 시스템 환경에 대한 Map 형태의 리턴값 받음
static String getenv(String name) 지정한 name에 해당하는 값 받음
  • Properties: 추가 및 변경 가능
  • 환경값 env : 변경 불가, 읽기 only (대부분 OS나 장비 관련)
System.out.println("JAVA_HOME=" + System.getenv("JAVA_HOME"));
  • JAVA_HOME: 보통 JDK 설치된 경로(java.exe나 java 명령어가 있는 위치가 아닌, 자바의 가장 상위 디렉터리)
  • 매개 변수가 없는 getenv() 메서드는 리턴 타입이 Map<String, String>

 

GC 수행

리턴 타입 메서드 이름 및 매개 변수 설명
static void gc() 가비지 컬렉터 실행
static void runFinalization() GC 처리 기다리는 모든 객체에 대해 finalize() 메서드 실행
  • 자바는 메모리 처리를 개발자가 별도로 하지 x
  • System.gc() 메서드 호출하면 가비지 컬렉션을 명시적으로 처리하도록 할 수 있음
  • Object 클래스에 선언된 finalize() 메서드를 명시적으로 수행하는 runFinalization() 메서드 있음
  • 위 두 개 메서드는 직접 호출할 필요 없이 JVM이 알아서 더 이상 필요 없는 객체 처리하는 GC 작업과 finalization 작업 실행

 

JVM 종료

리턴 타입 메서드 이름 및 매개 변수 설명
static void exit(int status) 현재 수행 중인 JVM을 멈춤
  • 위 결과값이 0일 때만 정상적인 종료
  • 그 외의 숫자는 비정상적인 종료 의미

 

현재 시간 조회

리턴 타입 메서드 이름 및 매개 변수 설명
static long currentTimeMillis() 현재 시간을 밀리초 단위로 리턴(1초 = 1000ms)
현재 시간을 나타낼 때 유용
static long nanoTime() 현재 시간을 나노초 단위로 리턴
시간 차이 측정하기 위한 용도
public void numberMinMaxElapsedCheck() {
    JavaLangNumber numberSample = new JavaLangNumber();
    long startTime = System.currentTimeMillis();
    long startNanoTime = System.nanoTime();
    numberSample.numberMinMaxCheck();
    System.out.println("Milli second=" + (System.currentTimeMillis() - startTime));
    System.out.println("Nano second=" + (System.nanoTime() - startNanoTime));
}
  • 나노초를 밀리초로 확인하기 위해 1/1,000,000으로 나누면 0.5ms

 

out과 err

  • System 클래스에 선언된 out (System.out)과 err (System.err) 변수는 PrintStream이라는 동일 클래스의 객체
  • 정상 출력인지, 에러 났을 때의 출력 결과인지 차이만 존재함

 

PrintStream 클래스의 출력 위한 주요 메서드

  • print()
  • println()
  • format()
  • printf()
  • write()

 

print() println()
매개 변수에 있는 내용 출력
줄바꿈 x
매개 변수에 있는 내용 출력
매개 변수가 없는 메서드도 존재함
줄바꿈 처리
두 메서드 모두 기본 자료형과 참조 자료형을 매개 변수로 사용 가능
byte타입이나 short 타입을 매개 변수로 받는 메서드는 선언되어 있지 x
Why? byte나 short 타입을 print()나 println() 메서드로 넘겨주면 int 타입을 매개 변수로 받는 메서드에서 알아서 처리해줌
//줄바꿈
println(""); //이 경우, 불필요한 String 객체 생성됨
println(); //이 방법으로 줄바꿈하기
package d.lang;

public class JavaLangSystemPrint {
    public static void main(String[] args) {
        JavaLangSystemPrint sample = new JavaLangSystemPrint();
        sample.printStreamCheck();
    }
    
    public void printStreamCheck() {
        byte b = 127;
        short s = 32767;
        System.out.println(b);
        System.out.println(s);
        printInt(b);
        printInt(s);
    }
    
    public void printInt(int value) {
        System.out.println(value);
    }
}

 

println()과 null

public void printNull() {
    Object obj = null;
    System.out.println(obj);
    System.out.println(obj + " is object's value");
}
//결과
//null
//null is object's value

obj 객체가 null인데 컴파일 에러 나지 않는 이유

  • 보통 객체 출력 시
    • toString() 메서드를 단순 호출 = null인 obj의 toString() 호출하는 셈
    • null인 obj는 아무런 할당이 되어있지 않기에 메서드 호출 불가
    • ➡ 컴파일은 제대로 되지만 실행 시 예외 발생
    • But 위 소스는 컴파일 제대로 됨
  • print()와 println()
    • 단순히 toString() 메서드 결과 출력하지 x
    • String의 valueOf()라는 static 메서드 호출해 결과 받은 후 출력
    • = String.valueOf(obj) 호출됨

 

public void printNullToString() {
    Object obj = null;
    System.out.println(obj.toString());
}
//결과
//NullPointerException 발생
  • 객체 출력 시 toString()보다 valueOf() 사용하는 게 훨씬 안전함

 

null + 문자열인데도 예외 발생하지 않는 이유

public void printNull() {
    Object obj = null;
    System.out.println(obj + " is object's value");
}
//결과
//null is object's value
  • 컴파일러에서 이 더하기 문장을 StringBuilder로 변환하기 때문
new StringBuilder().append(obj).append(" is object's value");

//obj = null;
//문제 없이 null 출력 가능
new StringBuilder().append(null).append(" is object's value");

 

format()과 printf()

  • 서로 이름만 다르고 처리 동일함

'Backend > Java' 카테고리의 다른 글

[자바의 신] 22장  (0) 2022.08.09
[자바의 신] 21장  (0) 2022.08.09
[자바의 신] 19장  (0) 2022.07.26
[자바의 신] 18장  (0) 2022.07.26
[자바의 신] 17장  (0) 2022.07.25

댓글