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값 기준으로 정렬하여 관리할 수 있음
'Programming Language > JAVA' 카테고리의 다른 글
[Do it 자바 프로그래밍 입문] 15. 예외 처리 (0) | 2023.06.15 |
---|---|
[Do it 자바 프로그래밍 입문] 14. 내부 클래스, 람다식, 스트림 (1) | 2023.06.15 |
[Do it 자바 프로그래밍 입문] 12. 자료구조 (1) | 2023.06.13 |
[Do it 자바 프로그래밍 입문] 11.기본 클래스 (0) | 2023.06.13 |
추상클래스(abstract)와 인터페이스(interface) 차이점 (0) | 2023.06.01 |