제네릭 프로그래밍
다양한 종류의 데이터를 처리할 수 있도록 클래스와 메소드를 작성하는 기법
제네릭 클래스
제네릭 프로그래밍을 활용하여 Box 클래스를 하나의 클래스로 여러 타입이 동작할 수 있도록 구현함
class Box<T>{
private T data;
//String, Integer도 클래스 이므로 가장 상위 클래스인 object로 선언해도 동작함
public T get() {
return data;
}
public void set(T data) {
this.data = data;
}
}
public class MyBox {
public static void main(String[] args) {
Box b = new Box();
b.set("Hello World!");
//문자열 객체 저장
String s = (String) b.get();
//Object 타입을 String 타입으로 변환
System.out.println(s);
b.set(new Integer(10));
Integer i = (Integer)b.get();
System.out.println(i);
}
}
제네릭 스택
제네릭 프로그래밍을 활용하여 여러개의 타입의 데이터가 들어갈 수 있는 스택을 구성해보자
public class Gstack <T>{
int tos;
Object[] stack; //T는 array를 선언할 수 없으므로 Object로 선언함
Gstack(){
tos = 0;
stack = new Object[10];
}
void push(T data) {
if ( tos == 10)
return;
stack[tos++] = data;
}
T pop() {
if (tos == 0)
return null;
return (T)stack[--tos];
}
}
public class MyStack {
public static void main(String[] args) {
Gstack <String> stringStack = new Gstack();
stringStack.push("Seoul");
stringStack.push("Busan");
stringStack.push("LA");
for(int i=0; i<3; i++) {
System.out.println(stringStack.pop());
}
Gstack <Integer> intStack = new Gstack();
intStack.push(10);
intStack.push(100);
intStack.push(500);
for(int i=0; i<3; i++) {
System.out.println(intStack.pop());
}
}
}
제네릭 함수
제네릭 프로그래밍을 이용하여 각자 다른 타입을 가진 array가 사용할 수 있는 제네릭 함수 getLast(), swap()을 만들어보자
public class MyArrayAlg<T>{
public static <T> T getLast(T[] a){
return a[a.length-1];
}
public static <T> void swap(T[] a, int i, int j) {
T tmp = a[i];
a[i] = a[j];
a[j]= tmp;
}
}
public class MyArrayAlgTest {
public static void main(String[] args) {
String[] language = { "C++", "C#", "JAVA" };
String last = MyArrayAlg.getLast (language);
System.out.println(last);
Integer[] langCode = {1,2,3};
int intLast = MyArrayAlg.getLast(langCode);
System.out.println(intLast);
MyArrayAlg.swap(language,1,2);
for( String value : language) { //for each 문
System.out.println(value);
}
MyArrayAlg.swap(langCode, 0, 1);
for( Integer value : langCode) { //for each 문
System.out.println(value);
}
}
}
제네릭 함수2
마찬가지로 각기 다른 타입을 가진 객체가 모두 활용해 array를 출력할 수 있는 제네릭 함수 printArray()를 만들어보자
public class GenericMethodTest {
public static void main(String[] args) {
Integer[] iArray = {10,20,30,40,50};
Double[] dArray = {1.1, 1.2, 1.3, 1.4, 1.5};
Character[] cArray = {'K','O','R','E','A'};
printArray(iArray);
printArray(dArray);
printArray(cArray);
}
private static <T> void printArray(T[] array) {
for( T value : array) {
System.out.println(value);
}
}
}
ArrayList
ArrayList는 기존 배열과 다르게 객체가 추가되어 용량을 초과하면 자동으로 부족한 크기만큼 용량이 늘어나는 가변적인 배열이다.
SimplePair
동일한 종류의 2개의 데이터를 저장하는 SimplePair 클래스 작성
public class SimplePairTest {
public static void main(String[] args) {
SimplePair<String> pair = new SimplePair<String> ("apple", "tomato");
System.out.println(pair.getFirst());
System.out.println(pair.getSecond());
SimplePair<Integer> pairlnt = new SimplePair<Integer>(10,20);
System.out.println(pairlnt.getFirst());
System.out.println(pairlnt.getSecond());
}
}
class SimplePair <T>{
private T data1;
private T data2;
SimplePair(T data1, T data2) {
super();
this.data1 = data1;
this.data2 = data2;
}
T getFirst() {
return data1;
}
T getSecond() {
return data2;
}
void setFirst(T data1) {
this.data1 = data1;
}
void setSecond(T data2) {
this.data2 = data2;
}
}
OrderedPair
서로 다른 2개의 타입을 저장하는 OrderedPair 클래스 작성
OrderePair 클래스에서 제네릭 타입 K와 V를 두 개 선언해서 작성
public class OrderedPairTest {
public static void main(String[] args) {
OrderedPair<String, Integer> p1 = new OrderedPair <String, Integer> ("mykey", 12345678);
OrderedPair <String, String> p2 = new OrderedPair <String, String> ("java", "a programming language");
OrderedPair <Integer, String> p3 = new OrderedPair <Integer, String> (90, "yourkey");
System.out.println(p1.getKey() + " " + p1.getValue());
System.out.println(p2.getKey() + " " + p2.getValue());
System.out.println(p3.getKey() + " " + p3.getValue());
}
}
class OrderedPair <K,V>{
private K key;
private V value;
public OrderedPair(K key, V value) {
this.key = key;
this.value = value;
}
K getKey() {
return key;
}
V getValue() {
return value;
}
}
ArrayList 메소드 사용
ArrayList의 주요 메소드인 add, remove, set 등을 이용해보자
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList();
list.add("MILK");
list.add("BREAD");
list.add("BUTTER");
list.add(1,"APPLE"); //인덱스 1에 apple 삽입
list.set(2, "GRAPE"); //인덱스 2의 원소를 grape로 대체
list.remove(3); //인덱스 3 삭제
// for(int i=0; i<list.size(); i++) {
// System.out.println(list.get(i));
// }
for(String s : list) {
System.out.println(s);
}
}
}
'Java' 카테고리의 다른 글
[Java] Multithread Programming (0) | 2022.12.18 |
---|---|
[Java] Vector (0) | 2022.12.18 |
[Java] 패키지 (0) | 2022.12.04 |
[Java] Interface - 도서 관리 프로그램 (0) | 2022.12.04 |
[Java] Interface (0) | 2022.12.04 |