가쟤의 해변일기 🐳

풀스택과정 Java- Collection API | HashSet | Exception | Abstract Class | 람다식 본문

풀스택과정

풀스택과정 Java- Collection API | HashSet | Exception | Abstract Class | 람다식

바닷가쟤 2025. 5. 19. 14:33
💡 2025 04 30

1. Collection API
     HashMap 방식으로 객체 관리하기 심화
2. Collection API
     HashSet 방식으로 객체 관리하기
3. Abstract Class 사용법과 용도
4. Exception 예외 처리

+람다 Collectiokn Stream

Exception 예외 처리

Throwable

  • Exception - Mild 한 손상
    • Runtime Exception실행 때 에러를 감지 !NullPointer ExceptionArithmeticException - 0분의 1 이런거 안댐
    • … 등등
    • ArrayIndexOutOfBoundsException
    • ex)
    • 컴파일러가 이 버그를 인식하지 못함(컴파일이 된다)
    • Compile Exception
    • 컴파일부터 에러가 난다.
  • 프로그램 적으로 살려낼 수 있음
  • Error - Serious 한 손상개발자 영역이 아님 신경 X
  • PhsicalMemory Full Down, JWM Death

— 예외가 어떤 상황에서 발생하는지

— 예외가 발생하면 어떤 결과가 나타나는지

— 예외를 처리한다는 것이 프로그램으로 어떤 작업인지

예외를 명시적으로 처리하는 방법 

 

package com.edu.exception.test;

public class RunTimeExceptionTest1 {

	public static void main(String[] args) {
		String[] str = {
				"Hello",
				"No, I Mean it",
				"Nice to meet you"
		};
		
		int i = 0;
		while(i <= 3) {
			try {
				System.out.println(str[i]);
			} catch(ArrayIndexOutOfBoundsException e) {
				System.out.println("Nice Catch~");
			}
			i++;				
		}
		System.out.println("The end....");
	}
}

 

사용자 정의 Exception

  1. 내가 특정한 조건에서 고의적으로 폭탄을 터트리겠다.
  2. 폭탄을 내가 직접 제조해서 사용하겠다.
package com.edu.exception.test;

/*
 * 1) try ~ catch :: 즉각적으로 예외를 처리
 * 2) throw :: 폭탄을 던진다 ... method 선언부에서 발생한 폭탄을 던진다
 */
class ZeroBoom extends Exception {
	ZeroBoom() {
		this("This is ZeroBoom Exception");
	};
	
	ZeroBoom(String message) {
		super(message);
	}
}

public class UserExceptionTest1 {
	public static void main(String[] args) {
		Users u = new Users();
		try {
			System.out.println("go() 메소드를 호출합니다.");
			u.go();			
		} catch(ZeroBoom e) {
			System.out.println(e.getMessage());
		}
		System.out.println("이 부분을 수행하고 프로그램을 마칩니다.");
	}
}

class Users {
	public void go() throws ZeroBoom {
		int i = 10;
		int j = 0;
		// 저 아랫 부분에서 i를 j로 나누는 연산이 진행된다라고 치고
		if (j == 0)
			throw new ZeroBoom("분모가 0이면 폭탄이 터집니다.");
	}
}

💡 2025 05 02

1. Exception
     Compile계열 Exception
2. Abstract Class
     Interface → Abstract Class → Class
3. Abstract 클래스 용도

프로그램을 수행하는 도중에 발생하는 예기치 못한 사건이나 상황

일종의 버그 혹은 에러

예외처리의 상당 부분이 강력한 제어문으로 사용

특정한 조건일 때 고의적으로 에러를 발생시켜서 프로그램을 제어하는 수단

사용자 정의 예외처리

e.printStackTrace(); ← 개발할 때는 좋으나 보안에 취약하기 때문에 배포 시 주석처리

Stream

데이터의 흐름

source(데이터의 근원) → Sink(데이터의 종착지)

keyboard console

[source와 sink는 하드웨어 적인 부분이다.]

내부적으로 이미 연결되어있다.

FileReader에 에러가 나는 이유는

FileReader에서 Throw했기 때문 !

fileReader의 new는 생성의 의미가 아니고 stream이다.

이미 만들어져 있는 것을 사용하겠다는 관 의 의미이다.

그래서 호출한 이 곳에서 try catch를 해줘야 한다.

FileReader는 파일을 읽어들이는 일종의 스트림이다.

스트림을 생성한다는 것은 객체를 생성하는 것이 아니라

자원을 열어서 사용하겠다는 의미이다.

이 때 사용을 한 후에는 반드시 닫아줘야만

자원이 누수 되는 현상을 막을 수 있다.

~Service 클래스는 기능 중심의 클래스이다.

기능에 대한 코드 가독력이 높아야 좋은 코드가 만들어진다.

이 때 예외처리로 인한 블락들은 코드 가독력을 저해하는 치명적인 요인이다.

그래서 메소드 구현부에는 반드시 예외를 직접 잡지 않고 반드시 던져야 한다.

try-with-resources

package com.edu.exception.test3;

import java.io.FileNotFoundException;

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

class FileService4 {
	public void readFile(String fileName) throws FileNotFoundException, IOException {
		System.out.println("2. FileReader Creating...");
		// finally 블락 안에서 자원을 반납해야 하는 경우에는 try-with-resource 구문 사용
		try (FileReader fr = new FileReader(fileName)) {
			System.out.println("3. 파일을 성공적으로 찾았습니다.");
			int data;
			while((data=fr.read()) != -1) 
				System.out.print((char)data);
		}
	}
}

public class CompileExceptionTest4 {
	public static void main(String[] args) throws FileNotFoundException, IOException {
		System.out.println("1. readFile() calling...");
		FileService4 service = new FileService4();
		try {
			service.readFile("test.txt");
		} catch(IOException e) {
			System.out.println(e.getMessage());
		}
	}
}

 

💡 2025 05 13 수업

1. 자바 프로젝트 발표
2. 람다식
3. Functional Interface(함수형 인터페이스)
4. Collection Stream

+추가로 자바 플젝 발표 자료 리드미에 정리

람다, 람다식(Lambda)

::

함수형 프로그램

자바 8버전에서 새롭게 추가된 기술

::

  1. 익명 함수(함수명이 없다)
  2. 코드가 간결하고 성능상 좋다
  3. Collection(List, Map, Set)안에 데이터를 처리할 때 유용하다 - Collection Stream
  4. 병렬 처리가 가능하다

함수 정의

// 함수 정의
int add(int x, int y) {
    return x + y;
}

// 람다식
(x, y) -> x + y;
// 메소드 이름, 인자값 타입, {}, return, 반환 타입이 생략

람다식 — 함수형 인터페이스에서 주로 사용됨

Functional Interface

→ 추상 메소드가 오직 1개만 존재 ! ⭐

// 이건 함수형 인터페이스 ! 추상 메소드 1개.
interface MyFunction {
	public int max(int a, int b);
}

class Test {
	public static void main(String[] args) {
		 // max 구현 이 부분 람다로 구현 가능 !!!
		 MyFunction mg = new (implements) MyFunction() {
			 public int max(int a, int b) {
				 return a > b ? a : b;
			}
		} // 여기까지 아래에 람다로 구현해보겠음
	}
}

// 위 부분 람다식으로 구현
MyFunction mf = (a, b) -> a > b ? a : b;

// 호출
mf.max(1, 20);

 

람다식 코드 구현

package step1;

@FunctionalInterface
interface Calculable {
	void calc(int a, int b); // 매개변수 2, 반환타입 X
}

public class LambdaTest4 {

	public static void main(String[] args) {
		// 1. Calculable를 구현.. 람다식으로 구현
		Calculable c = (a, b) -> System.out.println(a + b); // 함수형 인터페이스의 구현체
		
		c.calc(2, 3);
		
		action((x, y) -> {
			int result = x+y;
			System.out.println("RESULT=> " + result);
		});
	
	}
	
	// 2. 메소드를 정의(Calculable을 인자값으로 hasing)
	public static void action(Calculable cal) {
		System.out.println("action...method");
		cal.calc(10, 20);
	}

}

람다식은 내 마음대로 그때그때 구현이 가능하다.

함수형 인터페이스

구성 요소

  1. 추상 메소드⭐ (핵심)
  2. default 메소드
  3. static 메소드

:::

대표적인 functional Interface

매개변수 X, 반환 타입 X —————> Runnable - void run()

매개변수 O, 반환 타입 X —————> Consumer - void accept(T)

매개변수 X, 반환 타입 O —————> Supplier - R get()

매개변수 O, 반환 타입 O —————> Function - R apply(T)

매개변수 O, 반환 타입 O(boolean) —> Predicate - boolean test(T)

728x90