큐 클래스
public class ArrayQueue {
    private int front;
    private int rear;
    private int maxSize;

    private Object[] queueArray;

    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;

        front = 0;
        rear = -1;

        queueArray = new Object[maxSize];
    }

    // 큐 공간이 비어 있는지
    public boolean isEmpty() {
        return (front == rear + 1);     // 둘 다 인덱스 0번이면 비어 있음
    }

    // 큐 공간이 가득 차 있는지
    public boolean isFull() {
        return (rear == maxSize - 1);   // 최후단이 배열의 총 크기와 같으면 다 차 있음
    }

    // 추가 -- rear와 연관 (늘어남)
    public void push(Object item) {
        if (isFull()) {
            System.out.println("큐 공간이 가득 차 있습니다");
            return;         // break
        }
        rear++;             // -1에서 0번지로
        queueArray[rear] = item;
    }

    // 삭제 -- front와 연관
    public Object pop() {
        Object item = peek();
        if (item == null) return null;

        front++;
        return item;
    }

    // 산출
    public Object peek() {
        if (isEmpty()) {
            System.out.println("큐 공간이 비어 있습니다");
            return null;
        }
        return queueArray[front];
    }
}

 

메인 클래스
public class MainClass {
    public static void main(String[] args) {

        // 배열 사이즈 5로 큐 초기화
        ArrayQueue queue = new ArrayQueue(5);
        
        // 첫번째 요소 삽입
        Integer in = 111;
        queue.push(in);

        // 두번째 요소 삽입
        in = 222;
        queue.push(in);

        // 세번째 요소 삽입
        in = 222;
        queue.push(in);

        // front 위치의 데이터 산출
        Integer peek = (Integer) queue.peek();
        System.out.println(peek);
        
        // 1개 삭제 (front 위치에서)
        queue.pop();

        // front 위치의 데이터 산출
        peek = (Integer) queue.peek();
        System.out.println(peek);
    }
}

 

isFull 메소드 // isEmpty 메소드
Work Flow

Stack 클래스
public class ArrayStack {
    private int top;
    private int maxSize;
    private Object[] stackArray;            // Object == 어떤 클래스든 다 담을 수 있음

    // 생성자 (배열 크기 -> 배열 초기화, top은 비어있음)
    public ArrayStack (int maxSize) {
        this.maxSize = maxSize;
        stackArray = new Object[maxSize];
        top = -1;
    }

    // 스택 공간이 비어 있는지
    public boolean isEmpty() {
        return (top == -1);                 // -1이면 true고, -1이 아니면 false
    }

    // 스택 공간이 가득 차 있는지
    public boolean isFull() {
        return (top == maxSize -1);         // 배열 사이즈가 10이면 top은 0~9번지 -> 9
    }

    // 추가 -- push
    public void push(Object item) {
        if (isFull()) {
            System.out.println("스택 공간이 가득 차 있음");
            return;             // break
        }
        top++;                  // top은 -1 에서 0
        stackArray[top] = item; // 0번지에 item 삽입
    }

    // 삭제 -- pop
    public Object pop() {       // 삭제된 데이터를 Return -- 반환타입 Object
        Object item = peek();   // top 위치의 아이템을 일단 확인
        if (item == null) {
            System.out.println("스택 공간이 비어 있음");
            return null;
        }
        top--;                  // top은 n에서 n-1
        return item;
    }

    // top(최상단)에 해당되는 데이터 (반환)
    public Object peek() {
        if (isEmpty()) {
            System.out.println("스택 공간이 비어 있음");
            return null;
        }
        return stackArray[top];
    }
}

 

 

메인함수 코드
public class MainClass {
    public static void main(String[] args) {
    /*
        Stack
        First in last out = FILO
        push, pop, peek
        isEmpty, isFull
     */

        // 크기가 5로 Stack 초기화
        ArrayStack stack = new ArrayStack(5);

        // 1번째 요소 삽입
        String str = "AAA";
        stack.push(str);

        // 2번째 요소 삽입
        str = "BBB";
        stack.push(str);

        // 3번째 요소 삽입
        str = "CCC";
        stack.push(str);

        // 최상단 데이터 확인
        String peek = (String) stack.peek();
        System.out.println(peek);

        // 최상단 데이터 삭제
        stack.pop();

        // 최상단 데이터 확인
        peek = (String) stack.peek();
        System.out.println(peek);

    }
}

 

Collection
Map : interface
HashMap : class == 사전 (dict)
          key : value 쌍
          tree 구조
          index로 접근하는 것이 아님!! - key로 접근함
          key는 중복을 허용하지 않음 (중복으로 입력하면 덮어쓰기 됨)
          web에서는 json
TreeMap : HashMap + Sorting

 

1. 해시맵 선언 (구조)

HashMap<Key 타입, Value 타입> 변수명 = new HashMap<>();

보통 Map으로 더 많이 받는다.

// HashMap<Integer, String> hMap = new HashMap<>();
Map<Integer, String> hMap = new HashMap<>();

 

2. 해시맵에 요소 추가 - put( key, value )

hMap.put(111, "백십일");
hMap.put(222, "이백이십이");
hMap.put(333, "삽백삼십삼");

 

3. 해시맵의 크기 반환 - size()

System.out.println(hMap.size());

 

4. Key값을 인덱스로 활용하여 Value를 취득 - get( key값 )

★ HashMap은 중복 key를 허용하지 않는다.

  • get 메소드는 value값을 리턴한다.
String value = hMap.get(333);
System.out.println(value);

 

5. HashMap의 모든 요소를 출력 - Iterator와 get을 활용 ☆

  • Iterator는 일종의 포인터 역할을 한다
  • Iterator < Key값의 자료타입 > (이터레이터)변수명 = (해시맵)변수명.keySet().iterator();
  • it.hasNext()를 한 번 사용하고 나면, 다시 쓰려면 끝을 가리키고 있는 포인터를 초기화 시켜줘야 한다. (새로 대입)
Iterator<Integer> it = hMap.keySet().iterator();
while (it.hasNext()) {
    Integer _key = it.next();
    String _value = hMap.get(_key);
    System.out.println("key = " + _key + "\tvalue = " + _value);
}

 

6. 삭제 - remove( key값 )

  • 삭제된 key의 value값을 리턴해준다.
String remove_value = hMap.remove(222);
System.out.println("삭제된 값 = " + remove_value);

 

7. 검색 - containsKey( Key값) 과 get()을 활용

  • containsKey( k )는 boolean을 리턴한다.
// 검색
// boolean b = hMap.containsKey(333);
if (hMap.containsKey(333)) {
    String val = hMap.get(333);
    System.out.println(val);
}

 

8. 수정 - replace(  Key값, 새로운 Value값 )

  • 키 값을 수정할 수는 없다!
// 수정 -- 키 값은 수정 안되고 value만
String str = "300 + 30 + 3";
hMap.replace(333, str);

 

 

9. 해쉬맵의 정렬 - 트리맵을 사용한다.

[메모]

  • HashMap의 확장판 == TreeMap
  • (ArrayList의 확장판 == LinkedList)
  • HashMap + 정렬 기능 이라서 더 무겁다 ( 정렬할때만 쓰고, 잘 안 씀)
// Sorting
TreeMap<String, String> tMap = new TreeMap<>( fruitMap );

// 오름차순 (자동) -- keySet()
Iterator<String> it1 = tMap.keySet().iterator();

// 내림차순 (자동) -- descendingKeySet()
Iterator<String> it1 = tMap.descendingKeySet().iterator();

// 출력
while (it1.hasNext()) {
    String k = it1.next();
    String v = tMap.get(k);
    System.out.println("key = " + k + "\tvalue = " + v);
}

 

☆ 팩토리 패턴이란?

Singleton 패턴은 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다. 

이 패턴은 전역 접근을 제공하며, 여러 스레드에서 안전하게 사용할 수 있도록 구현할 수 있습니다.

--> 공유(접근)해야 될 데이터나 클래스로서 어디서나(클래스) 접근이 용이하도록 만든 패턴.

 

☆ 기본 구조 - 코드 예시

프로젝트 구조

 

animal
|-- Animal (인터페이스)
public interface Animal {
    void printDescript();
}

 

animal
|-- Cat (클래스)
public class Cat implements Animal {
    @Override
    public void printDescript() {
        System.out.println("야옹야옹");
    }
}

 

factory
|-- AnimalFactory (팩토리 클래스)

 

[메모] create() 메소드가 static 이면 main함수에서 호출될 때 더 쓰기가 편하다.

예를 들어, 현재 코드처럼 static이라면

main함수 안에서는 AnimalFactory.create("멍멍이") 이렇게 쓰기만 하면 되는데,

static이 아니라면 main 함수에서 호출하기 위해서

AnimalFactory af = new AnimalFactory();

af.create("멍멍이")

이렇게 써야 한다.

public class AnimalFactory {

    public static Animal create(String name) {
        if (name.equals("야옹이")) {
            return new Cat();
        }
        else if (name.equals("멍멍이")) {
            return new Dog();
        }
        else if (name.equals("황소")) {
            return new Cow();
        }

        return null;
    }
}

 

main
|-- MainClass
public class MainClass {
    public static void main(String[] args) {
        /*
        // 하나씩 생성
        Animal ani1 = AnimalFactory.create("멍멍이");
        Animal ani2 = AnimalFactory.create("야옹이");
        Animal ani3 = AnimalFactory.create("황소");

        ani1.printDescript();
        ani2.printDescript();
        ani3.printDescript();
        */

		// 식별자(=이름)을 배열에 미리 넣고, ArrayList에 인스턴스 삽입
        List<Animal> animalList = new ArrayList<>();
        String[] names = { "멍멍이", "황소", "황소", "멍멍이", "야옹이", "야옹이", "야옹이", "멍멍이" };

		// Factory 클래스를 사용해서 인스턴스 생성 후 ArrayList에 삽입
        for (String name : names) {
            Animal ani = AnimalFactory.create(name);
            animalList.add(ani);
        }

		// 메소드 호출
        for (Animal a : animalList) {
            a.printDescript();
        }
    }
}

☆ 싱글톤 패턴이란?

Singleton 패턴은 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다. 

이 패턴은 전역 접근을 제공하며, 여러 스레드에서 안전하게 사용할 수 있도록 구현할 수 있습니다.

--> 공유(접근)해야 될 데이터나 클래스로서 어디서나(클래스) 접근이 용이하도록 만든 패턴.

 

기본 구조 - 코드 예시

public class Singleton {
    // 클래스의 유일한 인스턴스를 저장할 정적 변수
    private static Singleton single = null;
    
    // 전달(이용)하고자 하는 변수 or 객체를 멤버로 가짐
    int number;
    List<Integer> list;
    
    // 생성자를 private으로 선언하여 외부에서 인스턴스를 생성할 수 없도록 함
    private Singleton() {}

    // 인스턴스를 반환하는 정적 메서드
    public static Singleton getInstance() {
        if (single == null) {
            single = new Singleton();
        }
        return single;
    }
}

 

☆ 코드 설명

1. Singleton 패턴에서 사용되는 Static의 맥락:

static으로 선언된 변수는 클래스의 인스턴스와 관계없이 클래스에 속하는 변수.

즉, 클래스가 로드될 때 메모리에 할당되며, 그 값이 null이라 하더라도 인스턴스를 생성하지 않고도 접근이 가능

 

2. getInstance() 메소드

if문이 딱 한 번만 실행된다는 것이 포인트임.

- single 변수를 null로 초기화했기 때문에 메소드가 최초 1회 실행될 때 if문이 실행됨

- 이 때 메모리 주소가 할당됨

- 한 번 메모리 주소가 할당된 이후로부터는, if문이 실행되지 않음

- 바뀌지 않는 메모리 주소를 리턴해줌

Collection : 수집

List : 목록

  • 데이터의 관리를 유동적으로 할 수 있는 배열이다.
  • index로 접근을 관리한다
  • 선형 구조 0-0-0-0ArrayList : 검색에 우수
  • 동적 배열
  • 검색 효율이 성능을 좌우한다.LinkedList : 추가/삭제에 효율적

ArrayList 선언

// ArrayList<Integer> al = new ArrayList<>();

List<Integer> list = new ArrayList<>();

ArrayList의 CRUD

1. 삽입(생성)

1.1 맨 뒤에 요소를 삽입 : 

  • add(삽입할 요소)
  • { 1, 2, 3 } -> { 1, 2, 3, 6 }
list.add(300);

1.1 원하는 위치에 요소를 삽입 : 

  • add( 삽입할 인덱스 번호 , 삽입할 요소 )
  • { 1, 2, 3 } -> { 1, 6, 2, 3 };
Integer newNum = 300;
list.add(2, newNum);

 

2. 삭제

  • remove ( 인덱스번호 )   혹은    remove(  Object  )
  • remove 메소드는 return값이 존재한다 (삭제된 요소를 반환해줌)
// 인덱스번호로 삭제
Integer rm = list.remove(1);

// 일치하는 요소를 찾아 삭제
rm = list.remove(333);

 

3. 수정

  • set( 인덱스번호, 새로운요소 )
Integer newNum = 555;
list.set(3, newNum);

 

4. 검색

  • indexOf( 인덱스번호 )
  • return 값으로 인덱스 번호를 넘겨준다 (int형)
Integer findE = 300;
int index = list.indexOf( findE );

System.out.println("index = " + index );

 

  • 혹은 for문 + get으로 어레이에서 했던 것처럼 구현 가능
int index = -1;
for (int i=0; i<list.size(); i++) {
	Integer n = list.get(i);
	if ( n == 300 ) {
		index = i;
		System.out.println(index);
	}
}

 

+ Recent posts