자료구조 클래스

woom·2022년 11월 21일
0

JAVA

목록 보기
15/18
post-thumbnail

🌻 NonGeneric 클래스

  • 필드의 자료형을 Object 클래스로 선언

  • 표현대상을 추상화하여 클래스로 선언할 경우 필드의 자료형에 따라 여러개의 클래스를 선언하여 사용하는 경우 발생

  • 필드의 자료형을 Object 클래스로 선언하면 필드에는 모든 클래스로 생성된 객체를 저장 가능

  • Object 클래스로 필드가 선언된 클래스의 객체를 생성하여 사용하는 프로그램

    • Object 클래스의 필드에 모든 클래스의 객체를 전달하여 저장 가능
    • Object 클래스의 필드에 저장된 객체를 반환받아 사용할 경우 반드시 명시적 객체 형변환 후 사용
      ( 문제점 : 부모인 Object만 참조가능 → 자식받으려면 객체 형변환 필요)

🐣 예제1

public class NonGeneric {
	private Object field;
	
	public NonGeneric() { }

	public NonGeneric(Object field) {
		super();
		this.field = field;
	}
	public Object getField() {
		return field;
	}
	public void setField(Object field) {
		this.field = field; }}
	



🐣 예제2 (실행)


public class NonGenericApp {
	public static void main(String[] args) {
		NonGeneric nonGeneric1=new NonGeneric();
		
		//Integer 객체를 Object 클래스의 매개변수로 전달받아 Object 클래스의 필드값으로 변경
		nonGeneric1.setField(100);	//오토박싱
		
		//필드값은 Object 클래스 타입의 객체로 반환되므로
        //명시적 객체 형변환을 해야 자식클래스의 메소드 호출 가능
		Integer returnObject1=(Integer)nonGeneric1.getField();
		
		System.out.println("필드값 = "+returnObject1);	//오토언박싱


		NonGeneric nonGeneric2=new NonGeneric();
		
		//Double 객체를 Object 클래스의 매개변수로 전달받아 Object 클래스의 필드값으로 변경
		nonGeneric2.setField(12.34);	//오토박싱

		//명시적 객체 형변환을 잘못할 경우 ClassCastException 발생
		// → instanceof 연산자를 사용하여 명시적 객체 형변환 전에 검증
		if(nonGeneric2.getField() instanceof Double) {
			Double returnObject2=(Double)nonGeneric2.getField();
			
			System.out.println("필드값 = "+returnObject2);	//오토언박싱
		}
		

		NonGeneric nonGeneric3=new NonGeneric();
		
		//String 객체를 Object 클래스의 매개변수로 전달받아 Object 클래스의 필드값으로 변경
		nonGeneric3.setField("홍길동");

		String returnObject3=(String)nonGeneric3.getField();

		System.out.println("필드값 = "+returnObject3); }}





🌻 Generic 클래스

  • 필드의 자료형(참조형) 대신 사용될 식별자 (미지정 자료형)
    • 참조형 선언시 <>기호에 제네릭 타입(식별자) 선언
    • 형식) public class 클래스명 <제네릭, 제네릭, ...> { }
    • <> 안의 제네릭 타입은 , 기호를 사용하여 나열 선언 가능
    • 제네릭 타입의 식별자는 대문자로 작성하는 것을 권장
  • 제네릭으로 전달받을 수 있는 클래스를 상속을 사용하여 제한 가능
    • 형식) public class 클래스명 <제네릭 extends 부모클래스> { }
    • 제네릭은 반드시 부모클래스를 상속받은 자식클래스만 전달받아 사용 가능

🐣 예제1

public class Generic<T extends Number> {//Number 상속받은 제네릭 클래스
	private T field;//필드 선언
	
	public Generic() { }//기본생성자

	public Generic(T field) {//생성자 초기화
		super();
		this.field = field;
	}
	public T getField() {//getter, setter 메소드
		return field;
	}
	public void setField(T field) {
		this.field = field; }}
	




🐣 예제2 (실행)

  • 제네릭 클래스로 객체를 생성하여 사용하는 프로그램
    • 제네릭 대신 설정된 클래스의 객체만 필드에 저장 가능 (제한적인 객체 저장)
    • 필드값을 반환받아 사용할 때 명시적 객체 형변환 불필요

public class GenericApp {
	public static void main(String[] args) {
		//제네릭 클래스를 이용할 경우 제네릭 대신 사용할 클래스를 전달해야만 사용 가능
		// → 전달받은 클래스를 제네릭 대신 사용하여 필드 또는 메소드 완성
		Generic<Integer> generic1=new Generic<Integer>();//정수형 선언
		
		//제네릭으로 설정된 클래스와 동일한 자료형의 객체를 전달하여 필드에 저장
		generic1.setField(100);//오토박싱
		//generic1.setField(12.34);
        //제네릭으로 설정된 클래스와 다른 자료형의 객체를 전달할 경우 에러 발생
		
		Integer returnObject1=generic1.getField();
		System.out.println("필드값 = "+returnObject1);//100
		

		Generic<Double> generic2=new Generic<Double>();
		generic2.setField(12.34);
		Double returnObject2=generic2.getField();
		System.out.println("필드값 = "+returnObject2);//12.34
		

		/*
		//제네릭의 부모클래스를 상속받지 않은 자식클래스로 제네릭 클래스 이용 → 에러 
		Generic<String> generic3=new Generic<String>();
		generic3.setField("홍길동");
		String returnObject3=generic3.getField();
		System.out.println("필드값 = "+returnObject3); }}
	  	  */





🌼 자료구조 관련 클래스

  • 데이터 수집 클래스 (Collection Class)

  • 다수의 객체를 효율적으로 저장하고 관리하기 위한 기능을 제공하는 클래스

    - 1. Set 인터페이스, 2. List 인터페이스, 3. Map 인터페이스 중 하나를 상속받아 작성된 자식클래스

    • 초기에 객체(요소의 개수)가 16개의 저장공간으로 정해져있으며 증가될시 0.75배씩 증가

📒 Set 인터페이스

  • Set 인터페이스를 상속받은 자료구조 클래스 ( ☆HashSet, Treeset 등 )

  • 객체 저장 순서가 없으며 메모리 주소와 객체에 저장된 값이 같은 객체 저장 불가능 (하나의 값만 저장됨)

  • HashSet (다수의 객체 생성 가능)

  • 1 ) 제네릭을 사용하지 않고 HashSet 객체 생성 (비권장)

    • HashSet 객체에 모든 클래스의 객체가 Object 타입으로 저장 가능
    • HashSet 객체에 저장된 객체를 반환받아 사용할 경우 반드시 명시적 객체 형변환 후 사용하므로 제네릭 사용을 권장
    • 형식) HashSet 참조변수 = new HashSet();
  • 2 ) 제네릭을 사용하여 HashSet 객체 생성 ★

    • HashSet 객체에는 제네릭 대신 설정된 클래스의 객체만 저장 가능
    • HashSet 객체에 저장된 객체를 명시적 객체 형변환 없이 반환받아 사용 가능
    • 형식) HashSet 참조변수 = new HashSet();
  • 3) 참조변수는 인터페이스(부모)를 이용하여 생성하는 것을 권장

    • 참조변수에는 (Set)인터페이스를 상속받은 모든 자식클래스의 객체 저장 가능
    • 클래스 간의 결합도를 낮추어 유지보수의 효율성 증가
    • 형식) Set 참조변수 = new HashSet();

📌 Set 객체 메소드

  • Set.add(E element) : Set 객체에 요소를 추가하는 메소드

    • Set 객체에는 동일한 값이 저장된 중복 객체 저장 불가
  • Set.toString() : Set 객체에 저장된 모든 요소(객체)를 문자열로 반환하는 메소드

  • Set.size() : Set 객체에 저장된 요소의 갯수를 반환받아 메소드

  • Set.remove(E element) : Set 객체에 저장된 요소를 제거하는 메소드

  • Set.iterator() : Set 객체에 저장된 요소를 반복 처리할 수 있는 Iterator 객체를 반환하는 메소드

    • Iterator 객체 : 자료구조 클래스의 객체 요소를 반복 처리하기 위한 기능을 제공하는 객체
    • 반복지시자 : 커서를 사용하여 자료구조 클래스의 객체 요소를 반복 처리
    • Iterator 객체를 이용하여 Set 객체에 저장된 모든 요소에 대한 일괄처리
  • Iterator.hasNext() : Iterator 객체로 처리 가능한 요소의 존재 유무를 판단하여 결과를 반환하는 메소드

    • false : 처리 요소 미존재, true : 처리 요소 존재
  • Iterator.next() : 커서 위치의 요소(객체)를 읽어와 반환하는 메소드

    • 현재 요소를 읽어 반환하고 커서는 다음 요소 위치로 자동으로 이동
  • Set.toArray(E[] a) : Set 객체를 배열로 변환하여 반환하는 메소드


🐣 예제

public class SetApp {
	public static void main(String[] args) {
		Set<String> set=new HashSet<String>();

		set.add("홍길동");						
		//set.add(100);	제네릭으로 설정된 클래스의 객체가 아닌 경우 에러 발생
		set.add("임꺽정");
		set.add("전우치");
		
		//System.out.println("set.toString() = "+set.toString());
		System.out.println("set = "+set);//set=[홍길동, 임꺽정, 전우치] (순서미정)
		

		//Set 객체에는 동일한 값이 저장된 중복 객체 저장 불가
		set.add("홍길동");
		System.out.println("set = "+set);//set=[홍길동, 임꺽정, 전우치] (순서미정)
		

		System.out.println("요소의 갯수 = "+set.size());	//요소의 갯수=3
		

		set.remove("임꺽정");
		System.out.println("set = "+set);//set = [홍길동, 전우치]
		

		Iterator<String> iterator=set.iterator();

		//Iterator 객체를 이용하여 Set 객체에 저장된 모든 요소에 대한 일괄처리
		while(iterator.hasNext()) {	//반복처리할게 있으면 실행
			String str=iterator.next();
			System.out.print(str+" ");	//홍길동 전우치
		}
		System.out.println();
		

		//향상된 for 구문을 사용하여 Set 객체에 저장된 요소에 대한 일괄처리
		// → 향상된 for 구문은 내부적으로 Iterator 객체를 사용하여 반복 처리
		for(String str:set) {
			System.out.print(str+" ");//홍길동 전우치	
		}
		System.out.println(); }}
		
	

  
  

🎀 연습문제 (Lotto)

  • 1~45 범위의 난수를 6개 제공받아 출력하는 프로그램
    ( 6개 난수는 서로 중복되지 않도록 작성하며 오름차순 정렬하여 출력 )
  • Arrays.sort(Object[] o) : 매개변수 전달받은 배열의 요소를 오름차순 정렬하는 메소드
  • Arrays.toString(Object[] o) : 매개변수로 전달받은 배열의 요소를 문자열로 반환하는 메소드
  
public class LottoSetApp {
	public static void main(String[] args) {
		Set<Integer> lottoSet=new HashSet<Integer>();
  		//Set 인터페이스 상속받아 Integer 객체(lottoset) 생성
		Random random=new Random();	//random 객체 생성
		
		while(true) {
			//1~45 범위의 난수값을 Set 객체의 요소로 추가하여 저장
			// → Set 객체에 동일한 값의 요소 중복 저장 불가능
			lottoSet.add(random.nextInt(45)+1);
			
			//Set 객체에 저장된 요소의 갯수가 6인 경우 반복문 종료
			if(lottoSet.size()==6) break;
		}
		//Set.toArray(E[] a) : Set 객체를 배열로 변환하여 반환하는 메소드
		// → Set 객체에 저장된 모든 요소를 배열로 생성하여 배열 요소에 모두 저장 
		Integer[] lotto=lottoSet.toArray(new Integer[0]);
  		//lottoset을 배열로 변환하여 Integer lotto에 저장
		
		Arrays.sort(lotto);	//lotto배열의 요소를 오름차순으로 정렬
		
		System.out.println("행운의 숫자 = "+Arrays.toString(lotto));}}
  		//lotto배열의 요소를 문자열로 반환

  
  
  

📒 List 인터페이스

  • List 인터페이스를 상속받은 자료구조 클래스 ( ☆ArrayList, Vector, LinkedList 등 )

    • ArrayList, Vector는 같은 클래스이나 Vector은 동기화 (Syncronized) 되어있음
    • 프로젝트는 주로 데이터베이스를 연동해서 사용하는데 데이터베이스에서는 기본적으로 스레드 동기화가 되기 때문에 동기화 되지 않은 클래스인 ArrayList를 동기화된 Vector보다 더 많이 사용
      (Vector는 더 많은 메모리 사용)
    • 자료구조 클래스는 다수의 검색 결과를 저장하기 위해서 사용
  • List 객체는 요소를 차례대로 저장

    • 첨자(Index)를 이용하여 요소를 구분하여 처리

📌 List 객체 메소드

  • List.add(E element) : List 객체에 요소를 추가하는 메소드

  • List.toString() : List 객체에 저장된 모든 요소를 문자열로 변환하여 반환하는 메소드

  • List.size() : List 객체에 저장된 요소의 갯수를 반환하는 메소드

  • List.get(int index) : List 객체에 저장된 요소 중 첨자 위치의 요소를 반환하는 메소드

  • List.add(int index, E element) : List 객체에 원하는 첨자 위치에 요소를 삽입하는 메소드

  • List.remove(E element) : List 객체에 저장된 요소를 제거하는 메소드

    • 매개변수로 전달받은 객체와 같은 요소가 여러개인 경우 첫번째 요소만 제거
  • List.remove(int index) : List 객체에서 원하는 첨자 위치의 요소를 제거하는 메소드

  • List.set(int index, E element) : List 객체에서 원하는 첨자 위치의 요소를 변경하는 메소드

  • Iterator 객체 사용하여 List 객체에 저장된 요소에 대한 일괄 처리

    • List.iterator() : List 객체에 저장된 요소를 반복 처리할 수 있는 Iterator 객체를 반환하는 메소드
  • Collections 클래스 : 자료구조 관련 클래스의 객체 요소에 대한 처리 기능을 메소드로 제공하는 클래스

    • Collections.sort(List list) : List 객체의 요소를 정렬하는 메소드
  • List.clear() : List 객체에 저장된 모든 요소를 제거하여 초기화 처리하는 메소드

  • List.isEmpty() : List 객체에 저장된 요소가 하나도 없는 경우 [true]를 반환하는 메소드


📌 List 객체 일괄처리

  1. 일반 for 구문 사용 → IndexOutOfBoundsException 발생 가능
  for(int i=0;i<list.size();i++) {System.out.print(list.get(i)+" ");} 
  1. Iterator 객체 사용
     Iterator<String> iterator=list.iterator();
     while(iterator.hasNext()) {
		System.out.print(iterator.next()+" ");} 
  1. 향상된 for 구문 사용
  for(String str:list) {
			System.out.print(str+" ");}

  • Arrays.asList(E... element) : 0개 이상의 요소가 저장된 List 객체를 생성하여 반환하는 메소드

🐣 예제

public class ListApp {
	public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("홍길동");
		list.add("임꺽정");
		list.add("전우치");
		list.add("일지매");
		//System.out.println("list.toString() = "+list.toString());
		System.out.println(list);// [홍길동, 임꺽정, 전우치, 일지매]

		//List 객체에는 동일한 값의 객체를 요소로 저장 가능
		list.add("임꺽정");
		System.out.println(list);// [홍길동, 임꺽정, 전우치, 일지매, 임꺽정]

		System.out.println(list.size());//요소의 갯수 = 5

		System.out.println("3번째 요소에 저장된 이름="+list.get(2));//전우치

		list.add(4, "장길산");
		System.out.println(list);//[홍길동, 임꺽정, 전우치, 일지매, 장길산, 임꺽정]

		//매개변수로 전달받은 객체와 같은 요소가 여러개인 경우 첫번째 요소만 제거
		//list.remove("임꺽정");//index=1의 임꺽정 제거
		list.remove(5);	 	   //index=5의 임꺽정 제거
		System.out.println(list);//[홍길동, 임꺽정, 전우치, 일지매, 장길산]

		list.set(1, "임걱정");	//index=1을 임걱정으로 변경
		System.out.println(list);// [홍길동, 임걱정, 전우치, 일지매, 장길산]
		

		//List 객체에 저장된 요소에 대한 일괄 처리 
  		//1. 일반 for 구문 사용 → IndexOutOfBoundsException 발생 가능
		for(int i=0;i<list.size();i++) {
		   System.out.print(list.get(i)+" ");//홍길동 임걱정 전우치 일지매 장길산
		}
		System.out.println();				
		

		//List 객체에 저장된 요소에 대한 일괄 처리 2. Iterator 객체 사용
		Iterator<String> iterator=list.iterator();
		
		while(iterator.hasNext()) {//반복처리할게 있으면 실행
		   System.out.print(iterator.next()+" ");//홍길동 임걱정 전우치 일지매 장길산
		}
		System.out.println();
		

		//List 객체에 저장된 요소에 대한 일괄 처리 3. 향상된 for 구문 사용
		for(String str:list) {
			System.out.print(str+" ");//홍길동 임걱정 전우치 일지매 장길산
		}
		System.out.println();
		

		//Collections.sort(List<E> list) : List 객체의 요소를 정렬하는 메소드
		Collections.sort(list);
		
		System.out.println(list);//[일지매, 임걱정, 장길산, 전우치, 홍길동]
		
		list.clear();//모든 요소를 제거
		if(list.isEmpty()) {
			System.out.println("List 객체에 저장된 요소가 없습니다.");
		}//List 객체에 저장된 요소가 하나도 없습니다.
		

		//Arrays.asList(E.. element):0개 이상의 요소가 저장된 List 객체를 생성하여 반환
		List<Integer> numberList=Arrays.asList(10,20,30,40,50);
		System.out.println(numberList); }}// [10, 20, 30, 40, 50]  
  

  
  
 

📒 Map 인터페이스

  • Map 인터페이스를 상속받은 자료구조 클래스 (☆HashMap, Hashtable, TreeMap, Properties 등)

    • HashMap, Hashtable은 같은 클래스이나 Hashtable은 동기화(Syncronized) 되어있음
    • 이름(Key - 식별자)과 값(Value - 객체)을 하나로 묶어 자료구조 클래스의 객체에 저장하여 사용
    • 엔트리(Entry) : 이름과 값을 하나로 묶어 사용하는 처리 단위
    • 이름을 이용하여 값을 빠르게 검색하여 사용하기 위한 자료구조 클래스
    • Map 객체의 이름(Key)은 Set 객체로 저장되므로 중복 저장할 수 없으며 순서 없이 저장
  • Map 인터페이스를 상속받은 자식클래스는 이름과 값에 대한 제네릭 2개 전달하여 사용

  • Map<Integer, String> map=new HashMap<Integer, String>();


📌 Map 객체 메소드

  • Map.put(K key, V value) : Map 객체에 엔트리를 추가하는 메소드

    • Map 객체의 이름(Key)은 Set 객체로 저장되므로 중복 저장할 수 없으며 순서 없이 저장
    • 메소드 호출시 이름(Key)가 중복될 경우 기존값 대신 새로운 값으로 저장 (변경)
  • Map.toString() : Map 객체에 저장된 모든 엔트리를 문자열로 변환하여 반환하는 메소드

  • Map.remove(K key) : Map 객체에 저장된 엔트리를 이름(Key)을 이용하여 제거하는 메소드

  • Map.get(K key) : Map 객체에 저장된 엔트리에서 이름(Key)을 이용하여 값(Value)을 검색하여 반환하는 메소드

    • 이름으로 저장된 값이 없는 경우 [NULL] 반환
  • Map.keySet() : Map 객체에 저장된 모든 엔트리의 이름(Key)를 Set 객체로 반환하는 메소드

  • Map.values() : Map 객체에 저장된 모든 엔트리의 값(Value)을 Collection 객체로 반환하는 메소드


🐣 예제

public class MapApp {
	public static void main(String[] args) {
		//Map 인터페이스를 상속받은 자식클래스는 이름과 값에 대한 제네릭 2개 전달하여 사용
		Map<Integer, String> map=new HashMap<Integer, String>();
		
		map.put(1000, "홍길동");
		map.put(2000, "임꺽정");
		map.put(3000, "전우치");
		map.put(4000, "일지매");
		map.put(5000, "장길산");
		
		//System.out.println(map.toString()); : 순서 없이 저장됨
		System.out.println(map);
  		//{2000=임꺽정, 4000=일지매, 1000=홍길동, 3000=전우치, 5000=장길산} 
		
		map.put(2000, "임걱정");
		System.out.println(map);
  		//{2000=임걱정, 4000=일지매, 1000=홍길동, 3000=전우치, 5000=장길산} 

		map.remove(4000);
		System.out.println(map);
  		//{2000=임꺽정, 1000=홍길동, 3000=전우치, 5000=장길산} 
		

		String name=map.get(1000);
		System.out.println("name = "+name);	//name=홍길동
		

		//Map 객체에 저장된 엔트리에 대한 일괄 처리 - Iterator 객체 사용
		//Map.keySet() : Map 객체에 저장된 모든 엔트리의 이름을 Set 객체로 반환
		Iterator<Integer> iteratorKey=map.keySet().iterator();
		
		while(iteratorKey.hasNext()) {//반복처리할게 있으면 실행
			Integer key=iteratorKey.next();//Set 객체에 저장된 key를 반환받아 저장
			System.out.println(key+" = "+map.get(key));
		}//2000=임걱정 /n 1000=홍길동 ....
		

		//Map.values() : Map 객체에 저장된 모든 엔트리의 값을 Collection 객체로 반환
		Iterator<String> iteratorValue=map.values().iterator();
		
		while(iteratorValue.hasNext()) {
			System.out.print(iteratorValue.next()+" ");
		}//임걱정 홍길동 전우치 장길산 
		System.out.println();
		
		//Map 객체에 저장된 엔트리에 대한 일괄 처리 - 향상된 for 구문 사용
		for(Integer key:map.keySet()) {
			System.out.println(key+" = "+map.get(key));
		}//2000=임걱정 /n 1000=홍길동 ....
		
		for(String value:map.values()) {
			System.out.print(value+" ");
		}//임걱정 홍길동 전우치 장길산 
		System.out.println();}}

  
  
  
  

🎀 연습문제 (Set)

🐣 예제 (student)

  • 학생정보(학번,이름)를 저장하기 위한 클래스 - VO(Value Object) 클래스
  • 객체의 컬럼값을 비교하기 위한 기능을 제공받기 위해 Comparable 인터페이스를 상속받아 작성
public class Student implements Comparable<Student> {
	private int num;//필드 선언
	private String name;
	
	public Student() { }//기본생성자

	public Student(int num, String name) {//생성자 초기화
		super();
		this.num = num;
		this.name = name;
	}
	public int getNum() {//getter, setter 메소드 선언
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	//Object 클래스의 toString() 메소드를 오버라이드 선언
	// → VO 클래스에 저장된 필드값을 반환받아 확인하기 위해 선언
	@Override
	public String toString() {
		return "학번 = "+num+", 이름 = "+name;
	}
	
	//Object 클래스의 hashCode() 메소드를 오버라이드 선언
	// → 객체의 메모리 주소 대신 VO 클래스의 필드값을 반환
	@Override
	public int hashCode() {
		return num;
	}
  
		
	//override를 이용해 해시코드와 필드값을 같게 만들어서 중복값을 저장하지 않도록 설정(set)
	//Object 클래스의 equals() 메소드를 오버라이드 선언
	// → VO 클래스에 저장된 필드값을 비교하여 결과를 반환하기 위해 사용
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student) {
			//매개변수로 전달받은 객체를 명시적 객체 형변환하여 참조변수에 저장
			Student student=(Student)obj;
			
			//메소드 객체(this)와 매개변수로 전달받은 객체(obj)의 필드값 비교하여 논리값 반환
			// → 학번를 비교하여 같은 경우 [true] 반환
			if(num==student.num) return true;
		}
		//비교가 불가능하거나 학번이 다른 경우 [false] 반환
		return false; }}
	}

	//객체의 컬럼값을 매개변수로 전달받은 객체의 컬럼값과 비교하여 결과를 반환하는 메소드
	//객체의 컬럼값이 큰 경우 양수 반환, 매개변수로 전달받은 객체의 컬럼값이 큰 경우 음수 
	//반환되며 같은 경우 0을 반환하도록 명령 작성
	// => 오름차순 또는 내림차순 정렬을 위한 비교값 설정 
	@Override
	public int compareTo(Student o) {
		//return num-o.num; : 학번을 비교하여 오름차순 정렬되도록 설정
		//return o.num-num; : 학번을 비교하여 내림차순 정렬되도록 설정
		//return name.compareTo(o.name); : 이름을 비교하여 오름차순 정렬되도록 설정
		return o.name.compareTo(name);//이름을 비교하여 내림차순 정렬되도록 설정
	}
}




  

🐣 예제 (실행)

public class StudentSetApp {
	public static void main(String[] args) {
		Set<Student> studentSet=new HashSet<Student>();	//Set 객체 생성
		
		studentSet.add(new Student(1000, "홍길동"));
		studentSet.add(new Student(2000, "임꺽정"));
		studentSet.add(new Student(3000, "전우치"));
		//Set 객체에 동일한 값이 저장된 Student 객체가 요소로 저장 가능
		// → Student 객체에 저장된 값은 같지만 객체는 다르므로 요소로 저장 가능
		//hashCode() 메소드와 equals() 메소드를 오버라이드 선언하여 동일한 값이
  		//저장된 객체가 Set 객체의 요소로 저장하지 않도록 설정 가능
		// → 매개변수로 전달받은 객체를 hashCode() 메소드로 기존 요소의 HashCode와 비교하여 
		//같은 경우 equals() 메소드로 필드값을 비교해 같으면 Set 객체에 추가되지 않도록 동작
		// → HashCode가 다르거나 비교 필드값이 다르면 Set 객체에 요소가 추가되어 저장
		studentSet.add(new Student(4000, "홍길동"));
		
		Iterator<Student> iterator=studentSet.iterator();
		
		while (iterator.hasNext()) {
			//객체를 반환받아 출력할 경우 Student.toString() 메소드 자동 호출
			System.out.println(iterator.next()); }}} 
  		//학번 = 2000, 이름 = 임꺽정 ··· 순서 없음

  
  
  
  

🎀 연습문제 (List)

  • BO(Business Object)/Manager 클래스 : 일(관리)을 하는 클래스로 CRUD(Create Read Update Delete) 기능을 제공하는 클래스
  • VO(Valuse Object) : 값 저장이 목적인 클래스

🐣 예제1 (vo 클래스)

  • 학생정보(학번,이름)를 저장하기 위한 클래스 - VO(Value Object) 클래스
  • 객체의 컬럼값을 비교하기 위한 기능을 제공받기 위해 Comparable 인터페이스를 상속받아 작성

public class Student implements Comparable<Student> {
	private int num;
	private String name;
	.
	:
	//Object 클래스의 toString() 메소드를 오버라이드 선언
	// → VO 클래스에 저장된 필드값을 반환받아 확인하기 위해 선언
	@Override
	public String toString() {
		return "학번 = "+num+", 이름 = "+name;//필드값 확인 위해서 toString 오버라이드
	}
	
	//Object 클래스의 hashCode() 메소드를 오버라이드 선언
	// → 객체의 메모리 주소 대신 VO 클래스의 필드값을 반환
	@Override
	public int hashCode() {
		return num;
	}
		
	//Object 클래스의 equals() 메소드를 오버라이드 선언
	// → VO 클래스에 저장된 필드값을 비교하여 결과를 반환하기 위해 사용
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student) {
			//매개변수로 전달받은 객체를 명시적 객체 형변환하여 참조변수에 저장
			Student student=(Student)obj;
			
			//메소드의 객체와 매개변수로 전달받은 객체(obj)의 필드값을 비교하여 논리값 반환
			// → 학번를 비교하여 같은 경우 [true] 반환
			if(num==student.num) return true;
		}
		//비교가 불가능하거나 학번이 다른 경우 [false] 반환
		return false;
	}

	//객체의 컬럼값을 매개변수로 전달받은 객체의 컬럼값과 비교하여 결과를 반환하는 메소드
	//객체의 컬럼값이 큰 경우 양수 반환, 매개변수로 전달받은 객체의 컬럼값이 큰 경우 음수 
	//반환되며 같은 경우 0을 반환 → 오름차순 또는 내림차순 정렬을 위한 비교값 설정 
	@Override
	public int compareTo(Student o) {
		//return num-o.num;//학번을 비교하여 오름차순 정렬되도록 설정
		//return o.num-num;//학번을 비교하여 내림차순 정렬되도록 설정
		//return name.compareTo(o.name);//이름을 비교하여 오름차순 정렬되도록 설정
		//compare메소드에서 비교값이 양수면 자리 변경, 음수 또는 0이면 객체의 자리가 그대로 유지
		return o.name.compareTo(name); }}//이름을 비교하여 내림차순 정렬되도록 설정
	



  

🐣 예제2 (CRUD 클래스)

  • 학생정보를 관리(저장,변경,삭제,검색 - CRUD)하는 기능을 제공하는 클래스
  • 다수의 학생정보를 저장하기 위한 콜렉션 필드 (저장매개)

	private List<Student> studentList=new ArrayList<Student>();
	//학번을 전달받아 콜렉션 필드에 저장된 요소의 학번과 비교하여 같은 요소의 첨자를 반환
	private int getStudentIndex(int num) {//학번을 전달받아 스튜던트 요소의 첨자 반환
		int index=-1;//초기값설정
		
		//콜렉션 필드에 저장된 모든 요소에 일괄처리 위한 반복문
		for(int i=0;i<studentList.size();i++) {
			//콜렉션 필드에 저장된 요소의 학번과 매개변수로 전달받아 학번이 같은 경우
			if(studentList.get(i).getNum()==num) {
				index=i;//변수의 요소의 첨자 저장
				break;
			}
		}
		
		return index;//요소의 첨자 반환
        //콜렉션 필드에서 요소가 미검색된 경우 -1 반환 (학생정보가 저장X → false)
	}
	//학생정보를 전달받아 콜렉션 필드의 요소로 추가하고 처리 결과를 반환하는 메소드
	//false 반환 : 콜렉션 필드의 요소 추가 실패, true : 콜렉션 필드의 요소 추가 성공
	//전달받은 학생정보의 학번이 이미 콜렉션 필드에 저장된 요소의 학번과 같은 경우
    //추가되지않도록 작성 (중복 저장 방지)
	public boolean addStudent(Student student) {
		//콜렉션 필드에 이미 저장된 학번의 학생정보인 경우
		if(getStudentIndex(student.getNum())!=-1) {
			return false;
		}	
		studentList.add(student);//List 객체에 요소를 추가하는 메소드 호출
		return true;
	}
	//학생정보를 전달받아 콜렉션 필드의 요소를 변경하고 처리 결과를 반환하는 메소드
	// → false 반환 : 콜렉션 필드의 요소 변경 실패, true : 콜렉션 필드의 요소 변경 성공
	// → 전달받은 학생정보의 학번이 콜렉션 필드에 저장된 요소의 학번이 아닌 경우 변경 실패
	public boolean modifyStudent(Student student) {
		int index=getStudentIndex(student.getNum());
		
		//콜렉션 필드에 저장된 학번의 학생정보가 아닌 경우
		if(index==-1) {
			return false;
		}
		studentList.set(index, student);//List객체에서 첨자위치의 요소 변경하는 메소드 호출
		return true;
	}
	//학번을 전달받아 콜렉션 필드의 요소를 삭제하고 처리 결과를 반환하는 메소드
	// → false 반환 : 콜렉션 필드의 요소 삭제 실패, true : 콜렉션 필드의 요소 삭제 성공
	// → 전달받은 학번이 콜렉션 필드에 저장된 요소의 학번이 아닌 경우 삭제 실패
	// → 삭제할때는 학번(고유값)만 전달받아서 찾아 삭제하면 됨
	public boolean removeStudent(int num) {
		int index=getStudentIndex(num);
		
		//콜렉션 필드에 저장된 학번의 학생정보가 아닌 경우
		if(index==-1) {
			return false;
		}
		
		studentList.remove(index);//List 객체에서 첨자위치의 요소를 삭제하는 메소드 호출
		return true;
	}
	//학번을 전달받아 콜렉션 필드의 요소를 검색하여 학생정보를 반환하는 메소드
	public Student getStudent(int num) {
		int index=getStudentIndex(num);
		
		//콜렉션 필드에 저장된 학번의 학생정보가 아닌 경우
		if(index==-1) {
			return null;//검색된 학생정보가 없는 경우 null 반환
		}
		
		return studentList.get(index);//List객체에서 첨자위치의 요소를 반환하는 메소드 호출
	}
	
	
	//콜렉션 필드에 저장된 모든 학생정보를 반환하는 메소드
	public List<Student> getStudentList() {
		return studentList;
	}
}




  

🐣 예제3 (실행)

  
public class StudentManagerApp {
	public static void main(String[] args) {
		StudentManager manager=new StudentManager();
		
		//학생정보를 전달하여 저장매체(콜렉션 필드)에 저장하는 메소드 호출
		manager.addStudent(new Student(1000, "홍길동"));
		manager.addStudent(new Student(2000, "임꺽정"));
		manager.addStudent(new Student(3000, "전우치"));
		manager.addStudent(new Student(4000, "일지매"));
		
		boolean result=manager.addStudent(new Student(5000, "장길산"));
		if(result) {
			System.out.println("학생정보를 성공적으로 저장 하였습니다.");
		} else {
			System.out.println("이미 저장된 학생정보이므로 저장되지 않습니다.");
		}//학생정보를 성공적으로 저장 하였습니다
		

		//학번이 [2000]인 학생정보를 저장매체에서 검색하여 출력
		Student searchStudent=manager.getStudent(2000);
		
		if(searchStudent==null) {//검색된 학생정보가 없는 경우
			System.out.println("해당 학번의 학생정보를 찾을 수 없습니다.");
		} else {//검색된 학생정보가 없는 경우
			System.out.println(searchStudent);//학생정보 출력
		}//학번 = 2000, 이름 = 임꺽정
		

		//저장매체에서 학번이 [2000]인 학생의 이름을 [임걱정]으로 변경 
		searchStudent.setName("임걱정");
		manager.modifyStudent(searchStudent);
		System.out.println("학생정보를 성공적으로 변경 하였습니다.");
		

		//학번이 [4000]인 학생정보를 저장매체에서 삭제
		if(manager.removeStudent(4000)) {//삭제된 학생정보가 있는 경우
			System.out.println("[메세지]학생정보를 성공적으로 삭제 하였습니다.");
		} else {
			System.out.println("[메세지]해당 학번의 학생정보를 찾을 수 없습니다.");
		}//[메세지]학생정보를 성공적으로 삭제 하였습니다.
		

		//저장매체에 저장된 모든 학생정보를 반환하는 메소드 호출
		List<Student> students=manager.getStudentList();
		
		for(Student student:students) {
			//Student.toString() 메소드 자동 호출 - 필드값을 반환받아 출력
			System.out.println(student);
		}//학번 = 1000, 이름 = 홍길동 /n 학번 = 2000, 이름 = 임걱정 ···
		

		//List 객체에 저장된 요소를 정렬하여 출력
		//Collections.sort(List<T> list) 메소드의 매개변수에 전달되는 List 객체는 요소값을
		//비교하기 위한 기능의 compareTo() 메소드가 오버라이드 선언되지 않은 경우 에러 발생 
		Collections.sort(students);//이름을 비교하여 내림차순 정렬되도록 설정
		
		for(Student student:students) {
			//Student.toString() 메소드 자동 호출 - 필드값을 반환받아 출력
			System.out.println(student);
		}}}//학번 = 1000, 이름 = 홍길동 /n 학번 = 3000, 이름 = 전우치 ···
  
  
  
  
  

🎀 연습문제 (Map)

public class StudentMapApp {
	public static void main(String[] args) {
		List<Student> studentListOne=new ArrayList<Student>();
		studentListOne.add(new Student(1000, "홍길동"));
		studentListOne.add(new Student(2000, "임꺽정"));
		studentListOne.add(new Student(3000, "전우치"));
		studentListOne.add(new Student(4000, "일지매"));
		studentListOne.add(new Student(5000, "장길산"));
		
		List<Student> studentListTwo=new ArrayList<Student>();
		studentListTwo.add(new Student(6000, "유재석"));
		studentListTwo.add(new Student(7000, "강호동"));
		studentListTwo.add(new Student(8000, "신동엽"));
		studentListTwo.add(new Student(9000, "김용만"));
		
		Map<Integer, List<Student>> studentMap=new HashMap<Integer, List<Student>>();
		studentMap.put(1, studentListOne);
		studentMap.put(2, studentListTwo);
		
		for(Integer ban:studentMap.keySet()) {
			System.out.println(ban+"반의 학생정보 >> ");
			List<Student> studentList=studentMap.get(ban);
			
			for(Student student:studentList) {
				System.out.println(student);
			}//1반의 학생정보 >> 학번 = 1000, 이름 = 홍길동 ···
  			 //2반의 학생정보 >> 학번 = 6000, 이름 = 유재석 ···
  
  
  
  
  

profile
Study Log 📂

0개의 댓글

관련 채용 정보