본문 바로가기
2022-2/자바

자바 Exception/Generic <T>

by 철없는민물장어 2022. 11. 24.
728x90
반응형

Exception

 

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ExceptExam08 {

	public static void main(String[] args) {
		
		try {
			FileReader rd = new FileReader("some.txt");
		} 
		catch(FileNotFoundException e) {
			System.err.println("파일이 없다");
		}
		catch (IOException e) {
			System.err.println("입출력 에러 발생");
		}
		
		
	}

}

catch문을 여러 개 달 수도 있다.

여기서 IOException이 FileNotFoundException보다 상위 예외이기 때문에

만약 IOException을 먼저 적게 되면 적절하게 동작하지 않는다.

 

public class ExceptExam11 {

	public static void main(String[] args) {

		int result = 0;
		try {
			result = subtract(5,100);
		} catch (InvalidMyException e) {
			e.printStackTrace();
		}
		System.out.println(result);
	}
	static int subtract(int a, int b) throws InvalidMyException {
		if(a<b)
			throw new InvalidMyException();
		return a-b;
	}

}

class InvalidMyException extends Exception{
	public InvalidMyException() {
		super("잘못된 입력 - 나의 예외처리");
	}
}

예외 클래스를 내가 만들 수도 있다.

extends Exception으로 Exception 클래스를 상속받으면 된다.


Generic

public class SimplePairTest <T> {

	T first;
	T second;
	public SimplePairTest(T first, T second) {
		this.first=first;
		this.second=second;
	}
	T getFirst() {
		return this.first;
	}
	T getSecond() {
		return this.second;
	}
	public static void main(String[] args) {

		SimplePairTest<String> pair = new SimplePairTest<String>("apple", "banana");
		System.out.println(pair.getFirst());
		System.out.println(pair.getSecond());


		SimplePairTest<Integer> pair2 = new SimplePairTest<Integer>(1, 2);
		System.out.println(pair2.getFirst());
		System.out.println(pair2.getSecond());
	}

}
public class OrderedPairTest<T1,T2> {
	T1 first;
	T2 second;
	public OrderedPairTest(T1 first, T2 second) {
		this.first=first;
		this.second=second;
	}
	T1 getFirst() {
		return this.first;
	}
	T2 getSecond() {
		return this.second;
	}
	public static void main(String[] args) {

		OrderedPairTest<String, Integer> pair1 = new OrderedPairTest<String, Integer>("Hello", 123);
		System.out.println(pair1.getFirst());
		System.out.println(pair1.getSecond());

		OrderedPairTest<String, String> pair2 = new OrderedPairTest<String, String>("Hello", "Hi");
		System.out.println(pair2.getFirst());
		System.out.println(pair2.getSecond());
	}

}

제네릭타입을 두개 쓰는것도 가능하다

 

public class MyStack <T>{

	int tos;
	Object[] array;
	public MyStack(){
		array= new Object[10];
		tos=0;
	}
	
	void push(T element) {
		if(tos==10) {
			System.out.println("못하는데.");
			return;
		}
		array[tos++]=element;
	}
	T pop() {
		if(tos==0) {
			System.out.println("못하는데.");
			return null;}
		return (T)array[--tos];
	}
	
	public static void main(String[] args) {

		MyStack<String> stringStack =new MyStack <String>();
		stringStack.push("대구");
		stringStack.push("서울");
		System.out.println(stringStack.pop());
		System.out.println(stringStack.pop());
		System.out.println(stringStack.pop());
		
	}

}

제네릭타입의 배열 T[] array = new T[10]; 을 선언할 수가 없는데,

그 대신 Object[] array = new Object[10]; 처럼 오브젝트타입으로 선언하면 된다.

이 오브젝트타입 배열에서 값을 빼서 T타입으로 리턴하는 경우 (T)로 형변환 해야 한다.

 

public class MyArrayAlgTest {

	
	public static void main(String[] args) {
		String[] language = {"C++","C#","JAVA"};
		String last = MyArrayAlg.getLast(language);
		System.out.println(last);
	}
	

}
class MyArrayAlg{
	static <T> T getLast(T array[]) {
		return array[array.length-1];
	}
}

메소드에만 제네릭타입을 적용할 수도 있다.

728x90
반응형

'2022-2 > 자바' 카테고리의 다른 글

[자바] 멀티스레드, synchronized  (0) 2022.12.01
[자바] Vector  (0) 2022.12.01
package  (0) 2022.11.15
interface/Object class/Wrapper class/System class  (0) 2022.11.08
추상화 클래스, 추상화 메소드, 다형성  (0) 2022.11.03

댓글