Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240620 2주차에서 못 벗어나고 있다..! 본문

개발Article

[TIL]20240620 2주차에서 못 벗어나고 있다..!

최밤빵 2024. 6. 21. 01:21

JAVA문법종합반 2주차 다시 수강...😔

(본 과정때 다시 들으면 전 보다는 나을 줄 알았지)

 

▶ 다차원 배열 

 

→ 2차원 배열

0 : [0, 0], [0, 1], [0, 2], [0, 3], [0, 4]

1 : [1, 0], [1, 1], [1, 2], [1, 3], [1, 4]

→ 3차원 배열

0 : [0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4]

1 : [1, 1, 0], [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4]

2 : [2, 2, 0], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 2, 4]

"다차원 배열은 늘어갈수록 조금 더 표현하는 갯수가 늘어난다."

 

🤓 왜 필요할까?

현실에서 일어나는 복잡하고 다양한 여러가지 문제를 대입해서 풀기위해 필요하다!

→ 배열을 잘 이용하면 복잡한 계산들을 간단하고 효율적으로 처리할수있다. 반복작업을 없애는거니까!

 

▶ 반복문을 통한 초기화 

2행3열의 배열을 선언해주고, for문을 사용해서 i, j를 초기화 시켜준다.

array[ i ][ j ] = 0; 위 [ ] 안의 숫자를 의미하며 index라고 부른다.

출력을 해보면 이렇게 2줄 3칸의 출력이 나오는 것을 알 수 있다.

 

▶ 가변 배열 

int[ ][ ] array = new int[ 3 ][  ];

→ 길이가 정해지지않은 배열.

 array[0] = new int[2]; // [0,0] , [0,1]
//        array[1] = new int[4]; // [1,0], [1,1], [1,2], [1,3]
//        array[2] = new int[1]; // [2,0]

배열 원소마다 각자 다른크기로 지정! (주석이 많은건 내가 이해를 잘 하지 못할 때😵‍💫)

 

int[][] array = {
        {10, 20, 30},
        {10, 20, 30, 40},
        {10, 20}
};// 가변적으로 길이를 3, 4, 2인 배열로 선언을 해버리면서 초기화 가능.

중괄호로 아예 초기화를 해버리는 것도 가능하다. 

주석으로 써있는 것 처럼 가변적으로 길이를 3, 4, 2인 배열로 선언을 해버리면서 초기화가 가능하다. 

 

for (int i =0; i < array.length; i++) { // 1차원 길이
    for (int j = 0; j < array[i].length; j++ ) { // 2차원 길이
        System.out.println(array[i][j]); // 이중 반복문으로 i, j 순회
    }
} 

→ 가변 2차원 배열 조회 

 

▶ 최대값, 최소값 구하기

int[] arr = {3, 2, 0, 5, 1}; // 생성과 동시에 초기화 진행

// 최대값 초기화 세팅
int max = arr[0];

// 최대값 구하기 로직
for (int num: arr) {
    if (num > max ) {
        max = num;
    }
}

System.out.println("최대값은 => " + max);

→ 최대값 구하기 

최대값 초기화를 세팅해주고 향상된 for문을 사용해서 max가 num보다 클 때 max를 num으로 선언해준다.

int min = arr[0];

        // 최대값 구하기 로직
        for (int num: arr) {
            if (num < min ) {
                min = num;
            }
        }

        System.out.println("최소값은 => " + min);
    }
}

→ 최소값 구하기 

min을 세팅해주고, 역시 향상된 for문을 사용해서 num의값이 min보다 작을 때 min값을 새롭게 선언해준다.

이렇게 출력되는 걸 볼 수 있다.

 

▶ .....collectin😵‍💫

 

1-1) List : 중복요소를 허용하는 순서가 지정된 컬렉션. 일반적인 구현으로 ArrayList, LinkedList 

- ArrayList

순서가 있는 데이터의 집합으로 배열(Array)과 비슷하다. (배열은 최초 길이를 알아야한다.)

 

List는 처음에 길이를 몰라도 만들 수 있다 .

Array는 "정적배열"로 최초 길이를 모르면 초기화 할 수 없지만 

List는 "동적배열"로 크기가 가변적으로 늘어 나며, 생성 시점에 작은 연속된 공간을 요청해 참조형 변수들을 담아놓는다. 

 

"ArrayList는 조회작업이나, 삽입 및 삭제가 덜 빈번한 상황에 이상적이다."

ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언 + 생성

→ 선언방법. (나를 아주 힘들게했다.. 이 선언방법 외우는 게 얼마나 힘들었는지 )

 

Array(배열)은 초기화 될 때 아예 값을 fix해서 넣거나 값을 재할당 하는 방법으로 넣었지만,

ArrayList는 동적 배열이라 값을 언제든지 추가 할 수 있다.

intList.add(99); // 0
intList.add(15); // 1
intList.add(3); // 2

System.out.println(intList.get(1));

get이라는 메서드를 사용해서 0이라고 세팅시 맨 처음 추가된 수가 출력된다. 

지금은 1을 넣었으니 15가 출력된다. 

 

intList.set(1, 10); 
System.out.println(intList.get(1));

2번째 자리에있는 수를 set을 이용해서 바꿔준다. 

0, 1, 2니까 1번째 자리의 수가 15 에서 10으로 변경되서 출력되는 걸 알 수 있다. 

intList.remove(0); // 99가 삭제되고 15가 첫번쨰 (0번쨰)가 됨
        System.out.println(intList.get(0));
        System.out.println("클리어 전");
        System.out.println(intList.toString()); // []출력. toString list 안에있는 값을 사람이 볼수있게끔 편하게 만들어주는 명령어.

        intList.clear();
        System.out.println("클리어 후");
        System.out.println(intList.toString());
    }
}

 

remove를 사용해서 0번째 자리를 삭제해준다. 

삭제해주고 나서  출력한 값은 0번째가 된 15가 출력된다.

clear은 전체 삭제해주는 메서드다. 클리어 를 하고나면 [ ]의 수 들이 사라진다.

이렇게 출력되는 걸 볼 수 있다.

 

1-2) List

- LinkdList

메모리에 남는 공간을 요청해서 여기 저기 나누어서 실제 값을 담아둔다.

실제값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조. 

기본적 기능은 ArrayList와 동일하지만, 실질적으로 LinkedList는 여기저기 나누어 두었기 때문에 

조회하는 속도가 느리지만, 값을 추가하거나 삭제할 때는 빠르다. 

 

" LinkedList는 목록의 시작이나 중간에서 삽입 및 삭제 작업이 자주 수행되는 시나리오에 적합하다."

LinkedList<Integer> linkdList = new LinkedList<Integer>();

→ 선언방법. 역시나.. 적응이 되지 않는다😵‍💫

 

linkdList.add(5);
linkdList.add(10);
linkdList.add(3);

System.out.println(linkdList.get(0));
System.out.println(linkdList.get(1));
System.out.println(linkdList.get(2));

System.out.println(linkdList.toString());

조회방법은 ArrayList보다 속도가 현저히 느리다. (솔직히 나는 체감하지 못하는 느림이다)

 linkdList.add(200);
        System.out.println(linkdList.toString()); // 추가. 200을 추가

        linkdList.add(2, 4);
        System.out.println(linkdList.toString()); // 추가. 2번째 순번에 4라는 값을 추가해주세요.

        linkdList.set(1, 30);
        System.out.println(linkdList.toString()); // 수정. 1번째를 30으로 변경

        linkdList.remove(1);
        System.out.println(linkdList.toString()); // 부분삭제. 몇번째 인덱스를 삭제할래?

        linkdList.clear();
        System.out.println(linkdList.toString());
    }
}

add를 이용해서 추가, add(2, 4) 2는 index, 4는 element로 2번쨰 순번에 4라는 값을 추가해준다.

set를 사용해서 1번째를 30으로 변경, remove는 부분삭제를 뜻하니 1번째를 삭제한다. clear 클리어~ 

이렇게 출력되는 걸 알 수 있다. 

 

2) Set : 중복요소를 허용하지않고, 정의된 순서가 없다. 일반적인 구현 : HashSet, TreeSet, LinkedList

순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조 

그냥 쓸 수도 있지만 HashSet, TreeSet, LinkedList 이렇게 응용해서 사용이 가능하다.

Set는 생성자가 없는 껍데기라서 바로 생성 할 수 없다. 

 

" 중복 요소를 허용하지않은 요소의 특정순서를 유지하지않는 컬렉션이 필요할 때 사용한다.

LinkedHashSet은 삽입 순서를 유지하고 삽입된 순서대로 요소를 반복해야 할 때 유용하다."

 

생성자가 존재하는 HashSet을 이용해서 Set을 구현

Set<Integer> intSet = new HashSet<>();

→ 선언 방법 

   intSet.add(1);
        intSet.add(12);
        intSet.add(5);
        intSet.add(9);
        intSet.add(1);
        intSet.add(12);

        for (Integer value: intSet) { 
            System.out.println(value);
            
            System.out.println(intSet.contains(2)); // 2가 없기때문에 false.
            System.out.println(intSet.contains(5)); // 5가 있으니까 true.
        }
    }
}

 

 

 

 

향상된 for문으로 value하나하나에 위에 숫자들이 세팅된다.

contains는 포함을 의미한다. 

2가 없기때문에 false가 출력되고, 5는 존재하기 때문에 true가 출력된다. 

 

3) Stack : First In Last Out 

Stack은 바구니같은 밑이 막힌 형태로 생각하면 쉽다. 먼저 들어간 게 가장 나중에 나온다. 

push (넣는기능), peek(조회기능), pop(꺼내는기능) → 주된기능 

 

" 최근 저장된 데이터를 나열하고 싶거나, 데이터의 중복 처리를 막고 싶을 때 사용한다."

Stack<Integer> intStack = new Stack<Integer>(); 

→ 선언 방법

intStack.push(10);
intStack.push(15);
intStack.push(1);

//  다 지워질 때 까지 출력
while(!intStack.isEmpty()) { 
    System.out.println(intStack.pop()); 
}

! 를 넣어준 이유는 while은 반복문으로 true여야 실행되기 때문에 조건에 !를 넣어주고,

isEmpty는 현재 Stack이 비어있는지를 반환해주는거라 !를 넣어주지 않으면 false가 출력되어 실행되지 않는다. 

맨 상단에 있는 걸 빼주기 때문에 1이 빠지는걸 알 수 있다. FILO니까 1 - 15 - 10 순서로 빠진다. 

 

4) Queue : 요소를 보관하도록 설계된 컬렉션. 선입선출 방식으로 요소를 정렬한다 (FIFO), 일반적인 구현: LinkedList

Queue는 빨대처럼 생각하면 쉽다. 가장 먼저 들어간게 먼저 나온다. FIFO( First In First Out)

add(넣는기능), peek(조회기능), poll(꺼내는기능)

생성자가 있는 것만 new키워드로 만들 수 있기때문에 LinkedList를 사용한다. 

Queue<Integer> intQueue = new LinkedList<>();

→ 선언 방법.

 

" Queue는 특정 순서로 요소를 처리해야 할 때 사용한다. 

LinkedList는 요소가 끝에 추가되고 처음부터 효율적으로 제거되는 Queue로 사용할 수 있다."

 

5) Map : key 와 value의 페어가 중요하다. 일반적인 구현 : HashMap, TreeMap, LinkedHashMap 

key 라는 값은 고유해야하고 중복이 허용되지않는다. key가 중복되게 되면 문제가 생긴다. 

각 key는 최대 하나의 값에 매핑될 수 있다. 

 

" Map은 key를 값과 연결해야할 때 사용한다. key를 기반으로 데이터를 저장하고 검색할 수 있다. "

 

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

→ 선언 방법. 

intMap.put("일", 11);
intMap.put("이", 12);
intMap.put("삼", 13); // 중복 key
intMap.put("삼", 14); // 중복 key
intMap.put("삼", 15); // 중복 key
intMap.put("삼", 16); // 중복 key

key값을 세팅하는 메서드 : put 

     // key 값 전체 출력(향상된 for문)
            for (String key: intMap.keySet()) { 
            System.out.println(key);
        }
            // value 값 전체 출력(향상된 for문)
            for (Integer value: intMap.values()) { 
                System.out.println(value);
        }
        System.out.println(intMap.get("삼")); 
    }
}

keySet은 key만 빼서 배열로 만든다. 

values 는 모든 value를 가져와서 배열에 담는다 .

출력 결과.

13,14,15가 나오지 않는 이유는 중복된 key로 마지막 숫자에 덮어쓰기가 되어서 16만 출력이된다 .

그래서 마지막에 "삼"을 출력했을 때, 16 하나만 나오는 걸 볼 수 있다. 

 

" collection을 사용할 때는 import를 꼭 확인해야한다. Window기준으로 collection 이름을 클릭하고 Alt + enter을 하면

import가 되는 걸 볼 수 있다. import를 안 하면 실행이 될 수 없다."

 

😕오늘의 회고 

오늘은 기초테스트가 있던 날인데 나는 논리연산자를 틀려버렸다. TIL로 정리하면서 이젠 완전히 알고있다고 생각했는데, 검토를 하지 못 한게 아쉽다... 컬렉션은 지금 따로 구글링을 해서 알아보고 개념 정리도 종일 했지만, 내일 아니면 모레 계속 내 머릿속에 남아 있을지 확신할 수 없어서 걱정이다.. 2주차부터 진짜 시작이라고 Spring을 공부한다고 하는데 벌써 겁을 집어먹고 많이 힘들어 하는 중이다. 선택과정에서도 3주차는 한번 듣고 4주차는 듣지도 못했기 때문에 기술매니저님의 조언대로 3주차와 4주차를 이해하고 Spring을 들을 수 있도록 하는 것과, 3주차 강의를 들으며 객체지향의 다섯가지 원칙 SOLID에 대해서 알아보고 이해하고 넘어갈 것을 꼭 지킬 예정이다. TIL을 썼지만 딴짓하고싶을때마다 한번씩 들여다봐주기로 했다....😵‍💫 내일은 3주차를 들어야하는데 어려웠던 기억이 강렬해서 집중해서 잘 들어보기를! 

 

추가+)

강의 내용만 듣기보다는 개념을 정리하고, 문제를 풀어보는게 좋다고해서 하루에 한 문제씩은 꼭 풀어보고있다. 

오늘은 백준에서 하나를 풀어봤는데 제출하는 과정에서 계속 컴파일 에러가나서 포기하고싶었다.. 제출방식이 배운것과 조금 다른 느낌이라 이것도 적응하는데 시간이 걸릴 것 같다.