- [Java 기본]INFO 클래스, Collection 객체(Set, Map, List), package
출처 : http://cafe.naver.com/litave/365
//===========================================================================//
본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
기본으로 하여 정리하였습니다.
- 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
작성자 : litwave
//---------------------------------------------------------------------------//
<목차>
1. INFO 클래스
2. Collections 객체(Set, Map, List)
3. package
//---------------------------------------------------------------------------//
1. INFO 클래스 : 기본정보를 제공하는 클래스(만들기)
- 특별한 기능을 가지지 않으며, 단순히 데이타를 저장하기 위한 공간으로 사용된다.
1.1 한 명에대한 사용자 정보를 관리하는 클래스 만들기
class Person {
String name; // 이름
int age; // 나이
String tel; // 전화 번호
String addr; // 주소
}
1) INFO 클래스의 모든 멤버변수는 은닉화 되어 있어야 한다.(예:private String name;)
2) 생성자는 public 으로 만든다.
- 디폴트로 생성자(null, 0,... 디폴트로 값을 넣을 수 있는)를 만든다.
- 매개 변수를 받을 수 있는 생성자를 만든다.
(예: public Person(String name, int 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.1) Set(집합) 계열
- Set이라는 주머니가 존재하고 그 곳에는 무한대의 구슬을 넣을 수 있다.
- 집합을 생각
(1) 동일 데이타 처리를 하지 못한다.(no duplicate) // 색깔이 같은 동일 구슬을 넣으면 안된다.
(2) 정렬되지 않는다.(Not Ordering)
// 과제1) HashSet 을이용해서 은행 클래스 과제 해결
2.2) Map(데이타 베이스와 비슷)
- 키값과 데이타를 동시에 넣어 주어야 한다.
- 꺼낼 때는 특정 키값을 이용해서 꺼낼 수 있다. 웹에서 많이 사용된다.
(1) 동일 데이타를 넣을 수 있다.
(2) 정렬은 되지 않는다.(Not ordering)
// 과제2) HashTable 을이용해서 은행 클래스 과제 해결
2.3) List(LinkedList 를 포함하고 있음)
- 기차의 열차칸 처럼 구성 되어 있다.
- 스택의 구조로 되어 있다.
- 데이타를 저장하는데 각각의 순서 번호가 자동으로 지정 된다.
1) 중첩된 데이타를 넣을 수 있다.
2) 정렬이 가능하다.
3) 동일 데이터를 가질 수 있다.
// 과제3) LinkedList를 이용해서.. 은행 클래스 과제 해결..
3) Vector : List 인터페이스 타입의 Vector 클래스
--> Vector vc = new Vector(10, 5); // vc는 4 바이트
// 최초 10개의 데이타를 입력하고, 필요시만 5개씩 추가해서 사용할 수 있다.
--> Vector vc = new Vector(); // 디폴트로 놓고 쓸 수 있다..(메모리 낭비를 줄일 수 있다.)
Object를 상속받은 클래스(= 모든 클래스(하물며 숫자라는 자료형도))를 저장할 수 있다.
클래스 타입이기만 하면.. 모두 저장이 가능하다.
Vector 에 있는 size 메소드를 이용하면 현재 몇개의 데이타가 저장 되었는지 확인 할 수 있다.
-> vc.size();
vc.clear(); // 저장된 모든 데이타를 지워버린다.
vc.addElement(Object);
vc에 무한개의 데이터를 순서적으로 넣을 수 있다.
vc.add(0, Object); // 순서를 뛰어넣어서.. 특정 위치(원하는 순서 번호에) 에 지정하여 넣을 수 있다.
// 나머지 데이터는 자동으로 뒤로 밀려 넘어가게 된다.
불러 내서 사용의 약간의 문제점
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 옵션 사용 디렉토리 컴파일을 시켜야 한다. . : 기준점
2) package 만의 형식) package java.lang; //자바라는 폴더와 그안에.. lang폴더를 생성 시키고.. 그안에 파일을 생성시킬 것이다.
폴더A.폴더B.폴더C... // 파일을 넣고자 하는 위치를 지정해 주는 것이다.
내가 포함 시키고자 하는 파일의 위치만 적어준다.
예) Test.java
3.3 package 사용
a) import 법
폴더 안에 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 name, int 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 x, int 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 이런 것들의 다양한 구현클래스간에 활용 용도등을 보여주는게 더 의미있지
않을런지... ㅎㅎ
단순히 해당 클래스의 성능보다 어떠한 작업이나 프로세싱에서의 성능을 생각해보는게 더 잼있을 것
//===========================================================================//
본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
기본으로 하여 정리하였습니다.
- 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
작성자 : litwave
//---------------------------------------------------------------------------//
<목차>
1. INFO 클래스
2. Collections 객체(Set, Map, List)
3. package
//---------------------------------------------------------------------------//
1. INFO 클래스 : 기본정보를 제공하는 클래스(만들기)
- 특별한 기능을 가지지 않으며, 단순히 데이타를 저장하기 위한 공간으로 사용된다.
1.1 한 명에대한 사용자 정보를 관리하는 클래스 만들기
class Person {
String name; // 이름
int age; // 나이
String tel; // 전화 번호
String addr; // 주소
}
1) INFO 클래스의 모든 멤버변수는 은닉화 되어 있어야 한다.(예:private String name;)
2) 생성자는 public 으로 만든다.
- 디폴트로 생성자(null, 0,... 디폴트로 값을 넣을 수 있는)를 만든다.
- 매개 변수를 받을 수 있는 생성자를 만든다.
(예: public Person(String name, int 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.1) Set(집합) 계열
- Set이라는 주머니가 존재하고 그 곳에는 무한대의 구슬을 넣을 수 있다.
- 집합을 생각
(1) 동일 데이타 처리를 하지 못한다.(no duplicate) // 색깔이 같은 동일 구슬을 넣으면 안된다.
(2) 정렬되지 않는다.(Not Ordering)
// 과제1) HashSet 을이용해서 은행 클래스 과제 해결
2.2) Map(데이타 베이스와 비슷)
- 키값과 데이타를 동시에 넣어 주어야 한다.
- 꺼낼 때는 특정 키값을 이용해서 꺼낼 수 있다. 웹에서 많이 사용된다.
(1) 동일 데이타를 넣을 수 있다.
(2) 정렬은 되지 않는다.(Not ordering)
// 과제2) HashTable 을이용해서 은행 클래스 과제 해결
2.3) List(LinkedList 를 포함하고 있음)
- 기차의 열차칸 처럼 구성 되어 있다.
- 스택의 구조로 되어 있다.
- 데이타를 저장하는데 각각의 순서 번호가 자동으로 지정 된다.
1) 중첩된 데이타를 넣을 수 있다.
2) 정렬이 가능하다.
3) 동일 데이터를 가질 수 있다.
// 과제3) LinkedList를 이용해서.. 은행 클래스 과제 해결..
3) Vector : List 인터페이스 타입의 Vector 클래스
--> Vector vc = new Vector(10, 5); // vc는 4 바이트
// 최초 10개의 데이타를 입력하고, 필요시만 5개씩 추가해서 사용할 수 있다.
--> Vector vc = new Vector(); // 디폴트로 놓고 쓸 수 있다..(메모리 낭비를 줄일 수 있다.)
Object를 상속받은 클래스(= 모든 클래스(하물며 숫자라는 자료형도))를 저장할 수 있다.
클래스 타입이기만 하면.. 모두 저장이 가능하다.
Vector 에 있는 size 메소드를 이용하면 현재 몇개의 데이타가 저장 되었는지 확인 할 수 있다.
-> vc.size();
vc.clear(); // 저장된 모든 데이타를 지워버린다.
vc.addElement(Object);
vc에 무한개의 데이터를 순서적으로 넣을 수 있다.
vc.add(0, Object); // 순서를 뛰어넣어서.. 특정 위치(원하는 순서 번호에) 에 지정하여 넣을 수 있다.
// 나머지 데이터는 자동으로 뒤로 밀려 넘어가게 된다.
불러 내서 사용의 약간의 문제점
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 옵션 사용 디렉토리 컴파일을 시켜야 한다. . : 기준점
2) package 만의 형식) package java.lang; //자바라는 폴더와 그안에.. lang폴더를 생성 시키고.. 그안에 파일을 생성시킬 것이다.
폴더A.폴더B.폴더C... // 파일을 넣고자 하는 위치를 지정해 주는 것이다.
내가 포함 시키고자 하는 파일의 위치만 적어준다.
예) Test.java
3.3 package 사용
a) import 법
폴더 안에 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 name, int 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 x, int 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 이런 것들의 다양한 구현클래스간에 활용 용도등을 보여주는게 더 의미있지
않을런지... ㅎㅎ
단순히 해당 클래스의 성능보다 어떠한 작업이나 프로세싱에서의 성능을 생각해보는게 더 잼있을 것
'scrap > Java/JSP' 카테고리의 다른 글
- [Java 기본]다형성, Abstract, Interface, Inner Class (0) | 2011.05.14 |
---|---|
- [Java 기본]예외처리, 클래스 상속 (0) | 2011.05.14 |
- [Java 기본]클래스, String, StringBuffer, static (0) | 2011.05.14 |
- [Java 기본]다차원배열, 클래스 (1) | 2011.05.14 |
- [Java 기본]메소드, 1차원 배열 (0) | 2011.05.14 |