본문 바로가기

programming/Gukbi

국비 교육 25일차 - 라이브러리 활용 (ArrayList)

728x90
반응형

오늘은 학원을 나가서 들었다. 확실히 집중도도 다르고 모르는게 있으면 물어볼 수 있어서 좋았다. 

근데 나빼고 다 잘 이해하는거 같아서 뒤지게 우울했다. 사실 어제 밤부터 우울했다. 내용은 어렵고 이해는 안가기 시작하고 마음은 조급하고 뭐하는 짓인가 싶고 그랬다. 지금이라고 다를건 없지만..

 

버티는 자가 승리하는거라고 믿고 싶은데 정신승리가 잘 안된다. 어느순간부터..

거울을 봤는데 사람 자체가 우울해보인다. 난 도대체 언제부터 이런 얼굴을 하고 산걸까..

지금 나를 처음 보는 사람들은 날 이런 느낌으로 알겠구나 생각이 들었다. 

사람의 분위기라는건 진짜 중요한데 

요즘의 나는 내가봐도 깡통같다..

 

sibal

 

하여튼 지금은 그런 마음이다. 수업 내용 복습을 위해 쓰는 블로그이지만 이정도 일기는 남겨도 되겠지

여튼 그래서 지금 학원 건너편 스벅에서 블로깅중이다. 이미 눈아파 뒤지겠다.

 

package com.sist.main;
/*
 * 	컬렉션 (Collection) : 데이터를 저장하는 표준화된 클래스
 * 	=================
 * 		= CURD (Create Update, Read, Delete)
 * 		= 데이터 읽기, 데이터 수정, 데이터 추가, 데이터 삭제
 * 		= 표준화 
 * 		= 배열(고정) / 컬랙션은 가변
 * 	1. 종류 
 * 		List : 순서가 있다 (인덱스 번호 => 일괄적으로 생성), 데이터가 중복적으로 저장 => 데이터베이스(오라클)
 * 		Set : 순서가 없다 (인덱스가 존재하지 않는다), 데이터 중복을 허용하지 않는다 => 사용빈도가 낮다
 * 		Map : 순서가 없다, 키와 값 => 키는 중복 x, 데이터는 중복을 허용함 / 키를 사용해서 값을 찾아옴
 * 		===
 * 		웹프로그램 : session, cookie, request, response
 * 
 * 		List : 인터페이스 (미완성된 클래스 - 메모리할당 못해줌) => 구현하고 있는 클래스를 이용한다 (표준화, 서로다른 클래스 연결)
 * 		 구현한 클래스
 * 		 =========
 * 		 배열 대신 사용을 한다
 * 		 ==================================================
 * 		 1) ArrayList : 비동기화 (순서 상관없이 저장) (데이터베이스 연결할때) *** 권장됨 // 사진+글이 있으면 사진이 먼저 뜰지 글이 먼저 뜰지 모름 (비동기화-순서를 모름)
 * 		 2) Vector : 동기화 (하나 저장하고 그 다음에 저장함) (네트워크에 사용)
 * 		 3) LinkedList : C언어 호환 => 속도가 빠르다
 * 		 ==================================================
 * 			공통적으로 사용
 * 			1. 데이터 저장 (추가) : add() ======> INSERT
 * 			2. 데이터 삭제 : remove() =========> DELETE
 * 			3. 데이터 수정 : set()	============> UPDATE
 * 			4. 데이터 읽기 : get()	============> SELECT   JOIN, SUBQUERY
 * 			5. 저장된 데이터 갯수 : size()
 * 		 ==================================================
 * 		 4) Stack : LIFO, Queue : FIFO
 * 			============  ============
 * 		   LastInFirstOut FirstInFirstOut (네트워크, 운영체제)
 * 
 * 		ArrayList
 * 		=========
 * 		1. 생성하는 방법
 * 		 	ArrayList list=new ArrayList();
 * 			=========		   ===========	
 * 			Vector (이렇게 사용가능)	 Vector()
 * 			LinkedList			LinkedList()
 * 		2. 데이터 저장
 * 			= 맨뒤에 추가 list.add(데이터);
 * 							========= Object public void add(Object obj) - 모든 데이터가 다 들어갈 수 있음, 리턴형이 obj이기 때문에 항상 형변환을 해줘야함 / 제네릭스 활용하면 형변환 안해도됨
 * 							1
 * 							2
 * 			= 원하는 위치에 추가 list.add(int index, Object obj)
 * 							1
 * 							2 => 1,3,2
 * 						
 * 		3. 데이터 읽기 list.get(int index) 		public Object get(int index) 
 * 					예) list.get(1) 			=> int no=(new)list.get(i)	
 * 		4. 데이터 갯수 확인
 * 					list.size() 			public int size()
 * 		5. 데이터 수정
 * 					list.set(int index, Object obj) public void set(int index, Object obj)
 * 					
 * 		6. 데이터 삭제 => 한개, 전체
 * 					list.remove(int index) 	public boolean remove(int index)
 * 					
 */
import java.util.*;
public class MainClass {
	public static void main(String[] args) {
		// 이름을 저장 (여러개) String[] names=new String[10];
		// 저장할 메모리 공간 설정
		ArrayList nameList = new ArrayList(); // 노란색줄은 경고, Object를 저장하는 공간
		//Vector nameList = new Vector(); // 클래스 이름 변경해도 내용은 똑같음. 인터페이스를 구현하고 있기 때문에
		//LinkedList nameList = new LinkedList();
		// 저장
		nameList.add("황런쥔"); // 0
		nameList.add("이제노"); // 1
		nameList.add("박지성"); // 2
		nameList.add("종천러"); // 3
		nameList.add("루카스"); // 4
		
		// forEach 구문 String으로 사용 불가 - 형변환 불가하기 때문
		/*
		 * 	public void display(double d)
		 * 	{
		 * 			65.0 으로 저장됨 / 매개변수 형때문에 바뀐 것
		 *  }
		 *  display('A'); 
		 */
		
		System.out.println("============ArrayList에 저장된 데이터 ==============");
		for(int i=0; i<nameList.size(); i++)
		{
			Object o=nameList.get(i);
			System.out.println(i+":"+o);
		}
		
		System.out.println("현재 저장된 이름:"+nameList.size());
		
		// 원하는 위치 데이터를 출력
		nameList.add(2, "양양");
		/*
		 * 	황런쥔 0
			이제노 1
			박지성 2 <= 이 자리에 양양 넣어라
			종천러 3
			루카스 4
			
			황런쥔 0
			이제노 1
			양양 2 
			박지성 3 
			종천러 4
			루카스 5
			======= 단점 : 그 뒤의 숫자를 하나씩 증가시켜야함 = 속도가 느려짐 / 가능하면 맨 뒤에 추가하는 것이 좋음
		 */
		
		for(int i=0; i<nameList.size(); i++)
		{
			Object o=nameList.get(i);
			System.out.println(i+":"+o);
		}
		
		
		System.out.println("========== 수정 ===========");
		nameList.set(3, "이해찬"); // 몇번째를 바꿀것인지 인덱스 번호 써주기
		
		for(int i=0; i<nameList.size(); i++)
		{
			Object o=nameList.get(i);
			System.out.println(i+":"+o);
		}
		
		System.out.println("======== 삭제 ========");
		nameList.remove(2); // 양양 삭제
		
		/*
		 *  황런쥔 0
			이제노 1
			이해찬 2 <= 양양대신 하나씩 위로 올려줌
			종천러 3
			루카스 4
		 */
		
		for(int i=0; i<nameList.size(); i++)
		{
			Object o=nameList.get(i);
			System.out.println(i+":"+o);
		}
		System.out.println("======== 전체 삭제 =========");
		nameList.clear();
		System.out.println("저장된 이름 :"+nameList.size());
	}

}

 

오늘은 컬렉션 중에서도 List, 그중에서도 ArrayList를 배웠다. 

컬렉션은 데이터 저장하는 표준화된 클래스이다. 그중에서도 List는 순서가 있고 데이터의 중복저장을 허용한다. 

List중에서도 집중해서 봐야할 것은 ArrayList - 순서가 상관없이(비동기화) 저장되어서 웹페이지 제작에 이용된다. 

 

메소드들은 add(), get(), size()정도만 알아놓으면 된다고 한다. 

그냥 한번 생성부터 다른 메소드들도 직접 활용해봐야겠다. 

 

package com.sist.main;
import java.util.*;
class NCTVO
{
	private int no;
	private String name;
	private String nationality;
	private String birthday;
	private String nickname;
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNationality() {
		return nationality;
	}
	public void setNationality(String nationality) {
		this.nationality = nationality;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	// 생성자
	public NCTVO(int no, String name, String nationality, String birthday, String nickname) {
		
		this.no = no;
		this.name = name;
		this.nationality = nationality;
		this.birthday = birthday;
		this.nickname = nickname;
	}
	
	
}


public class MainClass3 {

	public static void main(String[] args) {
		ArrayList list=new ArrayList(); // ArrayList 생성해주고
		list.add(new NCTVO(1, "이제노", "한국", "20000423", "제똥이")); // add와 생성자 써서 값 초기화 해줌
		list.add(new NCTVO(2, "황런쥔", "길림", "2000323", "야웅이"));
		list.add(new NCTVO(3, "루카스", "홍콩", "19990125", "서방님"));
		
		for(int i=0; i<list.size(); i++) // list에 값들을 초기화 해줬으니, size()를 써서 for문을 그만큼 돌림
		{
			NCTVO vo=(NCTVO)list.get(i); // vo라는 주소값에 list의 값들을 인덱스 순서대로 저장, vo라는 주소는 생성될때마다 새로운 주소값을 생성하기때문에 꼭 for문 안에서 만들어줘야함
			System.out.println("번호:"+vo.getNo()); // getter 메소드를 이용해서 vo 주소값에 저장되어 있는 번호, 이름, 국적, 생일, 별명 값 출력하기 
			System.out.println("이름:"+vo.getName());
			System.out.println("국적:"+vo.getNationality());
			System.out.println("생년월일:"+vo.getBirthday());
			System.out.println("별명:"+vo.getNickname());
			System.out.println("---");
		}

	}

}

직접 만들고 싶었으나 역시나 원래 썼던 코드를 참고해서 적었다. 눈으로 이해됐다고해서 내가 당장 써내려갈 수없다. 그래서 또 연습할려고 한다. 하고 뒤 블로깅을 이어서 하겠다. 

=> 됐다

 

 

 

 

 

package com.sist.news;
import java.util.*;
import java.io.*;
public class NewsManager {
	private static ArrayList newsList = new ArrayList();
	// 유저가 여러명이라고 생각-> static으로 데이터를 공유할 수 있게 처리해줌
	
	static
	{
		try
		{
			// 파일 읽기
			FileReader fr=new FileReader("c:\\javaDev\\daum_news.txt");
			int i = 0;
			StringBuffer sb = new StringBuffer();
			while((i=fr.read())!=-1)
			{
				sb.append(String.valueOf((char)i));
			}
			fr.close();
			
			//System.out.println(sb); // sb.toString() 써도됨 
			//sb 는 String이 아니라 객체임 
			
			// 분리
			String data=sb.toString();
			String[] news_data=data.split("\n");
			
			for(String news:news_data)
			{
				// st, vo라는 주소는 괄호밖에서는 사라짐
				StringTokenizer st=new StringTokenizer(news, "|");
				NewsVO vo=new NewsVO(); // 이렇게 따로 300개씩 저장해야함 
				// 300개가 다 다른 새로운 주소값이 출력됨 stack의 주소값은 사라져도 됨, heap에 저장된 값들만 남아 있으면 되는 것/ heap에 저장된 값들은 프로그램 종료시에 gc()가 삭제함.
																									// 즉 프로그램 종료전에는 삭제되지 않음 
				// vo 생성자를 for문 밖으로 빼면 하나의 주소만 저장하기 때문에 안쪽으로 들어와야 하는 것
				vo.setNo(Integer.parseInt(st.nextToken()));
				vo.setTitle(st.nextToken());
				vo.setContent(st.nextToken());
				vo.setAuthor(st.nextToken());
				vo.setPoster(st.nextToken());
				vo.setLink(st.nextToken());
				
				newsList.add(vo);
			}
			
			
			
		}catch(Exception ex) {
			ex.printStackTrace();
		}
	}
	// 목록 출력
	public ArrayList newsListData(int page)
	{
		// 10개씩 나눠서 페이지 별로 보이게 만들어야 함
		ArrayList list=new ArrayList(); // 가변형
		int j=0; // 10개씩 나눠주는 변수 j<10
		int pagecnt=(page*5)-5;// 시작위치
		/*
		 * 	1page 0~4 0이 pagecnt
		 * 	2page 5~9 5이 pagecnt
		 * 	3page 10~14 10이 pagecnt
		 */
		for(int i=0; i<newsList.size(); i++) 
		{
			if(j>4) // 그래서 4보다 커지면 아예 for문을 종료하고 빠져나감, 속도가 더 빨라질 수 있음 
				break;
			if(j<5 && i>=pagecnt) // pagecnt 가 페이지 시작 번호인것
			{
				NewsVO vo=(NewsVO)newsList.get(i);
				list.add(vo);
				j++; // j가 항상 4까지 가야함
			}
		}
		
		
		return list;
	}
	
	//총페이지
	public int newsTotalPage()
	{
		return (int)(Math.ceil(newsList.size()/5.0)); //ceil - 올림함수
		// 203/20.0==>10.15 이거를 올림해서 총 11로 계산해주고 그걸 총 페이지로 설정함 
	}
	
	
	public static void main(String[] args) {
		NewsManager m=new NewsManager();
//		for(int i=0; i<newsList.size(); i++)
//		{
//			NewsVO vo=(NewsVO)newsList.get(i);
//			System.out.println(vo.getTitle());
//		}
		
		ArrayList list=m.newsListData(20);
		for(int i=0; i<list.size(); i++)
		{
			NewsVO vo =(NewsVO)newsList.get(i); // 이렇게 NewsVO 클래스의 주소값을 넘겨줘야 Object에 없는 따로 만들어준 메소드를 (getter,setter) 사용할 수 있다/ 대신 형변환을 해서 받아와야함
			System.out.println(vo.getNo()+"."+vo.getTitle());
		}
		
		
		System.out.println("총페이지:"+m.newsTotalPage());
		/*
		 *  class A
		 *  {
		 *  	public String toString(){} // 오버라이딩
		 *  	public voud display(){}
		 *  }
		 *  
		 *  Object obj=new A(); // 가능함 Object가 가지고 있는 메소드중에 A클래스 오버라이딩된 것만 호출
		 *  obj.toString() // 접근할 수 있음 (재정의 된 것을 호출함) , 메소드 주소가 바뀜 
		 *  obj.display() // 접근할 수 없음 (Object에는 display()라는 메소드가 없기 때문에)
		 *  
		 *  A a=(A)obj;
		 *  a.toString();
		 *  a.display();
		 *  
		 *  ========================= 잘 기억해야함!! 형변환 신경써서 프로그램짜기
		 *  
		 */
		
	}
}

사실상 오늘 수업은 위의 코드를 이해하는게 관건이었다. 솔직히 수업중에는 내가 못하고 있다는 걸 느꼈다. 

그래서 너무 슬프고 가슴이 콩닥거렸다. 나는 내가 이해를 못하는거 같으면 너무 쉽게 불안해진다...

 

시간은 이럴때 쓰라고 있는거니까 지금 복습하면서 이해를 다시 하려고 노력해야지

 

 

 

package com.sist.news;
import java.util.*;
import java.io.*;
public class NewsManager연습{
	private static ArrayList newslist=new ArrayList();
	// 유저가 여러명이라고 생각-> static으로 데이터를 공유할 수 있게 처리해줌
	
	//파일 읽기
	static
	{
		try 
		{
			// 파일 읽기
			FileReader fr=new FileReader("c:\\javaDev\\daum_news.txt");
			int i=0;
			StringBuffer sb=new StringBuffer();
			while((i=fr.read())!=-1) // 파일이 끝날때까지 읽어오기
			{
				sb.append(String.valueOf((char)i)); // 한글자씩 읽어서 sb에 저장
				
			}
			fr.close(); // 파일 닫아줌
			// System.out.println(sb); => 한번 출력해줘서 다 나오나 확인
			String data=sb.toString(); // sb의 값들을 문자열로 바꿔서 data라는 문자열에 한꺼번에 저장함
			String[] data_list=data.split("\n"); // data_list라는 문자열 배열에 \n (띄어쓰기) 단위로 나누어서 저장/ 즉, 첫번째 띄어쓰기 전의 문장은 0번째 인덱스의 값으로 저장되는 것
			
			// data_list를 | 단위로 또 나누어서 저장해줘야함 => for문 돌려야할것 같음
			for(String s: data_list)
			{
				StringTokenizer st=new StringTokenizer(s, "|"); // 앞에는 나누어줄 String, 뒤에는 나누어줄 구분자 
				NewsVO vo = new NewsVO(); // for문 안에 주소값을 계속해서 새로 만들어 줘야 300개의 주소값이 각각 생성됨 
				vo.setNo(Integer.parseInt(st.nextToken()));
				vo.setTitle(st.nextToken());
				vo.setContent(st.nextToken());
				vo.setAuthor(st.nextToken());
				vo.setPoster(st.nextToken());
				vo.setLink(st.nextToken());
				
				newslist.add(vo); // 여기까지 읽어준 파일을 문자열에 저장-> 문자열 배열에 나눠서 저장-> Tockenizer로 쪼개서 요소별로 저장, newslist에 최종 저장까지 마침
			}
			
			
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	// 목록 출력
	public ArrayList newsListdata(int page)
	{
		// 10개씩 나눠서 페이지 별로 보이게 만들어야 함
		ArrayList listPage = new ArrayList();
		int j=0; // 10개씩 나눠줄 숫자
		int pagecnt = (page*10)-10; // 각 페이지의 첫 게시글의 넘버를 지정해주는것
		/*
		 * 	1page 0~9
		 * 	2page 10~20 
		 * 	3page 20~30
		 */
		for(int i=0; i<newslist.size(); i++)
		{
			if(j<10 && i>=pagecnt)
			{
				NewsVO vo=(NewsVO)newslist.get(i);
				listPage.add(vo); // 여기 이해하기
				j++;
			}
		}
		return listPage;
	}
	
	
	//총페이지
	public int totalPage()
	{
		return (int)(Math.ceil(newslist.size()/10.0));
	}
	
	
	public static void main(String[] args) {
		
		NewsManager연습 m=new NewsManager연습();
		
		ArrayList al=new ArrayList();
		for(int i=0; i<newslist.size(); i++)
		{
			NewsVO vo=(NewsVO)newslist.get(i);
			System.out.println("제목:"+vo.getTitle()+"내용:"+vo.getContent());
		}
		System.out.println("총페이지:"+m.totalPage());
		
	}
}

이해하고 다시 써본 코드이다. 어제 이거까지 하다가 시간이 다되어서 카페에서 쫓겨났었다..

아직 다 아는건 아니지만 그래도 어느정도는 혼자 코드를 써보고 이해하려고 노력했다. 

 

 

728x90
반응형