java.lang 패키지
- 자바의 패키지 중에서 유일하게 java.lang 패키지에 있는 클래스들은 import 하지 않고 사용할 수 있다.
- 아주 다양한 기능을 하는 클래스와 인터페이스들이 혼재되어 있다.
예외 및 에러
- java.lang 패키지에 정의된 많은 에러가 있지만 대부분 볼 일이 거의 없고 이 중 가끔 나타나는 에러에 대해서 보겠다.
- OutOfMemoryError(OOME) : 메모리가 부족해 발생하는 에러로 프로그램을 잘못 작성하거나 설정이 제대로 되어 있지 않을 떄 발생한다.
- StackOverflowError : 자바는 스택 영역에서 어떤 메소드가 어떤 메소드를 호출했는지 정보를 관리하는데 호출된 메소드의 깊이가 너무 깊을 때 발생한다.
ex) 메소드가 자기 자신을 호출하는 재귀 메소드를 잘못 작성했을 때 스택에 쌓을 수 있는 호출 정보의 한계를 넘어서 에러가 발생할 수 있다.
숫자를 처리하는 클래스
- 간단한 계산을 할 때 대부분 기본 자료형을 사용한다.
- 기본 자료형은 힙 영역에 저장되지 않고 스택 영역에 저장되어 관리된다.
- 계산할 때 보다 빠른 처리가 가능하다.
- 기본 자료형은 힙 영역에 저장되지 않고 스택 영역에 저장되어 관리된다.
- 기본 자료형의 숫자를 객체로 처리해야 할 필요가 있을 때 사용하는 기본 자료형으로 선언되어 있는 타입의 클래스들이 있다.
- Character를 제외한 나머지는 기본 자료형의 이름에서 첫 문자만 대문자로 표기
- 기본 자료형 타입의 클래스 종류
- Byte
- Short
- Integer
- Long
- Float
- Double
- Character
- Boolean
- Character, Boolean 제외한 숫자를 처리하는 클래스를 Wrapper 클래스라고 부른다.
- 모두 Number라는 abstract 클래스를 상속(extends)한다.
- 겉 보기로는 Byte, Short, Integer, Long, Float, Double 타입은 참조 자료형처럼 보이지만 기본 자료형처럼 사용할 수 있다.
- 컴파일러가 자동으로 형 변환을 해주기 때문에
- new를 사용하여 객체를 만들지 않아도 값을 할당할 수 있다.
Integer refInt1; //wrapper 클래스의 객체 생성
refInt1 = 100; //new를 사용해 객체를 만들지 않고 값을 할당
- 숫자를 처리하는 참조 자료형이 있는 이유
- 매개 변수를 참조 자료형으로만 받는 메소드를 처리하기 위해서
- 제네릭과 같이 기본 자료형을 사용하지 않는 기능을 사용하기 위해서
- MIN_VALUE, MAX_VALUE와 같이 클래스에 선언된 상수 값을 사용하기 위해서
- 문자열을 숫자로, 숫자를 문자열로 쉽게 변환하고 2 / 8 / 10 / 16 진수 변환을 쉽게 처리하기 위해서
- 2진수 toBinaryString() , 8진수 toOctalString() ,16진수 toHexString()
- Character를 제외하고 공통적인 메소드를 제공한다.
- 공통적인 메소드 종류
- parse타입이름()
- valueOf()
- 두 메소드의 공통점
- static 메소드로 타입 객체를 생성할 필요 없이 바로 사용 가능하다.
- String과 같은 문자열을 숫자 타입으로 변환하는 메소드다.
- 두 메소드의 차이점
- parse타입이름() 메소드는 기본 자료형을 리턴한다.
- valueOf() 메소드는 참조 자료형을 리턴한다.
- 공통적인 메소드 종류
- Boolean 클래스를 제외하고 기본 자료형을 참조 자료형으로 만든 클래스들은 최소 / 최대값 상수를 가지고 있다.
- static으로 선언된 MAX_VALUE, MIN_VALUE를 사용할 수 있다.
ex) System.out.println(Integer.MAX_VALUE); - Character의 경우 최대 / 최솟값을 그냥 출력 시 char 타입으로 출력되므로 필요한 경우 형 변환해서 출력하기.
- static으로 선언된 MAX_VALUE, MIN_VALUE를 사용할 수 있다.
- 돈 계산과 같이 중요한 연산을 수행 시 BigInteger(정수), BigDecimal(실수)을 사용하자.
- java.lang.Number 클래스를 상속 받고 java.math 패키지에 선언되어 있다.
System 클래스
- 생성자가 없는 클래스로 3개의 static 변수가 선언되어 있다.
선언 및 리턴 타입 | 변수명 | 설명 |
static PrintStream | err | 에러 및 오류를 출력할 때 사용 |
static InputStream | in | 입력값을 처리할 때 사용 |
static PrintStream | out | 출력값을 처리할 때 사용 |
- System.out.println()
- System은 클래스의 이름
- out은 static으로 선언되고 PrintStream타입의 변수
- println()은 PrintStream 클래스에 선언된 static 메소드
- 그렇기에 별도의 객체를 생성해 사용할 필요가 없다.
- 입/출력과 관련된 클래스는 System이 아닌 PrintStream / InputStream 클래스
- java.io 패키지에 선언된 클래스
- System 클래스는 시스템에 대한 정보를 확인하는 클래스
- System 클래스에서 제공하는 메소드 분류
- 시스템 속성 값 관리
- static String clearProperty(String key) : 매개 변수 key에 지정된 시스템 속성 제거
- static Properties getProperties() : 현 시스템 속성을 Properties 클래스 형태로 제공
- static String getProperties(String key) : 문자열 key로 된 시스템 속성 값을 얻는다.
- static String getProperties(String key, String def) : key로 된 시스템 속성 값을 얻고 없다면 def 값을 리턴한다.
- static void setProperties(Properties props) : Properties 타입으로 넘겨주는 매개 변수에 있는 값들을 시스템 속성에 넣는다.
- static String setProperty(String key, String value) : key에 지정된 시스템 속성 값을 value로 대체한다.
- Properties 클래스는 java.util 패키지에 속하며 Hashtable 상속을 받은 클래스다.
- 필요 여부와 상관 없이 자바 프로그램 실행 시 Properties 객체 생성이 되고 JVM 내에서 언제 어디서든 값을 꺼내서 사용할 수 있다.
- Properties 값은 추가, 수정이 가능
- 시스템 환경 값 조회
- static Map<String, String> getenv() : 현재 시스템 환경에 대한 정보를 Map 형태로 리턴한다.
- static String getenv(String name) : 지정한 name에 해당하는 값을 리턴한다.
- 환경 값 env는 OS, 장비에 관련된 것들로 수정이 안되고 읽기만 가능하다.
- GC 수행
- static void gc() : 가비지 컬렉터를 실행한다.
- static void runFinalization() : GC 처리를 기다리는 모든 객체에 대하여 finalize() 메소드를 실행한다.
- 자바에서는 메모리 처리를 개발자가 별도로 하지 않지만 위 메소드를 사용하면 GC를 명시적으로 처리하도록 할 수 있지만 절대 사용하지 말기....!
- JVM 종료
- static void exit(int status) : 현재 수행중인 JVM을 멈춘다.
- 매개 변수가 0일 경우에만 정상적인 종료를 의미하고 그 외 숫자는 비정상적인 종료를 의미한다.
- 절대 사용해서는 안되는 메소드 중 하나로 사용하지 말자!!
- 현재 시간 조회
- static long currentTimeMillis() : 현재 시간을 밀리초 단위로 리턴한다. 현재 시간을 나타낼 때 매우 유용한 메소드로 UTC라는 Universal time 기준으로 출력한다.
- long 타입으로 현재 시간을 리턴하기에 java.util.Date 클래스를 사용해 시간 확인이 가능하다.
- static long nanoTime() : 현재 시간을 나노초 단위로 리턴한다. 시간의 차이를 측정하기 위한 메소드
- static long currentTimeMillis() : 현재 시간을 밀리초 단위로 리턴한다. 현재 시간을 나타낼 때 매우 유용한 메소드로 UTC라는 Universal time 기준으로 출력한다.
- 기타 관리용 메소드들
- 사용하는 일이 거의 없다.....
- 시스템 속성 값 관리
- "GC 수행"관련 메소드와 "JVM 종료" 관련 메소드는 절대 수행해서는 안된다!!
- System 클래스에서 제공하는 메소드 분류
Hashtable은 Key와 Value의 이루어진 여러 개의 값을 갖는 Map 형태의 자료구조
Map 형태의 자료구조는 순서가 거의 없고 key-value 쌍으로 되어 있다.
객체에서 원하는 값을 찾을 때 index가 아닌 key로 찾는다.
System.out
- out과 err 변수는 PrintStream 클래스의 객체로 정상 출력 / 에러가 났을 때의 출력 결과인지의 차이만 존재한다.
- PrintStream 클래스는 static하게 사용한다.
- PrintStream 클래스의 출력을 위한 주요 메소드
- print()
- println()
- print()와 println()의 차이점
- print()는 매개 변수에 있는 내용을 출력하며 줄 바꿈을 하지 않는다.
- println()은 매개 변수에 있는 내용을 출력하며 줄 바꿈을 하지만 매개 변수가 없는 메소드도 존재한다.
- 공통점
- 모두 기본 자료형과 참조 자료형을 매개 변수로 사용할 수 있다.
- byte, short를 매개 변수로 받을 경우 int 타입을 매개 변수로 받는 메소드에서 알아서 처리한다.
- null인 객체를 매개 변수로 보내는 경우
- null 객체로 toString()을 호출하면 컴파일 시는 문제가 되지 않지만 실행 시 예외가 발생한다.
- print(), println() 메소드는 일반적인 객체는 toString()을 호출해 객체 정보를 출력하지만 null 인 객체는 toString()을 호출하는 것이 아닌 String의 valueOf() 메소드를 호출해 출력하기에 예외가 발생하지않고 null이 출력된다.
- 객체 출력 시 toString()보다 valueOf()를 사용하는 것이 훨씬 안전하다. (NullPointerException 예외가 발생하지 않음)
- 모두 기본 자료형과 참조 자료형을 매개 변수로 사용할 수 있다.
- print()와 println()의 차이점
- format()
- printf()
- format(), printf() 메소드는 이름만 다를 뿐 처리하는 것은 동일하다.
- write()
- System.out.wirte() 로는 많이 사용되지 않는다.
Object obj = null;
System.out.println(obj.valueOf()); //null 출력
System.out.println(obj.toString()); //NullPointerException 예외 발생
System.out.println(obj+" is object's value"); //예외가 발생하지 않고 정상 출력
- valueOf() 메소드는 null이 넘어오면 문자열 null로 출력하기에 NullPointerException을 발생시키지 않는다.
- toString() 메소드는 null이 넘어오면 NullPointerException(NPE) 예외를 발생시킨다.
- obj + " is object's value"가 정상 출력되는 이유
- 컴파일러에서 더하기 문장을 StringBuilder로 변환하기 때문
- obj + " is object's value"가 new StringBuilder().append(obj).append(" is object's value")로 변환되기 때문에 append(obj) 부분에서 append()에 null을 넣어버린것과 동일
null is object's value 가 출력된다.
간단 내용 정리
1. 같은 패키지에 있는 클래스를 제외하고, 별도로 import 하지 않아도 되는 패키지는 무엇인가요?
java.lang 패키지
2. 자바의 메모리가 부족해서 발생하는 에러는 무엇인가요?
OutOfMemoryError(OOME)
3. 메소드 호출관계가 너무 많아서 발생하는 에러는 무엇인가요?
StackOverflowError
4. java.lang 패키지에 선언되어 있는 3개의 어노테이션에는 어떤 것들이 있고, 각각의 역할은?
@Override 부모 클래스의 메소드를 오버라이딩할 경우 명시적으로 표현
@Deprecated 더 이상 사용하지 않는 경우 명시해주고 경고해주기 위한 용도
@SuppressWarnings는 컴파일 경고 무시하는 용도
5. Double과 Integer 같은 숫자 타입에서 처리할 수 있는 최대, 최소값을 알 수 있는 상수의 이름은?
MAX_VALUE (최대값)
MIN_VALUE (최소값)
6. Integer값을 2진법으로 표현하려면 어떤 메소드를 사용해야 하나요?
toBinaryString()
7. Integer값을 16진법으로 표현하려면 어떤 메소드를 사용해야 하나요?
toHexString()
8. 속성(Properties)과 환경(Environment) 값의 차이는 무엇인가요?
Properties는 JVM에서 사용하는 속성 값으로 값을 수정, 추가할 수 있다.
Environment은 시스템, 장비에서 사용하는 값으로 수정, 추가가 불가능하고 읽기만 가능
9. System.out과 System.err 에서 사용할 수 있는 메소드들은 어떤 클래스의 API를 봐야 하나요?
java.io.PrintStream 클래스
10. System 클래스에서 현재 시간을 조회하는 용도로 사용하는 메소드 이름은 무엇인가요?
System.currentTimeMillis()
11. System 클래스에서 시간 측정 용도로 사용하는 메소드 이름은 무엇인가요?
System.nanoTime()
12. System.out.print() 메소드와 System.out.println() 메소드의 차이는 무엇인가요?
System.out.print()는 줄바꿈이 없고 매개변수를 출력하는 메소드
System.out.println()은 줄 바꿈이 있고 매개 변수를 출력할 수 있고 매개 변수가 없는 메소드도 존재한다.
13. System.out.println() 메소드에 객체가 매개변수로 넘어 왔을 때 String의 어떤 메소드가 호출되어 결과를 출력하나요? 그리고, 그 메소드를 사용하는 이유는 무엇인가요?
System.out.println() 매개 변수로 객체가 넘어온 경우 String.valueOf()가 수행된다.
toString()인 경우 null 인 객체가 들어오는 경우 NullPointerException(NPE) 예외가 발생하는데 valueOf()는 null을 출력해 NPE 발생하지 않는다
14. 숫자 계산을 위해서 필요한 메소드들을 모아 놓은 클래스는 무엇인가요?
java.lang.Math 클래스
15. 위의 문제의 답인 클래스에 있는 메소드는 객체를 생성해서 사용해야 하나요?
X, Math 클래스의 상수와 메소드는 모두 static으로 선언되어 있기 때문에
16. 숫자의 절대값을 구하는 메소드는 무엇인가요?
Math.abs()
17. 숫자의 반올림을 하는 메소드는 무엇인가요?
Math.round() / Math.rint()
둘 다 반올림하는 메소드지만 round()는 int 형으로 리턴 rint()는 float, double형으로 리턴한다.
18. 각도를 라디안으로 변환하는 메소드와 라디안을 각도로 변환하는 메소드는 각각 무엇인가요?
각도를 라디안으로 변환하는 메소드는 Math.toRadians()
라디안을 각도로 변환하는 메소드는 Math.toDegrees()
19. 5의 4 제곱 값을 구하려고 하면 어떤 메소드를 사용해야 하나요?
Math.pow(5,4);
출처: 이상민, <자바의 신 VOL.2> 로드북
'Java > 자바의 신 VOL.2' 카테고리의 다른 글
06. 자바랭 다음으로 많이 쓰는 애들은 컬렉션 - Part3(Map) (0) | 2024.06.28 |
---|---|
05. 자바랭 다음으로 많이 쓰는 애들은 컬렉션 - Part2(Set과 Queue) (0) | 2024.06.28 |
04. 자바랭 다음으로 많이 쓰는 애들은 컬렉션 - Part1 (List) (0) | 2024.06.28 |
03. 실수를 방지하기 위한 제네릭이라는 것도 있어요. (0) | 2024.06.27 |
01. 이쯤에서 자바의 역사와 JVM에 대해서 알아보자 (1) | 2024.06.26 |