JAVA

[JAVA] TreeSet / String , Calendar, Date 클래스의 메서드

sian han 2022. 3. 13. 16:26

※ TreeSet

 - TreeSet : Set 인터페이스를 구현하는 컬렉션 클래스 

                    ㄴ 핵심인터페이스 Set특징 : 순서유지 X , 중복저장 X

                                                         

 - TreeSet 은 데이터 정렬이 가능하다 => 유니코드 기준으로 정렬됨 ( 숫자 영어 한글 순 )

 

 

▷ TreeSet 생성하기 

TreeSet<Integer> tset = new TreeSet<Integer>();

 

▷ TreeSet 값넣기

tset.add(10);
tset.add(4);

=> 값을 아무렇게나 넣어도 유니코드 순서대로 정렬되어 출력된다

 

 

▷ 값읽어오기

- iterator 사용 : Set은 인덱스로 객체를 관리하지 않기 때문에 데이터를 검색하기 위해서는 iterator() 메서드로 Iterator(반복자)를 생성하고 데이터를 가져와야 한다. 

Iterator<Integer>iter = tset.iterator();
		while(iter.hasNext()){
			int n = iter.next();
			System.out.println(n);
		}




▶ TreeSet - Set 인터페이스 다형성 이용

Set<Integer>set = new TreeSet<Integer>();
while(set.size()<6) {
		int n = (int)(Math.random()*45+1);
		set.add(n);
		}
System.out.println(set); // toString 이 자동으로 호출되어 set 참조변수 안의 값을 보여줌

 

 

 

▶Comparable

  - 뭔지 모르겠음 구글링해도 모르겠음 이걸 이해하는날이 . . 올까 ? 

  - TreeSet에 저장하려면 Comparable<T>인터페이스 구현을 통해 정렬기준을 개발자가 직접 정의해야함

 

  ▷클래스 만들때

class Person implements Comparable<Person>{

  ▷클래스에 메서드 만들기

public String toString() {
		return "Person[]="+name+", age="+age+"]";
	}

	@Override
	public int compareTo(Person p) {
		// 정렬기준을 나이로 정하자
		if(this.age>p.age) {
		return 1; //매개변수 p의 나이가 작다면 양수반환
		}else if (this.age>p.age) {
			return -1;//음수
		}else {
			return 0; //
		}
	}

  ▷ main 에서 구현하기~ 

TreeSet<Person>tset = new TreeSet<Person>();
		tset.add(new Person("홍길동",20));// 실행에러
		//ClassCastException:Person cannot be cast to class Comparable
		
		tset.add(new Person("박길동",17));
		tset.add(new Person("김길동",31));
		//TreeSet<E>는 Person 인스턴스가 저장될 때마다 기존에저자오딘 인스턴스와의 비교를 위해서
		//compareTo()메서드를 빈번히 호출하여, 이때 반환되는 값을 기반으로 정렬을 진행
		
		Iterator<Person>iter = tset.iterator();
		while(iter.hasNext()) {
			Person p =iter.next();
			System.out.println(p);
		}

 


 

※ String 클래스의 메서드

 

▶indexOf()

     - 특정 문자가 있는 위치를 찾는 메서드
     - ★★★해당문자가 없으면 -1을 리턴 ! 

       - int 형식을 리턴해야하는 indexof 는 만약 문자열에 없는 값을 리턴하라고 하면 -1을 리턴한다. 
         (boolean 이아니기 때문에 false를 리턴하지 않음)

 

 ▷indexOf(String)

     - int (찾을 문자열이 시작하는 index 위치 ) = indexOf (찾을 문자열)

       => indexOf(String) 사용할 경우 String 에 입력한 문자열이 시작하는 위치의 index 값이 반환된다

String str = "Hello Java, Hi Java!";
int idx = str.indexOf("Java"); //6

 ▷ lastIndexOf(String)

   - indexOf 와 동일한 형식이나, 뒤에서부터 찾는다

int idx = str.lastIndexOf("Java"); //12

 ▷ indexOf(String, int)

   - int 만큼 건너뛰고 String 을 찾고, 그 String(문자열) 이 시작하는 위치(int) 를 리턴

 

 ▷ lastIndexOf(String,int)

   - 뒤에서 ``

 

 

  

 

▶substring()

  - 문자열의 일부를 추출할 때 사용

 

 

  ▷ substring(int)

    - String str = substring(int a)

       - 인자로 전달된 index를 기준으로 문자열을 자르고 String을 리턴

String str = "Hi guys. This is split example";
String result = str.substring(17); // split example

 

   ▷ substring(int a,int b)

     - a 부터 b 사이의 문자열 잘라서 리턴

     - 크거나같고 작은 사이의 문자열을 가져온다 !  ( a<= 문자열 <  b )

System.out.println(str.substring(6,10));

  => String sub = str.substring(6,10) // System.out.println(sub) ;

       대신

       변수에 넣지 않고 이렇게 바로 출력가능

 

 

▶ split ()

 - 특정 문자를 기준으로 문자열을 잘라서 배열에 넣어줌

 - 문자열을 여러 개의 토막으로 분리

 - String값을 특수기호로 끊어서 배열에 저장시켜줌

 - 문자열배열 = 대상문자열.split("기준문자");

String str = "java,oracle,jsp,spring";
String[]arr = str.split(","); // ,기준으로 split 해서 새로운 배열을 만들어 넣어줌
for(String s3:arr) {
			System.out.println(s3);
		}

 - String[] arr = {java, oracle, jsp, spring};

   이렇게 하나의 배열이 만들어진거임 !

 

 

 

▶ ~with()

  - boolean

 

 

  ▷ startsWith()

     - startsWith(String)

     - String 으로 시작한다면 true 

 

  ▷ endsWith()

     - endsWith(String)

     - String 을 끝난다면 true 

String s = "www.nate.com";
		if(s.startsWith("www")) {
			System.out.println("www로 시작함");
		}if(s.endsWith(".com")) {
			System.out.println(".com 으로 끝남");
		}

 

  

▶ trim()

    - 문자열공백제거메서드

String s="        java   spring!!        ";
String s2=s.trim();

 

▶ valueOf()

   - 모든자료형을 String 으로 변환해줌

   - 클래스명 . 으로 사용 ( String 클래스 )

int x =10, y=30;
String val = String.valueOf(x);
System.out.println(val + y); // 1030

  = > valueOf 를 사용안했을때 x + y 는 40 이지만

        valueOf 를 통해 x = val 로 String 으로 변환했기때문에 1030이 출력됨

 

 

 

▶ replace () 

   - 문자열 치환함수

 

  ▷ replace (Char oldChar, char newChar)

       =>oldChar 를 newChar 로 변경해라

String a = "무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세 ";	
a= a.replace("대한", "민국");	
System.out.println(a); // 무궁화 삼천리 화려강산 민국사람 민국으로 길이 보전하세

 oldChar "대한" 이 newChar "민국" 으로 치환됨

 

 

  ▷ replace (Char oldChar, char newChar)

       =>첫번재 oldChar 만 newChar 로 변경해라

a= a.replaceFirst("대한", "민국");//무궁화 삼천리 화려강산 민국사람 대한으로 길이 보전하세

 

 

 


 

 

※ Calendar 클래스의 메서드

  - Calendar 클래스는 추상클래스이기때문에 객체생성이 불가하다.

    - 따라서 (1) 자식 클래스인 GregorianCalendar를 이용하거나

      (2) getInstance 를 사용하여 객체생성한다 

  - 메서드들은 모두 static 이라서 클래스명 . 으로 사용

Calendar cal = Calendar.getInstance();
Calendar cal2 = new GregorianCalendar();

 

 

▷ today 년, 월, 일 값 받아오기

int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int date = cal.get(Calendar.DATE);

  - ▽ 이런식으로 today 년월일 구하는 메서드로 만들어서 사용할 수 있다

public static String showDate(Calendar cal) {
	return	cal.get(Calendar.YEAR)+"년"+(cal.get(Calendar.MONTH)+1)+"월"+cal.get(Calendar.DATE);
	}
    
    
main () 
System.out.println("현재일자:"+showDate(today));

 

▷ add

   - 날짜 더하기

Calendar today = Calendar.getInstance();
today.add(Calendar.DATE, 100); //100일후
today.add(Calendar.MONTH, -3); // 3달전
today.add(Calendar.YEAR, 7);  // 7년후

 

 

▷ today 요일 받아오기

int week = cal.get(Calendar.DAY_OF_WEEK);
String[] arr = {"","일","월","화","수","목","금","토"}; 
System.out.println("요일:"+arr[week]);

 - Day_Of_Week : 1 = 일 , 2 = 월 . . . 순서 

 - Day_Of_Week 에 0 값은 없기 때문에 arr 첫번째 값을 비워둔다

 

 

 

▶ getTimeInMillis()

  - 두 날짜간 차이 구할 때 사용

  - 이 메서드는 이 달력의 현재 시간을 밀리초 단위로 반환함

     따라서 자료형 long 으로 받아주깅

  - 1/1000 천분의 일초 단위까지 반환해줌. (밀리초)

     따라서 천분의일초 => 초단위 => 일단위로 변환 해야지 두 날짜간 일 차이를 구할 수 있다

long gap = cal.getTimeInMillis()/1000;
gap = gap/(24*60*60);

 


 

 

※ Date 클래스의 메서드

  - 추상클래스가 아니기때문에 객체생성해서 참조변수 . 으로 Date 클래스의 메서드 사용하면 됨

Date d = new Date();
System.out.println(d); //Sun Mar 13 15:40:18 KST 2022

 - Date 객체생성해서 냅다 참조변수 불러오면 

   오늘 날짜정보가 위와같이 출력된다

 

 

 

toLocaleString()

 - d로 불러왔던 날짜정보를 로컬로 간단하게 바꿔줌

System.out.println(d.toLocaleString()); // 2022. 3. 13. 오후 3:40:18

 

 

getYear() , getMonth()

  - d 년도를 가져옴 / d 달을 가져옴

  - year : +1900 해서 print 해줘야함

    month : +1 해서 print  해줘야 함

int year = d.getYear();
System.out.println((year+1900) +"년"); // 2022년
System.out.println(d.getMonth()+1+"월"); // 3월

 

 

▶ Date 이용하여 두 날짜 사이의 간격 구하기

 

 1. 두 날짜 설정

Date d = new Date(); //오늘
Date d2 = new Date(2022-1900,11,25); // 2022년 크리스마스

  - 월 입력할땐 항상 한개 빼주기 (12월 출력하고싶으면 11입력)

 

 

 2. getTime 이용하여 빼주기 ( = Calendar 클래스의 getTimeInMillis() 과 동일한 성질 )

long gap = (d2.getTime()-d.getTime())/1000;
gap = gap/(24*60*60); // 밀리초 => 일 로 변환하는 과정

 

 3. 결과 출력

System.out.println("두 날짜 사이의 간격:"+gap+"일");

 

 


※ Calendar <=> Date

 

[1] ★자주씀 Calendar를 Date로 변환

Calendar cal =Calendar.getInstance();
		cal.set(2022,5,10); //
        
Date d = cal.getTime();
		System.out.println(d.toLocaleString());

 

[2] Date를 Calendar로 변환

Date date = new Date(2022-1900,7,23); // 2022-08-23
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(date);
		
		System.out.println("\n"+CalanderTest2.showDate(cal2));