본문 바로가기
공부/java

14일차 복습

by 샤샤샤샤 2022. 12. 1.

날짜와 시간

Date, Calendar, SimpleDateFormat, LocalDate,  LocalTime

 

1. Date클래스 - SimpleDateFormat

내부 라이브러리에서 import해서 사용해야 한다.

date: os로부터 정보를 가져온다. 현재 시간을 가져온다.

import java.util.Date;

public class ex43 {
    public static void main(String[] args) {
      Date date = new Date();
        System.out.println(date);
    }
}

결과 : Thu Dec 01 20:28:02 KST 2022

요일, 월, 일, 시간, 분, 초, 지역, 년도  순으로 나열되어 나온다.

그러나 이는 상당히 보기 불편한데다 원하는 부분만 추출이 안된다. 이를 위해 만들어진 클래스가 바로 Simple DateFormat 이다. 직관적인 이름처럼 원하는 형식으로 시간을 출력할 수 있다.

사용하는 방식은 다음과 같다.

SimpleDateFormat 객체 이름 = new SimpleDateFormat("원하는 출력 형식");
String 변수 이름 = 객체 이름.format ( new Date() );
System.out.println( 변수 이름);
import java.text.SimpleDateFormat;
import java.util.Date;

public class ex43 {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
        String dateFormat = sdf.format( new Date() );
        System.out.println(dateFormat);
        SimpleDateFormat sdf2 =
                new SimpleDateFormat("a hh:mm:ss");
        String dateFormat2 = sdf2.format( new Date() );
        System.out.println( dateFormat2 );
    }
}           출력값:2022년 12월 01일
                   오후 08:45:06

만약 년도만 출력하고 싶다면 뒤의 글자를 지우면 된다. 마찬가지로 월이나 일, 시간면 표현하고 싶으면 해당하는 foramt 형식만 적으면 된다. 아래를 참조하자.

   날짜시간을 형식포맷에 맞춰서 출력하기
   
 SimpleDateFormat : 날짜시간 포맷을 정해주는 클래스
 yyyy : year
 MM : month
 dd : day on month
 HH : hour 24시간제
 hh : hour 12시간제     a : "AM" 또는 "PM"
 mm : minute
 ss : second
 SS : milli second

참고로 타임스탬프 역시 가져올수 있다. 이는 1970년 1월 1일부터 지금까지 카운트하고 있는 정수의 나열로, 이를 이용해서 현재 시간을 구하고 싶으면 1000*60*60*24로 나눠야만 한다.

long stamp = date.getTime();
System.out.println(stamp);
 
 출력값: 1669895929103

 

 

중간 중간 글자를 넣거나 자동적으로 한글로 오전/오후를 나타내주는 것은 편하지만, 출력이 상당히 귀찮다. 원하는 출력형식을 지정할 수 있다는 것은 분명 강력한 기능이지만, 이를 위해서 클래스 객체를 만들고 변수 객체도 만들어서 그 변수에 함수를 넣고, 또 그 함수의 매개변수로 Date 객체를 넣고..... 코드 역시 어마어마하게 길어지진다.

 

2. Calendar 클래스

Date클래스의 약한 기능을 보완하기 위해 나온 것이 Calendar클래스다. 이는 내부적으로 달력을 가지고 있어 날짜간의 계산이나 덧셈, 뺄셈도 가능하다.

그러나 이 역시 Date를 쓰기 위해 SimpleDateFormat을 가져왔듯, GregorianCalendar클래스가 추가로 있어야 편하게 사용 가능하다. 양력 달력을 가지고 있는 클래스로, 국가 표준시도 변경할 수 있다.

 

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

public class ex43 {
    public static void main(String[] args) {
        Calendar cal = new GregorianCalendar(Locale.KOREA);//Calendar을 상속한 GregorianCalendar
        System.out.println(cal.getTime());
    } 
}          출력값:Thu Dec 01 21:01:50 KST 2022

Date에 비해 코드가 아주 간결해진다.

Date의 getTime() 함수처럼 이곳에도 밀리초단위로 타임스탬프를 얻어올수 있다.

System.out.println( cal.getTimeInMills() );
출력값: 1669896318783

아래는 년도, 월, 일, 시간 등을 각각 얻어오기 위한 함수 이름들이다.

모두 Calendar 객체.get( Calendar.원하는 시간 ) 형식으로 작성해야만 한다.

예시)

 int year = cal.get(Calendar.YEAR);
 System.out.println( year );
 
출력값 : 2022

아래는 이를 위한 static 변수 이름들이다.

 

YEAR : 년

MONTH :월

DAY_OF_MONTH : 한달중 몇일인가?

DAY_OF_WEEK : 어떤 요일인가?      1=일요일, 2=월요일, 3=수요일.... 7=토요일

WEEK_OF_YEAR : 1년의 몇주차인가

WEEK_OF_MONTH : 한달의 몇주차인가

HOUR : 12시간제

HOUR_OF_DAY : 24시간제

MINUTE : 분

SECOND : 초

MILLISECOND : 밀리초

 

여기서 주의할 것은 Month다.

아래의 출력값을 보자.

System.out.println( cal.get(Calendar.MONTH ));

출력값은 11이다.

여기서 보다시피 달만 유일하게 0부터 센다. 헷갈릴수 있으니 주의하자.

시간을 더하고 빼는 것은 add를 이용하면 된다.

cal.add( Calendar.HOUR, 10 );
System.out.println(cal.get(Calendar.HOUR));  출력값: 7
cal.add( Calendar.HOUR, -10 );
System.out.println(cal.get(Calendar.HOUR));  출력값: 11  - 12시간제

 시간끼리 더하고 빼기 위해서는 문자형이 아닌 정수형, 즉, 타임스탬프로 계산해야만 한다.

그 결과에 24*60*60*1000으로 나누면 원하는 결과가 나온다.

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class ex109 {
    public static void main(String[] args) {
        //연습문제 56
        // 두날짜 사이의 차이를 구하기(D-Day)
        // 12월25일에 크리스마스 이벤트를 시작한다.
        // 현재날짜 기준으로 D-Day를 출력하시오.
        // 출력예) "크리스마스까지 D-24일입니다"
        // 힌트) long 시간차_타임스탬프값 = 타임스탬프값1 - 타임스탬프값2
        //      타임스탬프값(밀리초)를 Day단위로 바꾸면 날짜가 나옴.
        //     현재시간 캘린더 객체 : startCal.setTime( new Date() );
        //     목표시간 캘린더 객체 : endCal.set(2022,11,25);
        Calendar startCal = new GregorianCalendar(Locale.KOREA);
        Calendar endCal = new GregorianCalendar(Locale.KOREA);
        startCal.setTime( new Date() ); //현재시간을 캘린더 설정
        //                     11은 12월이다.
        endCal.set( 2022, 11, 25);
        //두 날짜시간 사이의 정수값을 계산한다.
        long diff = endCal.getTimeInMillis() - startCal.getTimeInMillis();
        long diffDays = diff / ( 24 * 60 * 60 * 1000 );
        System.out.println( "날짜 차이는 " + diffDays +"일입니다.");
        System.out.println( "크리스마스까지의 D-" + diffDays+"일입니다.");
    }
}

setTime(): 원하는 날짜, 시간으로 객체에 저장된 시간 변수를 변경하기 위한 함수

set(): 원하는 날짜로 객체에 저장된 변수를 바꾸기 위한 함수

import java.text.SimpleDateFormat;
import java.util.Date;

public class ex107 {
    public static void main(String[] args) {
        //날짜와 시간 관련된 클래스
        //Date, Calendar 클래스 사용

        //인간이 살아가는 주배경
        //1. 시간 - 년월일시분초밀리초, 정수값(timestamp 1970-1-1 0:0:0)
        //         2022년11월30일16시10분5초023초
        //2. 장소 - 행정주소(서울시 마포구 신촌동), GPS좌표(위도,경도 double값)

        //현재시간을 운영체제(OS - 윈도우즈10 home)에서 가져온다.
        Date date = new Date();
        System.out.println( date );

        //타임스탬프 정수값
        long timestamp = date.getTime();
        System.out.println( "타임스탬프:" + timestamp);

        //날짜시간을 형식포맷에 맞춰서 출력하기
        //SimpleDateFormat : 날짜시간 포맷을 정해주는 클래스
        // yyyy : year
        // MM : month
        // dd : day on month
        // HH : hour 24시간제
        // hh : hour 12시간제   a : "AM" 또는 "PM"
        // mm : minute
        // ss : second
        // SS : milli second
        SimpleDateFormat sdf =
                new SimpleDateFormat("yyyy년 MM월 dd일");
        String dateFormat = sdf.format( new Date() );
        System.out.println( dateFormat );

        SimpleDateFormat sdf2 =
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateFormat2 = sdf2.format( new Date() );
        System.out.println( dateFormat2 );

        SimpleDateFormat sdf3 =
                new SimpleDateFormat("yyyy-MM-dd a hh:mm:ss");
        String dateFormat3 = sdf3.format( new Date() );
        System.out.println( dateFormat3 );
    }
}
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

public class ex108 {
    public static void main(String[] args) {
        //날짜와 시간 클래스
        // 1. Date : 약한 수준의 기능 제공
        // 2. Calendar : 높은 수준의 기능 제공
        //             : 내부적으로 달력을 가지고 있음.
        //             (윤년, 1년 12달 356일의 데이타를 포함)
        // 윤년 : 4년마다 2월의 하루를 증가시킨다.
        //     : 지구의 공전주기 약 365.2422일

        //양력 달력 : 그레고리안 달력
        //한국시간 = 국제표준시(GMT) + 9시간
        //국제표준시(GMT) : 영국 그리니치천문대 0시
        //한국표준시(KST) : GMT + 9시간
        Calendar cal = new GregorianCalendar(Locale.KOREA);
        //캘린더에서 Date 객체 가져오기
        System.out.println( cal.getTime() );
        //타임스탬프 정수값 출력 : 1970-01-01부터 증가하는 정수값
        System.out.println( cal.getTimeInMillis() );

        //년도
        // Calendar.YEAR : static final 상수
        int year = cal.get(Calendar.YEAR);
        System.out.println( year );
        //달 : 1월은 0이다. 2월 1이다. 주의!!
        int month = cal.get(Calendar.MONTH);
        System.out.println( (month + 1)+"월" );
        //일
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println( dayOfMonth );
        //요일
        //1 일요일, 2 월, 3 화, 4 수, 5 목, 6 금, 7 토
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        System.out.println( dayOfWeek );
        //올해의 몇주차인가?
        int weekOfYear = cal.get(Calendar.WEEK_OF_YEAR);
        System.out.println( weekOfYear );
        //이달의 몇주차인가?
        int weekOfMonth = cal.get(Calendar.WEEK_OF_MONTH);
        System.out.println( weekOfMonth );
        //시 : 12시간제
        int hour = cal.get(Calendar.HOUR);
        //시 : 24시간제
        int hourOfDay = cal.get(Calendar.HOUR_OF_DAY);
        int minute = cal.get(Calendar.MINUTE);
        int second = cal.get(Calendar.SECOND);
        int millisecond = cal.get(Calendar.MILLISECOND);
        System.out.println( hour );
        System.out.println( hourOfDay );
        System.out.println( minute );
        System.out.println( second );
        System.out.println( millisecond );

        //전후 시간 구하기
        // 예) 1년후 무료회원 마감일 구하기
        // 10시간 후
        cal.add( Calendar.HOUR, 10 );
        echoTime( cal );
        // 10시간 전
        cal.add( Calendar.HOUR, -20 );
        echoTime( cal );
        // 한달 후
        cal.add( Calendar.MONTH, 1 );
        echoTime( cal );
        // 일년 후
        cal.add( Calendar.YEAR, 1 );
        echoTime( cal );
    }//main

    static void echoTime( Calendar cal ) {
        SimpleDateFormat sdf =
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strTime = sdf.format( cal.getTime() );
        System.out.println( strTime );
    }

}//class

https://junghn.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94-%EB%82%A0%EC%A7%9C-%ED%8F%AC%EB%A7%B7-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95SimpleDateFormat-yyyyMMdd

참조링크)

 

[JAVA] 자바 날짜 포맷 변경 방법(SimpleDateFormat) yyyyMMdd

Date클래스를 이용하여 현재 날짜를 출력하면 영문으로 된 날짜를 리턴한다. 특정 문자열 포맷으로 얻고 싶으면 java.text.SimpleDateFormat 클래스를 이용하면 된다. 다음은 오늘 날짜를 yyyy 년 MM월 dd일

junghn.tistory.com

 

Calendar클래스의 Month문제와 더불어 여러가지 불편한 점을 개선한 새로운 클래스가 존재한다.

LocalDate, LocalTime이 바로 그것이다.

 

 

3. LocalDate, LocaTime

이 두 함수는 다소 특이하게 사용한다.

Date나 Calendar과는 달리, 클래스 자체를 변수 선언해서 사용이 불가능하다.

각각 함수마다 새로운 객체를 만들어줘야 사용할수 있다.

LocalDate)

ex)

import java.time.LocalDate;

public class ex43 {
    public static void main(String[] args) {
        LocalDate now = LocalDate.now();
        System.out.println(now);
    }
}          출력값: 2022-12-01

아래는 함수들을 정리해둔 것이다.

 

of() : 날짜 설정하기

 LocalDate birthDay = LocalDate.of(2000,12,1);
 System.out.println( birthDay );

parse() : 문자열로 날짜 설정하기

        LocalDate xmas = LocalDate.parse("2022-12-25");
        System.out.println( xmas );

LocalTime)

now(): 현재시간 받아오기

LocalTime nowTime = LocalTime.now();
System.out.println( nowTime );

of() : 시간 설정하기

LocalTime sleepTime = LocalTime.of(23, 30, 0);
System.out.println( sleepTime );// 시  분  초

plusHours() : 시간 더하기. 1시간 단위

LocalTime getUpTime = sleepTime.plusHours( 8 );
System.out.println( getUpTime );

minusHours() : 시간 빼기. 1시간 단위

LocalTime inHouseTime = sleepTime.minusHours( 5 );
System.out.println( inHouseTime );

ZoneId.of() : 세계시간 구하기. 미리 정해진 문자열형을 받는다. ex) "Europe/Paris"   파리의 시간

        LocalTime inHouseTime = sleepTime.minusHours( 5 );
        System.out.println( inHouseTime );

 

이 둘을 합친 LocalDateTime역시 존재한다.

LocalDateTime dateTime = LocalDateTime.now();
객체 생성   
System.out.println( dateTime );
밀리초 아래까지 현재시간 출력      2022-12-01T12:06:06.391847500  시간을 나타내는 T가 있다.
System.out.println( dateTime.getYear() );
현재 년도
System.out.println( dateTime.getMonth() ); 
달이름 출력 : DECEMBER
System.out.println( dateTime.getMonthValue() );
달 출력
System.out.println( dateTime.getDayOfMonth() );
1달중 몇일인지 출력
System.out.println( dateTime.getHour() );
시간 출력

이 클래스 역시 of()함수로 시간을 설정한다. 밀리초까지 설정 가능하지만, 원하는 곳까지만 설정해도 상관없다.

 

parse() : 이것 역시 문자열로 시간을 설정할수 있다. 그러나 날짜와 시간을 구분하는 T가 반드시 필요하다.

              밀리초는 생략해도 상관없다.

 LocalDateTime now2 = LocalDateTime.parse("2022-12-01T12:06:06");
 System.out.println( now2 );  결과: 2022-12-01T12:06:06

함수 연결해서 시간 설정하기

(첫 시간).of( 원하는 시간 ). at ~  형식으로 지정한다.

아래를 보자.

        LocalDateTime now3 = Year.of(2022).atMonth(12)
                .atDay(1).atTime(12, 12, 12);
        System.out.println( now3 );           출력값:2022-12-01T12:12:12
import javax.security.auth.callback.LanguageCallback;
import java.time.*;

public class ex110 {
    public static void main(String[] args) {
        //LocalDate, LocalTime, LocalDateTime
        //JDK 1.8부터 지원, 타임존 개념이 없는 단순 날짜/시간 정보 출력
        //오픈소스인 JodaTime클래스를 본따서 만듦.
        //최신 트렌드는 Date보다는 LocalDate, LocalDateTime을 사용한다.

        //Date,Calender의 단점
        //1. get/set함수로 인해서 값이 중간에 변경될 수 있다.
        //2. 1월을 0으로 표현하는 문제
        //3. 년/월/일 계산은 Date로만 안되고 Calendar를 사용해야 됨.

        //LocalDate
        LocalDate now = LocalDate.now(); //현재시간 얻어오기
        System.out.println( now ); //2022-12-01
        //날짜 설정하기
        LocalDate birthDay = LocalDate.of(2000,12,1);
        System.out.println( birthDay );
        //문자열로부터 날짜 설정하기
        LocalDate xmas = LocalDate.parse("2022-12-25");
        System.out.println( xmas );
        //"2022/12/25" "20221225" "2022 12 25" "2022:12:25" 안됨.

        //LocalTime
        LocalTime nowTime = LocalTime.now();
        System.out.println( nowTime );//11:59:02.475245400
        //세계시간-프랑스파리
        LocalTime parisTime = LocalTime.now(ZoneId.of("Europe/Paris"));
        System.out.println( parisTime );
        //시간 설정하기
        LocalTime sleepTime = LocalTime.of(23, 30, 0);
        System.out.println( sleepTime );
        //시간 더하기/빼기
        LocalTime getUpTime = sleepTime.plusHours( 8 );
        System.out.println( getUpTime );
        LocalTime inHouseTime = sleepTime.minusHours( 5 );
        System.out.println( inHouseTime );

        //LocalDateTime
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println( dateTime );//2022-12-01T12:06:06.391847500
        System.out.println( dateTime.getYear() );
        System.out.println( dateTime.getMonth() ); //달 이름
        System.out.println( dateTime.getMonthValue() );//달 숫자 : 1부터 시작
        System.out.println( dateTime.getDayOfMonth() );
        System.out.println( dateTime.getHour() );
        //날짜시간 설정하기
        LocalDateTime y2k = LocalDateTime.of(1999, 12,
                31, 23, 59, 29, 999);
        System.out.println( y2k );
        //문자열에서 날짜시간 가져오기
        LocalDateTime now2 = LocalDateTime.parse("2022-12-01T12:06:06.391847500");
        System.out.println( now2 );
        now2 = LocalDateTime.parse("2022-12-01T12:06:06");
        System.out.println( now2 );
        //함수 연결하여 날짜시간 설정하기
        LocalDateTime now3 = Year.of(2022).atMonth(12)
                              .atDay(1).atTime(12, 01, 05);
        System.out.println( now3 );

        //  클래스 필드            오라클 DB 필드   MySQL(MariaDB)
        //    String                varchar2     varchar
        //      int long             number      INT
        //     float double          float       FLOAT
        //     Date                  date        DATE/DATETIME
        //    LocalDate,LocalTime    date        DATE/DATETIME
        //                           CLOB x
        //                           BLOB x

    }
}

 

 

Optional클래스

null값 체크를 위해 사용하는 클래스. null로 인한 오류 발생을 줄이고자 만들어졌다.

다만 이는 상당히 수준급의 실력자들을 위한 클래스로, 나와 같은 초보자들은 애초에 null로 인한 오류가 발생하지 않는게 맞다고 생각한다. 나같은 수준의 사람들은 애초에 쓸 일이 있을까 싶어 그냥 정리만 남긴다.

import java.util.Optional;

public class ex111 {
    public static void main(String[] args) {
        //Optional 클래스
        //   : JDK 1.8부터 지원
        //   : 널값 체크을 위해 사용
        //   : NullPointException 발생 빈도를 줄여주고자 만들어짐.
        String nullValue = null;
        //System.out.println( nullValue.toLowerCase() ); //NullPointException 발생!

        //기존의 널체크 방법
        if( nullValue != null ){
            System.out.println( nullValue.toLowerCase() );
        }

        //ofNullable 함수 : 널값일 수 있는 값을 입력한다.
        Optional optional1 = Optional.ofNullable( nullValue );
        //널인지 아닌지 true/false로 반환
        System.out.println( optional1.isPresent() );
        //값이 비어있는지 true/false로 반환
        System.out.println( optional1.isEmpty() );
        if( optional1.isPresent() ){
            System.out.println( optional1.get() );
        }

        String normalValue = "abc";
        Optional optional2 = Optional.ofNullable( normalValue );
        System.out.println( optional2.isPresent() );
        if( optional2.isPresent() ){
            System.out.println( optional2.get() );
        }

        //of() 함수 : 절대 null이 아닌 값으로 초기화할 때
        Optional optional3 = Optional.of( normalValue );
        System.out.println( optional3.isPresent() );
        if( optional3.isPresent() ){
            System.out.println( optional3.get() );
        }

        //orElse() 함수 : null경우 대체 값을 설정한다.
        String strResult = Optional.ofNullable(nullValue)
                .orElse("Null이군요.");
        System.out.println( strResult );

        //filter() 함수
        //  : 람다식이 true이면 Optional객체값이 그대로 전달되고,
        //    false이면, orElse에 정의된 값이 전달된다.
        String strResult2 = Optional.ofNullable(normalValue)
                .filter(/*람다식-코드뭉치*/ (val) -> val.contains("abc123"))
                .orElse("abc값 없네요.");
        System.out.println( strResult2 );

        //map() 함수
        // String::toUpperCase : 람다식의 간결한 표현
        String strResult3 = Optional.ofNullable(normalValue)
                .map(String::toUpperCase)
                .orElse("대문자로 변환이 실패하였습니다.");
        System.out.println( strResult3 );

    }
}

 

 

리스트(List)

본래는 없는 데이터 구조이기에 따로 import를 해야한다.

배열과 비슷한 데이터 구조이지만, 배열과는 달리 크기 설정을 하지 않아도 가변적으로 크기가 늘어나거나 줄어든다. 또한 인덱스가 존재하고, 문자열형, 숫자형을 넣을 수 있다.

따라서 추가 / 삭제가 간편하지만, 반대로 검색이 비효율적이고 구현이 복잡하다는 단점이 존재한다.

 

ArrayList로 선언한다.

        ArrayList a = new ArrayList<>();

이대로 선언해도 문제될 부분이 전혀 없으나, 이렇게 선언하면 a가 문자열형을 받는지, int형을 받는지 전혀 판단이 불가능하다. 그래서 제네릭이 사용 가능하다.

        ArrayList<Integer> a = new ArrayList<>();

리스트는 int나 double 처럼 형식으로 나타내지 않고, Integer, Double 와 같은 래핑 클래스로 나타낸다.

 

리스트는 add()와 같은 함수로 item을 더할수 있다. 어떤 인덱스도 적지 않고 그냥 더하고 싶은 변수만 적으면 맨 뒤로 가지만 add(1 , "엄마") 와 같이 쓰면 인덱스 2번 자리에 "엄마"라는 변수가 들어가게 된다.

import java.util.ArrayList;

public class ex43 {
    public static void main(String[] args) {
        ArrayList<String> family = new ArrayList<>();
        family.add("아빠");
        family.add("누나");
        family.add("동생");
        family.add("나");
        System.out.println(family);            출력값: [아빠, 누나, 동생, 나]
        family.add(1, "엄마");
        System.out.println(family);            출력값: [아빠, 엄마, 누나, 동생, 나]
            }
        }

정렬을 위해서는 Collectios 클래스가 필요하다.

따로 import해야 하나 가독성을 위해 여기서는 짧막한 코드만 쓰겠다.

        Collections.sort(family);
        System.out.println(family);   출력값: [나, 누나, 동생, 아빠, 엄마]

한글은 가나다순, 영어는 알파벳순, 숫자는 작은숫자 순으로 정렬된다.

역정렬은 배열의 역정렬과 매우 비슷하다.

        Collections.sort(family, Collections.reverseOrder());
        System.out.println(family);
        출력값 :[엄마, 아빠, 동생, 누나, 나]

삭제는 remove() 함수로 가능하다.

이때 매개변수 값은 인덱스와 리터럴 둘 다 가능하다.

        family.remove("누나");
        family.remove(3);
        System.out.println(family); 결과값 :[엄마, 아빠, 동생]

set() 함수는 데이터 치환을 위한 함수다. 이때, 바뀔 데이터는 오직 인덱스로만 표현 가능하다.

        family.set(2, "애완동물");
        System.out.println(family);      출력: [엄마, 아빠, 애완동물]

clear()로 모두 지워버릴수도 있다.

       family.clear();
        System.out.println(family);   결과:[]

ArrayList 는 가변적이여서 배열처럼 용량을 지정해주지 않아도 된다(지정해줄수도 있긴 하다.) 또 다른 리스트로 초기화하는 것도 가능하다.

```java
import java.util.ArrayList;
import java.util.Arrays;

public class ex113 {
    public static void main(String[] args) {
        //ArrayList 사용 예
        //ArrayList는 가변용량 - 넣은 만큼 추가됨.

        ArrayList<Integer> nums1 = new ArrayList<Integer>();//타입명시
        ArrayList<Integer> nums2 = new ArrayList<>(); //타입생략
        ArrayList<Integer> nums3 = new ArrayList<>(10);//10개 공간
        //다른 리스트로 초기화
        ArrayList<Integer> nums4 = new ArrayList<>( nums1 );
        //선언과 동시에 초기화
        ArrayList<Integer> nums5 = new ArrayList<>(
                Arrays.asList(10,20,30,40,50)

    }
}

Arrays.asList (): 리스트에 값을 넣기 위한 함수

 

ArrayList 순환

리스트 역시 인덱스 번호를 가지고 있는 만큼, for문을 이요해서 순환할 수 있다. 하지만 배열처럼 인덱스 번호를 통해 바로 값을 얻어올수 없기 때문에, get()함수가 필요하다.

        //일반 for문
        for(int i=0; i<nums5.size(); i++){
            System.out.println( nums5.get( i ) ); 
        }  리스트.get() 함수

향상된 for문은 따로 함수를 쓸 필요가 없다.

        //향상된 for문
        for( Integer num : nums5 ){
            System.out.println( num );
            }     get()함수를 사용하지 않아도 자체적으로 item을 num에 넣음

그 외에도 아래와 같은 함수가 존재한다.

indexOf() : 특정 item의 인덱스 번호 알아오기

contains() : 해당 값을 가지고 있는지 확인

hasNext() : 다음 요소가 있는지 없는지 판별. true/fals로 나타냄.

next(): 다음 요소값을 반환하고 카운터++을 수행.

 

이터레이터(Iterator) 열거자

for문과 같은 역할. 순차적인 진행을 도와줌.

   Iterator<Integer> it = nums5.iterator();
        while( it.hasNext() ) {  //인덱스 -1에서 시작. 다음 인덱스에 값이 존재하면 true.
            System.out.println( it.next() );  // 다음 요소값을 반환함
            }
import java.util.ArrayList;
import java.util.Collections;

public class ex112 {
    public static void main(String[] args) {
        //데이타를 담는 그릇 - 데이타구조
        //1.변수 : 단 하나의 값(숫자,문자열,논리)
        //2.배열 : 인덱스가 있는 연속된 공간에 담음.
        //3.리스트 : 인덱스가 있는 연속된 공간
        //          추가/삭제가 간편하다.
        //          제네릭(가변타입)이 가능.
        //4.맵 : Key-Value 형태의 데이타. 순서없음.
        //5.세트 : 집합구조의 데이타(중복없음). 순서없음.

        // 콜렉션 프레임워크 : List, Map, Set
        //1. 리스트(List)
        //   List 인터페이스를 구현해서 ArrayList(일반), LinkedList(알고리즘기반) 클래스
        //  ArrayList : 순차적으로 데이타가 나열되어 있다. 순차적인 데이타에 대한 접근속도가 빠름.
        //  LinkedList : 다음 요소의 주소값을 이전 요소가 가지고 있다. 흩어져있는 데이타에 대한 접근속도가 빠름.
        //2. 맵(Map)
        //   Map 인터페이스를 구현해서 HashMap클래스 사용
        //3. 집합(Set)
        //   Set 인터페이스를 구현해서 HashSet클래스 사용
        //해쉬(HashCode) : 내부데이타간의 연결을 위한 유일한 키(정수)

        //ArrayList
        ArrayList<String> fruits = new ArrayList<>();
        System.out.println( fruits );//[]
        //아이템을 뒤로 추가 add()
        fruits.add("수박");
        System.out.println( fruits );
        fruits.add("망고");
        System.out.println( fruits );
        fruits.add("딸기");
        System.out.println( fruits );

        //맨앞에 추가
        fruits.add(0, "레몬");
        System.out.println( fruits );
        //중간에 추가
        fruits.add(1, "사과");
        System.out.println( fruits );
        //삭제
        fruits.remove( 1 );
        System.out.println( fruits );
        //오름차순 정렬
        Collections.sort( fruits );
        System.out.println( fruits );
        //내림차순 정렬
        Collections.sort( fruits, Collections.reverseOrder());
        System.out.println( fruits );
        //리스트 길이
        System.out.println( fruits.size() );
        //데이타 변경/치환
        fruits.set( 1, "복숭아");
        System.out.println( fruits );
        //전체 지우기
        fruits.clear();
        System.out.println( fruits );

        //연습문제 57
        //1.names라는 arrayList를 만들고
        //2."홍길동", "사임당", "이순신", "변사또" 추가하고,
        //3.맨앞에 "춘향이" 추가하고
        //4."사임당"삭제하고
        //5.arrayList 갯수 size()함수를 이용하여 출력하고
        //6."홍길동"을 "제임스"로 변경하시오. set함수
        //7.오름차순 정렬하시오.
        //8.내림차순 정렬하시오.
        ArrayList<String> names = new ArrayList<>();
        names.add("홍길동");
        names.add("사임당");
        names.add("이순신");
        names.add("변사또");
        System.out.println( names );
        names.add(0,"춘향이");
        System.out.println( names );
        names.remove(2);
        System.out.println( names );
        System.out.println( names.size() );
        System.out.println( names );
        names.set(1, "제임스");
        System.out.println( names );
        Collections.sort( names );
        System.out.println( names );
        Collections.sort( names, Collections.reverseOrder() );
        System.out.println( names );
    }
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class ex113 {
    public static void main(String[] args) {
        //ArrayList 사용 예
        //ArrayList는 가변용량 - 넣은 만큼 추가됨.

        ArrayList<Integer> nums1 = new ArrayList<Integer>();//타입명시
        ArrayList<Integer> nums2 = new ArrayList<>(); //타입생략
        ArrayList<Integer> nums3 = new ArrayList<>(10);//10개 공간
        //다른 리스트로 초기화
        ArrayList<Integer> nums4 = new ArrayList<>( nums1 );
        //선언과 동시에 초기화
        ArrayList<Integer> nums5 = new ArrayList<>(
                Arrays.asList(10,20,30,40,50)
        );
        System.out.println( nums5 );

        //전체 리스트 순환
        //일반 for문
        for(int i=0; i<nums5.size(); i++){
            System.out.println( nums5.get( i ) );
        }
        //향상된 for문
        for( Integer num : nums5 ){
            System.out.println( num );
        }
        //이터레이터(Iterator) : 열거자
        //콜렉션(리스트,맵,셋)의 순차적인 처리를 도와주는 클래스
        // hasNext() : 다음 요소를 가지고 있는지 true/false로 반환.
        // next() : 다음 요소값을 반환함.(값을 반환하고 it카운터 ++)
        Iterator<Integer> it = nums5.iterator();
        while( it.hasNext() ) {
            System.out.println( it.next() );
        }
        // 10,20,30,40,50
        //값을 포함하는지 확인?
        if( nums5.contains( 30 ) ){
            System.out.println("30을 포함함.");
        }
        //특정 요소의 인덱스 알아오기
        System.out.println( nums5.indexOf(40) );
    }
}

 

LinkedList

자료구조에서 많이 쓰이는 리스트 형식. 내부적으로 ArrayList와 처리 방식이 다르다.

다음 item에 대한 주소값이 이전 요소에 들어있다.

인터페이스 List, Queue의 구현체.

다양한 고유의 함수가 존재한다.

import java.util.LinkedList;
import java.util.List;

public class ex114 {
    public static void main(String[] args) {
        //LinkedList
        //   : ArrayList와 사용법은 비슷함.
        //   : 내부적으로 처리하는 방법이 다름.
        //   : 한 요소가 다음의 요소의 주소값을 가지는 구조를 가짐.
        //   : 흩어진 데이타를 접근할 때 빠르다.
        //   : 인터페이스 List구현체, Queue의 구현체
        LinkedList<Integer> nums = new LinkedList<>();
        nums.add( 10 );
        nums.add( 20 );
        nums.add( 30 );
        System.out.println( nums );
        nums.add( 0, 40 );
        System.out.println( nums );

        //차별화된 함수들
        System.out.println( nums.getFirst() );
        System.out.println( nums.getLast() );
        //자료구조(알고리즘)에서 사용하는 함수들
        System.out.println( nums.peek() ); //처음 요소 반환
        System.out.println( nums );
        System.out.println( nums.poll() ); //처음 요소 반환 후 삭제
        System.out.println( nums );
        nums.push( 50 ); //맨 왼쪽(처음)으로 추가
        System.out.println( nums );
        System.out.println( nums.pop() ); //맨 왼쪽 요소를 지우면서
                                          //지운 값을 반환함.
        System.out.println( nums );

    }
}

poll()과 pop()은 기능적으로 같은 일을 수행한다.

다만 poll()은 null값도 꺼내오지만, pop()은 null의 경우 오류를 일으킨다.

 

 

스택과 큐 (Stack / Queue)

이 부분은 유튜버 노마드 코더의 영상을 참조하길 바란다. 이해하기 쉽고 짧게 잘 설명되어 있다.

https://youtu.be/Nk_dGScimz8

기억해야 할것은 단 하나다.

스택은 LIFO( Last In, First Out ), 큐는 FIFO( First In, First Out, 선입선출).

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class ex115 {
    public static void main(String[] args) {
        //스택과 큐
        //스택(Stack) : LIFO(Last In First Out)
        //           : 맨 나중에 들어간 요소가 맨 처음에 나온다.
        //           : 사용예) 함수 호출시 주로 사용하는 구조
        //큐(Queue) : FIFO(First In First Out)
        //           : 맨 처음 들어간 요소가 맨 처음에 나온다.
        //          : 사용예)버퍼(Buffer) -
        //             입력속도와 출력속도가 다른 경우에 완충역활을 한다.
        //             프린터의 버퍼를 생각하면 됨.
        
        Stack<Integer> stack = new Stack<>();
        stack.push( 10 );
        stack.push( 20 );
        stack.push( 30 );
        System.out.println( stack );
        stack.pop();
        System.out.println( stack );
        System.out.println( stack.peek() ); //최상단의 값을 반환
        System.out.println( stack.size() );
        System.out.println( stack.contains(10) );
        System.out.println( stack.empty() );//비어있는가?

        Queue<Integer> queue = new LinkedList<>();
        queue.add( 10 );
        queue.add( 20 );
        queue.add( 30 );
        queue.offer( 40 );
        System.out.println( queue );
        System.out.println( queue.poll() ); //제일 먼저 들어간 값을 제거, 그 값을 반환
        System.out.println( queue );
        System.out.println( queue.peek() ); //맨첫번째 값을 반환
        System.out.println( queue );
        System.out.println( queue.size() );
    }
}

'공부 > java' 카테고리의 다른 글

16일차 복습  (0) 2022.12.06
15일차 복습  (0) 2022.12.04
13일차  (0) 2022.11.30
자바(java)의 객체의 다형성  (0) 2022.11.29
자바(java)의 클래스  (1) 2022.11.28