231012 Java 문법 종합반 chapter2

MJ·2023년 10월 13일

Java 문법 종합반

목록 보기
2/5

[학습목표]
1. 다양한 연산자에 대해서 학습하고 사용방법을 익힙니다.
2. 조건문과 반복문을 통해 프로그램의 문맥을 구성하는 방법을 배웁니다.
3. 배열로 연속된 데이터들을 효율적으로 저장하고 관리하는 방법을 배웁니다.
4. 다차원 배열로 좀더 복잡한 데이터를 저장하고 관리하는 방법을 배웁니다.
5. 컬렉션으로 연속된 데이터들을 더욱 효율적으로 저장하고 관리하는 방법을 배웁니다.
6. 여러 컬렉션들의 기능을 익히고 적절하게 사용하는 방법을 배웁니다.

1.연산자

(종류)
1.산술연산자 : + - * / % << >>
2.비교연산자 : > < >= <= == !=
3.논리연산자: && || !
4.대입연산자:
(기본대입) =
(복합대입 연산자)+= -= /= %=
(대입증감 연산자) ++ --
5.기타연산자:
형변환 연산자:(type),
삼항 연산자: (조건) ? (참결과) : (거짓결과)>,
instance of
:피연산자가 조건에 명시된 클래스의 객체인지 비교하여 참/거짓을 응답해주는 연산자

연산자 우선순위 : 산술 > 비교 > 논리 > 대입

*괄호로 감싸주면 괄호안의 연산이 최우선순위로 계산됩니다.

산술변환

연산 전에 피연산자의 타입을 일치(큰 타입으로 일치)

비트연산

컴퓨터의 가장작은 단위인 Bit이기 때문에 연산중에서 Bit 연산이 제일 빠릅니다.

<자리수 옮기기>

  • 자리수를 왼쪽으로 옮기는 횟수만큼 2의 배수로 곱셈이 연산되는것과 동일합니다.
  • 자리수를 오른쪽으로 옮기는 횟수만큼 2의 배수로 나눗셈이 연산되는것과 동일합니다.

3<< 2 = 12 11 -> 1100
3>> 1 = 1 11 -> 01

'>>' 비트 오른쪽으로 이동(부호 유지)
'>>>' 비트 오른쪽이동, 새로운 비트는 전부 0

2.문맥만들기(조건문과 반복문)

조건문

if
switch/case

차이점1. 복합조건

  • if 문은 복합조건을 지원합니다.
    • 복합조건 : 괄호()안에 조건 여러개를 지정하여 조건문을 수행할 수 있습니다.
  • switch 문은 피연산자 한개에 대한 조건만 지원합니다.
    차이점2. 코드중복
  • if 문은 상대적으로 코드중복이 많습니다.
  • switch 문은 코드중복이 적습니다.

반복문

while
for
do while

break,contunue

3.배열

선언 & 생성

배열은 한번에 많은 양의 데이터를 다루거나 계산할때 사용합니다
<선언>
int[] arr;
int arr[];

<생성>

//배열 생성후 초기화하면 배열의 주소가 할당된다.
int[] intArray = new int[3]; // 초기값 {0,0,0}
boolean[] boolArray = new boolean[3]; // 초기값 {false, false, false}
String[] stringArray = new String[3]; // 초기값 {"","",""}
		
//배열 선언만 해놓고 나중에 초기화를 시킬수도 있다.
int[] intArray2;
intArray2 = new int[3]; // 초기값 {0,0,0}

배열생성시 초기값으로 채워짐 int 는 0, boolean 은 false, String 은 null 값과 같은 초기값이 정해져 있습니다.

<초기화>
1.{}로 초기화
2.for문으로
3.Arrays.fill 메소드
Arrays.fill(intArray, 1);

얕은복사, 깊은복사

int a=4;
int b=a;
참조형 주소값은 저장

  • 얕은 복사: 주소값만 복사되고 실제값은 1개로 유지
    (복사본 바꾸면 원본 값도 바뀜)
  • 깊은 복사: for문으로 하나씩 꺼내서 복사/메소드 사용

int[] a={1,2,3,4};
int[] b=a.clone();//내용 복사, 주소는 다른 값을 가져옴
** 2차원 이상에서는 얕은 복사로 동작!

복사 후 내용 변경해도 이상 없음

=>Arrays.copyOf(a,a.length);//깊은복사 메소드

String배열

char 보다 String 많이 사용(기능이 많아서)
wrapper class와 비슷->기본형 변수 기능X->다양한 기능ㅇㄹ 제공하는 Wrapper을 감쌈으로써, 추가기능더함

str.substring(0, 3); // 0~2순번까지 자르기 합니다. (3순번은 제외)
String str = new String(charArr);//문자배열(char[]) 을 받아서 String으로 복사해서 반환한다.

4.다차원배열

가변배열:2차원배열 생성시 열의 길이 생략하여 행마다 다른 길이의 배열요소 저장

	int[][] array = new int[3][];
	//배열 원소마다 다른 크기로 지정가능
    array[0]= new int[2];
	array[1] = new int[4];
	array[2]= new int[1];
    
    // 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
	int[][] array2 = {
    {10, 20},
    {10, 20, 30, 40},
    {10}

};

3차원배열
int[][][] MultiArray = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};

5.컬렉션(참조형자료구조)

배열을 더 고도화시킨 것
List/Set/Queue/Map

  • List : 순서가 있는 데이터의 집합 (데이터 중복 허용) - 배열과 비슷
  • Queue : 빨대처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합
    • First In First Out : 먼저들어간 순서대로 값을 조회할 수 있다.
  • Set : 순서가 없는 데이터의 집합 (데이터 중복 허용 안함) - 순서없고 중복없는 배열
  • Map : 순서가 없는 (Key,Value) 쌍으로 이루어진 데이터의 집합 (Key값 중복 허용 안함)

기본형 변수가 아닌 참조형 변수를 저장합니다!(Integer,Long,Double,String)

*공통적으로 길이는 .size() 사용!!

List

  • 순서가 있는 데이터의 집합 (데이터 중복 허용) - Array(정적 배열,최초 길이 알아야함)과 비슷
  • 동적배열: 참조형변수저장, 크기가 가변적으로 늘어난다.
  • 처음에 길이를 몰라도 만들 수 있음.
  • 생성 시점에 작은 연속된 공간을 요청해서 참조형 변수를 담아놓는다.
  • 값이 추가될 떄 더 큰 공간이 필요하면 더 큰 공간을 받아서 저장하니깐 상관없다.

1.ArrayList

  • 일렬로 데이터를 저장하고 조회하여 순번값(인덱스)로 값을 하나씩 조회할 수 있습니다.
ArrayList<Integer> intList = new ArrayList<Integer>();//선언 생성
 intList.add();//끝에다 추가
 intList.set(index,);//수정
 intList.get(index);//조회
 intList.remove(index);//인덱스값 삭제
 intList.toString();//전체 값 [] 묶어서 출력
 intList.clear();//전체 값 삭제

2.LinkedList

  • 메모리에 남는 공간을 요청해서 여기저기 나누어서 실제값을 담아놓고, 실제값이 있는 주소값으로 목록을 구성하고 저장합니다.
  • 기본적인 기능은 ArrayList 와 동일하지만 LinkedList 는 값을 나누어 담기 때문에 모든값을 조회하는 속도가 느립니다. 대신에, 값을 중간에 추가하거나 삭제할때는 속도가 빠릅니다.
      LinkedList<Integer> linkedList = new LinkedList<Integer>(); //선언 + 생성
    linkedList.add();//끝에다 추가
    linkedList.add(index,);//중간에 추가
    linkedList.set(index,);//수정
    intList.get(index);//조회->ArrayList보다 속도가 현저히 느리다.
    linkedList.remove(index);//삭제
    linkedListt.toString();//전체 값 [] 묶어서 출력
    linkedList.clear();//전체 값 삭제

3.Stack(FILO)

  • 수시로 값을 쌓아놓고, 넣었다가 뺀다.FILO(bassket)
  • 최근 저장된 데이터를 나열하고 싶거나, 데이터의 중복 처리를 막고 싶을 때 사용
  Stack<Integer> stack = new Stack<Integer>();//선언 및 생성
  stack.push();//추가
  stack.peek();//젤 위에 값
  stack.isEmpty();//true,false 비어있는지 확인
  stack.pop();//위에꺼 꺼내기(젤 위에값 반환)

Queue(FIFO-원판)

생성자가 없는 껍데기(인터페이스)

Queue 가 부모/ LinkedList 가 자식

Queue queue = new LinkedList<>();

new 키워드가 가능한것->생성자 존재

큐는 항상 첫 번재 저장된 데이터를 삭제하므로, ArrayList와 같은 배열 기반의 자료구조를 사용하게 되면 빈공간을 채우기 위해서 데이터의 복사가 발생하므로 매우 비효율적입니다.
그래서 Queue는 ArrayList보다 데이터의 추가/삭제가 쉬운 LinkedList로 구현하는 것이 적합합니다.

Deque(양쪽에서 삽입,삭제 가능)
선언하려면 new Deque()로 선언이 안 됩니다
Deque대신 new ArrayDeque(), new LinkedList() 등으로 선언을 해줘야합니다

  • add vs offer() //추가
    queue.add(값);//큐가 꽉찬경우 예외발생
    queue.offer(값);//큐가 꽉찬경우 false리턴

  • element() vs peek() // 조회
    queue.element();// 큐가 비어 있는 경우 NoSuchElementException 에러 발생
    queue.peek();// 비어있는 경우 null 반환

  • remove() vs poll() // 삭제
    queue.remove();// 큐가 비어 있는 경우 NoSuchElementException 에러 발생
    queue.poll();// 큐가 비어 있을 경우 null 반환

    Set

  • 순서X 중복X

  • HashSet(빠르고 순서X)/ TreeSet(정렬된 순서로 보관,정렬방법 지정)/ LinkedHashSet(삽입된 순서)

  • Set은 생성자가 없는 껍데기(인터페이스)라서 바로 생성X

  • 생성자가 존재하는 클래스인 HashSet 사용해 생성가능

    Set<Integer> set = new HashSet<>();
    set.add();//추가
    
    //조회
    //iteraor 사용
    Iterator<Integer> ite = set.iterator();
        while (ite.hasNext()) {
            String text = ite.next();
            System.out.println(text);
        }
    
    
    //for사용
    for(Integer value : set) {
    				System.out.println(value);
    		}
    
    set.remove();//삭제(순서 없으므로)
    set.contains();//true/false 리턴 존재하는지 확인

Map

순서가 없는 (Key,Value) 쌍으로 이루어진 데이터의 집합 (Key값 중복 허용 안함)

map전체 출력 방법

  • LinkedHashMap : 입력된 순서대로 정렬

  • HashMap : 중복을 허용하지 않고 순서를 보장하지 않음 , 키와 값으로 null`이 허용(지멋대로 정렬)

  • TreeMap : key 값을 기준으로 정렬을 할 수 있습니다. 다만, 저장시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래 걸림

    Map<String, Integer> intMap =new HashMap<>();
    map.put(key,value);//삽입,중복된 키 생략됨,**최신 값으로 갱신**
    map.get(key)//값 리턴
    map.getOrDefault(key,defalut값);//값이 없으면 defalut값을 반환
    
    map.keySet();//키의 집합
    map.values();//값의 집합
    map.entrySet();//엔트리(키,값)의 집합
    
    map.remove(key);//키에 있는 값 삭제
    ``
    

length vs length() vs size()
1. length

  • 배열의 길이를 조회
    2. length()
    문자열의 길이를 조회
    3. size()
    -컬렉션 타입목록의 길이를 조회

**기억해야할 것

Arrays.toString(a);//배열 전체를 문자열로 표현
Arrays.copyOf(a,a.length)//깊은 복사 메소드
Arrays.fill(intArray, 1);//배열 모든값을 1로초기화
String str = new String(charArr);//문자배열(char[]) 을 받아서 String으로 복사해서 반환한다.

숙제(메소드 사용해 깔끔하게 구현)

import java.util.*;

public class Main {
  static ArrayList<String> list = new ArrayList<String>();
  static LinkedHashSet<String> set = new LinkedHashSet<>();//순서가 보장된 set
  static HashMap<Integer, String> map = new HashMap<>();
  static Scanner sc = new Scanner(System.in);

  public static void main(String[] args) {

      //입력값 저장할 자료구조명을 입력합니다. (List / Set / Map)
      String structure = sc.nextLine();
      //요리 제목을 먼저 입력합니다.
      String title = sc.nextLine();
      //내가 좋아하는 요리 레시피를 한문장씩 입력합니다.


      switch (structure) {
          case "List":
              InputList();
              break;
          case "Set":
              InputSet();
              break;
          case "Map":
              InputMap();
              break;
          default:
              System.out.println("저장할 수 없는 자료구조 입니다.");
              return;//바로 종료
            //  main(new String[]{"sss"}); //다시 시작(실패한 것도 같이 출력되더라)
      }

      //출력값
      //입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
      System.out.println("[ " + structure + " 으로 저장된 " + title + " ]");
      //이어서, 입력한 모든 문장앞에 번호를 붙여서 입력 순서에 맞게 모두 출력 해줍니다.
      switch (structure) {
          case "List":
              OutputList();
              break;
          case "Set":
              OutputSet();
              break;
          case "Map":
              OutputMap();
              break;

      }
      System.out.println();
  }

  private static void InputList() {
      while (true) {
          String text = sc.nextLine();
          if (text.equals("끝"))
              return;
          list.add(text);
      }

  }

  private static void OutputList() {
      for (int i = 0; i < list.size(); i++) {
          System.out.println((i + 1) + ". " + list.get(i));
      }
  }

  private static void InputSet() {
      while (true) {
          String text = sc.nextLine();
          if (text.equals("끝"))
              return;
          set.add(text);
      }
  }

  private static void OutputSet() {
      Iterator<String> ite = set.iterator();
      int idx = 1;
      while (ite.hasNext()) {
          String text = ite.next();
          System.out.println(idx++ + ". " + text);
      }
  }

  private static void InputMap() {
      int idx = 1;
      while (true) {
          String text = sc.nextLine();
          if (text.equals("끝"))
              return;
          map.put(idx++, text);
      }
  }

  private static void OutputMap() {
      for(int i=1;i<=map.size();i++){
          System.out.println(i+". "+map.get(i));
      }
  }
}
                                   

0개의 댓글