본문 바로가기

수업내용

[Day27][Java] Collection / Generic / auto Boxing / auto unBoxing / ArrayList / LinkedList / HashMap

Ⅰ. Collection

 

-- Package(my.day16.collection)와 Class(ListTest)를 생성

 

 

▷ 배열(Array)과 자료구조(Collection)의 차이점?

 

-- 배열(Array)은 오로지 동일한 데이터 타입만 들어가는 저장소이다.

   배열(Array)은 그 크기가 한번 정해지면 크기를 변경할 수 없다.

 

-- 자료구조(Collection)은 동일한 타입의 객체가 아니더라도 객체타입이기만 하면 모두 들어가는 저장소이다.
    자료구조(Collection)은 저장되는 크기가 자동적으로 늘어난다.

 


 

ListTest

Vector vt = new Vector(5, 3);

 

-- 초기용량이 5이고 객체가 더 들어오면 용량은 3만큼씩 증가한다.

 

ListTest

System.out.println("벡터 vt의 용량 : " + vt.capacity());
System.out.println("벡터 vt에 저장된 현재 크기 : " + vt.size());

 

 

-- 동일 Package(my.day16.collection)에 Class(Member) 생성

 

public class Member {

	private String userid;
	private String passwd;
	private String name;
	
	public Member() { }
	
	
	
	public Member(String userid, String passwd, String name) {
		super();
		this.userid = userid;
		this.passwd = passwd;
		this.name = name;
	}

	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		String info = "\n== 회원정보 ==\n" +
		 			  "▷ 아이디 : " + userid + "\n" +
		 			  "▷ 암  호 : " + passwd + "\n" +
		 			  "▷ 성  명 : " + name + "\n";
		return info;
	}
}

 

 

벡터의 요소(element) 넣기

 

Vector객체명.add(넣어야할객체)

 

ListTest

vt.add(nameArr[0]);
		
for(int i=1; i<nameArr.length; i++) {
	vt.add(nameArr[i]);
}
		
System.out.println("벡터 vt의 용량 : " + vt.capacity());
System.out.println("벡터 vt에 저장된 현재 크기 : " + vt.size());

 

 

ListTest

vt.add(mbrArr[0]);
		
System.out.println("벡터 vt의 용량 : " + vt.capacity());
System.out.println("벡터 vt에 저장된 현재 크기 : " + vt.size());	

 

 

-- 최대로 저장되어 있는 vt에 더 추가를 하면 용량이 3만큼 자동 증가된다.

 

ListTest

for(int i=1; i<mbrArr.length; i++) {
			vt.add(mbrArr[i]);
		}
		
System.out.println("벡터 vt의 용량 : " + vt.capacity());	
System.out.println("벡터 vt에 저장된 현재 크기 : " + vt.size());

 

 


 

ListTest

ArrayList list = new ArrayList();

또는

List list = new ArrayList();

 

-- 두 번째 방법을 더 많이 사용한다.

 

ListTest

System.out.println("ArrayList 의 현재 크기 => " + list.size());
		
for(int i=0; i<nameArr.length; i++) {
	list.add(nameArr[i]);
}
		
System.out.println("ArrayList 의 현재 크기 => " + list.size());

 

 

ListTest

for(int i=0; i<mbrArr.length; i++) {
		list.add(mbrArr[i]);
}
		
System.out.println("ArrayList 의 현재 크기 => " + list.size());
		
Integer[] intArr = {new Integer(100)
				   ,new Integer(200)
				   ,new Integer(300) };
		
for(int i=0; i<intArr.length; i++) {
	list.add(intArr[i]);
}
		
System.out.println("ArrayList 의 현재 크기 => " + list.size());

 

 

-- 객체라면 다 입력 받는다.

 

ListTest

double[] dblArr = {1.1, 2.2, 3.3, 4.4, 5.5};
		
for(int i=0; i<dblArr.length; i++) {
	list.add(dblArr[i]);
}
		
System.out.println("ArrayList 의 현재 크기 => " + list.size());

double[] dblArr2 = {0.1, 0.2, 0.3, 0.4, 0.5};
		
for(int i=0; i<dblArr2.length; i++) {
	list.add(new Double(dblArr2[i]));
}
		
System.out.println("ArrayList 의 현재 크기 => " + list.size());

 

 

-- 첫 번째와 같이 객체로 들어오지 않더라도 입력 받는 것을 확인할 수 있다.

-- autoBoxing : 원시형 데이터타입의 데이터를 자바가 알아서 자동적으로 wrapper 클래스 타입으로 만들어 준다. 

 

예> byte bl = 10;                    new Byte(b1);
     int n1 = 233232;               new Integer(n1);
     double db1 = 34.34231       new Double(db1);

     char ch1 = 's';                  new Character(ch1);

 

 


 

List에 저장된 객체 데이터 꺼내오기

 

 

Member

public void memberInfo() {
		System.out.println("1.아이디 : " + userid + "\n" +
						   "2.암  호 : " + passwd + "\n" +
						   "3.성  명 : " + name + "\n");
	}

 

ListTest

Object obj = list.get(i);
	if (obj instanceof String) {
		System.out.println("인덱스 번호" + i + "번째 String 타입 : " + (String)obj);
	} 
	else if (obj instanceof Member) {
		System.out.println("인덱스 번호" + i + "번째 Member 타입 : " + (Member)obj);
		((Member)obj).memberInfo();
	} 
	else if (obj instanceof Integer) {
		System.out.println("인덱스 번호" + i + "번째 Integer 타입 : " + ((Integer)obj - 10));
	} 
	else if (obj instanceof Double) {
		System.out.println("인덱스 번호" + i + "번째 Double 타입 : " + (Double)obj);
	} 
	else {
		System.out.println("인덱스 번호" + i + "번째 Object 타입 : " + obj);
	}
}

 

-- 매번 꺼낼 때마다 객체의 타입이 무엇인지 확인해야 하기 때문에 불편하다. 

-- JDK 1.5 부터 제네릭(Generic)타입이 새로 추가되었는데, 제네릭(Generic)을 이용함으로써 잘못된 타입이
   사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다.

 


Ⅱ. Generic

 

-- <E>를 Generic이라고 부르는데 JDK 1.5 버전 이후부터 사용되었다.
-- <E>의 E는 Element(요소)를 뜻하는 것으로 클래스명이 들어온다.
-- nameList에 저장되는 객체는 의 E에 들어오는 클래스만 가능하다.

 

ListTest

List<String> nameList = new ArrayList<String>();

 

 

-- String 외에 다른 값은 들어올 수 없다.

 

 

ListTest

for(int i=0; i<nameArr.length; i++) {
	nameList.add(nameArr[i]);
}
		
for(int i=0; i<nameList.size(); i++) {
	System.out.println(nameList.get(i));
}

 

 

 

Member만 입력 받는 List를 만들고 위에서 만든 mbrArr를 mbrList에 넣은 후 꺼내 보세요.

 

ListTest

List<Member> mbrList = new ArrayList<Member>();
		
for(int i=0; i<mbrArr.length; i++) {
	mbrList.add(mbrArr[i]);
}
		
for(int i=0; i<mbrList.size(); i++) {
	System.out.println(mbrList.get(i));
}

 

또는

 

ListTest

for(Member mbr : mbrList) {
	System.out.println(mbr);
}

 

 

문제 ▷▷ mbrList에 저장된 Member 객체 중 name이 "김길동"인 것만 memberInfo() 메소드를 실행하시오.

 

▷ 첫 번째 방법

 

ListTest

for(int i=0; i<mbrList.size(); i++) {
	Member m = mbrList.get(i);
	if("김길동".equals(m.getName())) {
	m.memberInfo();
	}
}

 

▷ 두 번째 방법 (확장 for문)

 

ListTest

for(Member m : mbrList) {
	if("김길동".equals(m.getName())) {
	m.memberInfo();
	}
}

 

 

-- m.getName().equals("김길동") (X) / "김길동".equals(m.getName()) (O) 

※ 비교를 할 땐 항상 null 값이 나오지 않도록 상수값이 앞에 나와야 한다.

 


Ⅲ. auto Boxing / auto unBoxing

 

 

▷ auto Boxing

: 원시형 데이터 타입(Primitive Type)의 데이터를 자바가 알아서 자동적으로 wrapper 클래스 타입으로 만들어 주는 것을 말한다.

 

ListTest

for(int i=1; i<=5; i++) {
	intList.add(i);
}

 

 

▷ auto unBoxing

: wrapper 클래스로 되어진 데이터를 원시형 데이터 타입(Primitive Type)으로 자바가 알아서 자동적으로 바꾸어 주는 것

을 말한다.

 

ListTest

for(int i=0; i<intList.size(); i++) {
	int n = intList.get(i);
	System.out.println(n*10);
}

 

 


Ⅳ. ArrayList

 

1) 출력시 저장된 순서대로 나온다.
2) 중복된 데이터를 저장할 수 있다.
3) 데이터를 읽어오는 속도는 ArrayList가 LinkedList보다 상대적으로 빠르다.
4) 순차적으로 데이터를 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 상대적으로 빠르다.
5) 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 ArrayList가 LinkedList보다 상대적으로 느리다.
6) 결과값은 ArrayList를 사용하든지 LinkedList를 사용하든지 동일한 결과값을 가진다.
7) LinkedList보다는 ArrayList를 사용하도록 하자.

 

-- 동일 Package(my.day16.collection)에 Class(ArrayListTest) 생성

 

1. Member 클래스의 객체만을 저장할 수 있는 ArrayList 객체 memberList를 생성하시오.

 

ArrayListTest

List<Member> memberList = new ArrayList<Member>();

 

 

2. Member 클래스의 객체 6개를 생성하여 memberList에 저장하시오.

 

ArrayListTest

memberList.add(new Member("youjs","qwer1234$","유재석"));
memberList.add(new Member("eom","qwer1234$","엄정화"));
memberList.add(new Member("kanghd","qwer1234$","강호동"));
memberList.add(new Member("leess","qwer1234$","이순신"));
memberList.add(new Member("kimth","qwer1234$","김태희"));
memberList.add(new Member("kangkc","qwer1234$","강감찬"));

 

 

3. memberList에 저장되어진 모든 회원들의 정보를 출력하도록 memberInfo() 메소드를 실행하시오.

 

ArrayListTest

for(int i=0; i<memberList.size(); i++) {
	memberList.get(i).memberInfo();
}

 

 

문제1 ▷▷ Member 객체의 userid 값이 고유한 값만 들어온다는 전제 하에 userid 값이 "leess"인 회원의 정보만 출력하세요.

 

ArrayListTest

for(Member mbr : memberList) {
	if("leess".equals(mbr.getUserid())) {
		mbr.memberInfo();
		break;
	}
}

// 또는

for(int i=0; i<memberList.size(); i++) {
	Member mbr = memberList.get(i);
	if("leess".equals(mbr.getUserid())) {
		mbr.memberInfo();
		break;
	}
}

 

 

ArrayListTest

memberList.add(new Member("leess","qwer1234$","이순신"));
memberList.add(new Member("leess", "abcd", "이삼순"));

 

 

-- userid가 같은 객체를 추가 입력한다.

 

 

문제2  Member 객체의 userid 값이 중복을 허락하는 전제 하에 userid 값이 "leess"인 회원의 정보만 출력하세요.

 

ArrayListTest

for (Member mbr : memberList) {
	if ("leess".equals(mbr.getUserid())) {
		mbr.memberInfo();
	}
}

// 또는

for (int i = 0; i < memberList.size(); i++) {
	Member mbr = memberList.get(i);
	if ("leess".equals(mbr.getUserid())) {
		mbr.memberInfo();
	}
}

 

 

-- ArrayList는 중복을 허락하고, Map은 중복을 허락하지 않는다.

 

 

문제3  memberList에 저장되어진 Member 객체들 중에 name이 "강"씨인 회원들만 정보를 출력하세요.

 

ArrayListTest

for (Member mbr : memberList) {
	if(mbr.getName().startsWith("강")){
		mbr.memberInfo();
	}
}

 

 

ArrayListTest

memberList.add(new Member());
memberList.add(new Member());

 

-- userid, passwd, name 다 null 값을 가진 기본 생성자가 추가될 경우 NullPointerException이 발생한다.

 

ArrayListTest

for (Member mbr : memberList) {
	if(mbr.getName() != null && 
		mbr.getName().startsWith("강")){
		mbr.memberInfo();
	}
}

 

-- null이 아닌 것을 확인하는 조건이 먼저 와야 한다.

 


-- ArrayList 타입인 memberList에 새로운 Member 객체 추가시 특정 index(위치)에 들어가도록 할 수 있다.

 

 

memberList에 새로운 Member 객체 추가하기

 

ArrayListTest

memberList.add(new Member("seolh", "qwer1234$", "설현"));
		
System.out.println("== memberList에 새로운 Member 객체 추가시 특정 인덱스에 위치하도록 하기 ==");
memberList.add(3, new Member("chaew", "qwer1234$", "차은우"));
		
System.out.println("\n== 새로운 회원 추가한 후 ==");
for(int i=0; i<memberList.size(); i++) {
	System.out.println(">> index : " + i + "<<");
	memberList.get(i).memberInfo();
}

 

 

 

memberList에 저장된 특정 Member 객체 삭제하기 

 

ArrayListTest

memberList.remove(3);
		
System.out.println("\n== 특정 회원 삭제한 후 ==");
for(int i=0; i<memberList.size(); i++) {
	System.out.println(">> index : " + i + " <<");
	memberList.get(i).memberInfo();
}

 

 

 

문제4 ▷ memberList에 저장되어진 Member 객체들 중에 name이 "강"씨인 회원들만 삭제하세요.

 

ArrayListTest

for(int i=0; i<memberList.size(); i++) {
	if(memberList.get(i).getName() != null &&
		memberList.get(i).getName().startsWith("강")) {
		memberList.remove(i);
	}
}
		
System.out.println("== 강씨인 회원을 삭제한 후 ==");
for(int i=0; i<memberList.size(); i++) {
	memberList.get(i).memberInfo();
}

 

 

 

문제5  memberList에 저장되어진 Member 객체들 중에 특정조건(userid가 null인 것)에 만족하는 Member 객체 하나를 삭제하고 삭제되어진 그 인덱스(위치) 자리에 새로운 Member 객체를 넣으세요.

단, userid가 null인 것이 없다면 새로운 Member 객체를 맨 뒤에 넣으세요.

 

ArrayListTest

for(int i=0; i<memberList.size(); i++) {
	Member mbr = memberList.get(i);
	if(mbr.getUserid() == null) {
		memberList.remove(i);
		memberList.add(i, new Member("youks","abcd1234","유관순"));
		flag = true;
		break;
	}
}
		
if(!flag)
	memberList.add(new Member("youks","abcd1234","유관순"));
		
System.out.println("== 새로운 Member 객체 추가한 후 ==");
for(int i=0; i<memberList.size(); i++) {
	memberList.get(i).memberInfo();
}

 

 

 

memberList에 저장된 모든 객체 삭제하기

 

ArrayListTest

memberList.clear();
System.out.println("memberList.size() => " + memberList.size());

 

▷ 결과

memberList.size() => 0

 


Ⅴ. LinkedList

 

-- Package(my.day16.collection)에 Class(LinkedListTest(ArrayListTest Class 복사)) 생성

-- ArrayList를 LinkedList로 변경

 

1) 출력시 저장된 순서대로 나온다.
2) 중복된 데이터를 저장할 수 있다.

3) 데이터를 읽어오는 속도는 LinkedList 가 ArrayList 보다 상대적으로 느리다.
4) 순차적으로 데이터를 추가/삭제하는 경우에는 LinkedList 가 ArrayList 보다 상대적으로 느리다.
5) 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 LinkedList 가 ArrayList 보다 상대적으로 빠르다.
6) 결과값은 ArrayList 를 사용하든지 LinkedList 를 사용하든지 동일한 결과값을 가진다.
7) LinkedList 보다는 ArrayList 를 사용하도록 하자.

 


Ⅵ. HashMap

 

-- Package(my.day16.collection)에 Class(HashMapTest) 생성

 

1. Map 계열
1) HashMap 과 Hashtable 이 있다.
2) Map 계열은 List 계열(Vector, ArrayList)처럼 index 가 사용되어 저장되는 것이 아니라, Map 계열은 key값과 value값

   을 쌍으로 사용하여 저장하는데 데이터 저장시 사용되는 메소드는 put(String key, Object value)메소드를 사용한다.
   이때 key값은 반드시 고유한 값을 가져야 하고, value값은 중복된 값이 와도 괜찮다.
3) Map 계열에 저장된 key값들은 순서와는 상관없이 저장된다.  
4) Map 계열에 저장된 value값을 추출하려면 key를 이용해서 가져오는데 value 값의 추출은 get(String key) 메소드를 사용한다.

 

HashMapTest

HashMap<String, Member> mbrMap = new HashMap<String, Member>();

또는

Map<String, Member> mbrMap = new HashMap<String, Member>();

 

HashMapTest

mbrMap.put("youjs", new Member("youjs", "qwer1234$", "유재석"));
mbrMap.put("eom", new Member("eom", "qwer1234$", "엄정화"));
mbrMap.put("kanghd", new Member("kanghd", "qwer1234$", "강호동"));
mbrMap.put("leess", new Member("leess", "qwer1234$", "이순신"));
mbrMap.put("kimth", new Member("kimth", "qwer1234$", "김태희"));
mbrMap.put("kangkc", new Member("kangkc", "qwer1234$", "강감찬"));
		
mbrMap.put("leess", new Member("leess", "abcd0070$", "LeeSunShin"));

 

 

mbrMap 에 저장되어진 것 중에서 key 값이 "leess"인 value값(Member 객체)을 추출하시오.

 

HashMapTest

Member mbr = mbrMap.get("leess");
mbr.memberInfo();

 

-- Map은 중복이 허용되지 않으므로 "이순신"의 정보는 덮어 씌워진다.

-- 중복 허용 안 되기 때문에 for문 사용하지 않아도 된다.

 

 

mbrMap에 저장되어진 모든 Member 객체의 정보를 추출하시오.

 

-- mbrMap.keySet() :  mbrMap에 저장되어진 모든 key 값만 알아와서 알려주는 메소드

 

HashMapTest

Set<String> keySets = mbrMap.keySet();
for(String key : keySets) {
	System.out.println(key);
}

 

 

 

모든 회원 정보 조회

 

HashMapTest

for(String key : keySets) {
	Member m = mbrMap.get(key);
	m.memberInfo();
}

 

 

-- 저장된 key값들은 순서와는 상관없다.

-- Map은 전체 정보 조회를 위한 것이 아닌 특정한 정보를 추출하기 위해 사용한다.