본문 바로가기

JAVA

231221 Java

금일 첫 교시는 프로그래머스 콜라 문제

class Solution {
    public int solution(int a, int b, int n) {
        int answer = 0;
        Cola cola = new Cola();
        answer = cola.bottle(a,b,n);
        // while (n >= a) {
        //     answer = answer + n / a * b;
        //     n = (n / a) * b + (n % a);
        // } // 재귀 함수 없으면 반복문으로 해결
        return answer;
    }
}

class Cola {
    int retrun = 0;
    public int bottle (int a, int b, int n) {
        retrun = retrun + n/a * b;
        n = n / a * b + n % a;
        if (n < a) return retrun;
        else return bottle(a, b, n);
    }
}

 

컬렉션 프레임워크

package study;
// 컬렉션 -> java.lang -> 예외처리 이후 DB 처리 가능
// 스레드 -> 입출력 -> 중첩
public class Study01 {
}

 

랩퍼 클래스

package com.poseidon.wrapper;
// 랩퍼 클래스
/* 주방에서 사용하는 랩 = 포장
 * 컬렉션은 R 타입만 담을 수 있음
 * P 타입을 R 타입으로 감싸 저장하면 됨 -> 래퍼
 *
 * 기본 자료형의 값을 컬렉션에 담기 위해서는 랩퍼 클래스를 사용
 * 기본 자료형에 대해서 그에 대응하는 랩퍼 클래스가 있음
 * 기본 자료형의 값을 멤버 변수의 값으로 저장하고
 * 이 값 주위로 값을 가공하는 메소드들이 감싸고 있다고 하여 랩퍼(wrapper : 감싸다) 클래스라고 함
 *
 * 기본 자료형       랩퍼 클래스
 *   byte             Byte
 *   short            Short
 *   int              Integer
 *   long             Long
 *   float            Float
 *   double           Double
 *   char             Character
 *   boolean          Boolean
 */
public class WrapperEx {
    public static void main(String[] args) {
        int num = 100;
        Integer number = 100; // 기존 int 와 다른 객체가 생성, 다른 heap 공간에 생성
        Integer number2 = new Integer(100); // java 9 이상부터 평소 선언 방법으로 해도 됨
        num = number2; // 자동 형 변환하여 대입
        byte bNum = number2.byteValue();
        short sNum = number2.shortValue();
        double dNum = number2.doubleValue();

        Short number3 = 100;
        bNum = number3.byteValue();
        System.out.println(Integer.MAX_VALUE); // int 형의 최댓값, 2147483647
        System.out.println(Integer.MIN_VALUE); // int 형의 최솟값, -2147483648
        System.out.println(Byte.MAX_VALUE); // 127
        System.out.println(Byte.MIN_VALUE); // -128

        // 박싱 언박싱
        /* 기본 타입의 값을 포장 객체로 만드는 과정 : 박싱 Boxing
         * 반대로 포장 객체에서 기본 타입의 값을 꺼내는 : 언박싱 UnBoxing
         */
        Integer integer = 30;
        Integer integer2 = new Integer("30");
        Integer integer3 = Integer.valueOf("300");
        // Integer integer = new Integer(30); 이렇게 변경됨
        // 오토박싱
        // 형 변환이 아님, 기본 자료형이 참조형으로 바뀜
        if (integer == integer2) System.out.println("같은 값");
        else System.out.println("다른 값"); // 다른 값 출력
    }
}

 

랩퍼 클래스 포장 값 비교하기

package com.poseidon.wrapper;

public class Wrapper02 {
    public static void main(String[] args) {
        // 포장 값 비교하기
        // 포장 값 비교하기 위해 ==, != 같은 연산자를 사용하지 않아야 함
        // 해당 연산자는 내부 값을 비교하는 것이 아니라 포장 객체의 참조를 비교
        Integer obj = 127;
        Integer obj2 = 127;
        System.out.println(obj); // 127
        System.out.println(obj2); // 127
        System.out.println(obj == obj2); // true
        Integer obj3 = 301;
        Integer obj4 = 301;
        System.out.println(obj3); // 301
        System.out.println(obj4); // 301
        System.out.println(obj3 == obj4); // false
        System.out.println(obj3.equals(obj4)); // true
        // equals() 도 사용해도 됨
        // 값 비교는 compareTo(), "<=" 연산자 라고 생각하면 편함
        // 출력 값은 괄호 안의 값이 크면 -1, 같으면 0, 괄호 안이 작으면 1
        System.out.println(obj.compareTo(obj2)); // 0
        if (obj3.compareTo(obj4) == 0) {
            System.out.println("값이 같음");
        } else if (obj3.compareTo(obj4) < 0) { // -1
            System.out.println("값이 다름, obj4 가 큼");
        } else { // 1
            System.out.println("값이 다름, obj3 이 큼");
        }
        // R -> P
        // 오토 언박싱
        int iNum = obj;
        Object obj1 = 40;
        // iNum = obj1; // 불가
        iNum = (int) obj1; 
        iNum = ((Integer) obj1).intValue(); 
    }
}

 

List

package com.poseidon.coll;

import java.util.ArrayList;
import java.util.List;

// 컬렉션
// List, Set, Map
/*
 * 클래스 선언부에 <E>, <T>, <K, V> 가 붙은 것을 볼 수 있음
 * 이 것은 제네릭 이라고 함 (자바 1.5 버전에 추가)
 * E : 요소, Element
 * T : 타입, Type
 * K, V : 키, 값(밸류), Key, Value
 */
public class Coll01 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(10);
        list.add(20);

        System.out.println(list); // [10, 20]

        System.out.println(list.get(0)); // 10
        System.out.println(list.get(1)); // 20
        // System.out.println(list.get(2)); // IndexOutOfBoundsException 에러 발생

        System.out.println(list.size()); // 리스트의 길이

        list.add(0, 100); // 0 번 인덱스에 100 값을 저장
        System.out.println(list); // [100, 10, 20], 10, 20 값이 한 칸씩 뒤로 밀림

        System.out.println(list.isEmpty()); // list 가 비었는지 확인, boolean 리턴, false

        list.set(1, 40); // list 배열 1 번 인덱스의 값을 40 으로 변경
        System.out.println(list); // [100, 40, 20]

        list.remove(1); // 1 번 인덱스의 값을 삭제
        System.out.println(list); // [100, 20]

        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " "); // 100 20
        }
        for (int i : list) {
            System.out.println(i); // list 에 들어있는 모든 값 출력
        }

        list.clear(); // 리스트에 들어있는 모든 값을 삭제
        System.out.println(list.isEmpty()); // true

        ArrayList<Integer> list2 = new ArrayList<>(); // 뒤의 꺽쇠 괄호 안의 Integer 생략 가능
        List<Integer> list3 = new ArrayList<>(); // List 인터페이스를 상속하는 ArrayList 로 생성
        for (int i = 1; i <= 10; i++) {
            list2.add(i);
        }
        System.out.println(list2);
        for (int i = 0; i < list2.size(); i++) {
            list2.remove(i + 1);
        }
        System.out.println(list2); // [1, 3, 5, 7, 9]
    }
}

 

List 정렬하기

package com.poseidon.coll;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class List01 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            int random = (int) (Math.random() * 45) + 1;
            list.add(random);
        }
        System.out.println(list); // [44, 18, 11, 30, 38, 10]
        Collections.sort(list); // 배열의 값 정렬
        System.out.println(list); // [10, 11, 18, 30, 38, 44]
        Collections.reverse(list); // 배열 뒤집기
        System.out.println(list); // [44, 38, 30, 18, 11, 10]
        Collections.sort(list, Collections.reverseOrder()); // 배열 역순으로 정렬
        System.out.println(list); // [44, 38, 30, 18, 11, 10]
    }
}

 

문자열 List

package com.poseidon.coll;

import java.util.ArrayList;

public class List02 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        list.add("홍길동");
        list.add("김길동");
        list.add("이길동");
        list.add("박길동");
        list.add("최길동");
        list.add("홍길동");
        System.out.println(list); // [홍길동, 김길동, 이길동, 박길동, 최길동, 홍길동]
        System.out.println(list.size()); // 6
        list.remove("홍길동"); // "홍길동" 문자열 중 가장 앞에 있는 1 개 삭제
        System.out.println(list.size()); // 5
        System.out.println(list); // [김길동, 이길동, 박길동, 최길동, 홍길동]
        list.remove("홍길동");
        System.out.println(list); // [김길동, 이길동, 박길동, 최길동]
        list.remove("한길동"); // 없는 문자열 삭제해보기, boolean return 타입
        System.out.println(list); // [김길동, 이길동, 박길동, 최길동], 변함 없음
    }
}

 

제네릭

package com.poseidon.coll;

import java.util.ArrayList;
import java.util.List;

public class List03 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        // int number = list.get(0); // 오류 발생
        int number = (int) list.get(0); // List 생성이 object 타입이라 캐스트를 다 걸어야 함
        list.add("홍길동"); // 문자열 추가
        int num = (int) list.get(1); // 실행 시 오류 발생
        for (int i = 0; i < list.size(); i++) {
            int numnum = (int) list.get(i); // list 안의 값에 따라 오류 발생
        }
        // 오류 발생을 방지하기 위해 <> 안에 타입을 지정해 놓는 것
        List<Integer> list2 = new ArrayList<>();
    }
}

 

Set 컬렉션

package com.poseidon.coll;

import java.util.*;

// List : 순서가 있음, 중복 허용
// Set : 순서가 없음, 중복 불허용
// Map :
public class Set01 {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(1);
        set.add(3);
        set.add(2);
        set.add(2);
        // set.get(0); // set 은 get 메소드가 없음
        System.out.println(set); // [1, 2, 3], 중복 제거
        Set<String> set2 = new HashSet<>();
        set2.add("홍길동");
        set2.add("김길동");
        set2.add("이길동");
        set2.add("박길동");
        set2.add("최길동");
        set2.add("홍길동");
        System.out.println(set2); // [박길동, 김길동, 홍길동, 최길동, 이길동]
        System.out.println(set2.size()); // 5, "홍길동" 중복 제거

        HashSet<Integer> set1 = new HashSet<>(Arrays.asList(3,2,1));
        System.out.println(set1.isEmpty());// false
        System.out.println(set1); // [1, 2, 3]

        // 로또 만들어보기
        Set<Integer> lotto = new HashSet<>();
        while (lotto.size() < 6) { // while 문 반복하기
            lotto.add((int) (Math.random() * 45) + 1);
        }
        System.out.println(lotto);

        Set<Integer> setLotto = new HashSet<>();
        for( ;setLotto.size() < 6 ;) { // for 문 반복하기
            setLotto.add((int) (Math.random() * 45) + 1);
        }
        System.out.println(setLotto);


        List<Integer> list = new ArrayList<>(lotto); // set lotto 값을 ArrayList 에 저장
        System.out.println(list);
        for (int i : list) {
            System.out.println(i);
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("--------------------");

        // Iterator, set 에서 값을 받음
        Iterator<Integer> iterator = lotto.iterator();
        while (iterator.hasNext()) { // iterator 에 다음 값이 있는지 체크
            System.out.println(iterator.next()); // 다음 값 출력
        }
        /* 반복자
         * 컬렉션 인터페이스의 iterator() 메소드는 Iterator 를 리턴
         * Iterator 는 Enumeration 인터페이스와 비슷하나 Enumeration 보다 나중에 만들어 짐
         */
        // List 에서 중복을 제거하고 싶으면 Set 으로 변환 후 List 로 변환 시 중복 자동 제거
        List<String> names = new ArrayList<>();
        names.add("홍길동");
        names.add("김길동");
        names.add("최길동");
        names.add("홍길동");
        names.add("홍길동");
        names.add("홍길동");
        names.add("이길동");
        names.add("홍길동");
        names.add("홍길동");
        System.out.println(names.size()); // 9

        Set<String> names2 = new HashSet<>(names); // List 를 Set 으로 변환하여 중복 제거
        System.out.println(names2.size()); // 4
        System.out.println(names2); // [김길동, 홍길동, 최길동, 이길동]
        names = new ArrayList<>(names2);
        System.out.println(names); // [김길동, 홍길동, 최길동, 이길동]
    }
}

 

Set 에 같은 값을 추가하였을 때

기존 값이 유지되는지, 기존 값을 삭제하고 새로운 값을 추가하는 지 확인하는 법

package com.poseidon.coll;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

// set 에 하나의 값만 저장하는데, 그게 처음 값인지 나중에 들어온 값인지 확인
public class Set02 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("홍길동");
        set.add("홍길동");
        set.add("홍길동");
        set.add("홍길동");
        String name = new String("홍길동");
        System.out.println(System.identityHashCode(name));
        System.out.println(System.identityHashCode(set));
        set.add(name);

        name = new String("박길동");
        System.out.println(System.identityHashCode(name));
        set.add(name);

        System.out.println(set.size());
        System.out.println("---------");
        // 클래스를 만들어 static 변수로 값을 변경시켜 저장해보기
        Set<Human> humans = new HashSet<>();
        Human n = new Human();
        System.out.println(n.ssn); // 1
        humans.add(n);
        n.ssn = 10;
        humans.add(n);
        n.ssn = 20;
        humans.add(n); // 한 객체를 여러 번 추가하기 때문에 기존 값 삭제 후 새로운 값 덮어쓰기
        System.out.println(humans.size()); // 1
        System.out.println(n.ssn); // 20, 기존 1, 10 값은 사라지고 20 이 추가됨
        humans.add(new Human());
        humans.add(new Human());
        humans.add(new Human()); // 추가할 때마다 heap 공간에 새로운 객체를 생성하여 추가
        humans.add(new Human()); // 새로운 객체가 Set 에 추가되기 때문에 중복이 아님
        System.out.println(humans.size()); // 5
        List<Human> list = new ArrayList<>(humans);
        System.out.println(list.get(0).ssn); // 3
        for (Human h : list) {
            System.out.print(h.ssn + " "); // 3 4 20 5 2
        }
    }
}

class Human {
    int ssn;
    static int number;

    public Human() {
        this.ssn = ++number;
    }
}

 

Map, set 과 map 의 중복 값 추가 시 덮어쓰기 여부 확인

package com.poseidon.coll;

import java.util.HashMap;
import java.util.Map;

/*
 * List : 순서 O, 중복 O
 * Set : 순서 X, 중복 X
 * Map : Key 와 Value 를 쌍으로 저장
 *       Key 는 중복 X, Value 는 중복 O
 */
public class Map01 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        HashMap<String, String> map2 = new HashMap<>(); // 둘 다 가능
        map.put("제주도", "귤");
        map.put("수원", "왕갈비");
        map.put("수원", "반도체");
        map.put("춘천", "닭갈비");
        System.out.println(map.size()); // 3, Key 기준으로 count, key 중복 제거
        System.out.println(map); // {수원=반도체, 제주도=귤, 춘천=닭갈비}
        System.out.println(map.get("수원")); // 반도체, 기존 값 삭제 후 새로운 value 저장
        System.out.println(map.containsKey("수원")); // true, key 여부 확인, boolean 리턴
        System.out.println(map.containsValue("쌀")); // false, value 여부 확인, boolean 리턴
        System.out.println(map.containsValue("왕갈비")); // false, 이미 교체 된 value
        System.out.println(map.containsValue("반도체")); // true
    }
}

'JAVA' 카테고리의 다른 글

231226 Java  (0) 2023.12.26
231222 Java  (0) 2023.12.22
231220 Java  (0) 2023.12.20
231219 Java  (0) 2023.12.19
231218 Java  (0) 2023.12.18