list -Array / Vector / Linked
자바 내용보도록 하겠습니다.
전체적인 구성에 대해서 살펴보겠습니다.
모두 컬렉션 - 리스트 - 이름만 다르지 사용법은 다 똑같아아ㅛ.
해볼게요.
이클립스 설정을 통해 자바 프로젝트로 만들어 주고 실습해볼게요.
[Array 리스트]
변수 선언해주고 뉴를 만들어 생성자를 만들어줍니다.
ArrayList list=new ArrayList;
리스트에 삽입하려면? add를 사용하고 다양한 타입의 데이터들을 넣어 줄 수 있습니다.
ArrayList list=new ArrayList;
//삽입
list.add("dd");
list.add(10);
이렇게 하고 학생들의 데이터를 이용하여 회원가입을 진행해보겠습니다.
참, 개인정보는 꼭 ! 캡슐화 = private 선언 해 주는것 잊지 마세요.
자 그러면 여기 이렇게 클래스를 하나 생성해 줬습니다. 앗참! 위의 list와는 다른 패키지로 생성하였습니다.
package dto;
public class Student {
private int sno;
private String name;
private int cno;
boolean check;
}
문자열 선언 앞에 캡슐화를 해준다구요 이해 되시냐구요? 저 부울형은 뭐냐구요? 트루/펄스 로 나오는 거라구요.
알트+시프트+에스 를 눌러서 게터세터 만들어줍니다.
만들면? 부울형이 먼가 특이함. 함 보죠!
public int getCno() {
return cno;
}
public void setCno(int cno) {
this.cno = cno;
}
//getCheck --> isCheck
public boolean isCheck() {
return check;
}
public void setCheck(boolean check) {
this.check = check;
}
이상한거 아,니.라.구.요!! 아니라느뇽!!!! 위에 cno와 다르다는것이 느껴지시나요? 짜자잔~~
디폴트 생성자를 눈ㅇ 보이게 명시해주겠습니다. 컨트롤 스페이스 눌러서 스튜던트를 보이게 해줘요.
//생략되어있는 생성자 명시
public Student() {
}
게터세터 위에 생성자를 명시해줬고요. 어떠한 생성자라도 명시 할 수 있습니다. 저게 ㅂ로 디폴트 생성자!
그런데 다시 alt+shift+s 를 누르고 제너레이트 컨스트럭터 유징 해서 생성자를 만들어주면?
디폴트 생성자는 없어지게 됩니다.
public Student(int sno, String name, int cno, boolean check) {
super();
this.sno = sno;
this.name = name;
this.cno = cno;
this.check = check;
}
이거랑 디폴트 생성자는 동시에 존재할수 없는,,,
이렇게 하면 어레이리스트테스트에 스튜던트가 빨간줄이 뜹니다. 왜요? 디폴트 생성자가 없어서!!!!
중요하다구요. 그래서 어레이이리스트테스트에서는 파라미터로 추가해 줍니다.
자자 잘 살펴보자고요
Student std1=new Student(1,"노원",304,true);
Student std2=new Student();
이렇게 2개 이구요, student 에서 확인해볼게요.
public Student(int sno, String name, int cno, boolean check) {
super();
this.sno = sno;
this.name = name;
this.cno = cno;
this.check = check;
}
public Student() {
}
각각 std1 / std2 에 대한 생성자 입니다. 2번은 디폴트로 생성하였습니다.
두개를 syso를 통하여 출력하면 뭐가나올까요?
오버라이드를 통해 살펴보면 toString 형시긍로 나온다는것을 알 수 있습니다.
바꿔볼게요
@Override
public String toString() {
// TODO Auto-generated method stub
return sno+":"+name+":"+cno+":"+check;
}
물론 스튜던트클래스에서 오버라이딩 했겠죠?
원래는 부모에 정의되어 있는것을 오버라이드=리모델링 이 가능하니까 리턴값을 바꿔줬습니다.
원래 저 return에 toString 이 있었어요. 복붙까먹음 ㅈㅅ
바꾼거로 출력화면 볼게요.
왕~~~ 나온다~~~~
이렇게 오버라이드 말고
Generate toString 통해도 볼게요
@Override
public String toString() {
return "Student [sno=" + sno + ", name=" + name + ", cno=" + cno + ", check=" + check + "]";
}
짜자자잔 이렇게 되었습니다. 이클립스에서 자동으로 만들어줌ㅋ.
머 암튼 그렇다구요!
//삽입 add()
list.add(std1);
list.add(std2);
//size() 메서드 통해 데이터 갯수 확이 ㄴ가능
System.out.println(list.size());
list.add(new Student(6,"강남",306,false));
System.out.println(list.size());
자 이렇게 저장했고 저장한것들을 지금 불러와볼게요.
//get(인덱스번호) 데이터 읽기
Student getData1 =list.get(0);
이렇게 하면 오류 듭니다. 왜요? 스튜던트는 오브젝트 타입이거든요. 그래서 아래 두가지 방법으로 바꾸어줍니다.
Object getData1 =list.get(0);
Student getData1 =(Student) list.get(0);
for 문으로 확인해보겟습니다.
Student getData1 =(Student) list.get(0);
list.add(0,new Student(4,"남영",304,true));
for(int i=0; i<list.size() ; i++) {
System.out.println(list.get(i));
}
get을 통해 읽을 수 있다구요
위에 숫자가 아니라 아래것만 보세요~!
list.remove(0);
for(Object obj:list) { //스트링으로는 정의안되고 오브젝트로만가능
Student s=(Student) obj;
//get 가져오고 싶은데 그거는 std에만 있으니까 캐스트 해준거임
System.out.print(s.getSno()+":");
System.out.print(s.getName()+":");
System.out.print(s.getCno()+":");
System.out.println(s.isCheck());
}
오케이 여기까지 어레이 리스트 엿습니다. 애드와 오브젝트 리무브 등등이었습니다.
[Vector]
package list;
import java.util.Vector;
import dto.Student;
public class VectorTest {
public static void main(String[] args) {
Vector list=new Vector();
list.add(new Student());
for(int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
}
}
list.add(0,new Student(1,"추가",304,true));
이거 넣으면
이제 수정해볼게요 set 을 이용하여
list.add(new Student());
list.add(0,new Student(1,"추가",304,true));
list.set(0, new Student(00,"수정",304,false));
자자 삭제하고 다시 삽입해보죠 삽입삭제수정
list.remove(1);
for(Object obj:list) {
Student s=(Student) obj;
System.out.print(s.getSno()+":");
System.out.print(s.getName()+":");
System.out.print(s.getCno()+":");
System.out.println(s.isCheck()+":");
}
와! 어레이 리스트랑 똑같당!
단일은 벡터
어레이는 여러개
그러나 요즘은 기술이 발전해서 그리 구분을 안해도 됩니다. 구분하고 싶지 않으면 벡터! 안전하게 쓰고 싶으면 벡터 쓰세요.
벡터는? synchronized 메서드를 사용합니다. 동기화 한다는 거죠.
그래서 멀티스레드 상에서 동기화 하며 안전하게 데이터 처리가 가능하지만, 처리속도가 느려질 수!도 있습니다.
어레이 리스트는 멀티스레드 상에서 쓰려면 동시접근만 안하면 안전하지만,,, 걍 벡터 쓰자구요
[Linked List]
package list;
import java.util.ArrayList;
import java.util.List;
public class LinkedListTest {
public static void main(String[] args) {
List<String> list1=new ArrayList<String>();
List<String> list2=new java.util.LinkedList<String>();
}
}
오 딱 보니까 위에거 2개랑 똑같을거 같은데~~~~~~
<String> 의 의미는
원래는 모든것을 허용하는데 그 중에서 스트링만 쓸게요. ~
List<String> list1=new ArrayList<String>();
List<String> list2=new LinkedList<String>();
long start;
long end;
//제일 앞쪽에 문자열 추가
start=System.nanoTime();
for(int i=0; i<10000; i++) {
list1.add(0,String.valueOf(i));
}
end=System.nanoTime();
System.out.println("ArrayList:"+ (end-start));
///////////////////////////////////////////////
start=System.nanoTime();
for(int i=0; i<10000; i++) {
list2.add(0,String.valueOf(i));
}
end=System.nanoTime();
System.out.println("LinkedList:"+ (end-start));
Array 와 Linked 의 차이입니다. 뭐가 더 빠를까요? 링크드! 근데 둘이 크으으으게 차이나진 않음ㅋ. 실행화면볼게요
1초로 바꾸면?
ArrayList:0
LinkedList:0
이거임ㅋ
리스트는 중복 데이터 허용.