JAVA

[JAVA] throw / throws 떠넘기기 / 컬렉션 / ArrayList / 제네릭스

sian han 2022. 3. 8. 21:20

 

RuntimeException 과 그 자식 클래스들
   - 개발자의 실수에 의해서 발생할 수 있는 예외들
   - 예외처리 안해도 됨

 

Exception 클래스와 그 자식 클래스들
   - 반드시 예외처리를 해주어야 함
     그렇지 않으면 컴파일 에러 발생

 

whether RuntimeException or Exception (ctrl+t) 를 눌러 확인 할 수 있다

 

 

 

 

▶ throw 

 

 - 개발자가 고의로 예외를 직접 발생시킬 수 있다
 - 자바 가상머신에 의해 인식될 수 있는 예외상황이 아니지만,
   프로그램의 성격에 따라 개발자가 정의한 예외상황인 경우 throw문 사용

 throw new Exception("예외메시지");

 

if(age<0 || age>150) {
				throw new Exception("나이는 양수여야 하고, 150보다 작아야 합니다!");
			}

△ 이런식으로 if 문에 개발자가 설정한 오류문을 넣고, 개발자가 설정한 오류 알럿이 뜨게 함

 

 

 

 

throws 예외 떠넘기기

  - 예외전달, 예외를 메서드에 선언

  - 메서드내에서 발생할 가능성이 있는 예외를 메서드의 선언부에 명시하여 이 메서드를 사용하는 쪽에서는 이에 대한      처리를 하도록 강요함

 

 

메서드에서 throws 로 예외 선언하기

public static void method2() throws Exception { //아래 new "Exception"이랑 똑같은게 들어가야함
		throw new Exception("예외알럿");
	}

  ▷ 선언한 예외메서드를 타 메서드에서 호출

try {
			method2();
		}catch (Exception e) {
			System.out.println("예외:"+e.getMessage());
		}

 

  - 예외를 메서드의 throws 에 명시하는것은 예외를 처리하는 것이 아니라

    자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것이다.

    - 이렇게 계속 메서드에게 떠넘겨지다가 main 메서드에서도 예외가 처리되지 않으면 프로그램이 종료

 

 

 

 

클래스에서 thorws 로 예외 선언하기 ( = 사용자 정의 예외 클래스 만들기 )

  -  Exception 을 상속받고, super(message) 이용하여 Exception 생성자에 메세지를 넘겨주면 된다

class SeohyunException extends Exception{
	SeohyunException(){
		super("유효하지 않은 나이입니다!");
	}
}

  - 예외 클래스 이름 ( SeohyunException ) 지정

  - super 안에 예외알럿 입력

 

 

 

  ▷ 예외클래스 호출 ( 사용할 메서드 + throws + 예외메서드명 / main 에서도 동일하게 사용가능 ) 

public static int readAge() throws AgeInputException {
		Scanner sc = new Scanner(System.in);
		System.out.println("나이입력!");
		int age = sc.nextInt();
		if(age<0 || age>150) {
			throw new AgeInputException();
		}
		
		return age;
	}

 - readAge() 메서드 실행시

   age 가 0 보다 작고 150 보다 클경우 사용자가 지정해둔 예외가 발생하는데

   이 예외는 AgeInputException 클래스에 던져둔다

  

 

  ▷ main 에서 예외 처리

public static void main(String[] args) {
		try {
			int age = readAge();
			System.out.println("나이는"+age+"세");
		}catch (AgeInputException e) {
			System.out.println(e.getMessage());
		}

  - readAge() 에서 던져둔 예외를 AgeInputException e 가 받아서

    참조변수 .getMessage() 메서드로 예외메세지를 출력해 처리한다

 

 


 

컬렉션 - 데이터의 저장을 위해 정의된 클래스 

 - 배열이랑 비슷하나, 다른 점은 메모리의 사이즈를 동적으로 확장할 수 있다는 것이다.

 

컬렉션 프레임워크 - 데이터그룹을저장하는 클래스들을 표준화한 설계
                           모든 컬렉션 클래스를 표준화된 방식으로 다룰 수 있도록 체계화됨

                           메모리의 사이즈를 동적으로 확장할 수 있다

 

 

 

 

★ 컬렉션 프레임워크의 핵심인터페이스


 [1] List 

순서가 유지되며, 데이터의 중복을 허용함
구현 클래스 ) ArrayList, Vector - Object 배열을 이용해서 데이터를 순차적으로 저장함

 


 [2] Set 

순서가 유지되지 않으며, 데이터의 중복을 허용하지 않음

순서가 없고 중복 저장 불가
구현 클래스 ) HashSet

 

      
 [3] Map

키와 값(Value)의 쌍으로 이루어진 데이터 집합
순서는 유지되지 않으며, 키는 중복 허용하지 않고, 값은 중복 허용
구현 클래스 ) HashMap, Hashtable, Properties

 

상속계층도

 

List, Set 의 부모 - Collection

Map 만 동떨어져있음

 

 

 

 

▶ List -  ArrayList 컬렉션 

 - list 특징 : 순차적 자료구조로 인덱스로 관리됨

 

▷ 생성

ArrayList list = new ArrayList(3);

 - (3) : 생성할 메모리공간할당

 

 

 데이터저장 ( ▣ list.add() )

 - add로 데이터 저장

list.add(40);

 

▣ list.size()

배열의 길이를 .length() 로 알 수 있듯,

컬렉션의 길이는 .size() 로 알 수 있다

 

▣ list.get(i)

 - Returns the element at the specified position in this list.

i 번째 저장된 데이터를 불러와라

for(int i=0; i<list.size();i++) {
			Object obj = list.get(i);
			Integer n = (Integer)obj;
			int num = n.intValue();//intValue() :  Returns the value of this Integer as an int.
			System.out.println(num);
		}

앞선 코드에서 add 메소드로 여러 타입으로 받은 객체들이 상위 클래스인 Object로 변환되어 업캐스팅 되었기 때문에, 꺼낼 때 다운캐스팅으로 꺼낼 수 있다. 

 

= > 이렇게 하면 불편하지 않은가 ? 값을 꺼낼때마다 매번 형변환을 해줘야한다니 !!!

      따라서 Generics 가 나왔죵 ~ 아래서 확인하세영 ~ !

 

 <주요 메서드>

 list.set() : 해당 인덱스의 객체를 바꿈

 contains() : 해당 객체 저장 여부

 remove() : 해당 객체 삭제

 

 

 


※ ★★★제네릭스(Generics)★★★

 

 - 컬렉션에 저장할 객체의 타입을 지정
 - 꺼낼때는 자동으로 형변환 해줌

 

 

 

제네릭스 선언

컬렉션클래스<저장할 객체의 타입> 변수명 = new 컬렉션클래스<저장할 객체의 타입>();

ArrayList<Integer> list = new ArrayList<Integer>(4);

<> 안에는 Int 라고 쓰면 안됨. 무조건 Wrapper Class 로 써줘야 함

 

 

Boxing - 스택에 저장된 기본자료형 데이터를 힙영역의 참조형으로 변환하는것

            박싱을 해주는 클래스가 Wrapper 클래스이다


Unboxing - 참조형의 데이터를 기본형으로 변환

 

 

 

 

데이터 저장 (초기화)

  - 저장할때 add 

list.add(77);

 

 

데이터읽어오기 (for , 확장 for) 

for(int i=0;i<list.size();i++) { 
			int n = list.get(i);
			System.out.println(n);
		}
for(int n : list) { // : 뒤에 컬렉션 . 하나씩 꺼내면(int n) int
			System.out.println(n);
		}

 

for 문 안에서 초기화 & 불러오기 동시에

ArrayList<Integer> list2 = new ArrayList<Integer>(); //size 안줘도 상관없음
		
		for(int i=0;i<4;i++) { // size 안줬을 경우 () for에서 size 로 돌리면 안됨, 숫자로돌림
			list2.add(i*2);
		}for(int i=0;i<list2.size();i++) {
			int num = list2.get(i);
			System.out.println(num);
		}

 

 

 

▶▶ 제네릭스 ArrayList <> 에 클래스 넣기

 

▷ 제네릭스 생성

 - id, name 을 멤버변수로 가지고 있는 Member 클래스

ArrayList<Member> list = new ArrayList<Member>();

 

▷ 초기화

 - new 로 객체생성해서 초기화

list.add(new Member("hong", "홍길동"));

 

데이터읽어오기 (for , 확장 for) 

for(int i=0;i<list.size();i++) {
			Member mem =list.get(i);
			System.out.println(mem);
		}
for(Member mem : list) {
			System.out.println(mem);
		}