KB IT’s Your Life 4기 - Java 5일차


List, Set

  • 컬렉션 : 값만 저장 (List, Set)
  • Map : key, value 저장
package day_05;

import java.util.ArrayList;

public class ListExam {
	public static void main(String[] args) {
		//회원이름관리
		
		//List - 순서 지원 O 중복 저장 O
		ArrayList<String> names = new ArrayList<String>();
		names.add("홍길동");
		names.add("김길동");
		names.add("박길동");
		System.out.println(names); // 여기 나온 출력 값은 내부적인 toString()임.
		
		names.add(1,"한길동");
		System.out.println(names); // [홍길동, 한길동, 김길동, 박길동]

		//remove 값을 지우고 반환(String)
		String r = names.remove(2); //remove(index) or remove(value)
		System.out.println(r); // 김길동
		System.out.println(names); // [홍길동, 한길동, 박길동]
		
		//값을 모두 지움.
		names.clear();
		System.out.println(names); // []
		
	}
}

Interface, Collection API

package day_05;

import java.util.HashSet;
import java.util.Set;

public class SetExam {
	public static void main(String[] args) {

		Set<String> s = new HashSet<String>();
		HashSet<String> hs = new HashSet<String>();

		
		//객체의 형변환
		//타입의 메서드만을 호출할 수 있음. 타입을 중요시 여겨야함. 
		수영선수 s1;
		s1 = new 박태환선수();

		야구선수 b1;
		// 박태환선수 class에 implements가 수영선수밖에 없다면, 에러 발생.
		b1 = new 박태환선수();

		박태환선수 bt = new 박태환선수();
		수영선수 s11;
		s11 = bt;
		// s1에는 swimming만 있음
		s11.swimming();

		야구선수 b11;
		b11 = bt;
		// b1에는 공던지기만 있음
		b11.공던지기();

		// bt에는 공던지기, swimming이 모두 있음
		bt.swimming();
		bt.공던지기();

	}
}

//동호회에 가입하려면 특정 능력이 꼭 있어야 가입 가능. interface는 동호회와 같음 ex. 수영동호회 - 수영할 줄 앎.
//수영 선수라면, swimming이라는 기능은 반드시 있어야 해.
interface 수영선수 {
	public void swimming();
}

interface 야구선수 {
	public void 공던지기();
}

class 박태환선수 implements 수영선수, 야구선수 {
	// interface에 따라 swimming 함수가 해당 class 내부에 꼭 있어야한다.
	public void swimming() {
		System.out.println("수영하기");
	}

	// interface에 따라 공던지기 함수가 없으면 에러 발생
	public void 공던지기() {
		System.out.println("공던지기");
	}
}

Comparable, Comparator

  • Comparable
  • 딱 한 가지 기준으로 비교(ex.정렬) 가능함.
  • 비교대상이 되어 비교 당함.
  • ex.MyMember안에 Comparable하면 비교대상이 됨.
package day_05;

import java.util.Arrays;

public class CompareExam {
	public static void main(String[] args) {
		MyMember[] mems = new MyMember[3];
		int count = 0; //객체 저장 위치 = 저장 개수
		mems[count++] = new MyMember("길동이", 33);
		mems[count++] = new MyMember("길동김", 25);
		mems[count++] = new MyMember("길동박", 35);
		
		//배열 정렬 : Arrays.sort(배열)		
		System.out.println("** 정렬 후 **" );
		Arrays.sort(mems);
	    for (int i = 0; i < count; i++) {			
	    	System.out.println(mems[i]);
		}
	}
}

  • Comparator(비교기)
  • 배열에서 2개씩 가져다가 비교함.
//문자열에 대한 공부

package day_05;

public class StringExam {
	public static void main(String[] args) {
		System.out.println('가' < '나'); //한글자씩은 대소비교 가능
		// System.out.println("가"<"나"); 문자열은 객체이기 때문에 오류 발생
		System.out.println("a".compareTo("b")); //문자열은 따로 compareTo라는 함수를 이용해 비교 가능. 
		System.out.println("ab".compareTo("b")); //음수 > 사전순, ab먼저옴.
		System.out.println("아버지".compareTo("어머니")); //음수
		System.out.println("홍길동".compareTo("박길동")); //양수 > 박길동 먼저옴.
		
	}
}


  • Comparator 예제
package day_05;

import java.util.Arrays;
import java.util.Comparator;

public class CompareExam {
	public static void main(String[] args) {
		MyMember[] mems = new MyMember[3];
		int count = 0; //객체 저장 위치 = 저장 개수
		mems[count++] = new MyMember("나길동이", 33);
		mems[count++] = new MyMember("가길동김", 25);
		mems[count++] = new MyMember("다길동박", 35);
		
		//배열 정렬 : Arrays.sort(배열)		
		
		System.out.println("** 정렬 후 **" );
		Arrays.sort(mems, new NameComparator());
	    for (int i = 0; i < count; i++) {			
	    	System.out.println(mems[i]);
		}
	}
}

package day_05;

import java.util.Comparator;

/** 이름 기준 정렬기 */
public class NameComparator implements Comparator<MyMember>{

	@Override
	public int compare(MyMember o1, MyMember o2) {
		return o1.getName().compareTo(o2.getName()); //문자열 가~하
        //return o1.getAge() - o2.getAge(); //숫자 오름차순
		//return o2.getAge() - o1.getAge(); //숫자 내림차순
	}


}

java.lang(String, Object, Wrapper class)

  • String
//string 비교
		String s1 = "abc"; //Method영역에 딱 하나 "abc"가 생성됨. 
		String s2 = "abc"; //s1과 같은 곳을 가리킴
		String s3 = new String("abc"); // heap영역에 "abc"가 생성됨.
		String s4 = new String("abc"); // heap영역에 "abc"가 생성됨. (s3와 다른 주소임.)
		
		System.out.println("s1=s2 " + (s1 == s2)); //주소를 비교
		System.out.println("s1=s2 " + (s3 == s4));
		System.out.println("s1=s2 " + (s1 == s3));
		System.out.println("s1=s2 " + (s1.equals(s2))); //값의 내부 문자열 비교
		System.out.println("s1=s2 " + (s3.equals(s4)));
		System.out.println("s1=s2 " + (s1.equals(s4)));
		

497page에 보면 객체 동등비교를 위해 따로 equals를 오버라이딩해야한다.

  • Object 클래스 extends를 하지 않으면 무조건 extends Object를 붙여서 직간접적인 자식들이 된다. 그래서 Object 안에 toString()메서드가 존재해서 다 쓸 수 있는 것이다.

-롬복

import lombok.Data; @Data

getter, setter을 안해도 사용 가능

@NoSrgsCosturctor

기본생성자를 포함함

등등… @— 라고 작성만 해주면 lombok에서 알아서 생성해준다.

-String

package day_05;

public class StringExam2 {
	public static void main(String[] args) {
		String s = "홍길동";
		String s2 = "멀티캠퍼스";
		System.out.println(s.length()); //문자열 길이
		System.out.println(s.charAt(0)); //문자 추출		
		System.out.println(s2.indexOf("캠퍼스")); //문자||문자열 검색
		System.out.println(s.startsWith("홍")); //boolean; 특정 글자로 시작?
		System.out.println(s.endsWith("동")); //boolean; 특정 글자로 끝? (ex. pdf, jpg.. 등 파일 확장자 찾을 때 주로 이용)
		
		String s3 = "10,20,30";
		String[] split = s3.split(","); // String 반환
		System.out.println(split[0]);
		String s4 = "abcd";
		String s5 = s4.toUpperCase();
		System.out.println(s4.toUpperCase()); //모두 대문자로 바꾸기 <->toLowerCase
		System.out.println(s4 == s5); //false > String은 불변객체. 한 번 만들어지면, 내부 값 변경이 불가하다.
                //문자열 변경 메서드 실행 결과로 새로운 문자열을 반환한다.
	}
}

StringBuilder sb = new StringBuilder();

package day_05;

public class StringExam3 {

	public static void main(String[] args) {
		// Stringbuilder: 고속 문자열 처리
		String s = "0123456789";
		String s2 = "";
		
		//실행시간
		long start = System.currentTimeMillis();
		for (int i = 0; i < 5000; i++) {
			s2 = s2 + s; //string객체가 불변 객체로 새로운 메모리를 사용해서 시간이 오래걸림.
		}
		System.out.println(s2);
		long end = System.currentTimeMillis();
		System.out.println("실행시간: " + (end - start));
		
		////////
		StringBuffer ssb = new StringBuffer(); //화장실이 급할 때, 문 두들기고 있으면 기다림 (여럿이서 쓸때, 버퍼)
		
		StringBuilder sb = new StringBuilder(); //화장실 급할 때, 그냥 들어감. (혼자서 쓸때, 빌더 (요즘은 단일작업임 이거!!))
		long start2 = System.currentTimeMillis();
		for (int i = 0; i < 5000; i++) {
			sb.append(s);
		}
		System.out.println(sb.toString()); //StringBuilder는 string이 아니라 toString으로 불러와주기.
		long end2 = System.currentTimeMillis();
		System.out.println("실행시간: " + (end2 - start2));
	}	
}

포장클래스

package day_05;

import java.util.ArrayList;

public class WrapExam {
	public static void main(String[] args) {
		
		//박싱
		int i = 5;
		//Integer ii = new Integer(i);
		Integer ii = i; //상단코드와 같은 코드임.- 오토박싱
		String ss = ii.toString();
		String ss2 = "200";
		int k = Integer.parseInt(ss2);
		
		//언박싱
		int j = ii;
		
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(i);
	}
}

과제 예시

도서판매점(Bookstore) 관리 프로그램을 작성

도서관리, 회원관리, 판매관리를 할 수 있는 프로그램을 작성한다.

도서: BookDto { isbn(도서번호), title, price } 회원: MemberDto { mno(멤버번호), name, tel } 판매: SaleDto { mno, isbn, quantity } 어떤 회원이 어떤 도서를 몇 권 사갔는가?

BookStoreService { ArrayList bookList = new ArrayList(); ArrayList memberList = new ArrayList(); ArrayList saleList = new ArrayList();

public BookStoreService(){ bookList.add(new BookDto(“123”, “자바기본”, “20000”)); } }