개발/Java

[Java] java.base 모듈

yun000 2024. 12. 5. 16:47

<API document>

자바 표준 모듈에서 제공하는 라이브러리 사용을 돕는 문서

https://docs.oracle.com/en/java/javase/21/docs/api/index.html

 

Overview (Java SE 21 & JDK 21)

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

NESTED 중첩 클래스/중첩 인터페이스 목록

FILED 필드 목록

CONSTR 생성자 목록

METHOD 메소드 목록

<Object 클래스>

모든 클래스는 Object를 상속받는다.

모든 객체에서 Ovject가 가진 메소드를 사용할 수 있다.

object의 method 용도
boolean equals(Object obj) 객체의 번지 비교하고 결과 return. "=="와 같은 결과
모든 객체를 obj에 넣기 가능
int hashCode() 객체 hashCode return
String toString() 객체 문자 정보 return

 

- equals

객체 동등비교

Object의 equals 메소드는 재정의하여 동등 비교용으로 사용된다.

객체가 달라서 내부 데이터가 같은지 비교하는 것이다

ex) String은 equals() 메소드 재정의하여 내부 문자열이 같은지 비교한다.

public boolean equals(Object obj)

 

 

Member m1=new Member("user1","홍길동");
Member m2=new Member("user2","홍길동");

System.out.println(m1==m2);
System.out.print(m1.equals(m2));

 

- hashCode

객체를 식별하는 정수

객체마다 재정의하여 새로운 정수값을 return한다.

 

java는 hashCode()가 return하는 정수값이 같은지 확인하고

equals()메소드가 true를 리턴하는지 확인해서 동등 객체임을 판단한다.

public int hashCode();
Member m1=new Member("user1","홍길동");
Member m2=new Member("user1","홍길동");

System.out.println(m1.hashCode());
System.out.println(m2.hashCode()));

 

hashCode와 equals 재정의

public class Member 
{
	public String name;
	public String id;
	
	public Member(String meaage,String name)
	{
		this.id= meaage;
		this.name=name;
	}
	
	@Override
	public int hashCode()
	{return 1;}
	@Override
	public boolean equals(Object obj)
	{
		return true;
	}
}

 

- HashSet

동등 객체를 중복 저장하지 않는다.

hashCode와 equals()를 이용해 동등객체인지 확인한다

package ch12.sec03;
import java.util.HashSet;

public class HashSetExample 
{
	public static void main(String[] args)
	{
		HashSet hashSet=new HashSet();
		Student s1=new Student(1,"홍길동");
		Student s2=new Student(1,"홍길동");
		hashSet.add(s1);
		hashSet.add(s2);
		
		System.out.println("저장된 객체 수="+hashSet.size());
		
		Student s3=new Student(2,"홍길동");
		hashSet.add(s3);
		System.out.println("저장된 객체 수="+hashSet.size());
	}
}

 

package ch12.sec03;

public class Student {
	private int no;
	private String name;
	
	public Student(int no,String name)
	{
		this.no=no;
		this.name=name;
	}
	public int getNo() {return no;}
	public String getName() {return name;}
	
	@Override
	public int hashCode(){return no+name.hashCode();}
    
	@Override
	public boolean equals(Object obj)
	{
		if(obj instanceof Student target)
		{
			if(no==target.getNo()&&name.equals(target.getName()))
			{ return true;}
		}
		return false;
	}
}

 

-toString

객체의 문자 정보 리턴

Object toString()메소드는 클래스명@hashCode를 return한다.

ex) toString을 Override하지 않으면

java.lang.Object@de6ced

toString을 Override하기

@Override
public String toString()
{ return compan+","+os; }

<롬복>

자동 코드 생성 라이브러리.

Getter Setter hasCode등의 메소드를 자동생성한다.

 

설치 후 환경변수 설정도 해줘야함

설치 사이트  https://projectlombok.org/download

 

Download

 

projectlombok.org

 

사용법

import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor

public class Member 
{
	private String id;
	private String name;
}

 

Annotation종류

@NoArgsConstructor

@AllArgsConstructor

@RequiredArgsConstructor

@Getter

@Setter

@EqualsAndHashCode

@ToString

<문자열 클래스>

String 문자열 저장하고 조작
StringBuilder 효율적인 문자열 조작
StringTokenizer 구분자로 연결된 문자열 분리

 

-String class

문자열 저장하고 조작

ex) 네트워크 통신으로 얻은 byte배열을 원래 문자열로 변환해보자

public static void main(String[] args)throws Exception
{
    String data="자바";

    //String -> byte array
    byte[] arr1=data.getBytes();
    System.out.println("arr1="+Arrays.toString(arr1));

    //Byte array -> String
    String str1=new String(arr1);
    System.out.println("str1="+str1);

    //String -> Byte array
    byte[] arr2=data.getBytes("EUC-KR");
    System.out.print("arr2="+Arrays.toString(arr2));

    //Byte array -> String
    String str2=new String(arr2,"EUC-KR");
    System.out.println("str2="+str2);
}

 

-StringBuilder class

String은 내부 문자열을 수정할 수 없다.

String data="ABC"; data+="DEF";

이 코드는 사실 ABCDEF라는 새로운 String객체를 생성한 것이다.

data는 새로 생성된 String객체를 참조하게 된다.

 

이는 비효율적이기 때문에 잦은 문자열 변경 작업을 해야한다면

StringBuilder를 사용하는 것이 좋다

 

StringBuilder는 내부 버퍼에 문자열 저장하고 그 안에서 수정하는 작업을 하게 설계되어 있다.

그래서 String객체 새로 만드는 과정 없이 문자열 조작이 가능하다

return type method 설명
StringBuilder append( 기본값|문자열 ) 문자열 뒤에 추가
StringBuilder insert(위치, 기본값 | 문자열) 문자열 지정 위치에 추가
StringBuilder delete(시작 위치, 끝 위치) 문자열 일부 삭제
StringBuilder replace(시작위치, 끝 위치, 문자열) 문자열 일부 대체
String toString() 완성된 문자열 리턴

 

toString()제외한 메소드들은 체이닝 패턴 사용 가능(연이어 다른 메소드 호출하는)

String data= new StringBuilder().append("DEF").insert(0,"ABC").delete(3,4).toString();
System.out.println(data);

 

-StringTokenizer class

문자열이 구분자로 연결된 경우, 구분자 기준으로 문자열 분리하고 싶으면

String.split혹은 StringTokenizer사용 가능

split은 정규표현식으로 구분하고 StringToKenizer는 문자로 구분한다.

StringToKenizer는 구분자가 한개만 있을 경우 사용 가능

String data1="홍길동&이수홍,박연수,김학생-허아린";
String[] names=data.split("&|,|-");
String data2="홍길동/첨판댁/박연수";
StringTokenizer st=new StringTokenizer(data,"/");

 

StringTockenize객체는

countTokens() = 분리할 수 있는 문자열 총 수

hasMoreTokens() = 남아 있는 문자열 있나 여부

nextTokens() = 문자열 하나씩 가져옴

를 사용하여 분리된 문자열을 얻을 수 있다.

<포장 클래스>

기본 타입 값을 가지는 객체를 포장 객체라고 한다.

각 기본타입에 대한 포장 클래스가 존재한다.

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

 

박싱과 언박싱

박싱 = 기본타입을 포장 객체로 만드는 것

언박싱=포장 객체에 기본 타입 값 얻어내는 과정

Integer obj1=new Integer(3);//불가능
Integer obj2=new Integer("3");//불가능
Integer obj3=3;//박싱
Integer obj4=Integer.parseInt("3");//박싱
Integer obj5=Integer.valueOf(3);//박싱
        
System.out.println(obj3.intValue()); //박싱된 것 출력
System.out.println(obj3); //언박싱
int value=obj3; //언박싱

 

-기본타입과 포장 비교

value1==obj9비교시 obj9는 정수 3 으로 언박싱되어 true를 출력한다.

int value1=3;
Integer obj9=3;
System.out.println(value1==obj9);

 

-추가 사용 예시

ex) 출력하기

public class BoxingUnBoxingExample 
{
	public static void main(String args[])
	{
		method(3.5);
		method(true);
	}
	
	public static void method(Object obj)
	{
		System.out.println(obj);
	}
}

 

ex) integer최대값

System.out.println(Integer.MAX_VALUE);

<수학 클래스>

수학계산에 사용하는 메소드

모두 static이라 Math클래스로 바로 사용 가능

절대값 int n=Math.abs(-5);   5
올림값 double n=Math.ceil(5.3); 6.0
버림값 double n=Math.floor(5.3); 5.0
최대값 int n=Math.max(1,10); 10
최소값 int n=Math.min(1,10); 1
랜덤값 double n=Math.random();
반올림값 long n=Math.round(5.3);

 

랜덤

//RANDOM
System.out.println(Math.random());//0<=x<1.0의 랜덤한 실수
System.out.println(Math.random()*6);//0<=x<6의 랜덤한 실수
System.out.println((int)(Math.random()*6));//0<=x<6의 랜덤한 정수

Random random=new Random();
System.out.println(random.nextInt());//정수 최소값~정수 최대값 사이의 랜덤한 정수
System.out.println(random.nextDouble());//0<=x<1.0의 랜덤한 실수
System.out.println(random.nextInt(6)+1);//1<=x<=6의 랜덤한 정수

System.out.println(random.nextBoolean());//랜덤 true false

<날짜와 시간 클래스>

Date 날짜 정보

Calendar 시간대별 날짜와 시간

LoadDateTime 날짜와 시간 조작,계산

 

1. Date

Date date=new Date();
System.out.println(date.toString());//그냥 출력

SimpleDateFormat sdf=new SimpleDateFormat("yyyy.MM.dd HH:mm.ss");
System.out.println(sdf.format(date));//원하는 형태로 출력

 

2. Calendar

하나하나의 날짜 정보

Calendar클래스는 달력을 표현하는 추상 클래스이다. 지역마다 날짜 계산법이 다르기 때문이다.

그렇기 때문에 new가 아니라 바로 객체를 얻어서 쓴다.

Calendar.getInstance를 하면 된다.

Calendar calendar=Calendar.getInstance();.
int year=calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH)+1;
int day=calendar.get(Calendar.DAY_OF_MONTH);
int week=calendar.get(Calendar.DAY_OF_WEEK);

다른 나라, 다른 시간대의 Calendar를 알고 싶다면

해당 시간대의 TimeZone객체를 얻어 getInstance에 넘겨주면된다

TimeZone timeZone=TimeZone.getTimeZone("America/Los_Angeles");
Calendar now=Calendar.getInstance(timeZone);

 

 

3. LocalDateTime

시간 조작, 시간 계산.

시간 조작

import java.time.format.DateTimeFormatter;

LocalDateTime now=LocalDateTime.now();
DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyy.MM.dd a HH:mm:ss");

System.out.println("현재시간="+now.format(dtf));

LocalDateTime result1=now.plusYears(1);
System.out.println("1년 덧셈"+result1.format(dtf));

LocalDateTime result2=now.minusMonths(2);
System.out.println("2월 뺄셈"+result2.format(dtf));

LocalDateTime result3=now.plusDays(7);
System.out.println("7일 덧셈"+result3.format(dtf));

시간 비교

public static void main(String[] args)
{
    DateTimeFormatter dtf=java.time.format.DateTimeFormatter.ofPattern("yyy.MM.dd a HH:mm::sss");
    
    LocalDateTime startDateTime=LocalDateTime.of(2021, 1,1,0,0,0);
    System.out.println("시작일="+startDateTime.format(dtf));

    LocalDateTime endDateTime=LocalDateTime.of(2021, 12,31,0,0,0);
    System.out.println("종료일="+endDateTime.format(dtf));

    if(startDateTime.isBefore(endDateTime))
    { System.out.println("진행중"); }
    else if(startDateTime.isEqual(endDateTime))
    { System.out.println("종료 합니다"); }
    else if(startDateTime.isAfter(endDateTime))
    { System.out.println("종료"); }

    long remainYear=startDateTime.until(endDateTime ,ChronoUnit.YEARS);
    long remainMonth=startDateTime.until(endDateTime,ChronoUnit.MONTHS);
    long remainHour=startDateTime.until(endDateTime,ChronoUnit.HOURS);
    long remainMinute=startDateTime.until(endDateTime,ChronoUnit.MINUTES);
    long remainSecond=startDateTime.until(endDateTime,ChronoUnit.SECONDS);
}

<정규 표현식 클래스>

문자열이 정해진 형식으로 구성되어 있는지 확인하는 것

ex) 이메일이나 전화번호가 제대로 입력되었는지

//전화 형식 확인
String regExp = "(02|010)-\\d{3,4}-\\d{4}";
String data = "010-123-4567";
boolean result = Pattern.matches(regExp, data);
if(result) { System.out.println("정규식과 일치합니다."); } 
else { System.out.println("정규식과 일치하지 않습니다."); }

//메일 형식 확인
regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
data = "angel@navercom";
result = Pattern.matches(regExp, data);
if(result) { System.out.println("정규식과 일치합니다."); } 
else { System.out.println("정규식과 일치하지 않습니다."); }

 

정규 표현식 작성

[ ] 한개의 문자

\d 한개의 숫자

\s 공백

\w 한개의 알파벳 혹은 한 개의 숫자

\. .

. 모든 문자 중 한개의 문자

? 없거나 한개

* 없거나 한개 이상

+ 한개 이상

{n} 정확히 n개

{n,} 최소 한개

{n,m} n~m개

a|b a또는 b

( ) 그룹핑

 

Pattern클래스로 검증

boolean result=Pattern.matches(정규식regExp, 검증할 문자열data);