+ 00 00 0000

Have any Questions?

18_Simple Coding – Java – 컬렉션 프레임워크- 기본 요약

18_Simple Coding – Java – 컬렉션 프레임워크- 기본 요약

📃 요약

자바는 웹 프로그램을 개발하는데 특화된 컴파일 언어이자 벡엔드 개발 전문 언어임. 플랫폼에 독립적이라서 어떤 운영체제(OS)에서도 실행이 가능하며 가상머신을 통해 실행됨

요소 기술 :

Basic : 자바

📃 기술 구현

스펙 :

 intellij
 java

📃 주요 자바API

    자바에서 코딩시에 활용할 수 있는 유용한 함수를 제공함. 이것을 API 함수라고 함

1) Object 클래스 :

  • 자바의 최상위 부모 클래스, 모든 자바 객체에서 사용가능( 자동 상속되고, extends 키워드는 생략됨 ),
  • 기본적인 함수들이 있음(.equals(), .hashCode(), .toString() 등)

(1) .equals() 함수 :

  • 객체를 동등 비교 : 객체가 동등하다는 것은 2개의 속성이 같다라는 뜻
  • String 객체를 제외한 모든 객체는 .equals() 함수르 쓰면 주소(방번호) 비교를 하기때문에 재정의해서 사용해야 함
  • String 객체는 .equals() 값비교가 됨( String 에서 재정의 되어 있음 : 자바에서 미리 재정의함 )

Member.java

public class Member {
//    속성
    public String id;

    public Member(String id) {
        this.id = id;
    }

//    Object : 객체의 최고 조상(부모) 클래스
//    객체의 .equals 함수 재정의
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
//            강제 형변환
            Member member =(Member)obj;
//            속성의 id 값 매개변수값 id를 비교해서 같은면 true
//            틀리면 false
            if(this.id.equals(member.id)) {
                return true;
            }
        }
        return false;
    }
}

MemberApplication.java

public class MemberApplication {
    public static void main(String[] args) {
        Member member = new Member("blue"); // 방번호(주소) 1
        Member member2 = new Member("blue"); // 방번호(주소) 2
        Member member3 = new Member("red");

//        객체 비교 시 .equals 방번호(주소) 비교
        if(member.equals(member2)) {
            System.out.println("member 와 member2는 같습니다.");
        } else {
            System.out.println("member 와 member2는 다릅니다.");
        }
    }
}

(2) .hashCode() 함수 :

  • 객체를 식별하는 유일한 정수값
    1) 번호는 중복되면 안됨,
    2) 주로 방번호(주소값)으로 해쉬코드를 사용함
    3) 해쉬코드를 자동으로 만들어주는 해쉬함수에 의해 구해짐
  • HashMap, HashSet 라는 자료구조는 해쉬코드로 객체 비교를 하기때문에 재정의해서 사용해야 함
  • 해쉬코드 재정의 : 객제 2개가 같다라는 것을 정의하기 위해 사용.
    1) 주로 속성의 값이 항상 같도록 결과 내보내기함

Member.java

public class Member {
//    속성
    public String id;

    public Member(String id) {
        this.id = id;
    }

//    Object : 객체의 최고 조상(부모) 클래스
//    객체의 .equals 함수 재정의
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
//            강제 형변환
            Member member =(Member)obj;
//            속성의 id 값 매개변수값 id를 비교해서 같은면 true
//            틀리면 false
            if(this.id.equals(member.id)) {
                return true;
            }
        }
        return false;
    }

//    해쉬코드 재정의
//    id속성이 2개가 같으면 해쉬코드도 같음
//    String 객체의 특징 : 문자열이 같으면 같은 방번호를 씀
    @Override
    public int hashCode() {
        return id.hashCode();
    }
}

(3) .toString() 함수 :

  • 객체를 문자열로 변환하는 함수
  • 객체만 출력함수에 매개변수(인자)로 넣어도 자동으로 .toString() 함수가 실행됨(생략가능)
  • 객체의 속성(필드) 정보 출력하기.
    1) 객체의 핵심 정보는 속성(필드)임
    2) 재정의 않하면 객체 출력시 방번호(주소값)가 출력됨(배열과 같음)
    3) 재정의 대상 : 객체의 속성이 출력되도록 재정의함

SmartPhone.java

public class SmartPhone {
    private String company;
    private String os;

    public SmartPhone(String company, String os) {
        this.company = company;
        this.os = os;
    }

//    toString() 재정의
//    속성의 값을 볼수 있게 함수 재정의
    @Override
    public String toString() {
        return this.company + "," + this.os;
    }
}

SmartPhoneApplication.java

public class SmartPhoneApplication {
    public static void main(String[] args) {
        SmartPhone smartPhone = new SmartPhone("구글", "안드로이드");

//        .toString() 함수 : 객체를 문자열로 변환하는 함수
//        출력 : 패키지명+클래스명@16진수해쉬코드
//        개발자 기대하는 출력 : 속성의 값들을 보고 싶다.
        System.out.println(smartPhone.toString());
    }
}

2) Wrapper 클래스 :

  • 기본 자료형 : byte, short, int, long, float, double, char, boolean
  • 위의 자료형을 객체로 변환해야 할때가 있음
  • 주로 표기할때 풀네임(Full Name)으로 사용하고 첫글자로 대문자를 사용함
    1) int -> Integer
    2) long. -> Long
    3) double -> Double
    4) boolean -> Boolean
    5) char -> Charater
    6) 기타 등등
  • Boxing : 기본자료형 -> 객체 변환
  • UnBoxing : 객체 -> 기본자료형
  • 과거에는 특정 함수를 이용해서 Boxing/UnBoxing 했지만, 지금은 함수사용하지 않고 바로 사용가능

BoxingApplication.java

public class BoxingApplication {
    public static void main(String[] args) {
//        기본 자료형 : byte, short, int, long, float, double, char, boolean
//        위의 자료형을 객체로 변환해야 할때가 있음
//        int -> Integer 객체 있음
//        double -> Double 객체 있음
//        boolean -> Boolean 객체 있음

//        기본자료형 -> 객체 변환 : Boxing
        Integer obj1 = new Integer(100); // 객체 정수형(Wrapper Class), 옛날방식
        Integer obj2 = 100; // 기본자료형 -> 객체 자동변환(AutoBoxing), 요즘방식

//        객체 -> 기본자료형 : UnBoxing
        int value1 = obj1.intValue(); // 원복
        int value2 = obj2; // 자동 변환(객체 -> 기본자료형)

        System.out.println(value1);
        System.out.println(value2);
    }
}

📃 컬렉션(자료구조) 프레임워크

    널리 알려진 자료구조를 사용해서 만들어 놓은 클래스

1) 자료구조 :

  • 자료(데이터)들을 효율적으로 사용하기 위한 구조(방)를 말함
  • 배열이 가장 쉬운 자료구조이며 이것을 개선한 여러가지 자료구조가 있음

2) 컬렉션 프레임워크 :

  • 널리 알려져 있는 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 만들어 놓은 클래스들
  • 대표적으로 List, Set, Map 이 있음

3) List :

  • 배열을 개선한 자료구조(컬렉션)로 인덱스번호를 내부에 가지고 있음
  • 추가/삭제/검색을 위한 다양한 함수들을 제공함

  • 특징 :


    1) 순서가 있음(index 번호)
    2) 중복 저장 허용
    3) 구현 클래스는 ArrayList(*), LinkedList, Vector 가 있음
    4) ArrayList 는 순차적으로 추가/삭제 시 성능이 좋음
    5) LinkedList 는 중간에 추가/삭제 시 성능이 좋음
    6) Vector 는 멀티쓰레드 환경에서 사용하는 자료구조임

public class ArrayListApplication {
    public static void main(String[] args) {
//        다형성 : 인터페이스(부모) 변수명 = new 구현클래스();
//        list 객체 <- ArrayList , Vector, LinkedList
//        <제한할자료형> : 제네릭 , 객체 자료형을 제한하기 위해 사용
        List<String> list = new ArrayList<>();

//        개선된 배열 : ArrayList
//        객체.add(문자열) : 개선된 배열에 자료 생성하는 함수
        list.add("Java");
        list.add("JDBC");
        list.add("Servlet/JSP");
        list.add(2, "Database");
//        JPA/ myBatis : JPA(단순 질의) + myBatis(복잡한 질의)
        list.add("myBATIS"); // Springboot framework 데이터베이스 연결하기 위한 용도의 프레임워크
        System.out.println(list); // [Java, JDBC, Database, Servlet/JSP, myBATIS]

//        배열 크기 가져오기
        int size = list.size();
        System.out.println("총 객체수 :" + size);
        System.out.println("-------3번째 자료 가져오기");

//        3번째 자료 가져오기
        String skill = list.get(2);
        System.out.println("3번째 자료 : " + skill);
        System.out.println("----------모두 출력하기------------");

//        ArrayList 안의 자료 모두 출력하기
        for (int i = 0; i < list.size(); i++) {
//            객체.get(인덱스번호) : 인덱스번호에 해당하는 자료 조회하기(검색하기)
            String str = list.get(i);
            System.out.println(i + " : " + str);
        }
        System.out.println("-------수정하기--------------");

//       자료 수정하기
        list.set(0, "자바");
        System.out.println("수정된 값 : " + list.get(0));
        System.out.println("----------삭제하기--------------");

//        삭제하기
//      객체.remove(인덱스번호) : 배열의 인덱스번호에 해당하는 자료 삭제하기
//      ArrayList : 중간에 삭제되면 뒤에 자료가 그 공간으로 자동 당겨짐
//                  중간에 추가되면 뒤로 한칸씩 밀림
        list.remove(2);
        list.remove(2);
        list.remove("myBATIS");

        //        ArrayList 안의 자료 모두 출력하기
        for (int i = 0; i < list.size(); i++) {
//            객체.get(인덱스번호) : 인덱스번호에 해당하는 자료 조회하기(검색하기)
            String str = list.get(i);
            System.out.println(i + " : " + str);
        }

        System.out.println("-------------모두 삭제하기---------------");

//        모두 삭제하기
        list.clear();

        if(list.isEmpty() == true) {
            System.out.println("모두 삭제됨");
        }
    }
}

4) Set : 집합을 구현한 자료구조


  • 특징 :


    1) 순서가 없음, 중복 저장 안됨
    2) 만약 중복 저장하면 나중값이 들어가지 않음
    3) 구현 클래스는 HashSet 이 있음

public class HashSetApplication {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();

//        .add(객체) : set 자료 추가
        set.add("Java");
        set.add("JDBC");
        set.add("Servlet/JSP");
        set.add("Java");
        set.add("myBATIS");
        System.out.println(set); // [Java, myBATIS, JDBC, Servlet/JSP]

//        자료 크기 보기
        int size = set.size();
        System.out.println("총 객체수 : " + size);

//        자료 출력
        for(String element : set) {
            System.out.println("\t" + element);
        }

//        자료 삭제하기
        set.remove("JDBC");
        set.remove("myBATIS");

        System.out.println("---------------------------");

        //        자료 출력
        for(String element : set) {
            System.out.println("\t" + element);
        }

        System.out.println("---------------------------");

//        모두 삭제
        set.clear();
//        set.isEmpty() : 집합에 자료가 있는지 없는지 검사 , 없으면 true, 있으면 false
        if(set.isEmpty() == true) {
            System.out.println("비워 있음");
        }
    }
}

5) Map : (키, 값) 으로 구성된 자료구조(1개를 Entry 라고 함)


  • 특징 :


    1) 키는 중복 저장될 수 없지만, 값은 중복 저장될 수 있음
    2) 만약 (키, 값)을 중복 저장하면 기존의 값이 나중 값으로 대치됨
    3) 구현 클래스는 HashMap(*), HashTable(멀티쓰레드에서 사용) 등이 있음

public class HashMapApplication {
    public static void main(String[] args) {
//        Map 자료 구조 생성
        Map<String, Student> map = new HashMap<>();

//      map객체.put(키, 값) : 객체 추가
        map.put("신용권", new Student(1,"신용권")); // 1st Entry
        map.put("홍길동", new Student(1,"홍길동")); // 2nd Entry
        map.put("동장군", new Student(1,"동장군"));
        map.put("홍길동", new Student(1,"홍길동"));
        System.out.println(map); // {홍길동=Student{sno=1, name='홍길동'}, 신용권=Student{sno=1, name='신용권'}, 동장군=Student{sno=1, name='동장군'}}

//      map.size() : map 객체 크기 보기
        System.out.println("총 Entry 수 :" + map.size());
        System.out.println("----------키에 해당하는 값보기----------");

//      map.get(키) : 키에 해당하는 값을 보기
        System.out.println("홍길동 :" + map.get("홍길동"));
        System.out.println();
        System.out.println("----------키만 있는 집합 변경 : 값 출력----------");

// Map -> Set 변환 : 키만 있는 집합
        Set<String> keySet = map.keySet();
        System.out.println(keySet);
        System.out.println("----------향상된 for 문으로 출력:키/값-----------");

//        향상된 for문으로 출력
        for (String key:keySet) {
            Student student = map.get(key); // 키로 값을 조회
            System.out.println(key + " : " + student);
        }

        System.out.println("---------자료 삭제----------"); // 줄바꿈

//        자료 삭제
        map.remove("홍길동");
        System.out.println("홍길동: " + map.get("홍길동"));
        System.out.println("----------모두 삭제-----------");

//        자료 모두 삭제
        map.clear();

        if(map.isEmpty() == true) {
            System.out.println("모두 삭제되었습니다.");
        }
    }
}

📃 LIFO 와 FIFO 컬렉션(자료구조)

  • 널리 알려진 자료구조 중 자료추가 및 꺼낼 때 순서가 달라지는 자료구조가 있음
  • 대표적으로 Stack(스택) / Queue(큐) 가 위와 같이 구조를 가짐

1) Stack(스택) :

  • LIFO(Last In First Out, 후입선출) 을 구현한 클래스
  • 마지막에 들어간 자료가 먼저 나옴

Coin.java

public class Coin {
    private int value;

//  생성자 : alt+insert
    public Coin(int value) {
        this.value = value;
    }

//    getter : 속성의 값을 조회하는 함수 (alt + insert)
    public int getValue() {
        return value;
    }

//    setter : 속성의 값을 저장하는 함수 (alt + insert)
    public void setValue(int value) {
        this.value = value;
    }
}

StackApplication.java

public class StackApplication {
    public static void main(String[] args) {
//        스택 객체 생성
        Stack<Coin> coinStack = new Stack<>();

//        Coin 객체가 Stack 4개가 들어감
        coinStack.push(new Coin(100));
        coinStack.push(new Coin(50));
        coinStack.push(new Coin(500));
        coinStack.push(new Coin(10)); // 먼저 나옴

//        스택객체.isEmpty() : 스택에 자료가 있는지 없는지 확인, 하나도 없으면 true,
//                           하나라도 있으면 false
        while (!coinStack.isEmpty()) {
            Coin coin = coinStack.pop(); // 스택에서 한개(Coin 객체) 꺼내기
//            coin.getValue() : Coin 객체의 getter 함수 ( 명명법 : get속성명() )
            System.out.println("꺼낸 동전 : " + coin.getValue() + "원");
        }
    }
}

2) Queue(큐) :

  • FIFO(First In First Out, 선입선출) 을 구현한 인터페이스
  • 먼저 들어간 자료가 먼저 나옴
  • 구현 클래스는 주로 LinkedList를 사용함

Message.java

public class Message {
//    속성
    public String command;
    public String to;

//    생성자
    public Message(String command, String to) {
        this.command = command;
        this.to = to;
    }
}

MessageApplication.java

public class MessageApplication {
    public static void main(String[] args) {
//        큐 객체 생성 : 다형성
//        부모인터페이스 변수 = new 자식클래스();
        Queue<Message> messageQueue = new LinkedList<>();

//        큐에 자료 저장
//        new Message(명령어, Who)
        messageQueue.offer(new Message("sendMail", "홍길동"));
        messageQueue.offer(new Message("sendSMS", "신용권"));
        messageQueue.offer(new Message("sendKakaotalk", "홍두깨"));

//        큐에 내용 출력
//        큐객체.isEmpty() : 큐안에 자료가 있는지 없는지 확인 함수(없으면:true, 있으면:false)
        while(!messageQueue.isEmpty()) {
//            자료 한개 꺼내기(Message 객체)
            Message message = messageQueue.poll();
            switch (message.command) {
                case "sendMail":
                    System.out.println(message.to + "님에게 메일을 보냅니다.");
                    break;
                case "sendSMS":
                    System.out.println(message.to + "님에게 SMS를 보냅니다.");
                    break;
                case "sendKakaotalk":
                    System.out.println(message.to + "님에게 카카오톡을 보냅니다.");
                    break;
            }

        }

    }
}

📃 Arrays / Collections

  • Arrays : 고전적 배열에 관련된 유용한 함수들이 있는 클래스
  • Collections : 컬렉션 프레임워크(List, Set, Map)에 있는 유용한 함수들이 있는 클래스
  • 주로 코딩테스트나 프로젝트 시 활용가능함

1) Arrays :

  • Arrays : 고전적 배열에 관련된 유용한 함수들이 있는 클래스

(1) Arrays.toString(배열) / Arrays.deepToString(배열)

    사용법 : Arrays.toString(배열)     : 1차원 배열의 모든값 문자열로 내보내기(리턴)
    사용법 : Arrays.deepToString(배열) : 2차원 배열의 모든값 문자열로 내보내기(리턴)
public class ArraysApplication {
    public static void main(String[] args) {
        int[] arr = {0,1,2,3,4};
        int[][] arr2D = { {11,12,13}, {21,22,23}};

//        사용법 : Arrays.toString(배열) -> 배열의 값이 보임
        System.out.println("arr=" + Arrays.toString(arr)); // 1차원 배열 값 보기
        System.out.println("arr2D=" + Arrays.deepToString(arr2D)); // 2차원 배열 값 보기        

    }
}

(2) Arrays.fill(배열, 값)

    사용법 : Arrays.fill(배열, 값); 배열의 모든원소를 특정값으로 채우기
public class ArraysApplication {
    public static void main(String[] args) {

        int[] arr7 = new int[5];

//      사용법 : Arrays.fill(배열, 값); 배열의 모든원소를 특정값으로 채우기
        Arrays.fill(arr7, 9); // arr7=[9,9,9,9,9]
        System.out.println("arr7=" + Arrays.toString(arr7));      

    }
}

(3) Arrays.sort(배열, Collections.reverseOrder()) / Arrays.sort(배열)

    사용법 : Arrays.sort(배열); 배열의 모든원소를 오름차순 정렬
    사용법 : Arrays.sort(배열, Collections.reverseOrder()); 배열의 모든원소를 내림차순 정렬
    - 듀얼피봇 퀵정렬 알고리즘 사용 : 변형된 퀵정렬 알고리즘, 이리 정렬된 데이터를 정렬할 경우를 제외하고 
                               빠른 알고리즘 중 1개  
public class ArraysApplication {
    public static void main(String[] args) {

        Character[] chArr = {'A', 'D', 'C', 'B', 'E'};         // char(정렬시 기본자료형 사용못함)

        Arrays.sort(chArr, Collections.reverseOrder());        // 내림차순 정렬
        System.out.println("chArr=" + Arrays.toString(chArr)); // 정렬된 배열 출력 

        Arrays.sort(chArr);                                    // 오름차순 정렬
        System.out.println("chArr=" + Arrays.toString(chArr)); // 정렬된 배열 출력   

    }
}

(4) Arrays.binarySearch(배열, 값)

    사용법 : Arrays.binarySearch(배열, 값); 배열에서 갑을 찾은 후에 인덱스번호를 내보내기함(리턴)
    사용 전에 미리 오름차순 정렬되어 있어야함
public class ArraysApplication {
    public static void main(String[] args) {

        Character[] chArr = {'A', 'D', 'C', 'B', 'E'};         // char(정렬시 기본자료형 사용못함)

        Arrays.sort(chArr);                                    // 오름차순 정렬
        System.out.println("B의 인덱스번호 : " + Arrays.binarySearch(chArr, 'B'));

    }
}

(5) Arrays.asList(배열)

    사용법 : Arrays.asList(배열) : 배열을 리스트로 변환
public class ArraysApplication {
    public static void main(String[] args) {

        List list = new ArrayList(Arrays.asList(1,2,3,4,5)); // 배열을 리스트로 변환
        System.out.println(list);                            // List 의 값 보기

    }
}

2) Collections :

  • Collections : 컬렉션 프레임워크(List, Set, Map)에 있는 유용한 함수들이 있는 클래스

(1) Collections.addAll(향상된배열, 배열값)

    사용법 : Collections.addAll(향상된배열, 배열값) : 배열값이 향상된배열에 들어감
public class CollectionsApplication {
    public static void main(String[] args) {

        List list = new ArrayList();

        Collections.addAll(list, 1,2,3,4,5);
        System.out.println(list);      

    }
}

(2) Collections.rotate(향상된배열, 오른쪽칸이동)

    사용법 : Collections.rotate(향상된배열, 오른쪽칸이동) : 배열값을 오른쪽으로 두 칸씩 이동
public class CollectionsApplication {
    public static void main(String[] args) {

        List list = new ArrayList();
        Collections.addAll(list, 1,2,3,4,5);

//        사용법 : Collections.rotate(향상된배열, 오른쪽칸이동)
        Collections.rotate(list, 2);
//        [4,5,1,2,3]
        System.out.println(list);   

    }
}

(3) Collections.swap(향상된배열, 원본요소, 바꿀요소)

    사용법 : Collections.swap(향상된배열, 원본요소, 바꿀요소) : 원본요소에서 바꿀요소로 값 교환(swap)
public class CollectionsApplication {
    public static void main(String[] args) {

        List list = new ArrayList();
        Collections.addAll(list, 1,2,3,4,5);     

//        사용법 : Collections.swap(향상된배열, 원본요소, 바꿀요소)
        Collections.swap(list, 0, 2);
        System.out.println(list);

    }
}

(4) Collections.sort(향상된배열) / Collections.sort(향상된배열, reverseOrder())

    사용법 : Collections.sort(향상된배열)                 : 향상된배열을 오름차순 정렬
    사용법 : Collections.sort(향상된배열, reverseOrder()) : 향상된배열을 내림차순 정렬
    - Tim 정렬 알고리즘 사용 : 삽입(Insertion) 정렬과 합병(Merge) 정렬을 결합하여 만든 정렬
            빠른 알고리즘 중 1개
public class CollectionsApplication {
    public static void main(String[] args) {

        List list = new ArrayList();
        Collections.addAll(list, 2,4,3,1,5);  

        Collections.sort(list, reverseOrder()); // 내림차순
        System.out.println(list);

        Collections.sort(list);                 // 오름차순
        System.out.println(list);

    }
}

(5) Collections.binarySearch(향상된배열, 검색할값)

    사용법 : Collections.binarySearch(향상된배열, 검색할값) : 값을 찾아서 그 위치의 인덱스번호 내보내기(리턴)
    - 사용 전 오름차순 정렬되어 있어야 함
public class CollectionsApplication {
    public static void main(String[] args) {

        List list = new ArrayList();
        Collections.addAll(list, 2,4,3,1,5);        

        Collections.sort(list);                 // 오름차순
        int idx = Collections.binarySearch(list, 3); // 3의 값이 있는 인덱스 위치가 리턴
        System.out.println("3의 위치 : " + idx);        

    }
}

(6) Collections.fill(향상된배열, 채울값)

    사용법 : Collections.fill(향상된배열, 채울값) : 값으로 향상된배열을 채움
public class CollectionsApplication {
    public static void main(String[] args) {

        List list = new ArrayList();
        Collections.addAll(list, 2,4,3,1,5);        

//        사용법 : Collections.fill(향상된배열, 채울값)
        Collections.fill(list, 9);
        System.out.println("list=" + list);      

    }
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다