- [Java 기본]INFO 클래스, Collection 객체(Set, Map, List), package

Posted by 겨울에
2011. 5. 14. 15:52 scrap/ Java/JSP
출처 : http://cafe.naver.com/litave/365


//===========================================================================//
  본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
    기본으로 하여 정리하였습니다.
  - 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
  작성자 : litwave
//---------------------------------------------------------------------------//

<목차>
1. INFO 클래스
2. Collections 객체(SetMapList)
3. package

//---------------------------------------------------------------------------//

1. INFO 클래스 : 기본정보를 제공하는 클래스(만들기)
    - 특별한 기능을 가지지 않으며, 단순히 데이타를 저장하기 위한 공간으로 사용된다.

  1.1 한 명에대한 사용자 정보를 관리하는 클래스 만들기
    class Person {
      String name;          // 이름
      int age;              // 나이
      String tel;           // 전화 번호
      String addr;          // 주소
    }

    1INFO 클래스의 모든 멤버변수는 은닉화 되어 있어야 한다.(예:private String name;)
    2) 생성자는 public 으로 만든다.
      - 디폴트로 생성자(null0,... 디폴트로 값을 넣을 수 있는)를 만든다.
      - 매개 변수를 받을 수 있는 생성자를 만든다.
        (예: public Person(String nameint age, String tel, String addr)
    3) setXXX()  // 메소드를 만들어서 각 값들을 설정할수 있는 메소드를 만든다.
       XXX = 첫 문자만 대문자로 변경 하고 변수명과 동일해야 한다.
       getXXX()  // 특정 값을 가져 올수 있는 Method를 만든다. <- 자료형이랑 똑같은 결과형 리턴 값을 갖는다.


2. 자료형 입력 방법
  2.1 링크드 리스트
    - 단일 선형 링크드 리스트 설계

    1) 어떤 특정 사람에 대한 정보(사람의 이름과 나이)를 입력 받는 클래스를 선언
        class Man {
          String name;
          int age;
        }

        // 아래의 것을 무한히 반복하며 입력 또는 출력 할 수 있는..
        1. 입력
        2. 출력
        3. 종료
        ------>
        형식의 프로그램 만들기(배열 이용)
        Ex0109_01 참고

    2) 무한적으로 사람 이름을 저장하며 출력 할 수 있도록 만들기
        배열을 사용해서 데이타를 입력 받으면 쓸모 없는 메모리의 낭비가 일어나고 입력 값의 한계가 정해 진다.
        필요한 메모리 공간을 할당하며 사용하는 것을 링크드 리스트라고 한다.(C언어)

        선형 링크드 리스트의 개념
         -> 참조 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Database/DataStructure/LinkedList

  2.2 Java 에서 무한 데이터를 입력 받는 3가지 분류
    - import java.util.*;  에 포함되어 있다.
    1) 관련 interface Type 및 하위 클래스
        Set          Map           List       // 대표 interface
        HashSet      HashMap       ArrayList  // 상속된 하위 클래스

    2) 개념 설명
      자바에는 무한 데이터를 입력할 수 있는 방식이 세가지로 나누어 진다.
      같은 상속 계열에 있는 것들은 크게 차이점이 없지만 
      줄기가 다른 클래스들은 무한 데이타만 입력 된다는 사실을 제외하고 엄청난 차이가 있다.

      2.1Set(집합) 계열
         - Set이라는 주머니가 존재하고 그 곳에는 무한대의 구슬을 넣을 수 있다.
         - 집합을 생각
         (1) 동일 데이타 처리를 하지 못한다.(no duplicate)    // 색깔이 같은 동일 구슬을 넣으면 안된다.
         (2) 정렬되지 않는다.(Not Ordering)
          // 과제1) HashSet 을이용해서 은행 클래스 과제 해결

      2.2Map(데이타 베이스와 비슷)
        - 키값과 데이타를 동시에 넣어 주어야 한다.
        - 꺼낼 때는 특정 키값을 이용해서 꺼낼 수 있다.  웹에서 많이 사용된다.
        (1) 동일 데이타를 넣을 수 있다.
        (2) 정렬은 되지 않는다.(Not ordering)
        // 과제2) HashTable 을이용해서 은행 클래스 과제 해결

      2.3List(LinkedList 를 포함하고 있음)
        - 기차의 열차칸 처럼 구성 되어 있다.
        - 스택의 구조로 되어 있다.
        - 데이타를 저장하는데 각각의 순서 번호가 자동으로 지정 된다.
         1) 중첩된 데이타를 넣을 수 있다.
         2) 정렬이 가능하다.
         3) 동일 데이터를 가질 수 있다.
        // 과제3) LinkedList를 이용해서.. 은행 클래스 과제 해결..


    3Vector : List 인터페이스 타입의 Vector 클래스
        --Vector vc = new Vector(105);      // vc는 4 바이트
        // 최초 10개의 데이타를 입력하고, 필요시만 5개씩 추가해서 사용할 수 있다.
        --Vector vc = new Vector();   // 디폴트로 놓고 쓸 수 있다..(메모리 낭비를 줄일 수 있다.)

        Object를 상속받은 클래스(= 모든 클래스(하물며 숫자라는 자료형도))를 저장할 수 있다.
        클래스 타입이기만 하면.. 모두 저장이 가능하다.

        Vector 에 있는 size 메소드를 이용하면 현재 몇개의 데이타가 저장 되었는지 확인 할 수 있다.
          -> vc.size();
        vc.clear();       // 저장된 모든 데이타를 지워버린다.

        vc.addElement(Object);
        vc에 무한개의 데이터를 순서적으로 넣을 수 있다.
        vc.add(0Object);        // 순서를 뛰어넣어서.. 특정 위치(원하는 순서 번호에) 에 지정하여 넣을 수 있다. 
                                  // 나머지 데이터는 자동으로 뒤로 밀려 넘어가게 된다.
        불러 내서 사용의 약간의 문제점
        vc.elementAt(2);       // 특정 두번째 데이타를 불러 낸다.
         하지만.. vc에 저장된 데이터가 다른 타입일 수 있다.
        vc.elementAt(2); 의 리턴 값은 Object 타입을 가지기 때문에..
        형변화을 해서 사용을 해야 한다.
        예)
         Integer i = (Integer)vc.elementAt(2);   // 두번째 데이터를 꺼내서(원본을 지우지는 않는다.) 형변환을 해서 넣는다.
                                                 // 주소값을 복사한다.
        예제 Ex0109_02...

        Math 클래스 : 모든 클래스는 static 이다.. 클래스 명으로 접근 가능..
          - random  0.0 ~ 1.0 보다 작은 수까지의 난수를 발생 시킨다.



//---------------------------------------------------------------------------//
3. Package(= 폴더다.)     //자바는 전부 폴더로 이루어져 있다.
  3.1 클래스 형식
    package               // package가 파일의 가장 위에 오며 단 한번만 올 수가 있다.

    import ...
    import ...
    .
    .
    class A { }
    class B { }
    .
    .
    public class c { }

  3.2 package 컴파일
    - package 를 사용한 순서부터 컴파일 방법이 달라진다.
    - package 사용시 기억 할것.
        1) cmd(현재파일이 작성된 위치로 이동한다.) -> javac -d . 파일명.java   //-d 옵션 사용 디렉토리 컴파일을 시켜야 한다.  . : 기준점  
        2package 만의 형식) package java.lang;  //자바라는 폴더와 그안에.. lang폴더를 생성 시키고.. 그안에 파일을 생성시킬 것이다.
             폴더A.폴더B.폴더C...    // 파일을 넣고자 하는 위치를 지정해 주는 것이다.
          내가 포함 시키고자 하는 파일의 위치만 적어준다.

      예) Test.java

  3.3 package 사용
     aimport 법
       폴더 안에 import 하는 파일명과 동일한 파일명이 있으면 충돌이 나서 에러를 유발한다.
       이것은 자바에서 클래스명과 파일명을 구분하지 않기 때문이다.

       클래스 파일에서 이름을 정할 때 자바에서 사용하는 예약어, 자바에서 이미 사용중인 API클래스를 사용하면 안된다.
      
     b) 절대 경로 명법   // 충돌의 우려가 있는 것들은 이것을 사용하면 절대 충돌이 일어나지 않는다.
       java.lang.System.out.println("test");      // 원래 자바에서는 이런 방식을 사용하도록 되어 있었으나,
                                                 // 너무 복잡하여 import 하여 폴더 자체를 사용할 수 있도록 하였다. 
     // 앞으로 과제는 package를 사용해서 만들 것.

    과제 4:
    1. 주민등록 검증기
    2. 계산기
    3. 성적처리
    4. 종료
    --------1
    // 주민등록 검증기와 관련된 프로그램 실행
    // 각 해당 번호에 관련된 프로그램 실행..
    // 조건. 4를 누를 때 까지.. 계속 실행
    // 모든 것을 클래스 형태로 만들고, 세개의 클래스를 package 를 이용하여 특정 폴더에 넣어서 관리한다.
    예) javatest.util

//---------------------------------------------------------------------------//
// Ex0109_01.java : INFO 클래스 예
public class Person{
    private String name;
    private int age;
    private String tel;
    private String addr;
    public Person(){
        name = tel = addr = null
        age = 0;
    }
    public Person(String nameint age, String tel, String addr){
        this.name = name;
        this.age = age;
        this.tel = tel;
        this.addr = addr;
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public void setTel(String tel){
        this.tel = tel;
    }
    public void setAddr(String addr){
        this.addr = addr;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
    public String getTel(){
        return tel;
    }
    public String getAddr(){
        return addr;
    }
}

//---------------------------------------------------------------------------//
// Ex0109_01.java : Linked List 구현
import java.io.*;
class Man {
    String name;
    int age;
    Man next;
}

public class Ex0109_01 {
    public static void main(String[] ar) throws IOException {
        BufferedReader br = new BufferedReader(
                                new InputStreamReader(System.in));
                            
        //Man[] man = new Man[100];
        //int i = 0;
        Man man = new Man();
        Man imsi = man;   //입력용...
        Man imsi1 = man;  //출력용...
        
        while(true) {
            System.out.println("1. 입력");
            System.out.println("2. 출력");
            System.out.println("3. 종료");
            System.out.print("------> ");
            int x = System.in.read() - 48;
            System.in.read();
            if(x == 1) {
                //입력...
                while(imsi.next !null){
                    imsi = imsi.next;
                }
                System.out.print("이름 = ");
                imsi.name = br.readLine();
                System.out.print("나이 = ");
                imsi.age = Integer.parseInt(br.readLine());
                imsi.next = new Man();
            } else if(x == 2) {
                //출력...
                imsi1 = man;
                while(imsi1.next !null){
                    System.out.println("이름 : " + imsi1.name);
                    System.out.println("나이 : " + imsi1.age + "세");
                    imsi1 = imsi1.next;
                }
            } else if(x == 3) {
                //종료...
                System.out.println("시스템을 종료합니다.");
                System.exit(0);
            } else{
                System.out.println("잘못 입력 하셨네요..");
            }
        }
    }
}

//---------------------------------------------------------------------------//
// Ex0109_02.java : Vector 사용 예
import java.util.*;
class Ex0109_02_Sub {
    private int x;
    private int y;
    public Ex0109_02_Sub(int xint y){
        this.x = x;
        this.y = y;
    }
    public void disp(){
        System.out.println("x = " + x + ", y = " + y);
    }
}

public class Ex0109_02 {
    public static void main(String[] ar){
        Vector vc = new Vector();
        Ex0109_02_Sub es = null;
        for(int i = 0; i < 20; i++){
            es = new Ex0109_02_Sub((int)(Math.random() * 800),
                                                (int)(Math.random() * 600));
            vc.addElement(es);
        }
        for(int i = 0; i < vc.size(); i++){
            Ex0109_02_Sub imsi = (Ex0109_02_Sub)vc.elementAt(i);
            imsi.disp();
        }
    }
}


//---------------------------------------------------------------------------//
// Ex0109_03.java
import java.io.*;
import java.util.*;
class Man1 {
    String name;
    int age;
}

public class Ex0109_03 {
    public static void main(String[] ar) throws IOException {
        BufferedReader br = new BufferedReader(
                                    new InputStreamReader(System.in));
        Vector vc = new Vector();
        while(true) {
            System.out.print("1.입력 2.출력 3.종료 ==> ");
            int x = System.in.read() - 48;
            System.in.read();
            if(x == 1) {
                Man1 man = new Man1();
                System.out.print("이름 = ");
                man.name = br.readLine();
                System.out.print("나이 = ");
                man.age = Integer.parseInt(br.readLine());
                vc.addElement(man);

            } else if(x == 2) {
                for(int i = 0; i < vc.size(); i++){
                    Man1 man = (Man1)vc.elementAt(i);
                    System.out.println("이름 : " + man.name);
                    System.out.println("나이 : " + man.age + "세");
                }

            } else if(x == 3) {
                System.exit(0);

            } else {
                System.out.println("잘못 입력 하셨습니다.");
            }
        }
    }
}

//---------------------------------------------------------------------------//
// Test.java    : Package 사용예
package pkg.test;            // 소문자로 적어야한다.
                             // Test.class가 생성될 폴더 위치..

public class Test {
    public void myMethod() {
        System.out.println("Package Test....!!");
    }
}


// Ex0109_04.java
//import pkg.test.*;

public class Ex0109_04 {
    public static void main(String[] ar){
        pkg.test.Test test = new pkg.test.Test();
        test.myMethod();
    }
}

//===========================================================================//



>>>>>>> 답글들

컬렉션에대한 설명이 조금 맘에 안들어서 첨언을 해봅니다.

List : 일반적으로 많은 양의 데이터를 핸들링하는데 가장 최적화된 컬렉션입니다. 데이터를 저장하는
속도도 가장 빠르고, 숫자형의 index 를 지원하기 때문에 가져오는 속도도 가장 빠릅니다.

Set : 집합연산을 하는데 최적화 된 컬렉션입니다. 즉, 중복되지 않은 유일한 값들을 구하고자 할때에
Set 을 통해서 데이터를 저장하면 따로 중복체크를 하지 않아도 자연스럽게 중복값들은 제거가
됩니다.

Map : 숫자형의 index 대신에 사용자가 정의한 key로 데이터들을 저장 할 수 있습니다. key-value를
한쌍으로 데이터가 저장되기 때문에 list 나 set 에 비해 상대적으로 속도는 느리지만 key-value
라는 특성 때문에 데이터베이스나 웹에서의 파라미터나 동적인 파라미터 처리를 할때에 많이
사용합니다. (M$ 계열의 Dictionary와 유사합니다.)

 

--------------------------------------------------------------------------------------------------------
 

Set(집합) 계열
(1) 동일 데이타 처리를 하지 못한다.(no duplicate) // 색깔이 같은 동일 구슬을 넣으면 안된다.
(2) 정렬되지 않는다.(Not Ordering)

위의 설명이 맘에 들지 않아서 쓴거라는.. 정렬이란 부분은 사실 List/Set/Map 이란 것과 관계되는 것은
아니고 Set의 경우 SortedSet 이 있기도 하구요.. 또 동일 데이터를 처리하지 못한다라는 것의 어감도 좋은 것은 아니구요. 위 설명대로라면 나쁜데 왜 쓰냐? 라는게 되니까....

Set 은 Unique 한 키값 같은 것을 핸들링할때에 쓰면 매우 유용하자나요. 물론, Map에서 value 에 빈값을주고 Set 처럼 쓰는 경우도 있겠지만.. 그건 퍼포먼스나 리소스면에서 않좋은 것이니까..

위의 설명이 Set의 용도를 설명하는데는 더 좋은 것 같아서 적어본거임...


--------------------------------------------------------------------------------------------------------

>>>
 
 List 계열중에 Vector는 syncronoize 되어 있으므로, 쓸데 없는 부하를 가중 시키므로 네트웍통신 같은 특수한 경우가 아니라면 ArrayList 사용을 권장하고, Hashtable도 같은 이유로 HashMap의 사용을 권장한다는...

>>>
 사실 syncronized 와 관계되는 부분은 멀티쓰레딩 환경에서도 스태틱한 케이스외에는 그렇게 민감하게 와닿는 경우가 없는 것 같아서 일반적으로 jsp 페이지도 다 쓰레드환경이지만 쓰레드라고해서 vector 를 쓰진 않죠.

오히려 일반 개발자들에게는 Arrays 나 Collections 같은 유틸의 활용이라던지.. 혹은 Map 이나 Set, List... 최근에는 Queue 이런 것들의 다양한 구현클래스간에 활용 용도등을 보여주는게 더 의미있지
않을런지... ㅎㅎ

단순히 해당 클래스의 성능보다 어떠한 작업이나 프로세싱에서의 성능을 생각해보는게 더 잼있을 것