16. 자바(java) : java.lang 패키지 클래스 정리(Object, System, Class, String, Wrapper, Math)

2024. 4. 24. 20:21·JAVA
목차
  1. 1. Object 클래스 (root)
  2. 1) 객체 복사 : clone()
  3. 2) 객체 비교 : equals()
  4. 3) 객체 해시코드: hashCode()
  5. 4) 객체 문자 정보: toString()
  6. 2. System 클래스
  7. 3. Class 클래스
  8. Class 객체 얻는 방법
  9. 4. String 관련 클래스
  10. 1) String 클래스
  11. 2) StringBuffer 클래스 & StringBuilder 클래스
  12. 3) StringTokenizerTest 클래스
  13. 5. Wrapper(포장) 래퍼 클래스
  14. Wrapper 객체?
  15. 박싱(Boxing)과 언박싱(Unboxing)
  16. Wrapper 객체의 장점
  17. 자동 박싱과 언박싱
  18. 문자열 → 기본 타입 언박싱
  19. 포장 값 비교
  20. Optional 클래스
  21. 주요 메서드와 사용법
  22. 예제
  23. 6. Math 클래스

java.lang 패키지

자바 프로그램의 기본적인 클래스를 담은 패키지

  • 해당 패키지의 클래스와 인터페이스는 import없이 사용 가능함
  • 아래와 같은 클래스가 소속되어 있다

 

1. Object 클래스 (root)

: 모든 클래스는 Object 클래스의 자식이거나 자손 클래스 = 자바의 최상의 클래스

→ Object 클래스의 메소드는 모든 자바 객체에서 사용 O

1) 객체 복사 : clone()

  • 깊은 복사
  • protected Object clone() {}
    • 외부에서 원본 객체에 접근할 수는 없고 사본만 제공할 때 접근제한자를 protected 사용
  • 객체 사본을 생성할 때 사용
@Override
public Student clone() {
    return new Student(super.getName(), super.getAge(), this.grade, this.classNumber);
}

//접근한 애를 Student로 사본생성, 해당 객체를 구성하는 변수들 대입도 그대로 진행해줌

 

2) 객체 비교 : equals()

  • 모든 객체가 매개값으로 대입될 수 있음
  • 비교 연산자인 ==와 동일 결과 리턴
  • 반환 타입: boolean
  • 자식 클래스에서 해당 메소드 재정의하여 사용하는 경우
    • 두 객체 필드값이 동등한지 비교하기 위해
    • 전제조건: 매개값이 기준 객체와 동일 타입 객체
@Override
public boolean equals(Object o) {
    if (this == o) {return true;
    }else if(o instanceof Employee) { //이 조건이 있어야 Employee가 아닌 다른 객체가 들어왔을 때는 실행하지 않음
        Employee e =(Employee) o;//해당 객체로 변환 안해주면 진짜 object가 저장됨
        //변환된 매개변수가 상위 클래스 변수와 같은지 조건 추가
        if(e.salary == salary && this.department.equals(e.department)) {
            return true;
        }
    }
    return false;
}
  • 오버라이딩 하면 편리함
    • 해당 클래스 객체 형태이면서 선언된 변수들까지 같으면 return true;
    • hashcode까지 같이 오버라이딩 해주면 정말 같은 값을 찾아낼 수 있음

 

@Override
public boolean equals(Object o) {
	if(this == o) return true;
	else if(o instanceof Food) {
		food f = (Food) o;
			if(hits.name.equals(f.name) && this.price == f.price
			&& this.type.equals(f.type)){
				return true;
			}
		}
	return false;
}

@Override
public int hashCode() {
	return Objects.hash(name, price, type);
}

 

3) 객체 해시코드: hashCode()

  • 객체를 식별하는 하나의 정수값을 반환(int)
  • 자신의 정보를 출력하는 것이라서 매개변수 X
  • 객체는 각 메모리 번지를 이용하여 해시소드 메소드를 만들기 때문에 객체마다 다른 값을 가짐 → 절대 중복되지 않음

재정의하여 사용하는 경우

  • 두 객체가 완전히 동등한지 비교할 때 사용(framework 등)
    ⇒ hashCode와 equals를 사용해서 동등객체로 판별하도록 설정
//Student 클래스
@Override
	public int hashCode() {
		return Objects.hash(super.getName(), super.getAge(), this.grade, this.classNumber);
	}

Student s = new Student("유지희", 24, 1, 3);
		Student s2 = new Student("유지희", 24, 1, 3);
		Student s3 = new Student("유승주", 29, 2, 3);

System.out.println(s.hashCode());
		System.out.println(s2.hashCode());
//동일 값이 출력됨

 

  • HashSet, Hashtable, HashMap 등이 유사함
    • 이들 모두 <key, value> 형태로 데이터를 저장 → 해시 함수를 이용해 key값을 기준으로 고유 식별값(해시값)을 생성하여 버킷(bucket)에 저장
    • 다만 서로 다른 객체인데도 같은 해시값을 갖게 되면 [해시 충돌]이 일어남 ⇒ 해당 버킷에 객체를 새로 추가하게 됨

4) 객체 문자 정보: toString()

  • 객체를 대표할 문자열 정보를 리턴 (defualt = 주소값)

재정의 하는 경우: 변수를 호출하면 출력하려는 다른 정보로 바꿀 수 있음

  • System.out.println(객체명) 만으로도 정보를 출력할 수 있게 됨
//원본
System.out.println(s2); //객체의 toString()호출하는 것

//재정의
@Override
public String toString() {
    return super.name + " " + getAge() + " " +getAddress() + " " + getPhone() + " " +
            getEmail() + " " + grade + " " + classNum;
} 

//재정의 후 다시 출력하면 내가 정의한 내용이 출력됨

 


2. System 클래스

: 운영체제의 일부 기능 이용할 수 있음

  • 모든 필드와 메소드는 정적 필드 및 메소드로 구성됨
  • 프로그램 종료: exit(int 매개변수)
    • JVM을 강제 종료하는 기능 = 자바 프로그램 종료
    • 반환 타입: static void
    • 해당 메소드가 지정하는 int 매개값 = 종료 상태값이라고 함
      • 보통 int 0을 주어서 정상 종료를 목적으로 사용함
  • 현재 시각 읽기: currentTimeMillis(), nanoTime()
    • 실행 시간 측정을 위해 사용됨
      • 보통 프로그램 실행시간 측정 = 끝시간 - 시작시간
    • currentTimeMillis(): 1/10^3 단위 long 값 리턴
    • nanoTime(): 1/10^9 단위 long 값 리턴 → 더 정밀
    • 반환 타입이 long인 이유? : 1970년 1월 1일 0시부터 시작되서 현재까지 카운팅이 진행되기 때문

3. Class 클래스

: 클래스와 인터페이스의 메타 데이터를 관리해주는 클래스

  • 용도
    • 자바는 클래스와 인터페이스의 메타 데이터를 해당 클래스로 관리함 ⇒ 메타 데이터를 얻어낼 수 있음(Reflaction)
      • 메타 데이터: 타입 이름, 파일 경로 정보, 필드 정보, 생성자 정보, 메소드 정보
    • 클래스 경로 활용하여 리소스 절대 경로 얻기 가능
      • Class 객체는 파일 경로 정보가 있어 해당 경로 활용해 다른 리소스 파일의 경로도 얻을 수 있음
      • getResource(”파일명”)
Calss clazz = Car.class; //객체 얻기

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

//자바 내에서 파일의 절대 경로가 출력됨

Class 객체 얻는 방법

: 3개 방법 모두 참조하는 메모리는 동일함

클래스로부터 얻는 방법

  1. Class clazz = 클래스 이름.class
    : 클래스 타입의 변수 선언, 해당 클래스이름에 .class 붙이기
  2. Class clazz = Class.forName(”패키지…클래스이름”)
  • Class가 가지는 정적 메소드인 forName을 호출해서 문자열로 지정하면 해당 클래스 클래스 객체가 생성되어 변수에 저장됨
  • 해당 클래스 주소를 잘못 적을경우 예외가 발생하므로 예외처리를 하라고 띄워줌
  1.  

객체로부터 얻는 방법

  1. 변수가 이미 생성되어 있다면
    : Class clazz = 참조변수.getClass(); : 변수가 참조하는 객체의 Class객체를 얻어서 번지를 변수에 저장함

예) String 클래스

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

 

반응형

4. String 관련 클래스

문자열 저장을 위해 사용하는 클래스

1) String 클래스

기본자료형처럼 사용하는 클래스로, “” 기호를 통해 리터럴을 사용한다

문자열 값 수정은 불가능 (immutuable 불변) ↔ (mutalbe 가변) StringBuffer 클래스 & StringBuilder 클래스

  • 가변과 불변이란 저장소의 원본 값을 수정할 수 있는지 여부이다
    • 즉, 불변이라함은 사본이 생성되어 사본이 수정된다는 의미이다.
    • 수정시 수정된 문자열이 새로 할당되어 새 주소를 넘기기 때문에 = 연산자로 대입해줘야한다)

String이 불변이라서 갖는 장점

  1. 캐싱: 저장공간에 각 리터럴 문자열의 하나만 저장하고 재사용하거나 캐싱에 이용할 수 있어서 힙 공간이 절약된다.
  2. 보안: 보안이 필요한 데이터는 문자열로 전달됨으로서 문자열 변경이 어려워 보안을 유지할 수 있다.
  3. 동기화: 불변하기 때문에 동시에 실행되는 여러 스레드에서 안정적이게 공유할 수 있다.

String 생성자

//배열 전체를 String 객체로 생성
String str = new String(byte[] bytes);
//지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, String charsetName);

//배열의 (지정한) offset 인덱스 위치부터 length만큼 String 객체로 생성(offset, length 숫자로 바로 입력도 가능)
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(인덱스번호) 특정 위치의 문자를 리턴
주어진 인덱스의 문자를 리턴
 
boolean equals(Object anObject) 두 문자열 비교 ==와 결과값 다를 수 있으니 주의
  .contains() 문자열에 특정문자 포함여부 확인 전체 문자열 중 포함만 되어있으면 찾아짐
  .startsWith(”문자열”)
.endsWith(”문자열”)
시작 및 끝 값 내용 확인  
  .isBlank() 문자열에 띄어쓰기 있는지 확인  
  .isEmpty() 문자열 유무 확인 띄어쓰기도 하나의 문자열임을 주의
byte[] getBytes() byte[]로 리턴  
  getBytes(Charset charset) 주어진 문자셋으로 인코딩한 byte[]로 리턴 - 문자셋 지정하지 않을 경우 os기본 문자셋으로 진행됨
(윈도우: ms949, mac: utf-8)
- 어떤 문자셋으로 인코딩되었는지 주의해서 디코딩 진행 필요
int indexOf(”문자열”) 혹은 indexOf(”문자열”, 시작위치) 문자열 내에서 주어진 문자열의 (시작)위치를 리턴
주어진 문자열 포함되지 않으면 -1 리턴 
- 단독사용은 별로..
⇒ 문자열이 포함됬는지 확인하는 if문 혹은 문자열 자르기 위한 인덱스번호 확인 용으로사용됨
  lastIndexOf(”문자열”)
length()
문자열 내에서 주어진 문자열의 총 문자 수 리턴  
String replace(CharSequence target, CharSequence replacement) target 부분을 replacement로 대치한 새로운 문자열을 리턴 원본 문자가 수정되는 것이 아니라, 새로운 문자열을 생성해서 리턴해줌
  substring(int beginIndex) beginIndex 위치에서 끝까지 잘라낸 새로운 문자열 리턴 - 하나의 정수값 제공: 주어진 인덱스부터 끝까지 문자열 추출
  substring(시작인덱스[, 끝인덱스]) 비긴에서 엔드 전까지 잘라낸 새로운 문자열 리턴 - 두개의 정수값 제공: 시작(0)과 끝(4) 인덱스 사이의 문자열 추출(0~3)
  toLowerCase()
toUpperCase()
알파벳 소문자로 변환한 새로운 문자열을 리턴
알파벳 대문자로 변환한 새로운 문자열 리턴
원본 문자가 수정되는 것이 아니라, 새로운 문자열을 생성해서 리턴해줌
  . valueOf() 기본 타입 값을 STRING타입으로 로 바꿔줌 - 배열의 값도 하나의 문자열string으로 바꿔줌 static type (예) String srt = String.valueOf(chArr);
  .concat() 문자열 합치기 == += 연산과 동일 기능임
  split(”구분할 기호나 값”) 문자열을 특정 값을 기준으로 파싱해서 배열로 반환해줌 - csv : ,로 나뉠수 있는 데이터를 의미 -> 공공 데이터 다운로드시 csv로 다운받아 내가 원하는 데이터로 파싱할 때 사용함
  join(“구분자”, 문자열배열) 혹은 (”구분자”, 문자열1, 문자열2,…) 배열을 문자열로 변경해주는 기능 static이므로 바로String.join으로 사용가능
  replace(”찾을값”, “바꿀값”) 특정문자열을 지정문구로 변경  
  formatted(넣을 값, …) printf의 형식에 따라 주어진 문장에 문자열값을 삽입  

 

예시

  • 알파벳 대문자, 소문자화 : toUpperCase(), toLowerCase()
System.out.println("계속 하시겠습니까? (y/n)");
String choice = sc.next();
if(choice.toLowerCase().equals("y")){ 
	.....
}
  • 문자열 지정구간 잘라내기 : substring()
test = "오늘 수업 끝";
test = test.substring(0, test.length()-1);
System.out.println(test);//오늘 수업
  • 문자열 분리 및 파싱 : split()
test = "유병승,19,남,경기도시흥\n김명준,32,남,경기도부천시\n김동훈,29,남,경기도안양시";
String[] data = test.split("\n");
for(String v : data) {
    String [] p = v.split(",");
    Person p1 = new Person();
p1.setName(p[0]);
    p1.setAge((Integer.parseInt(p[1]));
    p1.set(p[2]);
    p1.setAddress(p[3]);
    for(String t : p) {
    System.out.println(t);
    }
}
//\n로 나눈 다음 ,로 한번 더 나눔
  • 문자열 대치 : replace()
String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "JAVA");
//JAVA 프로그래밍
  • 문자열 합치기 : concat()
String test = "GDJ79";
test = test.concat("화이팅"); //대입연산을 꼭 해줘야함
//GDJ79화이팅

test = test.concat("졸면안돼!").concat("산타하부지가 선물안줘용!");
System.out.println(test);
//GDJ79화이팅졸면안돼!산타하부지가 선물안줘용!

 

2) StringBuffer 클래스 & StringBuilder 클래스

문자열 값 수정 가능, mutuable(가변)

→ 원본에 접근하여 수정하기 때문에 hashcode 변치않음

→ 대입연산자 안써도 바로 적용됨

둘은 서로 호환된다

test = new String(testsb);
		System.out.println(test); //이제안 ~남았어요!호호호
		test = "오늘 수업 끝!";
		testsb = new StringBuffer(test); //이제안 ~남았어요!호호호
		System.out.println(testsb); //오늘 수업 끝!

 

StringBuffer 클래스

StringBuilder 클래스

기본 16문자 크기로 지정된 버퍼를 이용하며 부족시 크기가 자동으로 증가된다. → 다만 효율이 떨어질 수 있으므로 넉넉히 잡는 것이 좋다.
buffer라는 독립공간을 가지면서 문자열을 추가할 수 있어 퍼포먼스가 좋음
safe 기능이 제공되어 성능저하 가능성이 있다.
→ 현업에서는 보통 자바를 멀티 스레드 이상의 환경에서 돌리기 때문에 왠만하면 StringBuffer로 통일하여 코딩함이 좋다고 한다.
StringBuffer와 동일하나 쓰레드 safe 기능이 없음
문자열 파싱 성능이 가장 우수하다
→ 동기화가 되지 않으므로 단일 쓰레드이거나 동기화를 고려하지 않아도 될 때 이용하면 좋다.
→ 쓰레드 safe 기능이 없다면 StringBuilder 클래스
두 클래스가 갖는 가변의 장점
  • 가변적이기 때문에 추가, 수정, 삭제 작업이 간단하고 빠르다.

 

생성 및 수정 방법

클래스 방식으로 사용해야하므로 new 클래스명(); 혹은 new 클래스명(””)형식으로 생성

수정, 삭제, 삽입을 메소드를 이용해서 진행해야 함 (.append(”내용”); 등)

따라서 문자열 변경이 많이 있는 경우 이 두 가지를 쓰고, 원본 그대로 유지할 경우 String 사용한다.

데이터 추가하기

  • append()메소드 이용: 문자열 마지막에 매개변수값을 추가하는 기능(누적)
    → 파일의 문자내용을 모두 가져오기 위해 (출력시)사용되기도 함
testsb.append("여려분 안녕하세요!");
System.out.println(testsb); //여려분 안녕하세요!
testsb.append("호호호");
System.out.println(testsb); //여려분 안녕하세요!호호호

//파일에서 가져오기(char)
//strdata: 날씨가 더워지고 있네요
try(FileReader fr = new FileReader("strdata.bs");) {
    int data = 0;
    StringBuffer sb = new StringBuffer(); //계속 누적출력해야되서 버퍼사용
    while ((data = fr.read()) != -1) {
        //char로 변환 안해주면 2바이트를 기반으로 한글문자열을 의미하는 숫자가 나옴
        sb.append((char)(data)); //문자열 마지막에 매개변수값을 추가(누적)
    }
    System.out.println(sb);
} catch(IOException e) {
    e.printStackTrace();
}

//파일에서 가져오기(string)		
public StringBuilder fileOpen(String file) {
//try 안에 선언하면 지역변수가 되어서 아래에 return을 못하기 때문에 try문 밖에 선언
StringBuilder result = new StringBuilder();
try (BufferedReader br = 
        new BufferedReader(new FileReader("./" + file));){
    String str;
    while((str = br.readLine()) != null) {
        result.append(str).append("\\n"); 
        //그냥 바로 객체 통째로 저장하려고 하니까 주소값만 들어감..
        //불러온 파일 br 의 내용을 한줄씩 불러와서 값이 있으면 
        //StringBuilder append 메소드로 누적하여 객체통째로 리턴
        //-> 파일 내용을 가져와서 출력하려면 다시 누적을 거쳐야하나보다.
    }
    return result;
} catch(FileNotFoundException e) {
    return result;
} catch(IOException e) {
    e.printStackTrace();
}
return result;
}

public void fileOpen() {
StringBuilder note = fc.fileOpen(fileName); //받아오기
    if(note != null) {
        System.out.println("파일을 찾았습니다.");
        System.out.println(note);		
        break;
    } else {
        System.out.println("없는 파일입니다. 다시 입력해주세요.");
    }
}

 

  • inset() 메소드: 문자열의 원하는 위치에 추가하는 기능
testsb.insert(4, "^^"); 
System.out.println(testsb); //여려분^^ 안녕하세요!호호호

 

데이터 삭제하기

  • delete(시작인덱스, 끝인덱스) : 시작부터 끝 인덱스 사이의 문자열을 잘라낸다.(삭제)
  • deleteCharAt(인덱스번호) : 문자열 한개만 삭제하는 기능

수정하기

  • setCharAt(인덱스번호, '문자') : 특정 위치의 한글자만 수정

 

3) StringTokenizerTest 클래스

String 클래스 내 split()과 동일 기능을 수행하는 클래스

즉, 전달받은 문자열을 구분자로 나누어 각 토큰에 저장 → 값을 저장해놓고 하나씩 뽑아서 쓰는 형식에 유용하다.

  • 컬렉션 프레임워크 set이라는 기능 활용시 함께 사용될 예정
  • 사용 예
    • 관련 메소드
      • nextToken() : 하나씩 호출 -> 일회성이라서 지역변수에 꼭 저장을 해줘야 재사용이 가능하다.
      • hasMoreTokens() : 모두 호출이 되었는지 체크해주는 메소드 (남았으면 true 리턴)
String test = "1, 2, 3, 4, 5, 6";
StringTokenizer stk = new StringTokenizer(test, ", ");
String test2 = "java,oracle,html/css,javascript/jquery,servlet";
StringTokenizer stk2 = new StringTokenizer(test2, ",/");

//위 두가지 메소드를 병합해서 아래처럼 사용하면 모두 출력되고 while이 종료됨
while(stk.hasMoreTokens()) {
    System.out.println(stk.nextToken());
}
  • 주의사항 : 일회성임을 유의하자
//예시1
while(stk.hasMoreTokens()) {
	System.out.println(stk.nextToken());
	System.out.println(stk.nextToken() + " " + stk.nextToken().length()); 
}

//2번 호출되었음. length부분은 데이터 길이만 출력되고 사라진 것임

while(stk.hasMoreTokens()) {
	String v = stk.nextToken(); 
	System.out.println(v + " " + v.length());
}
//길이도 같이 한번에 출력하고 싶으면 지역변수에 저장하고 호출해서 출력하면 된다

5. Wrapper(포장) 래퍼 클래스

Wrapper 객체?

기본타입(byte, char, short, int, long, float, double, boolean)값을 내부에 두고 포장된 객체

  • 기본 타입 값은 외부에서 변경할 수 없음
  • 주로 컬렉션 프레임워크에서 기본 타입 값을 관리할 때 사용
  • java.lang 패키지에 포함되어 있음

jvm이 자동으로 형변환 해줌(auto boxing, unboxing)으로서 기본 자료형을 객체로 취급하게 해준다

박싱(Boxing)과 언박싱(Unboxing)

기본 타입 값을 포장 객체로 만드는 과정이 박싱

기본타입 포장클래스
char Character
int Integer
...  
  • 나머진 첫글자가 대문자가 된 것과 동일함
  • [Boxing 박싱]: 기본 타입 → 포장 객체
    1. 생성자에 매개값으로 기본 타입 값 주기⇒ 해당 값을 래핑
    2. ex) Byte obj = new Byte(10);
    3. 생성자에 매개값으로 문자열 주기⇒ 문자열을 기본타입으로 바꾼 뒤 래핑
    4. ex) Byte obj = new Byte(”10”);
    5. 생성자 이용 않고, 각 포장 클래스마다 가진 정적 value of()메소드를 활용하기
    6. Integer obj = Integer.valueOf(1000); Integer obj = Integer.valueOf("1000");

반대로 포장 객체에서 기본 타입의 값을 얻는 과정이 언박싱

  • [Unboxing 언박싱]: 포장 객체 → 기본 타입ex) int A = B.intValue();
  • ⇒ 기본 타입 이름+Value()메소드 호출하여 언박싱

Wrapper 객체의 장점

  •  장점
    • 자동으로 형변환이 되어서 편하다
    • 상속관계에서 기본형에 한해 다형성을 이용할 수 있다.
//아무 자료형이든 다 들어갈 수 있어서 유연한 코드가 된다.
public static void printData (Object o) {
    System.out.println(o);
}

//int형밖에 못들어감
public static void printData (Integer o) {
    System.out.println(o);
}

 

자동 박싱과 언박싱

  • 자동 박싱
    • 포장 클래스 타입에 기본값이 대입될 경우 발생
    • 문법상으로는 맞지 않지만, 기본 타입의 값이 해당 객체로 포장이 되어서 대입됨
  • 자동 언박싱
    • 기본 타입 변수에 포장 객체가 대입되는 경우 및 연산에서 자동 언박싱 발생
    • 문법상으로는 맞지 않지만, 래퍼 객체의 경우 기본 타입의 값이 자동 언박싱이 되어서 대입됨
  • 예시
Integer obj = 100; //Integer 객체로 자동 박싱
int value1 = obj; //int로 자동 언박싱
int value2 = obj + 100; //자동 언박싱

String test = "19"; //공백 전환 불가: 자동으로 trim 미실행
int age = Integer.parseInt(test);
System.out.println(test);

test = "180.5";
double height = Double.parseDouble(test);

test = "65.5    "; //공백 제거 됨: 자동으로 trim을 실행
double weight = Double.parseDouble(test);
System.out.println(weight);

문자열 → 기본 타입 언박싱

  • parse⇒ wrappeer클래스명.parse기본 타입(”문자열”); 정적 메소드
  • ex) Int age = Integer.parseInt(”100”);
  • 보통 String으로 데이터를 많이 받고 이를 형변환해서 사용하도록 코드를 많이 짜기 때문에 사용할 일이 많다.

포장 값 비교

❗ 포장 객체는 내부 값 비교를 위해 == 및 =! 연산자를 사용치 않는게 좋음

⇒ equlas() 사용 혹은 직접 내부 값을 언박싱해서 비교

  • 포장 객체끼리의 비교는 주소가 달라서 내부 값이 같아도 false가 나옴
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println(obj1 == obj2);
  • 아래 표에 나와 있는 범위 값이 아닌 경우 언박싱 후 비교해야함
    →아래 범위 값들은 자바가 자주 사용된다고 판단하여 패킹할 때 재사용을 하기 때문에 true가 나옴타입값의 범위
    타입 값의 범위
    boolean true, false
    har \u0000~\u007f
    byte, short, int -128~127

Optional 클래스

Optional은 Java 8에서 도입된 클래스이며, null 값을 안전하게 처리할 수 있도록 돕는 래퍼(wrapper) 클래스

주로 null로 인해 발생하는 NullPointerException 문제를 줄이고, 코드의 가독성과 안전성을 높이기 위해 사용한다.

  • Java에서 null은 값을 가지고 있지 않음을 나타내.하지만 null을 잘못 사용하면 NullPointerException이 발생해.
  • Optional은 값이 없을 수 있음(null 가능성)을 명시적으로 표현하면서, null 검사를 보다 직관적이고 안전하게 처리할 수 있도록 돕는 클래스야.

주요 메서드와 사용법

(1) Optional 생성하기

  • of(value)
    Optional<String> optional = Optional.of("Hello");
    
    주의: 값이 null이면 예외 발생.
  • null이 아닌 값을 가진 Optional 객체를 생성.
  • ofNullable(value)
    Optional<String> optional = Optional.ofNullable(null);  // Optional.empty() 반환
    
  • 값이 null일 수도 있는 경우 사용.
  • empty()
    Optional<String> optional = Optional.empty();
    
  • 비어 있는 Optional 객체를 생성.

(2) Optional 값 확인하기

  • isPresent()
    if (optional.isPresent()) {
        System.out.println(optional.get());
    }
    
  • 값이 존재하면 true, 없으면 false.
  • ifPresent(Consumer)
    optional.ifPresent(value -> System.out.println(value));  // 존재한다면 출력
    
  • 값이 존재할 때만 실행할 로직을 지정.

(3) 값 반환하기

  • get()주의: 값이 없으면 NoSuchElementException 발생.
  • String value = optional.get();
  • Optional에 값이 있을 경우 값을 반환.
  • orElse(defaultValue)
    String value = optional.orElse("Default");
    
  • 값이 없으면 지정한 기본값을 반환.
  • orElseGet(Supplier)
    String value = optional.orElseGet(() -> "Generated Default");
    
  • 값이 없을 때 다른 로직을 실행하여 기본값을 반환.
  • orElseThrow()
    String value = optional.orElseThrow(() -> new IllegalStateException("Value is missing!"));
    
  • 값이 없을 때 예외를 던짐.

예제

일반적인 null 처리

String value = getValue();  // null 반환 가능
if (value != null) {
    System.out.println(value);
} else {
    System.out.println("Default Value");
}

Optional을 사용한 null 처리

Optional<String> optionalValue = Optional.ofNullable(getValue());
String value = optionalValue.orElse("Default Value");
System.out.println(value);

6. Math 클래스

: 수학 계산에 사용 가능한 메소드를 제공하는 클래스

  • 모두 정적 메소드 ⇒ Math 클래스로 바로 사용 가능

double ceil: 매개값보다 더 큰 정수값 리턴(올림값), int max.min: 매개값 중 최대.최소 값 리턴 random은 자주 사용되니 잘 알아두기

 

  • Math.random()메소드 상세설명
    • 랜덤 값은 기본적으로 실수로 처리됨
    • 0.0 ≤ Math.random() <1.0
      • 특정 범위의 랜덤 정수로 출력하려면 (int)(Math.random() * 최대 범위 정수 + 1)를 해주면 됨 -> 0~정수값-1 범위 랜덤값 출력원하는 최대값을 10대신 곱하면 됨

  • Math.rount(double값);
    • 반올림
    • int로 받고 싶으면 int n = Math.round(180.4F);
  • Math.ceil(double값);
    • 무조건 올림
반응형

'JAVA' 카테고리의 다른 글

17. 자바(java) : java.time 패키지 클래스 정리(+ String 데이터로 날짜 활용하는 방법)  (0) 2024.04.24
15. 자바(java) : java.util 패키지 클래스 정리(Date, Calendar, GregorianCalendar, SimpleDateFormat, stream)  (0) 2024.04.24
14-2. 자바(java) : 컬렉션(Collection) - Set, Map 개념과 활용 정리  (0) 2024.04.24
14-1. 자바(java) : 컬렉션(Collection) - List 개념과 활용 정리  (0) 2024.04.09
13. 자바(java) : 문자열 및 파일 입출력(IO)을 위한 스트림(stream) 간단 정리  (0) 2024.04.09
  1. 1. Object 클래스 (root)
  2. 1) 객체 복사 : clone()
  3. 2) 객체 비교 : equals()
  4. 3) 객체 해시코드: hashCode()
  5. 4) 객체 문자 정보: toString()
  6. 2. System 클래스
  7. 3. Class 클래스
  8. Class 객체 얻는 방법
  9. 4. String 관련 클래스
  10. 1) String 클래스
  11. 2) StringBuffer 클래스 & StringBuilder 클래스
  12. 3) StringTokenizerTest 클래스
  13. 5. Wrapper(포장) 래퍼 클래스
  14. Wrapper 객체?
  15. 박싱(Boxing)과 언박싱(Unboxing)
  16. Wrapper 객체의 장점
  17. 자동 박싱과 언박싱
  18. 문자열 → 기본 타입 언박싱
  19. 포장 값 비교
  20. Optional 클래스
  21. 주요 메서드와 사용법
  22. 예제
  23. 6. Math 클래스
'JAVA' 카테고리의 다른 글
  • 17. 자바(java) : java.time 패키지 클래스 정리(+ String 데이터로 날짜 활용하는 방법)
  • 15. 자바(java) : java.util 패키지 클래스 정리(Date, Calendar, GregorianCalendar, SimpleDateFormat, stream)
  • 14-2. 자바(java) : 컬렉션(Collection) - Set, Map 개념과 활용 정리
  • 14-1. 자바(java) : 컬렉션(Collection) - List 개념과 활용 정리
JinHyung-dev
JinHyung-dev
틈틈이 기록하고 있습니다!!
  • JinHyung-dev
    JinHyung's 블로그
    JinHyung-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • JAVA (18)
      • Oracle DataBase (13)
      • 프리코스 (4)
      • 백엔드 개발자 (0)
        • 신입 (0)
  • 인기 글

  • 반응형
  • 최근 댓글

  • 최근 글

  • 태그

    Java
    oracle
    SQL
    백엔드
    정리
    공부
    자바
    요약
    DB
    개발자
  • hELLO· Designed By정상우.v4.10.0
JinHyung-dev
16. 자바(java) : java.lang 패키지 클래스 정리(Object, System, Class, String, Wrapper, Math)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.