
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(”파일명”)
- 자바는 클래스와 인터페이스의 메타 데이터를 해당 클래스로 관리함 ⇒ 메타 데이터를 얻어낼 수 있음(Reflaction)
Calss clazz = Car.class; //객체 얻기
String photo1Path = clazz.getResource("photo1.jpg").getPath();
String photo1Path = clazz.getResource("images/photo2.jpg").getPath();
//자바 내에서 파일의 절대 경로가 출력됨
Class 객체 얻는 방법
: 3개 방법 모두 참조하는 메모리는 동일함
클래스로부터 얻는 방법
- Class clazz = 클래스 이름.class
: 클래스 타입의 변수 선언, 해당 클래스이름에 .class 붙이기 - Class clazz = Class.forName(”패키지…클래스이름”)
- Class가 가지는 정적 메소드인 forName을 호출해서 문자열로 지정하면 해당 클래스 클래스 객체가 생성되어 변수에 저장됨
- 해당 클래스 주소를 잘못 적을경우 예외가 발생하므로 예외처리를 하라고 띄워줌
객체로부터 얻는 방법
- 변수가 이미 생성되어 있다면
: 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이 불변이라서 갖는 장점
- 캐싱: 저장공간에 각 리터럴 문자열의 하나만 저장하고 재사용하거나 캐싱에 이용할 수 있어서 힙 공간이 절약된다.
- 보안: 보안이 필요한 데이터는 문자열로 전달됨으로서 문자열 변경이 어려워 보안을 유지할 수 있다.
- 동기화: 불변하기 때문에 동시에 실행되는 여러 스레드에서 안정적이게 공유할 수 있다.
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 박싱]: 기본 타입 → 포장 객체
- 생성자에 매개값으로 기본 타입 값 주기⇒ 해당 값을 래핑
- ex) Byte obj = new Byte(10);
- 생성자에 매개값으로 문자열 주기⇒ 문자열을 기본타입으로 바꾼 뒤 래핑
- ex) Byte obj = new Byte(”10”);
- 생성자 이용 않고, 각 포장 클래스마다 가진 정적 value of()메소드를 활용하기
- 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)
주의: 값이 null이면 예외 발생.Optional<String> optional = Optional.of("Hello"); - 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 클래스로 바로 사용 가능

- 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 |
