13-1. 제네릭 (Generic)

제네릭 자료형 정의

  • 클래스에서 사용하는 변수의 자료형이 여러 개 일 수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언
  • 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식
  • 컬레션 프레임워크에서 많이 사용되고 있음

 

package ch05;


public class ThreeDPrinter {
private Powder material;

public void setMaterial(Powder material) {
this.material = material;
}

public Powder getMaterial() {
return material;
}


}
package ch05;

// 제네릭 클래스 // T : 자료형 매개변수

public class GenericPrinter<T> {  

private T material;

public void setMaterial(T material) {
this.material = material;
}

public T getMaterial() {
return material;
}


}

- 여러 자료형으로 바꾸어 사용할 MATERIAL 변수의 자료형을 T 라고 쓰고, 이때 T를 자료형 매개변수 (type parameter) 라고 부른다.

- 클래스 이름을 GenericPrinter<T> 라고 정의하고 나중에 클래스를 사용할 때 T 위치에 실제 사용할 자료형을 지정한다.

- 클래스의 각 메서드에서 해당 자료형이 필요한 부분에는 모두 T 문자를 사용하여 구현한다.

 

 

 

 

다이아몬드 연산자 < >

  • ArrayList list = new ArrayList<>();      // 다이아몬드 연산자 내부에서 자료형은 생략가능 함
  • 제네릭에서 자료형 추론 (자바10부터)   ㅡ>   지역 변수에 한해서 자료형을 추론 할 수 있음

       ArrayList list = new ArrayList()    ㅡ>    var list = new ArrayList();

 

 

 

 

제네릭 예시

package ch05;

public class Powder {

public class powder {
public void doPrinting() {
System.out.println("Powder 재료로 출력합니다.");
}
public String toString() {
return "재료는 Powder 입니다.";
}
}
}
package ch05;


public class Plastic {

public void doPrinting( ) {
System.out.println("Plastic 재료로 출력합니다.");
}
public String toString() {
return "재료는 Plastic 입니다.";
}


}
package ch05;


public class GenericPrinter<T> {
private T material; // T 자료형으로 선언한 변수

public void setMaterial(T material) {
this.material = material;
}

public T getMaterial() { // T 자료형 변수 material을 반환하는 제네릭 메서드
return material;
}

public String toString() {
return material.toString();
}
}
package ch05;


public class GenericPrinterTest {


public static void main(String[] args) {
GenericPrinter<Powder> powderPrinter = new GenericPrinter <Powder>();

powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial();
System.out.println(powderPrinter);

GenericPrinter<Plastic> plasticPrinter = new GenericPrinter <Plastic>();

plasticPrinter.setMaterial(new Plastic());
Plastic plastic = plasticPrinter.getMaterial();
System.out.println(plasticPrinter);
}


}

 

 

 

 

<T extends 클래스> 사용하기

 

상위 클래스의 필요성

  • T 자료형의 범위를 제한 할 수 있음
  • 상위 클래스에서 선언하거나 정의하는 메서드를 활용할 수 있음
  • 상속을 받지 않는 경우 T는 Object로 변환되어 Object 클래스가 기본으로 제공하는 메서드만 사용가능

 

 


 

 

 

 

13-2. 컬렉션 프레임워크

  • 프로그램 구현에 필요한 자료구조(Data Structure)를 구현해 놓은 JDK 라이브러리
  • java.util 패키지에 구현되어 있음
  • 개발에 소요되는 시간을 절약하면서 최적화 된 알고리즘을 사용할 수 있음
  • 여러 구현 클래스와 인터페이스의 활용에 대한 이해가 필요함

 

 

 

 

Collection 인터페이스

  • 하나의 객체를 관리하기 위한 메서드가 선언된 인터페이스
  • 하위에 List와 Set 인터페이스가 있음

 

List 인터페이스

  • 객체를 순서에 따라 저장하고 관리하는데 필요한 메서드가 선언된 인터페이스
  • 자료구조 리스트 (배열, 연결리스트)의 구현을 위한 인터페이스
  • 중복을 허용함
  • ArrayList, Vector, LinkedList, Stack, Queue 등...

 

Set 인터페이스

  • 순서와 관계없이 중복을 허용하지 않고 유일한 값을 관리하는데 필요한 메서드가 선언됨
  • 아이디, 주민번호, 사번 등을 관리하는데 유용
  • 저장된 순서와 출력되는 순서는 다를 수 있음
  • HashSet, TreeSet 등...

 

Map 인터페이스

  • 쌍(pair)으로 이루어진 객체를 관리하는데 사용하는 메서드들이 선언한 인터페이스
  • 객체는 key-value의 쌍으로 이루어짐
  • key는 중복을 허용하지 않음
  • HashTable, HashMap, Properties, TreeMap 등이 Map 인터페이스를 구현 함

 

 

 


 

 

 

13-3. List 인터페이스 (순차적으로 자료를 관리하는 인터페이스)

 

 

Member.java

package collection;


public class Member {
private int memberId;                   //회원 아이디
private String memberName;      //회원 이름

public Member(int memberId, String memberName) {
this.memberId = memberId;
this.memberName = memberName;
}


public int getMemberId() {
return memberId;
}


public void setMemberId(int memberId) {
this.memberId = memberId;
}


public String getMemberName() {
return memberName;
}


public void setMemberName(String memberName) {
this.memberName = memberName;
}

@Override                           //toString() 메서드 재정의
public String toString() {
return memberName + " 회원님의 아이디는 " + memberId + "입니다";
}

}

 

 

MemberArrayList.java

package collection;


import java.util.ArrayList;
import collection.Member;                      //Member 클래스는 collection 패키지에 있으므로 사용하려면 import 하기


public class MemberArrayList {
private ArrayList<Member> arrayList;

public MemberArrayList() {
arrayList = new ArrayList<Member>();                         // Member형으로 선언한 ArrayList 생성
}

public void addMember(Member member) {               // ArrayList에 회원을 추가하는 메서드
arrayList.add(member);
}

// 해당 아이디를 가진 회원을 ArrayList에서 찾아 제거
public boolean removeMember(int memberId) {
for(int i = 0; i < arrayList.size(); i++) {
Member member = arrayList.get(i);                         // get() 메서드로 회원을 순차적으로 가져옴

if(member.getMemberId() == memberId) {             // 회원 아이디가 매개변수와 일치하면
arrayList.remove(i);                                                // 해당 회원을 삭제
return true;
}
}
System.out.println(memberId+" 가 존재하지않습니다");
return false;
}

// 전체 회원 출력 메소드
public void showAllMember() {
for(int i = 0; i<arrayList.size(); i++) {
Member member = arrayList.get(i);
System.out.println(member);
}
}

 

 

MemberArrayListTest.java

package collection;


public class MemberArrayListTest {


public static void main(String[] args) {
MemberArrayList memberArrayList = new MemberArrayList();

// 새로운 회원 인스턴스 생성
Member memberLee = new Member(1001, "이지원");
Member memberSon = new Member(1002, "손민국");
Member memberPark = new Member(1003, "박서훤");
Member memberHong = new Member(1004, "홍길동");

// ArrayList에 회원 추가
memberArrayList.addMember(memberLee);
memberArrayList.addMember(memberSon);
memberArrayList.addMember(memberPark);
memberArrayList.addMember(memberHong);

// 전체 회원 출력
memberArrayList.showAllMembers();

// 홍길동 회원 삭제한 경우
memberArrayList.removeMember(memberHong.getMemberId());
// 홍길동 회원 삭제한 후 다시 전체 회원 출력
memberArrayList.showAllMembers();
}

}

 

 

 


 

 

 

13-4. Iterator (순서가 없는 경우 / Collection 요소를 순회)

 

요소의 순회란?

  • 컬렉션 프레임워크에 저장된 요소들을 하나씩 차례로 참조하는것
  • 순서가 있는 List인터페이스의 경우는 Iterator를 사용하지 않고 get(i) 메서드를 활용할 수 있음
  • Set 인터페이스의 경우 get(i) 메서드가 제공되지 않으므로 Iterator를 활용하여 객체를 순회함

 

Iterator 사용하기

  • boolean hasNext() : 이후에 요소가 더 있는지를 체크하는 메서드, 요소가 있다면 true를 반환
  • E next() : 다음에 있는 요소를 반환

 

 

get(i) 말고 iterator를 사용해 회원 아이디 제거

// 해당 아이디를 가진 회원을 ArrayList에서 찾아 제거
public boolean removeMember(int memberId) {
Iterator<Member> ir = arrayList.iterator(); //Iterator 반환
while(ir.hasNext()) { //요소가 있는 동안
Member member = ir.next(); //다음 회원을 반환받음
if(member.getMemberId() == memberId) { //회원 아이디가 매개변수와 일치하면
arrayList.remove(member); //해당 회원 삭제
return true; //true 반환
}
}

//끝날 떄 까지 삭제하려는 값을 찾지 못한 경우
System.out.println(memberId+" 가 존재하지않습니다");
return false;
}

 

 

 

 


 

 

 

 

13-5. Set 인터페이스 (중복되지 않게 자료를 관리)

HashSet 클래스

  • Set 인터페이스를 구현한 클래스
  • 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야 함
  • 동일성 구현을 위해 필요에 따라 equals()와 hashCode() 메서드를 재정의함

 

 

 

 


 

 

 

13-6. Comparable과 Comparator 인터페이스 (정렬)

TreeSet 클래스

  • 객체의 정렬에 사용하는 클래스
  • Set 인터페이스를 구현하여 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬할 수 있음
  • 내부적으로 이진검색트리(binary search tree)로 구현됨
  • 이진검색트리에 저장하기 위해 각 객체를 비교해야 함
  • 왼쪽노드 ㅡ> 부모노드 ㅡ> 오른쪽노드 순으로 순화하면 오름차순으로 정렬 됨
  • 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현 해야 TreeSet에 추가 될 수 있음
  • String, Integer 등 JDK의 많은 클래스들이 이미 Comparable을 구현했음
  • Comparator의 활용 : 이미 Comparable이 구현된 경우 Comparator로 비교하는 방식을 다시 구현할 수 있음

 

 

 


 

 

 

13-7. Map 인터페이스 (쌍pair으로 자료를 관리)

HashMap 클래스

  • Map 인터페이스를 구현한 클래스와
  • 가장 많이 사용되는 Map 인터페이스 기반 클래스
  • key - value를 쌍으로 관리하는 메서드를 구현함
  • 검색을 위한 자료구조
  • key를 이용하여 값을 저장하고 key를 이용하여 값을 꺼내오는 방식 - hash 알고리즘으로 구현 됨
  • key가 되는 객체는 중복될 수 없고 객체의 유일성을 비교를 위한 equals()와 hashCode() 메서드를 구현해야 함

 

TreeMap 클래스

  • Map 인터페이스를 구현한 클래스이고 key에 대한 정렬을 구현할 수 있음
  • key가 되는 클래스에 Comparable이나 Comparator 인터페이스를 구현함으로써 key-value 쌍의 자료를 key값 기준으로 정렬하여 관리할 수 있음

 

xoo | 수진