쌍용교육(JAVA)/JAVA

쌍용교육 -JAVA 수업 13일차 ArrayList리스트

구 승 2024. 4. 11. 22:40
package kr.s27.collection;

import java.util.ArrayList;

class A{
	@Override
	//toString을 재정의 해주지않으면 결과값에는 참조값이 나오기 때문에 재정의가 필요하다.
	public String toString() { 
		
		return "A";
	}
}
class B{}

public class ArrayListMain01 {
	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		//ArrayList에 객체 저장하기 (int,String 등등 여러개를 저장하면 일효율이 떨어진다. 하나만 사용해야좋음)
		list.add(new A());
		list.add(new B());
		list.add("홍길동");
		list.add(10);//자동으로 int -> Integer 가 입력된다. 이를 auto boxing 이라고 한다.
		
		
		//저장된 요소의 목록
		System.out.println(list);
		//요소의 갯수를 반환 .size()
		System.out.println(list.size());
		
	}
}

[A, kr.s27.collection.B@6f2b958e, 홍길동, 10]
4

package kr.s27.collection;

import java.util.ArrayList;

public class ArrayListMain02 {
	public static void main(String[] args) {
		/*
		 * list 구조의 특징
		 * 저장된 순서 유지, 중복 저장 허용
		 */
		ArrayList list = new ArrayList();
		list.add("홍길동"); //String -> Object
		list.add("장영실"); //String -> Object
		list.add("박문수"); //String -> Object
		list.add("김유신"); //String -> Object
		
		//저장된 요소의 목록
		System.out.println(list);
		System.out.println("----------------");
		//반복문을 이용해서 저장된 요소 출력
		for(int i =0; i<list.size(); i++) {
			//String name = list.get(i); //에러나는이유: 위에서 String에서 Object로 형변환 했기 때문에 명시적 형변환을 해줘야된다.
			String name = (String)list.get(i);//명시적 형변환
			System.out.println(name);
		}
	}
}

[홍길동, 장영실, 박문수, 김유신]
----------------
홍길동
장영실
박문수
김유신

package kr.s27.collection;

import java.util.ArrayList;

public class ArrayListMain03 {
	public static void main(String[] args) {
		/*
		 * 제네릭 표현 : 객체를 생성할 때 객처에 저장할 수 있는 요소의 타입을 지정
		 */
		ArrayList<String> list = new ArrayList<String>(); //<String>만 쓰겠다 라는 제네릭 표현 
		list.add("장영실");//String -> Object -> 제네릭을 쓰면 Object 로 저장 X 기존 String 으로 유지
		list.add("홍길동");//String -> Object-> 제네릭을 쓰면 Object 로 저장 X 기존 String 으로 유지
		//list.add(1000);//Integer -> Object 문법적인 문제는 없음 // 제네릭 표현을 쓰니까 문법적으로 문제가 생긴다.
						//String 으로 한정했기 때문에 Integer 데이터는 저장불가
		list.add("김유신"); //String -> Object-> 제네릭을 쓰면 Object 로 저장 X 기존 String 으로 유지
		
		//반복문을 이용한 요소의 출력
		for(int i = 0; i<list.size(); i++) {
			String name = (String)list.get(i); //1000이 String 이 되어도 컴파일 에러는 없음. 대신 실행시 타입에러 발생
												//(에러내용: Integer 가 String 으로 형변환이 불가능하다) 이러한 문제를 사전에 "제네릭 표현"을 써서 방지한다.
			System.out.println(name);
		}
		System.out.println("-------------------");
		
		//확장for문을 이용한 요소의 출력
		for(String name : list) {
			System.out.println(name);
		}
	}
}

장영실
홍길동
김유신
-------------------
장영실
홍길동
김유신

package kr.s27.collection;

import java.util.ArrayList;

public class ArrayListMain04 {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("홍길동");
		list.add("김유신");
		list.add("박문수");
		list.add("장영실");
		list.add("홍길동"); //ArrayList는 중복가능

		//반복문을 이용한 요소의 출력
		for (int i = 0; i<list.size(); i++) {
			System.out.println(i + " : " + list.get(i));
		}
		System.out.println("-------------------------------");

		//************요소의 삭제*************
		//인덱스
		//list.remove(2); 

		//요소
		list.remove("홍길동"); //중복된 데이터가 있을 떄 동시 삭제를 할 수 없고 앞에서부터 삭제함.-->모든 홍길동을 제거X 가장 앞에있는 홍길동 하나만 제거

		//반복문을 이용한 요소의 출력
		for (int i = 0; i<list.size(); i++) {
			System.out.println(i + " : " + list.get(i));
		}
		System.out.println("-------------------------------");

		ArrayList<Integer> list2 = new ArrayList<Integer>();
		list2.add(40);
		list2.add(1);
		list2.add(2);
		list2.add(3);
		list2.add(40);

		//반복문을 이용한 요소의 출력
		for (int i = 0; i<list2.size(); i++) {
			System.out.println(i + " : " + list2.get(i));
		}
		System.out.println("-------------------------------");

		//요소의 삭제
		//list2.remove(2);//인덱스
		list2.remove(Integer.valueOf(40)); //요소, int -> Integer로 변경됨
		//반복문을 이용한 요소의 출력
		for (int i = 0; i<list2.size(); i++) {
			System.out.println(i + " : " + list2.get(i));
		}
		System.out.println("-------------------------------");

		//요소의 변경
		list2.set(1, 30); //(인덱스,데이터) <인덱스 1의 값이 30으로 바뀐다.>
		//반복문을 이용한 요소의 출력
		for (int i = 0; i<list2.size(); i++) {
			System.out.println(i + " : " + list2.get(i));
		}
		System.out.println("-------------------------------");

	}
}

0 : 홍길동
1 : 김유신
2 : 박문수
3 : 장영실
4 : 홍길동
-------------------------------
0 : 김유신
1 : 박문수
2 : 장영실
3 : 홍길동
-------------------------------
0 : 40
1 : 1
2 : 2
3 : 3
4 : 40
-------------------------------
0 : 1
1 : 2
2 : 3
3 : 40
-------------------------------
0 : 1
1 : 30
2 : 3
3 : 40
-------------------------------

package kr.s27.collection;

import java.util.ArrayList;

public class ArrayListMain05 {
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer> () ;
		list.add(10);
		list.add(20);
		list.add(15);
		list.add(16);

		//저장된 요소의 목록
		System.out.println(list);
		System.out.println("----------------");

		//짝수 삭제
		/*
		for(int i = 0; i<list.size(); i++) {
			if(list.get(i)%2==0) {
				list.remove(i);
				//10이 지워지면서 20이 인덱스 0이 되었는데 이미 반복문은 0이 끝나고 1로 넘어갔기 때문에 인덱스 1에서 0이된 20은 삭제가 되지못함.
				//순서를 앞에서부터 뒤 순서가 아닌 뒤에서부터 앞으로하면 인덱스 변동이 생기더라도 가능함.
			}
		}
		*/
		//마지막 인덱스부터 시작해서 조건 체크하면 건너뛰는 데이터가 발생하지 않고 모든 요소의 조건 체크 가능
		for(int i = list.size()-1; i >= 0 ; i--) {
			if(list.get(i)%2 ==0) {
				list.remove(i);
				
			}
		}
		System.out.println(list);//[20,15] remove할 때 마다 인덱스 변동이 생겨서

	}
}

[10, 20, 15, 16]
----------------
[15]

package kr.s27.collection;

import java.util.ArrayList;
import java.util.Collections;

public class ArrayListMain06 {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("머루");
		list.add("사과");
		list.add("앵두");
		list.add("자두");
		list.add("사과");
		
		//인덱스 탐색
		int index1 = list.indexOf("사과"); //사과라는 문자의 인덱스 위치를 탐색하는 함수. 중복값일경우 첫번째
		System.out.println("첫번째 사과 : "+ index1);
		
		int index2 = list.lastIndexOf("사과"); //사과라는 문자의 인덱스 위치를 뒤에서부터 탐색하는 함수
		System.out.println("마지막 사과 : "+index2);
		
		int index3 = list.indexOf("망고");//리스트에 없는 값은 -1로 반환한다.
		System.out.println("망고 : " + index3);
		
		//검색기능: ArrayList에 머루가 저장되어 있으면 true를 반환 없으면 false를 반환
		boolean f1 = list.contains("머루"); 
		System.out.println("머루 : "+ f1);
		
		boolean f2 = list.contains("망고");
		System.out.println("망고 : " + f2);
		
		//요소의 목록 출력
		System.out.println(list);
		System.out.println("-----------------------");
		
		//정렬(사전에 명시된 순서대로)
		Collections.sort(list);
		System.out.println(list);  
		
		//역순으로 정렬
		Collections.reverse(list);
		System.out.println(list);
		System.out.println("-----------------------");
		
		ArrayList<Integer> list2 = new ArrayList<Integer>();
		list2.add(10);
		list2.add(100);
		list2.add(15);
		list2.add(2);
		list2.add(40);
		
		System.out.println(list2);
		
		//정렬(오름차순 정렬)
		Collections.sort(list2);
		System.out.println(list2);
		
		
	}
}

첫번째 사과 : 1
마지막 사과 : 4
망고 : -1
머루 : true
망고 : false
[머루, 사과, 앵두, 자두, 사과]
-----------------------
[머루, 사과, 사과, 앵두, 자두]
[자두, 앵두, 사과, 사과, 머루]
-----------------------
[10, 100, 15, 2, 40]
[2, 10, 15, 40, 100]

package kr.s27.collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

public class ArrayListMain07 {
	/*
	 * [실습]
	 * 로또 프로그램 제작
	 * 1~45까지 중복되지 않는 6개의 숫자를 구해서 ArrayList에 저장하고 출력하시오.
	 * 출력할 때는 오름차순 정렬하여 출력하시오.
	 * 난수 생성:Math.random(), Random클래스의 nextInt()메서드 사용
	 */
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer> () ;
		Random ra = new Random();
		
		while(list.size() < 6) {
			//난수 발생(1~45)
			int num = ra.nextInt(45)+1;
			//중복값 체크(포함이 되어있지 않다면을 만들어야됨)
			if(!list.contains(num)) {//if(list.contains(num)==false) {도 가능 
				list.add(num);
			}
		}
		//오름차순 정렬
		Collections.sort(list);
		System.out.println(list);
	}
		
}

[6, 13, 14, 16, 29, 39]

package kr.s27.collection;

import java.util.ArrayList;

public class ArrayListMain08 {
	public static void main(String[] args) {
		//2차원 배열 형태를 ArrayList로 구현하기 <>안에는 String Integer 말고 객체도 넣어서 사용가능.
		ArrayList<CartItem> list = new ArrayList<CartItem>();
		list.add(new CartItem("A1001",2,2000));
		list.add(new CartItem("B1001",1,7000));
		list.add(new CartItem("C1001",3,2500));
		//list는 배열과 다르게 더 추가할 수 있지만 배열은 미리 정해두면 더이상 추가 삭제가 불가능하다는 단점이있다.
		System.out.printf("%s  %8s %8s%n","상품코드","수량","가격");
		System.out.println("===================================");
		
		for(CartItem item:list) {
			System.out.printf("%s %,8d %,8d%n",item.getCode(),item.getNum(),item.getPrice());
		}
		System.out.println("=====================================");
		
		//요소의 삭제
		list.remove(1);
		
		for(CartItem item:list) {
			System.out.printf("%s %,8d %,8d%n",item.getCode(),item.getNum(),item.getPrice());
		}
	}
}

상품코드        수량       가격
===================================
A1001        2    2,000
B1001        1    7,000
C1001        3    2,500
=====================================
A1001        2    2,000
C1001        3    2,500

package kr.s27.collection;

public class CartItem {
	private String code; //상품코드
	private int num; //수량
	private int price; //단가
	
	public CartItem() {} //인자가 없는것도 넣어주는 편이 좋다.
	
	public CartItem(String code, int num, int price) {
		this.code = code;
		this.num = num;
		this.price = price;
		
	}
	
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
}