주노 님의 블로그

20240722 본캠프 6일차 TIL 본문

TIL

20240722 본캠프 6일차 TIL

juno0432 2024. 7. 22. 21:24

본캠프 6일차 내용 간단요약

  • 09:00 ~ 09:20 : 프로그래밍 기초 주차 발제
  • 09:20 ~ 09:30 : 팀원 소개 및 일정
  • 09:40 ~ 10:20 : 멤버 카드 작성
  • 10:20 ~ 11:00 : 강의 준비
  • 11:00 ~ 12:00 : 강의
    1주차 1강 ~ 1주차 4강
  • 12:00 ~ 13:00 : 점심시간
  • 13:00 ~ 14:00 : 코드카타
    알고리즘43 : 크기가 작은 부분 , SQL55~57
  • 14:00 ~ 18:00 : 강의
    1주차 7강 ~ 9강, 1주차 과제
    2주차 1강~3강
  • 16:00 ~ 17:00 : 학습법 특강
  • 18:00 ~ 19:00 : 저녁시간
  • 19:00 ~ 22:00 : 강의
    2주차 4강 ~ 16강 + 숙제
  • 22:00 ~ 24:00 : TIL정리
  • 24:00 ~ 01:00 : 3주차 예습

 

오늘 해야할 일✔️ 🔺 ❌

✔️ 코드카타

✔️  프로그래밍 ~ 2주차 강의

✔️ 팀원소개 카드 작성


프로그래밍 기초 주차 발제

더보기

예? 5일만에 제네릭을 배우는데 기초라뇨

  • 팀구성
    팀이 바뀌었다. 프로젝트가 끝나면 다음날에 바뀐다고한다
    아이스 브레이킹의 무덤무덤...!

  • 학습 일정
    1주차 : 강의  주차 (수요일) 개인과제 안내
    2주차 : 개인과제 해설 및 재제출, 팀프로젝트
    3주차 : 개인 과제 피드백 제출

  • 강의
    자바 강의가 지급되었다
    주차 표시가 되어있지만, 최소 팀 프로젝트전에는 끝내놓기..!

  • 밍글데이
    신입생 환영회 같은건가!

  • TIL작성
    발생한 문제, 해결 과정, 느낀점 등등..

  • 튜터님 질문
    강의 질문이아니라, 취업이나, 궁금한점 언제든지 물어봐도 된다.

 


팀원 소개 및 일정 조율

더보기

일정
점심시간 : 12~13
저녁시간 : 18~19

학습 중에 : 모르는게 있을때마다 질문하기
프로젝트 중에

1. 정기 회의시간을 가지는게 좋을것 같다.
2. 프로젝트를 뭔지 확인하고 잡는게 좋을것 같다.

프로젝트 룰
외출 길게 할때 미리 말하기(전날)
모르는게 있으면 서로 물어보기
SLACK DM이나 ZEP으로 물어보기


회의할때는 캠과, 마이크를 키고 회의하고
강의할때는 선택적으로 키자


강의 - 자바문법종합반 1주차

더보기
  • 개발 언어의 역사
    a 언어 : 1960년대에 나온 첫 개발용 언어로써 입, 출력 문맥기능만 구현가능한 언어이다
    b 언어 : 1960년대에 나온 언어로 a언어의 기능과 데이터타입, 연산기능, 메서드를 추가 하였다
    c 언어 :  1970년대에 나온 언어로, b언어의 기능에, 자료형 데이터 타입과, 자료구조를 추가하였다.
    자바 : 1990년대에 나온 언어로, c언어기능에, 클래스와 객체를 추가하였다.

  • 자바는 객체지향 언어이다.

  • 자바를 많이 사용하는 이유
    공통 실행환경(JVM)이 있어서 여러 기기에서 실행 가능하다
    객체지향 언어로 코드 이해 및 유지 보수 용이
    안정성이 높음
    대규모 앱 개발 가능
    다양한 개발 도구와 라이브러리 사용 가능

  • JVM이란?
    Java Virtual Machine의 약자로써, 여러기기에서 Java프로그램이 실행 가능하게 하는 가상 환경.

  • 바이트코드
    내가 만든 코드(.java)가 운영체제가 읽을 수 있는 코드(바이트코드)로 자바 컴파일러가 변환한다.

  • 인터프리터
    운영체제가 읽은 바이트코드를 기계가 실행할 수 있는 기계어로 변환, 인터프리터가 바이트코드를 한줄씩 읽어서 실행함. jit컴파일러와 함께 사용하여 효율성을 높임.

  • 컴파일러
    .java파일을 바이트코드(.class)로 변환한다.

  • 메모리 영역
    jvm이 실행될 수 있게 할당받은 메모리 영역

  • 클래스 로더
    jvm으로 바이트코드를 메모리영역에 담는 역할

  • 가비지 컬렉터
    메모리 영역에서 쓰지 않는 데이터를 주기적으로 정리하여 메모리 누수를 방지한다.

  • 내가 쓴 코드가 실행되는 순서
    코드작성 > 자바 컴파일러가 바이트코드로 변경 > 클래스 로더가 바이트코드를 메모리 영역에 적재 > 자바 인터프리터에서 바이트코드를 한 줄 씩 읽고 실행함 & jit 컴파일러에서 성능을 최적화함 > 런타임 시스템에서 기계어 코드를 실행함 > 운영체제 > 동작

  • JRE
    자바를 실행하기 위해서.

  • JDK
    자바를 개발하기 위해서.

  • 자바 main 메서드에 대한 이해
    자바는 제일 먼저 main메서드를 실횅한다.
    public class Main {
        public static void main(String[] args) {
            System.out.println("Hello world!");
        }
    }

    public class main
    public : 외부에서 실행가능한 접근제어자
    class : 자바에서 클래스를 선언
    main : 클래스 이름

    public static void main(String[] args) {
    static : 바이트 코드로 변환할때 미리 정의되는 메서드, 객체를 생성하지 않고도 호출 가능
    void : 메서드의 반환값을 정의하는곳, 현재는 아무것도 반환하지 않음
    string[] args : 메서드의 매개변수 정의, 프로그램이 실행될때 전달된 인수를 받고있음

    System.out.println("");
    System : 입출력을 제공하는 자바 표준 클래스이다
    out : 클래스
    println : out의 메서드이다.

    입력
    string[] args

    출력
    void

  • print vs println vs printf
    print : 줄 바꿈 없이 문자열 출력
    println : 문자열 출력 후 줄 바꿈
    prinftf : 형식을 지정하여 문자열을 출력한다 %d %s 등.
    문자를 쓸때는 ""로 감싸야한다. 문자를 ""없이 작성하면 변수로 인식한다.

  • 주석
    설명을 달아놓는 기능으로 // /**/을 사용한다.

  • 변수
    변할수 있는 저장공간

  • 상수
    변할 수 없는 저장공간.
    final int NUMBER = 10;
    10이 고정된다.

  • 변수의 선언
    int number;
    값의 타입 - 기본형과 참조형이 있다.

    기본형
    논리형: boolean (true/false)
    문자형: char ('A') - 큰 따옴표 금지
    정수형: byte(-128 ~ 127), short(-32,768 ~ 32,767), int(-21억~21억, 4byte), long(8byte)
    => 허용량을 넘게되면 오버플로우, 언더플로우가 일어나게 된다.
    int와 long의 차이
    int num1=100;
    Long num2 = 200L;


    실수형: float(4byte), double(8byte)
    float는 4byte지만 long보다 더 큰 값을 계산할 수 있다.
    부동소수점 계산 방식으로, 기수부는 움직이지 않고, 지수부가 움직여 계산하는  방식이다.



    참조형 변수
    정수형 : BigInteger(long을 넘어선)
    문자열: String - 문자열 끝에 null문자가 있어, 문자열의 끝을 알 수 있다.


    객체, 배열, 리스트: Object, Array, List
    래퍼 클래스 변수: 기본형 변수를 클래스로 랩핑한 변수 (예: Integer, Double).
    => 기본형 변수를 객체로 다룰 수 있음, list, set, map등 객체로 다룰수 있음.
    박싱 : 기본형 타입을 래퍼 클래스로 변환
    int num = 10;
    Integer numObj = Integer.valueOf(num);

     언박싱 : 래퍼 클래스를 기본형으로 변환
    Integer numObj = Integer.valueOf(10);
    int num = numObj.intValue(); // 언박싱 (Unboxing)


  • 변수에 값 저장하기
    int number = 10;
    number의 변수에 10을 대입한다.
    이후 number =20;을 하면 값은 20으로 바뀐다

  • 아스키 코드표

 

  • 형 변환
    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    
    		int asciiNumber = sc.nextInt();
    		char ch = (char)asciiNumber; // 문자로 형변환을 해주면 숫자에 맞는 문자로 표현됩니다.
            char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기위해 charAt(0) 메서드를 사용합니다.
    		int asciiNumber = (int)letter; // 숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현됩니다.
            
    		System.out.println(ch);
    	}
    
    }
    
    // 입력
    97, a
    
    // 출력
    a, 97
    문자에서 숫자로, 숫자에서 문자로 형 변환을 할때 아스키코드표를 사용한다.
    또는 정수-실수-문자 사이에 일어난다.

    강제 형변환 : 
    Long num1 = 1000L;
    int num2 = (int)num1;

    자동 형변환 :
    byte byteNumber = 10;
    int intNumber = byteNumber;    // byte -> int 형변환
    System.out.println(intNumber); // 10
    
    char charAlphabet = 'A';
    intNumber = charAlphabet;   // char -> int 형변환
    System.out.println(intNumber); // A의 유니코드 : 65
    
    intNumber = 100;
    long longNumber = intNumber; // int -> number 형변환
    System.out.println(longNumber); // 100
    
    intNumber = 200;
    double doubleNumber = intNumber; // int -> double 형변환
    System.out.println(doubleNumber); // 200.0  (소수점이 추가된 실수출력)

    작은타입 크기에서 큰 크기의 타입으로 저장할때 형변환이 되는것을 볼 수 있다.

  • 기본형과 참조형의 차이점
    기본형 변수
    스택 영역에 저장한다, 변수 자체가 원본값을 담고 있으며, 정적으로 할당된다, 즉 변수 선언시 크기가 고정이된다.

    참조형 변수
    변수 자체는 스택영역에 저장되지만, 실제 객체는 힙 영역에 저장된다.
    참조형 변수는 객체의 메모리 주소를 참조하며, 객체 생성시점에 필요한 만큼 메모리가 할당된다.

  • 입력 및 출력
    입력 : 기본적으로 Scanner.in 객체의 next() 명령을 사용해서 입력받는다
    출력 : System.out 객체의 println()명령어를 사용해서 출력받는다

 


학습법 특강

더보기

TIL 등 작성이 중요한 이유

  • 문제의 실마리를 찾는데 도움이 된다
  • 채용자의 입장에서 꾸준하게 남겨놓은 자료가 좋을 수 있다
    성실성, 문제해결과정을 파악할 수 있다

프로젝트 기간때의 학습법

  • 어떤 프로젝트를 진행하려고 했고 어떤부분을 구현하기 위해서 어떤부분을 고려했으며 어떻게 진행했다를 서술

회사 인재상

  • 기술적인요구사항은 기본이지만, 자질과 성향도 본다.
  • 성장가능성이 있는사람, 다른사람과 협업하며 좋은 결과를 이끌어 낼 수 있는 사람.

기술적 고민을 잘 하려면

  • 로직과 코드에 대한 의도를 생각하기
    구현하는 기술, 스택에 목적과 근거 가지기
    더 좋은 방법이 있는지 고민하기.

협업을 잘하는법

  • 말예쁘게 하기 - 튜터님의 코드 피드백 말투를 보고 배워라
  • 전달하고자 하는 바를 명확하게 말하기
  • 데이터 또는 기술적인 근거를 바탕으로 소통하기

공부하는법

  • 원격 강의 : 개념과 구조 이해 > 이해한 부분 직접 구현하기
  • 실시간 강의 : 완전히 이해하지 못하더라도 집중해서 듣기 > 녹화본으로 복습하기
  • 과제 : 과제의 목적은 배운 내용 복습 및 구현 연습, 완성하지 못했더라도 정해진 시간에 제출 후, 피드백을 받고 부족한 부분 채우기
  • 적극적으로 질문하고, 도움주기

챗지피티

  • 고민을 바탕으로 한 코드 구현 > 

 


강의 - 자바문법종합반 2주차

더보기

연산자

  • 산술 연산자
    +(덧셈),  - (뺄셈),  *(곱셈),  /(나눗셈/몫),  % (나눗셈/나머지), <<(왼쪽으로 한비트), >>(오른쪽으로 한 비트)

  • 비교 연산자
    > (크다) , < (작다), >= (크거나 같다), <= (작거나 같다), == (같다), != (다르다)

  • 논리 연산자
    &&(모든게 참일때), ||(하나라도 참이면 참), !(피연산자의 반대 값)

  • 대입연산자
    =
    +=(A=A+B) , -=(A=A-B) , *=(A=A*B) , /=(A=A/B) , %=(a=A%B)

    ++A : 연산 전에 피연산자에 1을 더해줌
    val = ++num; 
    num값+1 후에 val변수에 저장

    A++ : 연산 후에 피연산자에 1을 더해줌 
    val = num++;
    num값을 val변수에 저장 후 num+1

    --A : 연산 전에 피연산자에서 1을 빼줌
    A-- : 연산 후에 피연산자에서 1을 빼줌

  • 기타 연산자
    삼항 연산자 : 조건 ? 참일때 : 거짓일때
    instance of : 검사할객체명 instance of 검사할 클래스명
    검사할 객체가 클래스의 인스턴스인 경우. 

  • 연산자 우선순위
    우선순위가 높은 순서대로 먼저 연산을 수행한다.

  • 비트연산
    1바이트는  8비트이다.
    비트는 0과 1로만 값을 저장하며 비트연산이 가장 빠르다
    << : 왼쪽으로 시프트 1101 << 1 이라면 11010 이렇게 민것과 같다
    >> : 오른쪽으로 시프트 1101 >> 1 이라면 110 이렇게 민것과 같다.
    // 비트 연산
    
    // 참고, 3의 이진수값은 11(2) 입니다. 12의 이진수값은 1100(2) 입니다.
    // (2) 표기는 이 숫자가 이진수값이라는 표식 입니다.
    
    System.out.println(3 << 2); 
    // 3의 이진수값인 11(2) 에서 왼쪽으로 2번 옮겨져서 1100(2) 인 12값이 됩니다.
    
    
    System.out.println(3 >> 1); 
    // 3의 이진수값인 11(2) 에서 오른쪽으로 1번 옮겨져서 1(2) 인 1 값이 됩니다.
    2진수와 같기때문에 왼쪽으로 시프트한것은 원 값에 두배를 한것과 같으며
    오른쪽으로 시프트한것은 /2를 한것과 같다.

  • 조건문 (if)
    특정 조건에 따라 연산을 수행하고 싶을때 사용한다
    if (조건1) {조건을 만족할때}
    else if (조건2) {조건 1을 만 족하진 않지만, 조건2를 만족할때)
    else {그 외}
    () 안에 들어가는 조건은 true와 false로 나눠져야한다.
    if else if else 하나만으로 끝나지 않는 조건이 있을 수 있다.
    그럴때는 아래와 같이 중첩 조건문을 사용한다
    // 중첩 조건문
    boolean flag = true;
    int number = 2;
    
    if (flag) {
    	if (number == 1) {
    		 System.out.println("flag 값은 true, number 값은 1 입니다."); // 미출력
      } else if (number == 2) {
    		 System.out.println("flag 값은 true, number 값은 2 입니다."); // flag 값은 true, number 값은 2 입니다. 출력
    	}
    } else {
    	if (number == 1) {
    		 System.out.println("flag 값은 false, number 값은 1 입니다."); // 미출력
      } else if (number == 2) {
    		 System.out.println("flag 값은 false, number 값은 2 입니다."); // 미출력
    	}
    }


  •  조건문 (switch ~ case문)
    피연산자(변수)가 case 조건을 만족했을때 연산을 해당하는 연산을 수행한다.
    각 case의 끝에는 break를 적어줘야한다.
    switch문의 마지막에는 아무것도 만족하지 않을때 수행하는 defalut가 있으며 생략해도 된다.
    switch (변수명) {
    case 값 : 연산; 
    break;
    default : 연산;
    }


  • if와 switch의 차이
    if :  복합 조건을 지원한다, 상대적으로 코드 중복이 많다.
    switch : 하나의 피연산자에만 대응한다, 코드 중복이 적다.

 

반복문

  • for문
    //for(초기값, 조건문, 증가연산) {연산}
    
    for(int i=0; i < 4; i++) { // 변수 i 값은 0 ~ 3 까지 반복
        System.out.println(i + "번째 출력"); // i 변수와 문자열 합치기
    }
    조건에 만족할때까지 반복한다.

  • 향상된 for문 (for-each문)
    //for(변수 타입 변수 명 : 배열) {연산}
    
    int[] numbers = {3,6,9,12,15};
    for(int number: numbers) {
        System.out.print(number + " "); 
    }
    
    // 출력
    3 6 9 12 15
    for-each문은 배열의 첫번째 요소부터 마지막 요소까지 순차적으로 접근하며, 배열의 각 요소를 순차적으로 담기 위한 변수 number에 각 요소가 대입되어, 코드가 실행된다.

  •  
  • while문
    for문처럼 사용되지만, 얼마나 반복될지 모를때 사용한다.
    한번 반복할때마다 조건을 체크해 조건문이 불만족이면 반복을 중단한다
    (조건문) {연산}


  • do {연산} while(조건문)
    최초 1회 연산후 while과 같은 기능을 한다.

  • break
    break;를 사용하면 가장 가까운 블럭의 for문 또는 while문을 중단한다.
    // break 명령
    
    int number = 0;
    while(number < 3) {
    		number++;
    		if (number == 2) {
    			break;  // 2일때 반복 중단
    		}
        System.out.println(number + "출력"); 
    }
    
    // 출력
    1출력

    break outer; 같이 레이블을 지정하여 특정 반복문을 종료 할 수 있다

    public class Main {
        public static void main(String[] args) {
            // 레이블 정의
            outer: // 이 레이블은 바깥쪽 for문을 나타냄
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    System.out.println("i: " + i + ", j: " + j);
                    if (i == 2 && j == 2) {
                        break outer; // 레이블을 사용하여 바깥쪽 for문을 종료
                    }
                }
            }
            System.out.println("프로그램 종료");
        }
    }


  • continue
    반복문에서 해당 순서를 패스하고싶을때 사용된다.
    // continue 명령
    
    int number = 0;
    while(number < 3) {
    		number++;
    		if (number == 2) {
    			continue;  // 2일때 다음 sout을 출력하지 않고 다시 4로 올라간다.
    		}
        System.out.println(number + "출력"); 
    }
    
    // 출력
    1출력
    3출력


배열

  • 배열 선언 및 생성
    배열은 여러개 값을 하나의 변수에 저장할 수 있다

    타입 [] 변수명 ;이 가능하다
    int [] arr = new int[배열길이];

    배열은 객체이기 때문에 new 키워드를 사용하여 메모리를 할당하여야 한다.

    또한 배열은 0부터 시작하기때문에 [8]을 적으면 0~7까지 할당된다.

    객체는 참조형 변수기때문에 실제값을 담은게 아니라 실제 값의 주소값을 가지고 있는다.
    int는 이렇게 스택영역에 해당하는 값 5를 저장하고 있지만,
    참조형 변수는 스택영역에 arr의 진짜 값이 있는 주소 만 보관하고, heap영역에 실제 배열의 값이 저장되어있는것을 볼 수 있다.



  • 배열 조회
    arr[1] >> arr배열의 두번째 위치를 조회한다.

    for(int i=0; i<intArray.length; i++) { // .length 는 배열의 길이
    	System.out.println(intArray[i]);
    }

    for문을 사용하여 배열의 모든 부분을 조회할 수 있다


  • 배열 메서드
    .length() : 배열의 길이를 반환한다.
    Arrays.fill(바꿀배열, 초기화할 값) : 배열을 특정 값으로 초기화한다.

  • 얕은복사 깊은복사
    배열은 특정 값을 저장하고 있는것이 아니라. 그 주소값을 저장하고 있다.

    얕은 복사
    대입 연산자(=)를 사용한다면, 
    // 얕은 복사
    
    int[] a = { 1, 2, 3, 4 };
    int[] b = a; // 얕은 복사
    
    b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
    
    System.out.println(a[0]); // 출력 3  <- a 배열의 0번째 순번값도 3으로 조회됩니다.

    b=a를 하게되면 a의 주소를 복사해온다.
    즉 a와 b의 주소가 같아지게 되어 b의 값을 변경하여도 같은 주소를 공유하기 때문에 a의 값이 변경되는것이다.

    깊은복사
    a와 b를 전혀 다른 객체로 보게 하는것이다
    // 깊은 복사
    
    int[] a = { 1, 2, 3, 4 };
    int[] b = new int[a.length]; 
    
    for (int i = 0; i < a.length; i++) {
        b[i] = a[i]; // 깊은 복사
    }
    
    b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
    
    System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.

    b에 새로운 객체를 생성 후
    a의 값을 b에 대입하는것이다.

    또는 .clone()가 있다.
    // 깊은 복사 메서드
    
    // 1. clone() 메서드
    int[] a = { 1, 2, 3, 4 };
    int[] b = a.clone(); // 가장 간단한 방법입니다. 
    // 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!
    2차원 배열 이상에서는 얕은복사형식으로 동작한다.

  • n차원 배열
    배열의 배열 형태이며, 기본적으로 2차원배열은 행과 열로 이루어진다.
    // 1차원 배열
    [1, 2, 3]
    
    //1차원 배열의 접근방법
    for (int i = 0; i < array1D.length; i++) {
       System.out.print(array1D[i] + " ");
    }
    // 2차원 배열
    [
      [1, 2],
      [3, 4],
      [5, 6]
    ]
    
    //2차원 배열의 접근방법
    
            for (int i = 0; i < array2D.length; i++) {
                for (int j = 0; j < array2D[i].length; j++) {
                    System.out.print(array2D[i][j] + " ");
                }
                System.out.println();
            }
    //3차원 배열
    [
      [
        [1, 2],
        [3, 4]
      ],
      [
        [5, 6],
        [7, 8]
      ]
    ]
    //3차원 배열의 접근방법
     for (int i = 0; i < array3D.length; i++) {
                for (int j = 0; j < array3D[i].length; j++) {
                    for (int k = 0; k < array3D[i][j].length; k++) {
                        System.out.print(array3D[i][j][k] + " ");
                    }
                    System.out.println();
                }
                System.out.println();
            }
     2차원 초과 배열은 차원 배열은 딥러닝 빼고는 잘 본적이 없는것 같다.

컬렉션

  • 참조형 데이터를 더 효과적으로 처리할 수 있다.
    크기 자동 조정/ 추가/ 수정/ 삭제/ 반복/ 순회/ 필터/ 포함 확인등.

  • 컬렉션의 종류
    LIST : 순서가 있으며 중복 허용
    QUEUE : FIFO방식
    SET : 순서가 없으며, 중복을 불허함.
    MAP : 순서가 없는 키와 밸류쌍으로 이루어짐, 키값은 중복 불허.

  • 컬렉션의 특징
    int가 아닌 Intege
    long가 아닌 Long
    double가 아닌 Double
    처럼 앞글자가 대문자이고, 풀네임이면 참조형 변수이다.

List

  • ArrayList - 배열처럼 데이터를 저장하고 조회함

    그냥 Array와 다른점
    Array는 미리 값을 할당받아 생성되어 고정되는것인 정적배열이며, 값을 초과하면 오류가 생긴다.
    ArrayList는 미리 값을 할당받지않고, 값이 초과하면 더큰 공간을 할당받고 기존 요소를 복사한다.

  • ArrayList 의 사용법
    선언 및 생성 : ArrayList<Integer> intList = new ArrayList<Integer>();
    .add(추가할 값) : 마지막에 값을 추가한다
    .set(인덱스, 수정할 값) : 해당 위치의 값을 수정할 값으로 변경한다.
    .remove(인덱스): 해당 위치의 값을 삭제한다
    >> 해당 위치의 값을 삭제하고, 뒤에 있는 배열을 한칸씩 옮겨야한다, O(n)이 걸리게 된다.

  • LinkedList
    ArrayList는 배열을 한곳에 모아놓는다면, LinkedList는 여러 주소에 저장한 후, 조회하는 방식이다.
    따라서 ArrayList는 배열을 한곳에 모아놓는다면, LinkedList는 여러 주소에 저장한 후, 조회하는 방식이다.
    따라서 조회에는 배열의 주소를 따라가야해서 조금 오래걸리지만, 추가와 삭제에는 해당 위치의 노드를 제거후, 바꿀 노드를 추가하거나, 해당 위치의 노드를 제거 후, 그 다음 위치와 연결하면 되기때문에 추가 삭제는 빠른편이다.

    선언 및 생성 LinkedList<Integer> linkedList =new LinkedList<Integer>() 
    값 추가 : linkedList.add(값)
    값 중간에 추가 : linkedList.add(인덱스, 값) 인덱스 위치에 값을 추가한다.
    값 수정 : linkedList.set(인덱스, 수정할 값) 인덱스 위치에 값을 수정할 값으로 변경한다.
    값 삭제 : linkedList.remove(인덱스) 인덱스 위치의 값을 삭제한다. 
    전체 출력 : linkedList.toString() 형태로 전체 값을 대괄호[]로 묶어서 출력한다.
    전체 제거 : linkedList.clear() 전체 값을 삭제한다.

Stack

  • Last-In-First-out으로 뷔페 접시로 생각하면 편하다
    위에 있는 접시가 가장 늦게 쌓였지만, 사람들은 가장 늦게쌓인것만 가져간다. (난 중간거 가져가긴함)
    그렇기때문에 push(마지막 추가). pop(마지막 제거), peek(마지막 조회)만 가능하다.

    선언 및 생성  : Stack<Integer> intStack = new Stack<Integer>();
    추가 : intStack.push(값) 마지막에 값을 추가한다.
    조회 : intStack.peek() 마지막 값을 조회한다.
    꺼내기 : intStack.pop() 마지막 값을 꺼낸다.

Queue

  • 스택과 반대로 먼저 들어온게 먼저 나가는것이다 줄서기를 생각하면 된다
    먼저 줄선사람이 먼저 놀이기구를 탈 수 있다 (에버랜드 플랜잇 제외)
    그렇기때문에 add(마지막에 추가), 조회(처음값 조회), poll(처음값 꺼내기)만 가능하다

    선언 및 생성 : Queue<Integer> intQueue = new LinkedList<Integer>();
    추가 : intQueue.add(값) 맨 마지막에 값을 추가한다. 
    조회 : intQueue.peek() 맨 처음 값을 조회한다
    꺼내기 : intQueue.poll() 맨 처음 값을 삭제한다

Set

  • 중복을 허용하지않고, 순서를 허용하지않는 값을 입력할때 쓴다.
    알고리즘에서는 중복제거후 수 세기 등으로 사용한다.

    선언 및 생성 : Set<Integer> = new HashSet<Integer>();
    추가 : intSet.add(값) 값을 마지막에 추가한다
    삭제 : intSet.remove(값) 해당 값을 삭제한다. !! 위치가 아님
    포함 확인 : intSet.contains(값) 해당 값이 포함되었는지 boolean으로 응답을 해준다.

Map

  • json 형식처럼 key와 value 한쌍으로 이루어진다.

    선언 및 생성 : Map<String, Integer> = new HashMap<>();  키값은 string으로 value값은 int로 입력을 받는다
    추가 : intMap.put({추가할 Key값},{추가할 Value값}) 
    조회 : intMap.get({조회할 Key값}) 해당 키에있는 value를 조회한다
    전체 key 조회 : intMap.keySet() 전체 키값을 조회한다
    전체 value 조회 : intMap.values() 전체 value를 조회한다.
    삭제 : intMap.remove({삭제할 Key값}) 해당 키에있는 value를 삭제한다.

과제

  •  
    자료구조 요리 레시피 메모장 만들기
     
    입력값
     
    저장할 자료구조명을 입력합니다. (List / Set / Map)
     
    내가 좋아하는 요리 제목을 먼저 입력합니다.
     
    이어서 내가 좋아하는 요리 레시피를 한 문장씩 입력합니다.
     
    입력을 마쳤으면 마지막에 “끝” 문자를 입력합니다.
     
    출력값
     
    입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력해 줍니다.
     
    이어서, 입력한 모든 문장 앞에 번호를 붙여서 입력 순서에 맞게 모두 출력해 줍니다.
     
    입력
    Set
    백종원 돼지고기 김치찌개 만들기
    돼지고기는 핏물을 빼주세요.
    잘익은 김치 한포기를 꺼내서 잘라주세요.
    냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
    다진마늘 한스푼, 설탕 한스푼 넣어주세요.
    종이컵으로 물 8컵 부어서 센불에 끓여주세요.
    핏물 뺀 돼지고기를 넣어주세요.
    된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
    간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
    중불로 줄여서 오래 끓여주세요~!!
    마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^
     
    출력
     
    [ Set 으로 저장된 백종원 돼지고기 김치찌개 만들기 ]
    1. 돼지고기는 핏물을 빼주세요.
    2. 잘익은 김치 한포기를 꺼내서 잘라주세요.
    3. 냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
    4. 다진마늘 한스푼, 설탕 한스푼 넣어주세요.
    5. 종이컵으로 물 8컵 부어서 센불에 끓여주세요.
    6. 핏물 뺀 돼지고기를 넣어주세요.
    7. 된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
    8. 간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
    9. 중불로 줄여서 오래 끓여주세요~!!
    10. 마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^
    package week2;
    
    import java.util.*;
    
    public class work {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            //변수 선언
            String cmd = sc.next();
            sc.nextLine();
            String input = "";
            String end = "끝";
    
            //switch문으로 분기
            switch (cmd) {
                //List라고 입력했을때
                case "List":
                    //ArrayList를 사용한다
                    ArrayList<String> list = new ArrayList();
                    //끝이 입력되기 전까지.
                    while (!input.equals(end)) {
                        input = sc.nextLine();
                        if (!input.equals(end)) {
                            list.add(input);
                        }
                    }
                    //첫 값 출력
                    System.out.println("[ " + cmd + "로 저장된 " + list.get(0) + " ]");
    
                    //두번째부터의 값 출력
                    for (int i = 1; i < list.size(); i++) {
                        System.out.println(i + ". " + list.get(i));
                    }
                    break;
                //set으로 입력하였을때
                case "Set":
                    //순서를 보장하는 linkedhashset을 사용한다
                    LinkedHashSet<String> set = new LinkedHashSet<>();
                    //끝이 입력될 때 까지
                    while (!input.equals(end)) {
                        input = sc.nextLine();
                        if (!input.equals(end)) {
                            set.add(input);
                        }
                    }
                    //iterator를 사용하여 순서대로 순회한다.
                    Iterator<String> iterator = set.iterator();
                    //첫 값 출력
                    System.out.println("[ " + cmd + "으로 저장된 " + iterator.next() + " ]");
    
                    //출력한다.
                    for (int i = 1; i < set.size(); i++) {
                        System.out.println(i + ". " + iterator.next());
                    }
                    break;
    
                //map으로 입력하였을때
                case "Map":
                    //hashmap을 사용한다.
                    HashMap<Integer, String> map = new HashMap<>();
                    //키값을 저장하기위한 변수
                    int mapIndex = 1;
    
                    //끝을 입력할때까지 입력받는다.
                    while (!input.equals(end)) {
                        input = sc.nextLine();
                        if (!input.equals(end)) {
                            map.put(mapIndex++, input);
                        }
                    }
                    //첫값 출력
                    System.out.println("[ " + cmd + "으로 저장된 " + map.get(1) + " ]");
    
                    //출력한다.
                    for (int i = 2; i <= map.size(); i++) {
                        System.out.println(i - 1 + ". " + map.get(i));
                    }
                    break;
                //다른값을 입력받았을때는 취소된다.
                default:
                    System.out.println("다시 입력해 주세요");
                    break;
            }
        }
    }

    list는 순서를 보장하기때문에 get을 이용하여 뽑아내고

    set은 순서를 보장하지 않지만, 입력된 순서를 유지 할 수 있는 linkedSet을 사용한다.
    순서를 보장하지 않기때문에 인덱스로 요소의 접근이 불가능하고, 컬렉션의 요소를 하나씩 접근할 수 있는 Iterator를 사용한다.
    next()로 요소를 순차적으로 접근 할 수 있는데
    LinkedSet 또한 다음값과 노드로 연결되어있기때문에 가능한것이다.

    Map은 키값을 정의하기위해 증감연산자를 사용하였다.

 

 

 

오늘의 회고

오늘 배운 내용이 쉬운 내용들이라 엄청나게 til이 길어지고, 더러워졌는데 따로 뽑아서 주말에 꼭 하나 따로 써야겠다..

정리하면서 조회, 삭제의 시간복잡도도 떠오르는 거보니 다시 한번 조사해봐야겠다..
주말에 할일이 많겠구만..

 

10시간 몰입했는가?

7시간 정도는 til적는다고 몰입했는듯..

 

찾아볼 내용

자료구조 시간복잡도! (주말까지)

 

내일 해야할 일

 

'TIL' 카테고리의 다른 글

20240724 본캠프 8일차 TIL  (0) 2024.07.24
20240723 본캠프 7일차 TIL  (0) 2024.07.23
20240719 본캠프 5일차 TIL  (0) 2024.07.19
20240718 본캠프 4일차 TIL  (0) 2024.07.18
20240717 본캠프 3일차 TIL  (0) 2024.07.17