맞는데 왜 틀릴까..?

Java

[Java] 제네릭 프로그래밍, ArrayList

안도일 2022. 12. 18. 15:42

제네릭 프로그래밍

 

다양한 종류의 데이터를 처리할 수 있도록 클래스와 메소드를 작성하는 기법

 

제네릭 클래스 

 

제네릭 프로그래밍을 활용하여 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