11-1 / java.lang 패키지
java.lang은 자바 프로그램의 기본적인 클래스를 담고 있는 패키지. 이 패키지는 가장 기본이기에 이 패키지의 클래스와 인터페이스는 import 없이 사용가능하다.
이 패키지에 속하는 주요 클래스와 간략 용도
| 클래스 | 용도 | |
| Object | - 자바 클래스의 최상위 클래스로 사용 | |
| System | - 표준 입력 장치(키보드)로부터 데이터를 입력받을 때 사용 - 표준 출력 장치(모니터)로 출력하기 위해 사용 - 자바 가상 기계를 종료할 때 사용 - 쓰레기 수집기를 실행 요청할 때 사용 |
|
| Class | - 클래스를 메모리로 로딩할 때 사용 | |
| String | - 문자열을 저장하고 여러가지 정보를 얻을 때 사용 | |
| Wrapper | Byte, Short, Character, Integer, Float, Double, Boolean, Long |
- 기본 타입의 데이터를 갖는 객체를 만들 때 사용 - 문자열을 기본 타입으로 변환할 때 사용 - 입력값 검사에 사용 |
| Math | - 수학 함수를 이용할 때 사용 | |
자바 API 도큐먼트
API는 라이브러리라고 부르기도 하는데, 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음을 말한다.
방대한 자바 표준 API 중 원하는 API를 찾기위해 공식 문서를 이용할 수 있다.
Java Platform, Standard Edition Documentation - Releases
Java Platform, Standard Edition documentation, current and previous releases
docs.oracle.com
문서보는 법


object 클래스
클래스 선언시 extends 키워드를 사용하지 않더라도 암시적으로 java.lang.Object를 상속하게 된다.
내가 바로 작성하는 클래스도 포함 자바의 모든 클래스들은 Object 클래스의 하위 클래스에 해당한다.
object는 필드가 없고, 생성자와 메소드로만 구성되어 있다.
- 객체비교( equals() )
- 두 객체가 동일한 데이터를 가지고 있는지 판별하는 메소드.
- 객체가 동일한가를 판별하는 것과는 다르다.
- equals() 메소드의 매개타입은 Object에 해당하며 이는 즉 모든 객체가 매개값이 될 수 있다는 이야기이다.
가장 상위클래스이기 때문에 자동변환이 가능하기 때문이다.
- 반환 값은 boolean을 반환한다.
- 객체 해시코드( hashCode() )
- 객체를 식별하는 하나의 정수값을 리턴한다.
객체의 메모리 번지를 이용해서 해시코드를 만들기 때문에 유일한 값을 가진다.
- 컬렉션 프레임워크 중 HashMap, HashSet, Hashtable에서 두 객체가 동등한지 비교할 때 hashCode()를 사용한다.
( hashCode() 리턴값이 다르면 다른 객체, 같으면 equals() 리턴값을 판단 false면 다른 객체, true면 동등객체 )
- 객체 문자 정보 ( toString() )
- 객체의 문자 정보(객체를 문자열로 표현한 값)를 리턴한다.
- 형식 : 클래스이름@16진수해시코드
- 그대로 사용하기 보다는 이 메소드를 오버라이딩하여 유익한 정보를 리턴하는 방법으로 사용되고 있다.
- System.out.println() 메소드에서 기본타입 경우 값 그대로 출력하나,
객체 즉 참조타입 경우에는 객체의 toString() 메소드를 호출해 리턴값을 받아 출력한다.
System 클래스
자바의 프로그램은 운영체제에서 바로 실행되는 것이 아니라 JVM위에서 실행되기 때문에 직접 운영체제 기능을 사용할 수 없어 System 클래스를 통해 운영체제의 일부 기능을 사용한다. System 클래스의 모든 필드와 메소드는 정적필드와 정적 메소드로 구성되어 있다.
- 프로그램 종료 ( exit() )
- JVM을 강제로 종료
- 매개값으로 int를 지정하게 되어있는데 이 값을 종료 상태값이라 한다. 일반적으로 정상종료는 0에 해당한다.
System.exit(0);
- 현재 시간 읽기 ( currentTimeMillis(), nanoTime() )
- 컴퓨터의 시계로부터 현재 시간을 읽어 밀리세컨드 (1/1000초)와 나노세컨드 (1/10⁹초) 단위의 long값을 리턴한다.
- 주로 프로그램의 실행 소요 시간 측정에 사용된다.
Class 클래스
클래스와 인터페이스의 메타 데이터를 이 클래스로 관리한다.
여기서 메타 데이터란 클래스 이름, 생성자 성보, 필드 정보, 메소드 정보를 말한다.
- Class 객체 얻기 ( getClass(), forName() )
프로그램에서 Class 객체를 얻는 3가지 방법이 있으며, 이렇게 Class객체를 얻어, Class의 메소드를 이용해 클래스 정보를 얻을 수 있다.
① 객체없이 클래스 이름만 가지고 Class 객체 얻는 방법 1
Class clazz= String.class;
② 객체없이 클래스 이름만 가지고 Class 객체 얻는 방법 2
Class clazz = Class.forName("패키지...클래스이름");
③ 클래스로부터 객체가 이미 생성되어 있어 객체로 부터 얻는 방법
Class clazz = 참조변수.getClass();
- 클래스 경로를 활용해서 리소스 절대 경로 얻기
Class 객체는 해당 클래스의 파일 경로 정보도 가지고 있다.
이를 활용해 다른 리소스 파일의 절대 경로도 얻을 수 있어 UI프로그램에서 많이 활용된다.
Class clazz = 클래스이름.class;
String path = clazz.getResource("images/photho.jpg").getPath();
String 클래스
- String 생성자
소스상 문자열 리터럴이 자동 String 개체를 생성하지만, String 클래스의 생성자로도 String객체를 생성할 수 있다.
// 배열 전체를 String 객체로 생성
String str = new String(byte[] bytes);
// 지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, String charsetName);
// 배열의 offset 인덱스 위치부터 length만큼 String 객체로 생성
String str = new String(byte[] bytes, int offset, int length);
// 지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, int offset, int length, String charsetName);
- String 메소드
| 리턴타입 | 메소드이름(매개변수) | 설명 |
| char | charAt(int index) | 특정 위치의 문자를 리턴 |
| boolean | equals(Object anObject) | - 두 문자열을 비교 - String경우 == 로 문자열 비교가 불가능하므로 이 메소드를 이용 |
| byte[] | getBytes() | - byte[]로 리턴 - 네트워크로 문자열 전송 때 바이트로 변환 사용 - 문자열을 암호화 할 때 바이트로 변환 사용 |
| byte[] | getBytes(Charset charset) | 주어진 문자셋으로 인코딩한 byte[]로 리턴 |
| int | indexOf(String str) | - 문자열 내에서 주어진 문자열의 위치 리턴 - 주어진 문자열이 포함되있지 않으면 -1 반환 |
| int | length() | - 총 문자의 수(문자열 길이) 리턴 - 공백을 포함 |
| String | replace(CharSequence target, CharSequence replacement) |
target 부분을 replacement로 대치한 새로운 문자열 리턴 |
| String | substring(int beginIndex) | beginIndex 위치부터 끝까지 부분을 잘라 문자열로 리턴 |
| String | substring(int beginIndex, int endIndex) |
beginIndex 위치부터 endIndex "전"까지 부분을 잘라 문자열로 리턴 |
| String | toLowerCase() | 전부 알파벳 소문자로 변환한 문자열 리턴 |
| String | toUpperCase() | 전부 알파벳 대문자로 변환한 문자열 리턴 |
| String | trim() | 앞뒤 공백 제거한 문자열 리턴 |
| String | valueOf(int i) valueOf(double d) |
기본 타입 값을 문자열로 리턴 |
Wrapper(포장) 클래스
자바는 기본 타입의 값을 갖는 객체를 생성할 수 있다.
이렇게 기본 타입 값을 내부에 두고 포장하는 객체를 포장(Wrapper) 객체라고 한다.
포장 객체의 특징은 외부에서 포장하고 있는 내부 기본 타입 값을 변경할 수 없다는 점이다. 내부 값을 변경하려면 새롭게 포장 객체를 만들어야 한다.
- 박싱과 언박싱
기본 타입 값을 객체로 만드는 걸 박싱이라고 하며, 포장 객체에서 기본 타입 값을 가져오는 걸 언박싱이라고 한다.
| 기본타입 | 포장클래스 | 박싱(Boxing) | 언박싱(Unboxing) |
| byte | Byte | 기본타입 : Byte obj = new Byte(10); 문자열 : Byte obj = new Byte("10"); |
num = obj.byteValue(); |
| char | Character | 기본타입 : Character obj = new Character('가'); 문자열 : 불가 |
ch = obj.charValue(); |
| short | Short | 기본타입 : Short obj = new Short(100); 문자열 : Short obj = new Short("100"); |
num = obj.shortValue(); |
| int | Integer | 기본타입 : Integer obj = new Integer(1000); 문자열 : Integer obj = new Integer("1000"); |
num = obj.intValue(); |
| long | Long | 기본타입 : Long obj = new Long(1000); 문자열 : Long obj = new Long("1000"); |
num = obj.longValue(); |
| float | Float | 기본타입 : Float obj = new Float(2.5F); 문자열 : Float obj = new Float("2.5F"); |
num = obj.floatValue(); |
| double | Double | 기본타입 : Double obj = new Double(3.5); 문자열 : Double obj = new Double("3.5"); |
num = obj.doubleValue(); |
| boolean | Boolean | 기본타입 : Boolean obj = new Boolean(true); 문자열 : Boolean obj = new Boolean("true"); |
bool = obj.booleanValue(); |
| 생성자를 이용하지 않아고 각 포장 클래스마다 가지고 있는 valueOf 메소드를 통해 사용도 가능하다. Integer obj = Integer.valueOf(100); Integer obj = Integer.valueOf("100"); |
|||
- 자동 박싱과 자동 언박싱
기본타입을 직접 박싱, 언박싱하지 않아도 자동적으로 일어나는 경우가 있다.
- 자동 박싱 : 포장 클래스 타입에 기본값을 바로 대입하는 경우, 바로 Heap영역에 객체가 생성된다
// 직접하는 박싱
Integer obj = new Integer(100);
// 자동 박싱
Integer obj = 100;
- 자동 언박싱 : 기본 타입에 포장 객체가 대입되는 경우와 연산에서 자동으로 언박싱이 된다.
Integer obj = 100;
int value1 = obj; // 자동 언박싱
int value2 = obj * 3; // 자동 언박싱
- 문자열을 기본 타입 값으로 변환
포장 클래스는 기본타입 값을 박싱해서 포장 객체로도 만들지만 문자열을 기본 타입 값으로 변환할 때에도 많이 사용된다.
대부분 포장 클래스에 parse+기본타입 형식으로 되어 있는 정적 메소드를 이용한다.
*parse : 파싱한다할 때 그 파스, 구문 분석이라는 뜻을 가지고 있다
| 기본 타입의 값을 이용 | |
| byte | num = Byte.parseByte("10"); |
| short | num = Short.parseShort("100"); |
| int | num = Integer.parseInteger("1000"); |
| long | num = Long.parseLong("10000"); |
| float | num = Float.parseFloat("2.5F"); |
| double | num = Double.parseDouble("3.5"); |
| boolean | num = Boolean.parseBoolean("true"); |
포장 값 비교
포장 객체 내부의 값은 == 와 != 연산자로 비교하지 않는 것이 좋다. 이 연산자는 내부 값이 아닌 포장 객체의 참조를 비교하기 때문이다.
자바 언어 명세를 보면 박싱된 값이 다음 표에 나와있는 범위면 == 와 != 연산자로 내부 값 바로 비교 가능하다고 적혀있지만 이외에는 언박싱한 값을 얻어야 비교가 가능하다고 한다.
| 타입 | 값의 범위 |
| boolean | true, false |
| char | \u0000 ~ \u007f |
| byte, short, int | -128 ~ 127 |
Math 클래스
수학 계산에 사용할 수 있는 메소드를 제공하는 클래스. 모두 정적 메소드이므로 바로 사용이 가능하다.
| 메소드 | 설명 | 예제코드 | 리턴값 |
| int abs(int a) double abs(double a) |
절대값 | int v1 = Math.abs(-5); double v2 = Math.abs(-3.14); |
v1 = 5 v2 = 3.14 |
| double ceil(double a) | 올림값 | double v3 = Math.ceil(5.3); double v4 = Math.ceil(-5.3); |
v3 = 6.0 v4 = -5.0 |
| double floor(double a) | 버림값 | double v5 = Math.floor(5.3); double v6 = Math.floor(-5.3); |
v5 = 5.0 v6 = -6.0 |
| int max(int a, int b) double max(double a, double b) |
최대값 | int v7 = Math.max(5, 9); double v8 =Math.max(5.3, 2.5); |
v7 = 9 v8 = 5.3 |
| int min(int a, int b) double min(double a, double b) |
최소값 | int v9 = Math.min(5, 9); double v10 = Math.min(5.3, 2.5); |
v9 = 5 v10 = 2.5 |
| double random() | 랜덤값 (0.0<= 랜덤값 < 1.0) |
double v11 = Math.random(); | 0.0 <= v11 < 1.0 |
| double rint(double a) | 가까운 정수의 실수값 | double v12 = Math.rint(5.3); double v13 = Math.rint(5.7); |
v12 = 5.0 v13 = 6.0 |
| long round(double a) | 반올림 값 (소수 첫째 자리에서) |
long v14 = Math.round(5.3); long v15 = Math.round(5.7); |
v14 = 5 v15 = 6 |
11-2 / java.util 패키지
프로그램 개발에서 자주 사용되는 자료구조 뿐만아니라 여러 유용한 API를 포함하고 있다.
자바 표준 API의 날짜 정보와 관련된 두가지만 간단히 소개해본다.
Date 클래스
날짜를 표현하는 클래스
Date는 객체 간에 날짜 정보를 주고 받을 때 매개 변수나 리턴 타입으로 주로 사용
- Date객체 생성
Date date = new Date();
- 원하는 날짜 형식으로 문자열을 얻는 방법
Date객체 toString() 메소는 영문으로 된 날짜를 리턴하기 때문에 원하는 날짜 형식으로 얻고 싶다면 java.text 패키지의 SipleDateFormat 클래스와 함께 사용하는 것이 좋다.
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
String strNow = sdf.format(now);
Calendar 클래스
달력을 표현한 클래스.
Calendar 클래스는 추상 클래스이므로 new 연산자를 사용해서 인스턴스를 생성할 수 없다.
Calendar 클래스의 정적 메소드인 getInstance() 메소드를 이용해 현재 운영체제에 설정되어 있는 시간대를 기준으로 Calendar 하위 객체를 얻을 수 있다.
// Calendar 하위 객체 생성
Calendar now = Calendar.getInstance();
// get() 메소드를 이용해 날짜와 시간에 대한 정보를 읽을 수 있다
int year = now.get(Calendar.Year); // 연도를 리턴
int month = now.get(Calendar.Month) + 1; // 월을 리턴
int date = now.get(Calendar.DAY_OF_MONTH); // 일을 리턴
String week = now.get(Calendar.DAY_OF_WEEK); // 요일을 리턴
String amPm = now.get(Calendar.AM_PM); // 오전/오후를 리턴
int hour = now.get(Calendar.HOUR); // 시를 리턴
int minute = now.get(Calendar.MINUTE); // 분을 리턴
int second = now.get(Calendar.SECOND); // 초를 리턴'Programming > Java' 카테고리의 다른 글
| 혼공자바] 12-2 스레드 제어 (0) | 2022.12.19 |
|---|---|
| 혼공자바] 12-1 멀티 스레드 (1) | 2022.12.15 |
| 혼공자바] 10-2 예외처리 (0) | 2022.12.13 |
| 제네릭(Generic) (0) | 2022.12.13 |
| 혼공자바] 10-1 예외 클래스 (0) | 2022.12.12 |

