# ArrayList
// 동적배열(ArrayList구조) : 리스트 내부에 배열이 들어가 있는 구조
public class ArrayListTest {
public static void main(String[] args) {
// ArrayList<String> list = new ArrayList<String>();
LinkedList<String> list = new LinkedList<String>();
list.add("포도"); // index = 0;
list.add("딸기"); // index = 1;
list.add("복숭아"); // index = 2; -> 3
// 중간에 값이 들어갈 경우
// add(1. 삽입할 위치, 2. 저장할 객체명)
list.add(2, "키위"); // index = 2;
// 중간검사
System.out.println("list 의 size() : " + list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println("list 의 순서 " + i + "번째 : " + list.get(i));
}
System.out.println("=====================================");
// 중간에 값을 수정할 경우
// set(1. 수정할 인덱스번호, 2. 수정할 값);
list.set(0, "오렌지"); // 포도 -> 오렌지
// 중간에 값을 삭제할 경우
// 1. remove(삭제할 데이터명) = 만약 동명이인이 있을경우 해당 이름 전부 삭제됨
// 2. remove(인덱스번호) = 중복된 데이터를 구분해서 삭제
list.remove("키위"); // = list.remove(2);
// 값을 조회 하는 경우
// get(인덱스번호)
System.out.println("list 의 size() : " + list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println("list 의 순서 " + i + "번째 : " + list.get(i));
}
}
}
# ArrayList (2)
import java.util.*; // ArrayList...
import java.io.Serializable; // 직렬화 하기위해서 필요 (데이터전송)
// class Person implements Serializable {}
class Person { // DTO (Data Tranfer Object) 데이터를 전송할수 있는 객체
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 회원가입 -> 회원로그인 -> 관리자만 회원리스트 목록을 볼 수 있도록 구성
public class ArrayListTest2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("회원명 입력 : ");
String name = sc.next();
System.out.println("나이 입력 : ");
int age = sc.nextInt();
Person p = new Person(); // new Person(name, age)
p.setName(name); // input box때문에
p.setAge(age);
Person p2 = new Person(); // new Person(name, age)
p2.setName("임시"); // input box때문에
p2.setAge(32);
Person p3 = new Person(); // new Person(name, age)
p3.setName("테스트김"); // input box때문에
p3.setAge(25);
// ArrayList을 이용해서 저장
ArrayList<Person> list = new ArrayList<Person>();
list.add(p);
list.add(p2);
list.add(p3);
// 출력
ArrayListTest2 alt = new ArrayListTest2(); // 메소드 호출(데이터 저장용)
alt.setPersonList(list);
sc.close();
}
// ArrayList<Person>매개변수로 전달 받아서 출력 -> html
// html 이 지금은 없기 때문에 console에 출력
public void setPersonList(ArrayList<Person> list) {
/*
for (int i = 0; i < list.size(); i++) {
// <td><% = st.getName() %></td>
Person st = list.get(i);
System.out.println("이름 : " + st.getName());
System.out.println("나이 : " + st.getAge());
}
*/
// for (꺼낸 객체의 자료형 객체명 : 배열 또는 컬렉션객체)
for (Person st:list) {
System.out.println("이름 : " + st.getName());
System.out.println("나이 : " + st.getAge());
}
}
// 웹에 출력시켜주는 메소드를 작성(DB에 저장된 데이터를 찾아서 담아서 출력)
// <td> <% = p.getName() %> </td>
// <td> <% = p.getAge() %> </td>
public ArrayList<Person> getPersonList() {
// DB에 접속해서 데이터를 가져온다는 경우(JDBC)
ArrayList<Person> list2 = new ArrayList<Person>();
list2.add(new Person("hong", 23)); // 익명객체형태로
list2.add(new Person("kim", 25));
list2.add(new Person("park", 28));
return list2;
}
}
# ArrayList (3) - 로또번호
// List -> ArrayList, Vector, Random....
import java.util.*;
public class ArrayListLotto extends Object {
Integer bonus; // 숫자객체
// int(X)
List<Integer> lotto = new ArrayList<Integer>();
// 부모가 가져오지 못해서 자식클래스의 객체를 통해서 인터페이스객체를 얻어올 수 있다.
// 6개의 번호를 랜덤으로 출력
public void setUp() { // 난수 0 ~ 0.999....
/*
* 난수를 발생 시킬수 있는 방법
* 1. Math.random() : 난수를 만들어주는 메소드
* 단점 : 중복된 숫자가 나옴
* seed값(섞어주는값 고정) -> 중복 높음
*/
Random random = new Random(); // 내부값이 변경될 때 마다 seed값이 변경됨 -> 중복X
while (bonus == null) { // 보너스 번호가 설정 안되어 있을때
// nextInt(숫자범위) = 숫자범위내의 임의의수를 출력
int num = random.nextInt(45)+1; // 1이 안나오기 때문에 +1을 해줘야됨
// System.out.println("num : " + num);
// 번호를 하나 뽑을때마다 lotto 배열의 내용을 비교 (중복비교)
if (!lotto.contains(num)) { // 중복된 숫자가 아니라면
if (lotto.size() < 6) { // 중복되지않음 + lotto 배열에 6개의 숫자가 다 안찼을 경우
lotto.add(num); // 뽑은 숫자를 lotto에 저장
} else { // lotto 배열이 꽉 찬 경우 lotto.size() >= 6
bonus = num; // 6개의 수가 꽉 차고 중복되지 않으면 나머지 보너스
} // else
} // outer if
} // while
Collections.sort(lotto); // 랜덤으로 뽑은 숫자를 오름차순으로 정렬
System.out.println(lotto.size());
}
@Override
public String toString() {
return "당첨번호 : " + lotto + ", 보너스 번호 : " + bonus;
}
public static void main(String[] args) {
ArrayListLotto lotto = new ArrayListLotto();
lotto.setUp(); // 6개의 번호를 구함
System.out.println(lotto); // 주소값 출력 -> lotto.toString()
}
}
# ArrayList (4) - Generic
* 자주 사용이 되는 클래스도 import형태로 등록
* 형식) import static 자주 불러서 사용하는 클래스명(패키지명....클래스명)
* 제너릭 클래스 : 특정 자료형의 값만 입력받아서 저장, 조회, 계산, 출력 등
* 적용) 멤버변수, 메소드의 매개변수에도 제너릭을 부여가능
*/
import static java.lang.System.out; // 메모리에 로딩
// 기능은 동일한데 서로 다른 자료형을 하나의 Type로 설계O (=추상화)
public class GenericEX <T> { // GenericEx클래스에 객체를 생성하면서 값을 저장할 Type에 대한 자료형만 받아서 처리함
/*
String v[];
Double v2[];
Integer v3[];
*/
T v[];
public void set(T n[]) {
v = n;
}
public void getPrint() {
for(T s:v) {
System.out.println(s);
}
}
/*
// 1. 배열의 값을 저장시킬 경우(setter)
public void set(String n[]) {
v = n;
}
public void set(Double n[]) {
v2 = n;
}
public void set(Integer n[]) {
v3 = n;
}
// 2. 배열의 값을 꺼내와서 출력(getter)
public void getPrint() {
for (String s:v) {
System.out.println(s);
}
}
public void getPrint2() {
for (Double s:v2) {
System.out.println(s);
}
}
public void getPrint3() {
for (Integer s:v3) {
System.out.println(s);
}
}
*/
public static void main(String[] args) {
out.println("자주 출력됨");
// 제너릭 주의 : 객체명은 다르게 설정, 타입도 다르게 설정해서 생성 해야됨
GenericEX<String> ge = new GenericEX<>();
GenericEX<Double> ge2 = new GenericEX<>();
GenericEX<Integer> ge3 = new GenericEX<>();
String ss[] = {"제너릭", "제너릭의 종류", "제너릭 실습"};
ge.set(ss);
ge.getPrint();
Double ss2[] = {3.4, 5.6, 7.8};
ge2.set(ss2);
ge2.getPrint();
Integer ss3[] = {23, 43, 234};
ge3.set(ss3);
ge3.getPrint();
/*
String ss[] = {"제너릭", "제너릭의 종류", "제너릭 실습"};
ge.set(ss);
ge.getPrint();
System.out.println("=======================");
Double ss2[] = {3.4, 5.6, 7.8};
ge.set(ss2);
ge.getPrint2();
System.out.println("=======================");
Integer ss3[] = {23, 43, 234};
ge.set(ss3);
ge.getPrint3();
*/
}
}
# ArrayList (5) - WildCard
import java.util.*;
// 1. < ? > 와일드 카드를 이용한 제너릭 방법 -> 메소드 호출시 매개변수를 전달할 때
public class WildTest {
public static void main(String[] args) {
// 1. 문자열
List<String> list = new ArrayList<>();
list.add("test1");
list.add("test2");
list.add("test3");
list.add("test4");
printDate(list);
System.out.println("===========================");
// 2. 정수형
List<Integer> list2 = new ArrayList<Integer>();
list2.add(new Integer(1));
list2.add(2);
list2.add(3);
list2.add(4);
printDate(list2);
System.out.println("===========================");
// 3. 소수점
List<Double> list3 = new ArrayList<Double>();
list3.add(1.1);
list3.add(2.2);
list3.add(3.3);
list3.add(4.4);
printDate(list3);
}
// 오버로딩의 단점은 메소드의 개수를 줄이질 못한다.
// 제너릭을 이용해 한개의 메소드로 통합
// <?> : 매개변수를 전달 받을때 그때 그때 마다 자료형을 바꿔서 전달함
public static void printDate(List<?> list) {
for (Object obj:list) {
System.out.println(obj);
}
}
/*
public static void printDate2(List<Integer> list) {
for (Integer obj : list) {
System.out.println(obj);
}
}
public static void printDate3(List<Double> list) {
for (Double obj : list) {
System.out.println(obj);
}
}
*/
}
# ArrayList (6) - WildCard (2)
import java.util.*;
/*
* 2. < ? extends T > : 상속관계로 이루어진 클래스만 메소드의 매개변수로 받겠다는 뜻
* ? : 자식클래스 (Man, Woman)
* T : 부모클래스 (Person2, Test)
* 부모클래스뿐만 아니라 자식클래스만 임의의 자료형으로 매개변수를 전달받겠다는 표시
*/
class Test extends Object { // 부모클래스로 사용 할 예정
String name;
}
class Person2 extends Object { // 부모클래스로 사용 할 예정
String name;
}
// 자식클래스 Man
class Man extends Test {
// String name
Man(String name) {
this.name = name;
}
@Override
public String toString() {
return this.name;
}
}
// 자식클래스 Woman
class Woman extends Test {
// String name
Woman(String name) {
this.name = name;
}
@Override
public String toString() {
return this.name;
}
}
public class WildTest2 {
public static void main(String[] args) {
// 1. Man
List<Man> list = new ArrayList<>();
/*
* Man m = new Man("임시");
* list.add(m);
*/
list.add(new Man("테스트1"));
list.add(new Man("test2"));
printDate(list);
System.out.println("===========================");
// 2. Woman
List<Woman> list2 = new ArrayList<Woman>();
list2.add(new Woman("임시2"));
list2.add(new Woman("임시3"));
printDate(list2);
System.out.println("===========================");
/*
// 3. Person
List<Person2> list3 = new ArrayList<>();
list3.add(new Person2());
printDate(list3);
System.out.println("===========================");
*/
// 4. Test
List<Test> list4 = new ArrayList<>();
list4.add(new Test());
printDate(list4);
}
// 오버로딩의 단점은 메소드의 개수를 줄이질 못한다.
// 제너릭을 이용해 한개의 메소드로 통합
// <?> : 매개변수를 전달 받을때 그때 그때 마다 자료형을 바꿔서 전달함
// 모든 클래스 OK
/*
* public static void printDate(List<?> list) {
*
* for (Object obj:list) { System.out.println(obj); } }
*/
// ?(자식) 대신에 자식클래스명 적으면 안됨
public static void printDate(List<? extends Test> list) { // 부모상속을 물려받는 자식클래스인 Man, Woman만 가능
for (Object obj : list) {
System.out.println(obj);
}
}
}
# Collection - Wrapper
/*
* 컬렉션(Collection) : 데이터(객체)를 저장할 수 있는 구조(List, Set, Map)
* -> 객체만 저장
* 기본자료형(8가지)은 컬렉션에 저장이 안됨 -> 객체가 아니기 때문에 저장이 안됨
* <-> 참조형(=객체형=클래스형)은 저장 가능
* 기본자료형을 컬렉션에 저장하고 싶다. -> Wrapper
*/
public class BoxingTest {
public static void main(String[] args) {
System.out.println("자동 unboxing");
// int obj = 10;
// unboxing : 자바의 객체형(Wrapper) -> 기본자료형으로 변환됨
Integer obj = new Integer(10);
// int sum = obj.intValue() + 20;
int sum = obj + 20; // Integer + int -> int + int = int(sum)
System.out.println("sum : " + sum);
// boxing : 기본자료형 -> 자바의 객체형(Wrapper)로 변환됨
System.out.println("자동 boxing");
/* Double d = new Double(123.45);
printDouble(d);*/
printDouble(new Double(123.45)); // 익명객체형태로 객체를 전달
printDouble(143.67); // double -> new Double(143.67)
}
static void printDouble(Double obj2) {
System.out.println(obj2.toString()); // 소수점을 문자열로 변환해서 출력하는 메소드
}
}
# Collection (2) - Vector
import java.util.*; // * = util에 관련된 전부
// Scanner, Vector, ArrayList
public class VectorTest {
public static void main(String[] args) {
Vector v = new Vector(); // new Vector(1, 1) // (1, 1) = (생성개수, 증가분) = default값
v.add("테스트"); // 자동으로 index 번호 0 부여
v.addElement("임시테스트2"); // 구버전(옛날버전), index 번호 1 부여
v.add("테스트2"); // index 번호 2 부여
// v.add(100); // 숫자는 객체가 아니기 때문에 자동으로 변환됨 (v.add(new Integer(100));
System.out.println("v 의 크기 : " + v.size());
// 값 출력
for(int i = 0; i < v.size(); i++) {
// 저장할때 Object형으로 저장 했기 때문에 값을 꺼내올때 다시 변환 시켜줘야됨
String temp = (String) v.elementAt(i);
System.out.println("v에든 내용 " + i + "번째 : " + temp);
}
/*
* 컬렉션의 장점이자 단점은 모든 '객체'가 저장이 가능하기 때문에 원치않는 타입의 객체를 넣을 수 있기 때문에
* 그 단점을 보안해주기 위한게 '제너릭'이다.
* 제너릭을 사용하면 원하는 타입만 들어가기 때문에 형변환 없이 바로 꺼내올 수 있다.
* 형식) Vector <원하는 타입>
*/
Vector<String> v3 = new Vector<String>(); // new Vector(1, 1) // (1, 1) = (생성개수, 증가분) = default값
v3.add("테스트44");
v3.addElement("임시테스트244");
v3.add("테스트245");
// v.add(100); // String으로 정했기 때문에 다른타입은 못들어옴
System.out.println("v 의 크기 : " + v.size());
// 값 출력
for (int i = 0; i < v.size(); i++) {
/*// 저장할때 Object형으로 저장 했기 때문에 값을 꺼내올때 다시 변환 시켜줘야됨
String temp = (String) v.elementAt(i);*/
System.out.println("v에든 내용 " + i + "번째 : " + v3.elementAt(i));
}
// 다양한 값 저장
Vector v2 = new Vector();
/*
* Character c = new Character('a');
* v2.add(c)
*/
v2.add('a'); // v2.add(new Character('a'));
// 만약에 100자리에 3.14 넣고 싶을때 = 1번인덱스 값을 다른걸로 바꾸고 싶을때
// 1. 기존에 100을 삭제하고 3.14 값을 집어넣는다
// 2. 혹은 'a' 와 100 사이에 생성을 해야됨
// insertElement(1. 저장할객체명, 2. 삽입할 인덱스번호)
v2.add(100); // v2.add(new Integer(100));
v2.insertElementAt(3.14, 1);
System.out.println("v2 의 크기 : " + v2.size());
// 수정
// setElementAt(1. 수정할데이터명, 2. 수정할 인덱스번호)
v2.setElementAt("사과", 2); // 2번의 인덱스 번호인 100의 값을 "사과"로 변경
// 내부적인 값의 타입들이 다 다를때
// 꺼내면서 내부적으로 자동형변환
for (int i = 0; i < v2.size(); i++) {
System.out.println("v2에든 내용 " + i + "번째 : " + v2.elementAt(i));
}
}
}
# Collection (3) - Hash (Set, Map)
import java.util.*;
// Set, Map -> 공통으로 사용하는 검색
public class EnumTest {
public static void main(String[] args) {
System.out.println("Set(중복을 허용X, 데이터의 저장순서X)");
HashSet<String> hs = new HashSet();
hs.add("abc");
hs.add("abc2");
hs.add("abc3");
System.out.println("hs : " + hs);
hs.remove("abc"); // abc 객체 삭제
System.out.println("hs : " + hs);
hs.clear(); // 삭제할 데이터가 1개 이상 일때 clear를 통해서 전체삭제
System.out.println("hs : " + hs);
System.out.println("hs의 개수 : " + hs.size());
System.out.println("저장 유무 확인 : " + hs.isEmpty()); // true = 비어있음
System.out.println("========================================");
// 검색 때문에
Vector<String> v = new Vector();
v.add("test1");
v.add("test2");
v.add("test3");
//Map <E>, <K, V> -> 표 형태로 저장 -> 세션처리(회원로그인 할 때 사용)
Hashtable<Integer, String> h = new Hashtable();
// Hashtable은 add 대신 put을 사용함
h.put(1, "홍길동");
h.put(2, "테스트");
h.put(3, "010-1234-1234");
h.put(4, "23");
h.put(5, "서울시 강남구");
// 값을 꺼낼때
// get(키명) -> 키를 알고 있으면 검색속도 제일 빠름
String tel = h.get(3); // = h.put(3, "010-1234-1234");
System.out.println("tel : " + tel);
System.out.println("============================================");
// 검색에 대한 인터페이스 -> Enumeration, Iterator
// 1. Enumeration : 저장된 순서 그대로 가져오길 원할때
Enumeration<String> eu = v.elements(); // 메소드 반환형
// 데이터구조가 다르다 할지라도 공통된 검색방법을 쓰고 싶다.
while(eu.hasMoreElements() == true) { // 검색할 데이터가 존재한다면
System.out.println(eu.nextElement());
}
// 2. Iterator : 도서관의 책꽂이에 들어가 있는 여러권의 책을 꺼내올 때
// -> 출력할 때 저장된 순서대로 출력X
Collection<String> c = h.values();
Iterator<String> ih = c.iterator();
while (ih.hasNext() == true) { // 검색할 데이터가 있다면
System.out.println(ih.next()); // 있으면 꺼내와라(= nextElement())
}
}
}
'국비학원 > 공부' 카테고리의 다른 글
25일차 java(13) (0) | 2023.07.03 |
---|---|
24일차 java(12) (0) | 2023.07.03 |
22일차 java(10) (0) | 2023.07.03 |
21일차 java(9) (0) | 2023.07.03 |
20일차 java(8) (0) | 2023.07.02 |