0%

스택과 큐(Stack&Queue)

  • 스택(Stack): LIFO구조. 마지막에 저장된 것을 제일 먼저 꺼냄
  • 큐(Queue): FIFO구조. 제일 먼저 저장한 것을 제일 먼저 꺼냄

스택 메서드

메서드 설명
boolean empty() Stack이 비어있는지 알려줌
Object peek() Stack의 맨 위에 저장된 객체를 반환. pop()과 달리 Stack에서 객체를 꺼내지는 않음
Object pop() Stack의 맨 위에 저장된 객체를 꺼냄
Object push(Object item) Stack에 객체(item)을 저장
int search(Object o) Stack에서 주어진 객체(o)를 찾아서 그 위치를 반환, 못찾으면 -1을 반환(배열과 달리 위치는 0이 아닌 1부터 시작)

큐 메서드

메서드 설명
boolean add(Object o) 지정된 객체를 Queue에 추가. 성공하면 true를 반환.
Object remove() Queue에서 객체를 꺼내 반환.
Object element() 삭제없이 요소를 읽어옴 peek과 달리 Queue가 비어있을 때 NoSuchElementException발생
boolean offer(Object o) Queue에 객체를 저장. 성공하면 true. 실패하면 false
object poll() Queue에서 객체를 꺼내서 반환
Object peek() 삭제없이 요소를 읽어옴
  • Queue는 인터페이스로 되어 있어서 객체생성이 안됨
1
Queue q = new LinkedList();

예제

image

스택과 큐의 활용

  • 스택의 활용 예 - 수식계싼, 수식괄호검사, 워드프로세스의 undo/redo, 웹브라우저의 뒤로/앞으로
  • 큐의 활용 예 - 최근사용문서, 인쇄작업 대기목록

image

image

LinkedList(배열기반)장단점

  • 장점
    • 배열은 구조가 간단하고 데이터를 읽는데 걸리는 시간이 짧음
  • 단점
    • 크기를 변경할 수 없음
      • 크기를 변경해야 하는 경우 새로운 배열을 생성 후 데이터를 복사해야 함
      • 크기 변경을 피하기 위해 충분히 큰 배열을 생성하면, 메모리가 낭비
    • 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸림
      • 데이터를 추가하거나 삭제하기 위해, 다른 데이터를 옮겨야 함
      • 순차적인 데이터추가와 삭제는 빠름

LinkedList는 배열의 단점을 보완

  • 배열과 달리 링크드리스트는 불연속적으로 존재하는 데이터를 연결(link)
  • 데이터의 삭제: 단 한 번의 참조변경만으로 가능
  • 데이터의 추가: 한 번의 Node객체생성과 두 번의 참조변경만으로 가능

이중 연결 리스트

  • 링크드 리스트 - 연결리스트. 데이터 접근성이 나쁨

    • class Node{
        Node next;
        object obj;
      }
      <!--0-->
  • 더블리 써큘러 링크드 리스트 - 이중 원형 연결리스트

ArrayList(배열기반) vs LinkedList(연결기반) 비교

  • 순차적으로 데이터를 추가/삭제 - ArrayList가 빠름
  • 비순차적으로 데이터를 추가/삭제 - LinkedList가 빠름
  • 접근시간(access time) - ArryaList가 빠름

이클립스 무한 building 반복될 때

  1. 이클립스를 먼저 종료
  2. 다음 폴더를 안전한 장소로 이동
    • eclipse-workspace/.metadata/.plugins/org.eclipse.core.resources/.projects
  3. 이클립스 종료 후 재시작
  4. 2번에서 이동한 .projects폴더로 다시 원위치에 덮어씌우기

ArrayList

  • 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일
  • ArrayList와 달리 Vector는 자체적으로 동기화처리 되어 있다.
  • List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용
  • 데이터의 저장공간으로 배열을 사용(배열기반)
1
public class Vector extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializeable {
2
  protected Object[] elementData; //객체를 담기 위한 배열
3
}
  • 생성자
    • ArrayList() //생성자
    • ArrayList(Collection c) //컬렉션들끼리 변환할때사용
    • ArrayList(int initalCapacity) //배열의길이
  • 추가
    • boolean add(Object o)
    • void add(int index, Object element)
    • boolean addAll(Collenction c)
    • boolean addAll(int index, Collection)
  • 삭제
    • booelean remove(Object o)
    • Object remove(int index)
    • boolean remove(Collenction c)
    • void clear() //모든객체삭제
  • 검색
    • int indexOf(Object o)
    • int lastIndexOf(Object o)
    • boolean contains(Object o) //객체가존재하는지
    • Object get(int index) //객체읽기
    • Object set(int index, Object element) //객체변경
  • 새로운 리스트를 만듦
    • List subList(int fromindex, toindex) //from~to 새로운 리스트를 만듦
    • Object[] toArray() //ArrayList의 객체배열를 리스트반환
    • Object[] toArray(Object[] a)
    • boolean isEmpty() //비어있는지확인
    • void trimToSize() //빈공간제거
    • int size() //객체갯수반환

ArrayList에 저장된 객체의 삭제과정

  1. 삭제할 데이터 아래의 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어씀

    • System.arraycopy(data, 3, data, 2, 2) //data[3]에서 data[2]로 2개의 데이터를 복사하라는 의미
      <!--1-->
  2. 데이터가 삭제되어 데이터의 개수가 줄었으므로 size의 값을 감소

    • size--;
      <!--2-->
  • ArryaList에 저장된 마지막 객체부터 삭제하는 경우(배열 복사 발생안함)

    • for (int i=list.size(); i>0; i--){
        list.remove(i);
      }

컬렉션 프레임웍(collections framework)

  • 컬렉션

    • 여러 객체(데이터)를 모아 놓은 것을 의미
  • 프레임원(framework)

    • 표준화, 정형화된 체계적인 프로그래밍 방식
  • 컬렉션 프레임웍

    • 컬렉션을 다루기 위한 표준화된 프로그래밍 방식
    • 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공
    • java.util패키지에 포함
  • 컬렉션 클래스(collection class)

    • 다수의 데이터를 저장할 수 있는 클래스(ex. Vector, ArrayList, HashSet)

컬렉션 프레임웍의 핵심 인터페이스

  • List
    • 순서가 있는 데이터의 집합. 데이터의 중복을 허용
    • ex) 대기자 명단
    • 두현클래스: ArrayList, LinkedList, Stack, Vector 등
  • Set
    • 순서를 유지하지 않는 데이터의 집합. *데이터의 중복을 허용하지 않음 *
    • ex)양의 정수 집합, 소수의 집합
    • HashSet, TreeSet 등
  • Map
    • 키와 값의 쌍으로 이루어진 데이터의 집합. 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용
    • ex)우편번호, 지역번호(전화번호)
    • HashMap, TreeMap, Hashtable, Properties 등

List인터페이스 - 순서O, 중복O

  • 핵심: ArrayList, LinkedList
메서드 설명
void add(int index, Object element)
boolean add(int index, Collection c)
지정된 위치에 객체 또는 컬렉션에 포함된 객체들을 추가
Object get(int index) 지정된 위치에 있는 객체를 반환
int indexOf(Object o) 지정된 객체의 위치를 반환(List의 첫 번쨰 요소부터 순방향으로 찾음)
int lastindexOf(Object o) 지정된 객체의 위치를 반환
(List의 마지막 요소부터 역방향으로 찾음)
Listlterator listlterator()
LIstlterator listlterator(int index)
List의 객체에 접근할 수 있는 Listlterator를 반환a
Object remove(int index) 지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환
Object set(int index, Object element) 지정된 위치에 객체를 저장
void sort(Comparator c) 지정된 비교자로 List를 정렬
List subList(int fromindex, int tolndex) 지정된 범위에 있는 객체를 반환

Set인터페이스 - 순서X, 중복X

  • 핵심: HashSet, TreeSet
  • Set인터페이스의 메서드는 Collection인터페이스와 동일
  • 집합과 관련된 메서드(Colleciton에 변화가 있으면 true, 아니면 false를 반환)
메서드 설명
boolean addAll(Collection c) 지정된 Collection(c)의 객체들을 Collection에 추가(합집합)
boolean containsAll(Collection c) 지정된 Collection(c)의 객체들이 Collection에 포함되어 있는지 확인(부분집합)
boolean removeAll(Collection c) 지정된 Collection(c)에 포함된 객체들을 삭제(차집합)
boolean retainAll(Collection c) 지정된 Collection(c)에 포함된 객체만을 남기고나머지는 Collection에서 삭제(교집합)

Map인터페이스 - 순서X, 중복(키X, 값O)

  • 핵심: HashMap, TreeMap
메서드 설명
void clear() Map의 모든 객체를 삭제
boolean containKey(Object key) 지정된 key객체와 일치하는 Map의 key객체가있는지 확인
boolean containsValue(Object value) 지정된 value객체와 일치하는 Map의 value객체가 있는지 확인
Set entrySet() Map에 저장되어 있는 key-value쌍을 Map,Entry타입의 객체로 저장한 Set을 반환
boolean equals(Object o) 동일한 Map인지 비교
Object get(Object key) 지정한 key객체에 대응하는 value객체를 찾아서 반환
int hashCode() 해시코드를 반환
boolean isEmpty() Map이 비어있는지 확인
Set keySet() Map에 저장된 모든 key객체를 반환
Object put(Object key, Object value) Map에 value객체를 key객체에 연결(mapping)하여 저장
void putAll(Map t) 지정된 Map의 모든 key-value쌍을 추가
Object remove(Oeject key) 지정한 key객체와 일치하는 key-value객체를 삭제
int size() Map에 저장된 key-value쌍의 개수를 반환
Collection values() Map에 저장된 모든 value객체를 반환

Calendar클래스

  • set()으로 날짜와 시간 지정하기
1
void set(int field, int value)
2
void set(int year, int month, int date)
3
void set(int year, int month, int date, int hourOfDay, int minute)
4
void set(int year, int month, int date, int hourOfDay, int minute, int second)
  • 날짜 지정하는 방법, 월(MONTH)이 0부터 시작한다는 점에 주의
1
Calendar datel = Calendar.getInstance();
2
date1.set(2017, 7, 15); // 2017년 8월 15일(7월 아님)
3
// date1.set(Calendar.YEAR, 2017);
4
// date1.set(Calendar.MONTH, 7);
5
// date1.set(Calendar.DATE, 15);
  • 시간 지정하는 방법
1
Calendar time1 = Calendar.getInstance();
2
time1.set(Calendar.HOUR_OF_DAY, 10); //time1을 10시 20분 30초로 설정
3
time1.set(Calendar.MIVUTE, 20);
4
time1.set(Calendar.SECOND, 30);
  • 보통 두 날짜의 일자 차이를 구할 땐 초로 바꾼 후 계산하고 다시 일로 변경합니다.
1
import java.util.*;
2
3
class Ex10_3 {
4
    public static void main(String[] args) {
5
        final int[] TIME_UNIT = {3600, 60, 1};
6
        final String[] TIME_UNIT_NAME = {"시간", "분", 초}; //큰 단위를 앞에 둠
7
        
8
        calendar time1 = caleandar.getInstance();
9
		calendar time1 = caleandar.getInstance();
10
        
11
        time1.set(Calendar.HOUR_OF_DAY, 10);
12
        time1.set(Calendar.MINUTE, 20);
13
        time1.set(Calendar.SECOND, 30);
14
        
15
       	time2.set(Calendar.HOUR_OF_DAY, 20);
16
        time2.set(Calendar.MINUTE, 30);
17
        time2.set(Calendar.SECOND, 10);
18
        
19
        System.out.println("time1: " + time1.get(Calendar.HOUR_OF_DAY) + "시" + time1.get(Calendar.MINUTE) + 		"분" + time1.get(Calendar.SECOND) + "초");
20
        System.out.println("time2: " + time2.get(Calendar.HOUR_OF_DAY) + "시" + time2.get(Calendar.MINUTE) + 		"분" + time2.get(Calendar.SECOND) + "초");
21
        long difference = Math.as(time2.getTimeInMillis() - time1.getTimeInMillis())/1000;
22
        System.out.println("time1과 time2의 차이는" + difference + "초입니다.");
23
        Stirng tmp = "";
24
    for (int i=0; i< TIME_UNIT.length; i++) {
25
        tml += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i];
26
    difference %= TIME_UNIT[i];
27
    }
28
    System.out.println("시분초로 변환하면" + tmp + "입니다."
29
}
  • clear()은 Calendar객체의 모든 필드를 초기화
  • add()는 특정필드의 값을 증가 또는 감소(다른 필드에 영향O)
1
calendar date = Calendar.getInstance();
2
date.clear(); //모든 필드를 초기화
3
date.set(2020, 7, 31); //2020년 8월 31일로 설정
4
5
date.add(Calendar.DATE, 1); //날짜(DATE)에 1을 더함
6
date.add(Calender.MONTH, -8); //월(MONTH)에서 8을 뻄
  • roll()은 특정필드의 값을 증가 또는 감소(다른 필드에 영향X)
1
date.set(2020, 7, 31); //2020년 8월 31일로 설정
2
3
//add()와 달리 roll()은 다른 필드에 영향을 미치지 않는다.
4
//년, 월, 일이 별도임
5
date.roll(Calendar.DATE, 1); //날짜(DATE)에 1을 더함
6
date.roll(Calendar.MONTH, -8); //월(MONTH)에서 8을 뻄

Date와 Calendar간의 변환

  • Date의 메서드는 대부분 deprecated(사용하지 않는것을 권장)되었지만 여전히 사용/자바는 새로운 기능이 나와도 하위호환성을 따지며 버전이 나옴
1
1. Calendar를 Date로 변환
2
    Calendar cal = Calendar.getInstance();
3
		...
4
    Date d = new Date(cal.getTimeInMillis()); //Date(long date)
5
6
2.Date를 Calendar로 변환
7
    Date d = new Date();
8
		...
9
    Calendar cal = Calendar.getInstance();
10
	cla.setTime(d)

형식화 클래스

  • java.text패키지의 DecimalFormat, SImpleDateFormat

DecimalFormat()

  • 숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자, 날짜 -> 형식 물자열)
1
double number = 1234567.89;
2
DecimalFormat df = new DecimalFormat("#.#E0");
3
String result = df.format(number); //result = "1.2E6"
  • 형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열 -> 숫자, 날짜)
1
DecimalFormat df = new DecimalFormat("#.###.##");
2
Number num = df.parse("1,234,567.89");
3
double d = num.doubleValue(); //1234567.89

SimpleDateFormat

  • 날짜와 시간을 다양한 형식으로 출력할 수 있게 해줌
1
Date today = new Date();
2
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
3
4
String result = df.format(today);
  • 특정 형식으로 되어있는 문자열에서 날짜와 시간을 뽑아낼 수 있음
1
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
2
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
3
Date d = df.parse("2015년 11월 23일"); //문자열을 Date로 변환
4
String result = df2.format(d);

어노테이션 정리(@, Annotation)

한국말로 뜻자체는 “주석”이라고 나옵니다. 하지만 코딩할 때 java에서는 설명 그 이상의 역할을 합니다. 어노테이션이 붙은 코드는 어노테이션의 구현된 정보에 따라 연결되는 방향이 결정됩니다. 전체 소스코드에서 비즈니스 로직에는 영향을 주지는 않지만 해당 타겟의 연결 방법이나 소스코드의 구조를 변경할 수 있습니다. 쉽게 말해서 “이 속성을 어떤 용도로 사용할까, 이 클래스에서 어떤 역할을 줄까?”를 결정해서 붙여준다고 볼 수 있습니다. 자주 사용하는 어노테이션에 대해서 간단하게 정리하겠습니다.

  • @Autowired: 의존 자동 주입, 스프링이 알아서 의존 객체를 찾아서 주입해줍니다. 설정 파일에 의존 객체를 명시하지 않아도 스프링이 필요한 의존 빈 객체를 찾아서 주입해줍니다.
    • 자동 주입 대상에 @Autowired사용
    • XML설정에 <context:annotation-config /> 설정 추가
  • @Controller: 핸들러가 스캔할 수 있는 빈(Bean) 객체가 되어 서블릿용 컨테이너에 생성됩니다. 해당 클래스를 웹 요청을 처리하는 컨트롤러로 사용합니다.
  • @Service: 서비스가 적용 된 Class는 비즈니스 로직이 들어가는 Service로 등록이 됩니다. Conrooler에 있는 @Autowired는 @Service('exampleservice')에 등록된 exampleservice와 변수명이 같아야 하며 Service에 있는 @Autowired@Repository('exampleDao')에 등록된 exampleDao와 변수명이 같아야 합니다.
  • @RequestMapping: 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션
  • @PostMapping, @GetMapping: 두 어노테이션은 @RequestMapping(value="", method=RequestMethod.GET) or @RequestMapping(value="", method=RequestMethod.POST)을 대신하는 코드입니다. get,post메소드에 대해서만 응답을 하는지 확인하는 코드입니다.
  • @Mapper: 매핑파일에 기재된 SQL을 호출하기 위한 인터페이스입니다.

래퍼클래스

  • 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스
기본형 래퍼클래생성자
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Doble

Number클래스

  • 모든 숫자 래퍼 클래스의 조상

문자열을 숫자로 변환하기

  • 문자열을 숫자로 변환하는 다양한 방법
1
int i = new Integer("100").intValue();
2
int i2 = Integer.parseInt("100");
3
integer i3 = Integer.valueOf("100");
  • n진법의 문자열을 숫자로 변환하는 방법
1
int i4 = Integer.parseInt("100", 2);
2
int i5 = Integer.parseInt("100", 8);
3
int i6 = Integer.parseInt("100", 16);
4
int i7 = Integer.parseInt("FF", 16);

오토박싱 & 언박싱

  • 기본형의 값을 객체로 자동변환하는 것을 오토박싱, 그 반대는 언박싱

StringBuider

  • StringBuffer는 동기화되어 있음. 멀티 쓰레드에 안전(thread-safe)
  • 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하. 이럴 땐 StringBuffer대신 StringBuilder를 사용하면 성능 향상

Math클래스

  • 수학관련 static메서드의 집합

  • round()로 원하는 소수점 아래 세 번째 자리에서 반올림하기

    • 원래 값에 100을 곱함

    • 위의 결과에 Math.round()를 사용

    • 위의 결과를 다시 100.0으로 나눔

    • 1. 90.7552 * 100 // 9075.52
      2. Math.round(9075.52) // 9076
      3. 9076 / 100.0
  • static double,float,int,long abs

    • 주어진 값의 절대값을 반환
  • static double ceil(double a)

    • 주어진 값을 올림하여 반환
  • static double floor(double a)

    • 주어진 값을 버림하여 반환
  • static double max(double a, double b)

    • 주어진 두 값을 비교하여 큰 쪽을 반환
  • static double min(double a, double b)

    • 주어진 두 값을 비교하여 작은 쪽을 반환
  • static long round(double a)

    • 소수점 첫째자리에서 반올림한 정수값을 반환
  • static double random()

    • 0.0 ~ 1.0범위의 임의의 double값을 반환