본문 바로가기
Java

자바 java.lang 패키지

by 승환파크 2023. 6. 28.

java.lang 패키지에 속하는 주요 클래스와 간단한 용도를 살펴보면 아래와 같다.

클래스 용도
Object - 자바 클래스의 최상위 클래스로 사용
System - 표준 입력 장치(키보드)로부터 데이터를 입력받을 때 사용
- 표준 출력 장치(모니터)로 출력하기 위해 사용
- 자바 가상 기계를 종료할 때 사용
- 쓰레기 수집기를 실행 요청할 때 사용
Class - 클래스를 메모리로 로딩할 때 사용
String - 문자열을 저장하고 여러 가지 정보를 얻을 때 사용
Wrapper Byte, Short, Character
Integer, Float, Double
Boolean, Long
- 기본 타입의 데이터를 갖는 객체를 만들 때 사용
- 문자열을 기본 타입으로 변환할 때 사용
- 입력값 검사에 사용
Math - 수학 함수를 이용할 때 사용

 

 

자바 API 도큐먼트

자바에서 제공하는 API(Applecation Programming Interface)는 라이브러리(Library)라고 부르기도 하는데, 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음을 말한다. 자주 사용하는 String 클래스와 System 클래스도 모두 API에 속하는 클래스이다.

 

방대한 자바 표준 API 중에서 우리가 원하는 API를 쉽게 찾아 이용할 수 있도록 도와주는 API 도큐먼트가 있다. API 도큐먼트는 HTML 페이지로 작성되어 있고, 다음 URL을 방문하면 버전별로 볼 수 있다.

각 버전별 링크를 클릭해서 해당 버전의 도큐먼트 페이지로 이동한다. 이후 왼쪽 메뉴 또는 내용에서 (Java SE) API Docuemt 링크를 찾아 클릭하면 된다.

 

 

Object 클래스

객체 비교(equals())

아래는 Object 클래스의 equals() 메소드이다.

public boolean equals(Object obj) {
	...
}

equals() 메소드의 매개 타입은 Object인데, 이것은 모든 객체가 매개값으로 대입될 수 있음을 말한다. 왜냐하면 모든 객체는 Object 타입으로 자동 타입 변환될 수 있기 때문이다. Object 클래스의 equals() 메소드는 비교 연산자인 == 과 동일한 결과를 리턴한다. 두 객체가 동일한 객체라면 true를 리턴하고 그렇지 않으면 false 를 리턴한다.

Object obj1 = new Object();
Object obj2 = new Object();

boolean result = obj1.equals(obj2);
boolean result = (obj1 == obj2);

 

자바에서는 두 객체를 동등 비교할 때 equals() 메소드를 흔히 사용한다. equals() 메소드는 두 객체를 비교해서 논리적으로 동등하면 true 를 리턴하고, 그렇지 않으면 false를 리턴한다. 논리적으로 동등하다는 것은 같은 객체이건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일함을 뜻합니다.

 

예를 들어 String 객체의 equals() 메소드는 String 객체의 번지를 비교하는 것이 아니라 문자열이 동일한지 조사해서 같다면 true 를 리턴하고, 그렇지 않다면 false를 리턴한다. 이것이 가능한 이유는 String 클래스가 Object의 equals() 메소드를 재정의(오버라이딩)해서 번지 비교가 아닌 문자열 비교로 변경했기 때문이다. 일반적으로 Object 의 equals() 메소드는 직접 사용되지 않고 하위 클래스에서 재정의하여 논리적으로 동등 비교할 때 이용된다.

 

equals() 메소드를 재정의할 때에는 매개값(비교 객체)이 기준 객체와 동일한 타입의 객체인지 먼저 확인해야 한다. Object 타입의 매개 변수는 모든 객체가 매개값으로 제공될 수 있기 때문에 instanceof 연산자로 기준 객체와 동일한 타입인지 제일 먼저 확인해야 한다. 만약 비교 객체가 다른 타입이라면 equals()메소드는 false를 리턴해야 한다. 비교 객체가 동일한 타입이라면 기준 객체 타입으로 강제 타입 변환해서 필드값이 동일한지 검사하면 된다. 필드값이 모두 동일하다면 true를 리턴하고 그렇지 않으면 false를 리턴하도록 하면 된다.

 

객체 해시코드(hashCode())

객체 해시코드란 객체를 식별하는 하나의 정수값을 말한다. Object 클래스의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다. 논리적 동등 비교 시 hashCode()를 오버라이딩할 필요가 있는데 커렉션 프레임워크에서 HashSet, HashMap, Hashtable은 아래와 같은 방법으로 두 객체가 동등한지 비교한다.

우선 hashCode() 메소드를 실행해서 리턴된 해시코드 값이 같은지를 확인한다. 해시코드 값이 다르면 다른 객체로 판단하고, 해시코드 값이 같으면 equals() 메소드로 다시 비교한다. 그렇기 때문에 hashCode() 메소드가 true가 나와도 equals() 의 리턴값이 다르면 다른 객체가 된다.

 

객체 문자 정보(toString())

Object 클래스의 toString() 메소드는 객체의 문자 정보를 리턴한다. 객체의 문자 정보란 객체를 문자열로 표현한 값을 말한다. 기본적으로 Object 클래스의 toString() 메소드는 '클래스이름@16진수해시코드'로 구성되 문자 정보를 리턴한다.

 

하지만 Object 클래스의 toString() 메소드의 리턴값은 자바 어플리케이션에서는 별 값어치가 없는 정보이므로 Object 하위 클래스는 toString() 메소드를 재정의 하여 간결하고 유익한 정보를 리턴하도록 되어있다. 예를 들어 java.util 패키지의 Date 클래스는 toString() 메소드를 재정의하여 현재 시스템의 날짜와 시간 정보를 리턴한다. 그리고 String 클래스의 toString() 메소드는 저장하고 있는 문자열을 리턴한다.

 

 

System 클래스

자바 프로그램은 운영체제에서 바로 실행되는 것이 아니라 JVM 위에서 실행된다. 따라서 운영체제의 모든 기능을 직접 이용하기는 어렵다. 하지만 java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있다. 즉, 프로그램 종료, 키보드로부터의 입력, 모니터로 출력, 현재 시간 읽기 등이 가능하다. System 클래스의 모든 필드와 메소드는 정적 필드와 정적 메소드로 구성되어있다.

 

프로그램 종료(exit())

경우에 따라서는 강제적으로 JVM을 종료시킬 때도 있다. 이 때 System 클래스의 exit() 메소드를 호출하면 된다. exit() 메소드는 현재 실행하고 있는 프로세스를 강제 종료시키는 역할을 한다. exit() 메소드는 int 매개값을 지정하도록 되어 있는데, 이 값을 종료 상태값 이라고 한다. 일반적으로 정상 종료일 경우 0 값을 준다.

System.exit(0);

 

현재 시각 읽기(currentTimeMillis(), nanoTime())

System 클래스의 currentTimeMIllis() 메소드와 nanoTime() 메소드는 컴퓨터의 시계로부터 현재 시간을 읽어서 밀리세컨드(1/1000초) 단위와 나노세컨드(1/10⁹초) 단위의 long 값을 리턴한다.

long time = System.currentTimeMillis();
long time = System.nanoTime();

리턴값은 주로 프로그램의 실행 요소 시간 측정에 사용된다. 프로그램 시작 시 시각을 읽고, 프로그램이 끝날 때 시각을 읽어서 차이를 구하면 프로그램 실행 소요 시간이 나온다.

 

 

Class 클래스

자바는 클래스와 인터페이스의 메타 데이터를 java.lang 패키지에 소속된 Class 클래스로 관여한다. 여기서 메타 데이터란 클래스의 이름, 생성자 정보, 필드 정보, 메소드 정보를 말한다.

 

Class 객체 얻기(getClass(), forName())

프로그램에서 Class 객체를 얻기 위해서는 아래 세 가지 방법 중 하나를 이용하면 된다.

  • 클래스로부터 얻는 방법
    1. Class clazz = 클래스이름.class
    2. Class clazz = Class.forName("패키지...클래스이름")
  • 객체로부터 얻는 방법
    1. Class clazz = 참조변수.getClass();

첫 번째와 두 번째 방법은 객체 없이 클래스 이름만 가지고 Class 객체를 얻는 방법이다. 세 번째 방법은 클래스로부터 객체가 이미 생성되어 있을 경우에 사용하는 방법이다. 예를 들어 String 클래스의 Class 객체는 아래와 같이 얻을 수 있다.

1. Class clazz = String.class;
2. Class clazz = Class.forName("java.lang.String");
   String str = "감자바";
3. Class clazz = str.getClass();

 

클래스 경로를 활용해서 리소스 절대 경로 얻기

Class 객체는 해당 클래스의 파일 경로 정보를 가지고 있기 때문에 이 경로를 활용해서 다른 리소스 파일(이미지, XML, Property 파일)의 경로를 얻을 수 있습니다. 이 방법은 UI 프로그램에서 많이 활용된다. 예를 들어 Car 클래스가 위치하는 경로에 photo.jpg 파일이 있다고 가정할 때 아래와 같이 경로가 나오게 된다.

C:\SelfJavaStudy\chap11\bin\sec01
				| - exam09
                                	| - Car.class
                                    	| - photo1.jpg
                                    	| - images
                                    		| - photo2.jpg

프로그램 실행 중에 이미지 파일(photo1.jpg, photo2.jpg)의 절대 경로가 필요한 경우에 Car.class를 기준으로 한 상대 경로를 이용해서 절대 경로를 얻을 수 있다.

String photo1Path = clazz.getResource("photo1.jpg").getPath();
String photo2Path = clazz.getResource("images/photo2.jpg").getPath();

 

 

Stirng 클래스

어떤 프로그램이건 문자열은 데이터로서 아주 많이 사용된다. 그렇기 때문에 문자열을 생성하는 방법과 추출, 비교, 찾기, 분리, 변환 등을 제공하는 메소드를 알아둬야 한다.

 

String 생성자

자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리된다. 소스상에서 문자열 리터럴은 String 객체로 자동 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 String 객체를 생성할 수도 있다. 어떤 생성자를 이용해서 String 객체를 생성할지는 제공되는 매개값의 타입에 달려있다.

 

아래는 사용 빈도수가 높은 생성자들이다. 파일의 내용을 읽거나, 네트워크 통해 받은 데이터는 보통 byte[] 배열이므로 이것을 문자열로 변환하기 위해 사용된다.

// 배열 전체를 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 ofset, int length, String charsetName);

 

String 메소드

String 클래스는 문자열의 추출, 비교, 찾기, 분리, 변환 등과 같은 다양한 메소드를 가지고 있다. 그중에서 사용 빈도수가 높은 메소드를 아래와 같이 정리한것이다.

리턴 타입 메소드 이름(매개 변수) 설명
char charAt(int index) 특정 위치의 문자를 리턴한다.
boolean equals(Object anObject) 두 문자열을 비교한다.
byte[] getBytes() byte[]로 리턴한다.
byte[] getBytes(Charset charset) 주어진 문자셋으로 인코딩한 byte[]로 리턴한다.
int indexOf(Stirng str) 문자열 내에서 주어진 문자열의 위치를 리턴한다.
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)
기본 타입 값을 문자열로 리턴한다.

 

문자 추출(charAt())

charAt() 메소드는 매개값으로 주어진 인덱스의 문자를 리턴한다. 여기서 인덱스란 0에서부터 '문자열 길이 - 1' 까지의 번호를 말한다.

String subject = "자바 프로그래밍";
char cahrValue = subject.charAt(3);

"자바 프로그래밍"문자열은 아래와 같이 인덱스를 매길 수 있다.

 
0 1 2 3 4 5 6 7

charAt(3) 은 3번 인덱스 위치에 있는 문자를 말한다. 즉 '프' 문자가 해당된다.

 

문자열 비교(equlas())

기본 타입(byte, char, short, int, long, float, double, boolean) 변수의 값을 비교할 때에는 == 연산자를 사용한다. 그러나 문자열을 비교할 때에는 == 연산자를 사용하면 원하지 않는 결과가 나올 수 있다. 따라서 == 비교를 사용하지 않고 equals() 메소드로 비교한다.

String str1 = "가나다";
String str2 = "가나다";
String str3 = new String("가나다");

str1 == str2; // true
str2 == str3; // false
str1 == str3; // false

str1.equals(str2); // true
str1.equals(str3); // true
str2.equals(str3); // true

원래 equals()는 Obejct 클래스의 번지 비교 메소드이지만, String 클래스가 재정의해서 문자열을 비교하도록 변경했다.

 

바이트 배열로 변환(getBytes())

종종 문자열을 바이트 배열로 변환하는 경우가 있다. 대표적인 예로 네트워크로 문자열을 전송하거나, 문자열을 암호화할 때 문자열을 바이트 배열로 변환하는 경우가 있다. 문자열을 바이트 배열로 변환하는 메소드는 두 가지가 있다.

byte[] bytes = "문자열".getBytes();
byte[] bytes = "문자열".getBytes(Charset charset);

 

getBytes() 메소드는 시스템의 기본 문자셋으로 인코딩된 바이트 배열을 리턴한다. 만약 특정 문자셋으로 인코딩된 바이트배열을 얻으려면 두 번째 메소드를 사용하면 된다. 아래는 EUC-KR과 UTF-8로 각각 인코딩된 바이트 배열을 리턴한다.

try{
	byte[] bytes1 = "문자열".getBytes("EUC-KR");
    byte[] bytes2 = "문자열".getBytes("UTF-8");
} catch(UnsupportedEncodingException e){

}

어떤 문자셋으로 인코딩하느냐에 따라 바이트 배열의 크기가 달라지는데 EUC-KR은 getBytes()와 마찬가지로 알파벳은

1바이트, 한글은 2바이트로 변환하고, UTF-8은 알파벳은 1바이트, 한글은 3바이트로 변환한다. getBytes(Charset charset) 메소드는 잘못된 문자셋을 매개값으로 줄 경우 java.io.UnsupportedEncodingException이 발생하므로 예외처리가 필요하다.

 

바이트 배열을 다시 문자열로 변환(디코딩)할 때에는 어떤 문자셋으로 인코딩된 바이트 배열이냐에 따라서 디코딩 방법이 다르다. 단순하게 Stirng(byte[] bytes) 생성자를 이용해서 디코딩하면 시스템의 기본 문자셋을 이용한다. 시스템 기본 문자셋과 다른 문자셋으로 인코딩된 바이트 배열일 경우 아래 String 생성자를 이용해서 디코딩해야 한다.

String str = new String(byte[] bytes, String charsetName);

 

문자열 찾기(indexOf())

indexOf() 메소드는 매개값으로 주어진 문자열이 시작되는 인덱스를 리턴한다. 만약 주어진 문자열이 포함되어 있지 않으면 -1을 리턴한다. 아래 코드는 그 예시이다.

String str = "자바 프로그래밍";
int index = str.indexOf("프로그래밍");

index 변수에는 3이 저장되는데, "자바 프로그래밍"에서 "프로그래밍" 문자열의 인덱스가 3이기 때문이다.

 

문자열 길이(length())

length() 메소드는 문자열의 길이(문자의 수)를 리턴한다. 아래 코드는 그 예시이다.

String str = "자바 프로그래밍";
int length = str.length();

length 변수에는 8이 저장된다. str 객체의 문자열 길이는 공백을 포함한 8개이기 때문이다.

 

문자열 대치(replace())

replace() 메소드는 첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴한다. 아래 코드는 그 예시이다.

String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "JAVA");

String 객체의 문자열은 변경이 불가능한 특성을 갖기 때문에 replace() 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아니라 완전히 새로운 문자열이다. 따라서 newStr 변수는 새로 생성된 "JAVA 프로그래밍" 문자열을 참조한다.

 

문자열 잘라내기(substring())

substring() 메소드는 주어진 인덱스에서 문자열을 추출한다. substring() 메소드는 매개값의 수에 따라 두 가지 형태로 사용된다. substring(int beginIndex, int endIndex)는 주어진 시작과 끝 인덱스 사이의 문자열을 추출하고 substring(int beginIndex)는 주어진 인덱스부터 끝까지 문자열을 추출한다.

String ssn = "880815-1234567";
String firstNum = ssn.substring(0, 6);
String secondNum = ssn.substring(7);

위 코드에서 firstNum 변수값은 "880815"이고 secondNum 변수값은 "1234567"이다. ssn.substring(0, 6)은 인덱스가0(포함) ~ 6(제외) 사이의 문자열을 추출하는 것이고, substring(7)은 인덱스 7부터 끝까지 문자열을 추출한다.

 

알파벳 소 • 대문자 변경(toLowerCase(), toUpperCase())

toLowerCase() 메소드는 문자열을 모두 소문자로 바꾼 새로운 문자열을 생성한 후 리턴한다. 반대로 toUpperCase() 메소드는 문자열을 모두 대문자로 바꾼 문자열을 생성한 후 리턴한다.

String str = "Java Programming";
String lowerCase = str.toLowerCase();
String upperCase = str.toUpperCase();

lowerCase 변수는 새로 생성된 "java programming" 문자열을 참조하고 upperCase 변수는 새로 생성된 "JAVA PROGRAMMIN" 문자열을 참조한다. 이 때 원래 str 변수읜 "Java Programming" 문자열이 변경된 것은 아니다.

 

문자열 앞뒤 공백 잘라내기(trim())

trim() 메소드는 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴한다. 아래 코드를 보면 newStr 변수는 앞뒤 공백이 제거된 채로 새롭게 생성된 "자바 프로그래밍" 문자열을 참조한다. trim() 메소드는 앞뒤의 공백만 제거할 뿐 중간에 있는 공백은 제거할 수 없다.

String oldStr = "   자바 프로그래밍   ";
String newStr = oldStr.trim();

trim() 메소드를 사용한다고 해서 원래 문자열의 공백이 제거되는것은 아니다.

 

문자열 변환(valueOf())

valueOf() 메소드는 기본 타입의 값을 문자열로 변환하는 기능을 가지고 있다. String 클래스에는 매개 변수의 타입별로 valueOf() 메소드가 아래와 같이 오버라이딩 되어 있다.

static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(float f)
static String valueOf(double d)

 

 

Wrapper(포장) 클래스

자바는 기본 타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체를 생성할 수 있다. 이러한 객체를 포장 객체라고 하는데, 그 이유는 기본 타입의 값을 내부에 두고 포장하기 때문이다. 포장 객체의 특징은 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다는 점이다. 만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.

포장 객체는 주로 컬렉션 프레임워크에서 기본 타입 값을 객체로 생성해서 관리할 때 사용한다.

 

포장객체의 설계도인 포장 클래스는 java.lang 패키지에 포함되어 있는데, 아래와 같이 기본 타입에 대응되는 클래스들이 있다. char 타입과 int 타입은 Character 와 Integer 로 변경되고, 나머지는 기본 타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있다.

기본 타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

 

박싱(Boxing)과 언박싱(UnBoxing)

기본 타입의 값을 포장 객체로 만드는 과정을 박싱 이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱 이라고 한다.

 

아래는 8개의 기본 타입의 값을 박싱하는 방법이다. 간단하게 포장 클래스에서 생성자 매개값으로 기본 타입의 값 또는 문자열을 넘겨주면 된다.

기본 타입의 값을 줄 경우 문자열을 줄 경우
Byte obj = new Byte(10); Byte obj = new Byte("10");
Character obj = new Character('가'); 없음
Short obj = new Short(100); Short obj = new Short("100");
Integer obj = new Integer(1000); Integer obj = new Integer("1000");
Long obj = new Long(10000); Long obj = new Long("10000");
Float obj = new Float(2.5F); Float obj = new Float("2.5F");
Double obj = new Double(3.5); Double obj = new Double("3.5");
Boolean obj = new Boolean(true); Boolean obj = new Boolean("true");

 

생성자를 이용하지 않아도 알와 같이 각 포장 클래스마다 가지고 있는 정적 valueOf() 메소드를 사용할 수 있다.

Integer obj = Integer.valueOf(1000);
Integer obj = Integer.valueOf("1000");

 

이렇게 박싱된 포장 객체에서 다시 기본 타입의 값을 받아내기 위해서는 각 포장 클래스마다 가지고 있는 '기본 타입이름 + Value()' 메소드를 호출하면 된다.

기본 타입의 값을 이용
byte num = obj.byteValue();
char ch = obj.charValue();
short num = obj.shortValue();
int num = obj.intValue();
long num = obj.longValue();
float num = obj.floatValue();
double num = obj.doubleValue();
boolean bool = obj.booleanValue();

 

자동 박싱과 언박싱

기본 타입 값을 직접 박싱, 언박싱 하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있다. 자동박싱은 포장 클래스 타입에 기본값이 대입될 경우 발생한다. 예를 들어 int 타입의 값을 Integer 클래스 변수에 대입하면 자동 박싱이 일어나 힙 영역에 Integer 객체가 생성된다.

Integer obj = 100; // 자동 박싱

 

자동 언박싱은 기본 타입에 포장 객체가 대입되는 경우와 연산에서 발생한다. 예를 들어 Integer객체를 int 타입 변수에 대입하거나, Integer 객체와 int 값을 연산하면 Integer 객체로부터 int 값이 자동 언박싱되어 연산된다.

Integer obj = new Integer(200);
int value1 = obj; 	// 자동 언박싱
int value2 = obj + 100; // 자동 언박싱

 

문자열을 기본 타입 값으로 변환

포장 클래스의 주요 용도는 기본 타입의 값을 박싱해서 포장 객체로 만드는 것이지만, 문자열ㅇ르 기본 타입 값으로 변환할 때에도 많이 사용된다. 대부분의 포장 클래스에는 'parse + 기본 타입 이름'으로 되어 있는 정적 메소드가 있다. 정적 메소드는 문자열을 매개값으로 받아 기본 타입 값으로 변환한다.

기본 타입의  값을 이용
byte num = Byte.parseByte("10");
short num = Short.parseShort("100");
int num = Integer.parseInt("1000");
long num = Long.parseLong("10000");
float num = Float.parseFloat("2.5F");
double num = Double.parseDouble("3.5");
boolean num = Boolean.parseBoolean("true");

 

포장 값 비교

포장 객체는 내부의 값을 비교하기 위해 == 와 != 연산자를 사용하지 않는 것이 좋다. 이 연산자는 내부의 값을 비교한느 것이 아니라 포장 객체의 참조를 비교하기 때문이다. 예를 들어 아래 두 Integer 객체는 300이라는 동일한 값을 갖고 있지만 == 연산의 결과는 false 가 나온다.

Integer obj1 = 300;
Integer obj2 = 300;
System.out.println(obj1 == obj2);

 

자바 언어 명세를 보면 다음과 같은 규칙이 있다. 박싱된 값이 아래 표에 나와 있는 범위의 값이라면 == 와 != 연산자로 내부의 값을 바로 비교할 수 있지만, 그 이외의 경우에는 언박싱한 값을 얻어 비교를 해야 한다.

타입 값의 범위
boolean true, false
char \u0000 ~ \u0071
byte, short, int -128 ~ 127

 

따라서 포장 객체에 정확히 어떤 값이 저장될지 모르는 상황이라면 == 와 != 연산자는 사용하지 않는 것이 좋다. 직접 내부 값을 언박싱해서 비교하거나, equals() 메소드로 내부 값을 비교하는 것이 좋다. 포장 클래스의 equals() 메소드는 내부의 값을 비교하도록 재정의 되어있다.

 

 

Math 클래스

java.lang.Math 클래스는 수학 계산에 사용할 수 있는 메소드를 제공하고 있다. Math 클래스가 제공하는 메소드는 모두 정적 메소드이므로 Math 클래스로 바로 사용이 가능하다.

 

아래는 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() 랜덤값 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

 

'Java' 카테고리의 다른 글

자바 멀티 스레드  (0) 2023.06.28
자바 java.util 패키지  (1) 2023.06.28
자바 예외 처리  (0) 2023.06.28
자바 예외 클래스  (0) 2023.06.28
자바 익명 객체  (0) 2023.06.27