TIL/Java

TIL 2024-10-10 (Java 문법 종합반)

myoma 2024. 10. 10. 20:46

1) 증감 연산자

  • ++ 또는 --를 붙이면 피연산자가 1 더해지거나 1 빼기가 된다.
    • 주의할 점. 피 연산자 뒤에 붙이냐, 앞에 붙이냐에 따라 연산순서가 달라진다.

  • 이처럼 대입 연산할 때 뿐만 아니라 연산을 직접할 때도 선/후 작용으로 나뉜다.
public class w06 {
    public static void main(String[] args) {
        // 대입연산자에서 주의해야 할 점!!
        // ++, --
        int a = 10;
        int b = 10;
        int val = ++a + b--;
        System.out.println(a);
        System.out.println(b);
        System.out.println(val);

    }
}
  • result =  11, 9, 21
    • why? 선/후 작용을 생각하지 않는다면 1 더해지고 1 빼졌기에 val = 20 이 나오겠지만
    • b-- 는 10의 값을 먼저 계산한 후에 -1 을 해주었기에 val = 21이 나온다.

 

 


 

2) 삼항 연산자

// (2) 삼항연산자
        // 비교연사자와 항상 함께 쓰인다.
        // 비교연산자의 결과 : true or false -> 이 결과의 값에 따라 결정되는 무언가?
        // 조건 ? 참 : 거짓
        int x = 1;
        int y = 9;

        boolean b = (x == y) ? true : false;
        System.out.println(b);

        String s = (x != y) ? "정답" : "오답";
        System.out.println(s);

        int max = (x > y) ? x : y;
        System.out.println(max);

        int min = (x < y) ? x : y;
        System.out.println(min);
  • result : false, 정답, 9, 1 순서로 답이 나온다.
    • why? 처음엔 1과 9는 다르기에 거짓이다. 그렇기에 false가 나온다.
    • x 와 y 값은 엄연히 다르기 때문에 참이 되었고 그렇기에 앞에 있는 정답이 나온다.
    • 위에 같은 방법으로 두 수를 비교할 수 있다.

 

 


3) if 문과 switch 문의 차이점.

  • 차이점 1. 복합조건
    • if 문은 복합조건을 지원한다.
      • 복합조건 : 괄호() 안에 조건 여러개를 지정하여 조건문을 수행할 수 있다.
    • switch 문은 피연산자 한개에 대한 조건만 지원.
  • 차이점 2. 코드 중복
    • if 문은 상대적으로 코드 중복이 많습니다.
    • switch 문은 코드중복이 적습니다.
  • 즉 상황에 따라 적절한 조건문을 사용해주면 되는데, 예를 들어 숫자를 입력하면 내가 원하는 계절이 나오게끔 하고 싶다면 switch 문이 더욱 적절하고, 사용자의 나이, 성별, 거주지 등 여러 조건에 맞추는 상황이라면 if 문을 사용하는 것이 좋다.

 


4) Collection 

  • Java에서 컬렉션은 배열보다 다수의 참조형 데이터를 더 쉽고 효율적으로 처리할 수 있는 기능을 많이 가지고 있다.
    • 기능 : 크기 자동조정, 추가, 수정, 삭제, 반복, 순회, 필터, 포함확인 등...
  • 컬렉션 종류.
    • collection 에는 List, Set, Queue, Map 이 있다.
      1. List - 순서가 있는 데이터의 집합(데이터 중복 허용) - 배열과 비슷
      2.  Queue - 빨대처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺼 수 있는 집합.
        • First In First Out (FIFO) : 먼저 들어간 순서대로 값을 조회할 수 있다.
      3. Set - 순서가 없는 데이터의 집합(데이터 중복 허용 안함) - 순서없고 중복없는 배열
      4. Map - 순서가 없는(Key Value) 쌍으로 이루어진 데이터의 집합(Key값 중복 허용 안함)
  • 사용할 때 주의 사항.
    • Collection은 기본형이 아닌 참조형 변수를 저장.
    • int = Integer, long = Long, double = Double 등등..

 

4 - 1 ) List

public class Col1 {
    public static void main(String[] args) {
        // List
        // 순서가 있는 데이터의 집합 => Array
        // 처음에 길이를 몰라도 만들 수 있음!
        // 1) Array -> 정적 배열
        // 2) List(ArrayList) -> 동적배열(크기가 가변적으로 늘어난다)
        //  - 생성 시점에 작은 연속된 공간을 요철해서 참조형 변수들을 담아놓는다.
        //  - 값이 추가될 때 더 큰 공간이 필요하면 더 큰 공간을 받아서 저장하니깐 상관없다.

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

        intList.add(99);
        intList.add(15);
        intList.add(3);

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

        // 2번째 있는 값(15)를 바꿔보자.
        intList.set(1, 10);
        System.out.println(intList.get(1));

        // 삭제
        intList.remove(0);
        System.out.println(intList.get(0));

        intList.clear();
        System.out.println(intList.toString());

    }
}
  • result : 15, 10, 10, []
  • .add 말 그대로 배열에 데이터 추가
  • .get() 원하는 데이터 선택
  • .set() 데이터 수정
  • .remove() 삭제, clear() 전체 삭제
  • .toString() 전체 출력

 

4 - 2 ) Linked List

public class Col2 {
    public static void main(String[] args) {
        // linked list
        // 메모리에 남는 공간을 요청해서 여기 저기 나누어서 실제 값을 담아놔요.
        // 실제 값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조.

        // 기본적 기능은 -> ArrayList와 동일
        // Linked List는 값 -> 여기저기 나누어서 : 조회하는 속도가 느리다.
        // 값을 추가하거나, 삭제할 때는 빠릅니다.

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

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

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

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

        linkedList.add(200);

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

        linkedList.add(2, 4);

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

        linkedList.set(1, 30);
        System.out.println(linkedList.toString());

        linkedList.remove(1);
        System.out.println(linkedList.toString());

        linkedList.clear();
        System.out.println(linkedList.toString());

    }
}
  • result :
    5
    10
    3
    [5, 10, 3]
    [5, 10, 3, 200]
    [5, 10, 4, 3, 200]
    [5, 30, 4, 3, 200]
    [5, 4, 3, 200]
    []

용어는 List와 거의 동일.

 

4 - 3 ) Stack

public class Col3 {
    public static void main(String[] args) {
        // stack
        // 수직으로 값을 쌓아놓고, 넣었다가 뺀다. FILO
        // 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());
        }


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


        System.out.println(intStack.peek());
        System.out.println(intStack.size());

    }
}
  • result :
    1
    15
    10
    1
    3

  • .push() - 데이터 추가
  • .peek() - 데이터 조회 , 맨 위 값을 조회
  • .pop() - 꺼내기, 맨 위 값을 꺼냄
  • .isEmpty - 비어져 있는 지. 

 

4 - 3 ) Queue

public class Col4 {
    public static void main(String[] args) {
        // Queue : FIFO
        // add, peek, poll
        // Queue : 생성자가 없는 인터페이스 <-

        Queue<Integer> intQueue = new LinkedList<Integer>(); //queue 선언, 생성

        intQueue.add(1);
        intQueue.add(5);
        intQueue.add(9);

        while (!intQueue.isEmpty()) {
            System.out.println(intQueue.poll());
        }


        intQueue.add(1);
        intQueue.add(5);
        intQueue.add(9);
        intQueue.add(10);

        // peek
        System.out.println(intQueue.peek());
        System.out.println(intQueue.size());

    }
}
  • result :
    1
    5
    9
    1
    4
  • .add() - 추가
  • .peek() - 조회, 맨 아래값을 조회
  • .poll() - 꺼내기, 맨 아래값을 꺼냄

 

4 - 4 ) Set

public class Col5 {
    public static void main(String[] args) {
        // 집합 : 순서 없고 중복 없음.
        // 순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조
        // Set -> 그냥 쓸 수도 있음. 그러나 Hashset, Treeset 등으로 응용해서 같이 사용 가능
        // Set은 생성자가 없는 껍데기라서 바로 생성할 수 없음!
        // 생성자가 존재하는 Hashset을 이용해서 -> Set을 구현해 볼 수 있음.

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

        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);
        }

        // contains

        System.out.println(intSet.contains(2));
        System.out.println(intSet.contains(5));


    }
}
  • result :
    1
    5
    9
    12
    false
    true
  • .add()
  • .get()
  • .remove()
  • .contains() - 해당값이 포함되어있는지 boolean 값으로 응답 받음.

 

4 - 5 ) Map

public class Col6 {
    public static void main(String[] args) {
        // Map : key - value pair -> 중요
        // Key라는 값으로 unique하게 보장되어야 함.
        // Map -> Hashmap, Treemap 응용

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

        // 키 값
        intMap.put("일", 11);
        intMap.put("이", 12);
        intMap.put("삼", 13);
        intMap.put("삼", 14); //중복 키
        intMap.put("삼", 15); //중복 키
        intMap.put("삼", 16);
        // key 값 전체 출력(향상된 for문)
        for (String key : intMap.keySet()) {
            System.out.println(key);
        }


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

        System.out.println(intMap.get("삼"));



    }
}
  • result :



    12
    11
    16
    16
  • .put() - 추가, key에 value 값을 추가한다.
  • .get()
  • .keySet() - 전체 key값 조회
  • .values() - 전체 value 조회
  • .remove()

 


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