기간 : 221007 ~ 221012

221007 Java / OOP 심화

이번 주 초에는 기존에 배웠던 것들을 복습하는 시간을 가지게되었다.
그래서 새로운 것들을 정리하기보다는 기존에 배웠던 것을 되돌아보았다.
금요일부터 새로운 수업을 들어가서 애매하게 걸쳐 2주 기간을 글 하나에 작성하기로 했다. 😅

정리 ✏️

🏓 예외처리

에러

  • 치명적인 오류로 시스템이 종료되어야 할 수준
  • JVM 실행에 문제가 생김
  • 개발자가 미리 예측하여 방지할 수 없음
  • ex)
    • 메모리 부족
    • 스택 오버플로우

예외

  • 개발자가 구현한 로직에서 발생한 실수
  • 사용자의 잘못된 입력이나 사용에 의해 발생
  • 개발자가 미리 예측하여 방지 가능
  • 예외가 발생되면 프로그램은 바로 종료됨
    -> 예외처리를 통해 종료를 막고 정상 실행 상태를 유지

RuntimeException

  • 상속하지 않은 예외
    • Checked Exceptions
    • 일반 예외, 컴파일러 체크 예외
    • 주로 외부 영향으로 발생 할 수 있는 예외
    • 예외 처리 코드를 무조건 작성
    • 컴파일 단계에 확인
      • 스트림이나 파일 접근시 발생하는 예외
        IOException
      • DB 접속 권한이 없거나 네트워크 오류시 발생하는 예외
        SQLException
      • 존재하지 않는 파일 처리시 발생하는 예외
        FileNotFoundException
      • 클래스 이름을 잘못 적었을 때 발생하는 예외
        ClassNotFoundException
  • 상속한 예외
    • Unchecked Exceptions
    • 컴파일러 체크하지 않는 예외
    • 주로 프로그래머 실수에 의해 발생될 수 있는 예외
    • 예외 처리 코드를 강제하지않음
    • 주로 프로그램 논리 오류가 있을 때 발생하도록 의도
      • 배열 범위 벗어났을 때 발생하는 예외
        IndexOutOfBoundsException
      • null인 참조 변수의 멤버를 호출시 발생하는 예외
        NullPointerException
      • 클래스 간의 형을 잘못 변환했을 때 발생하는 예외
        ClassCastException
      • 정수를 0으로 나누려고 했을 때 발생하는 예외
        ArithmeticException

Errors

  • 치명적인 오류
  • 개발자가 해결 불가
    • JVM 고유의 스택 공간 범위 벗어났을 때 발생하는 예외
      StackOverFlowError -> 보통은 잘못된 재귀호출에 의해 발생
    • JVM 손상되었거나 작동하는데 필요한 자원이 부족했을 때 발생하는 예외
      VirtualMachineError
    • JVM의 힙 공간이 과도한 요구 또는 지속적인 누수로 인해 더이상 요청한 메모리를 할당할 수 없거나 OS의 이유로 스레드 생성하는데 실패했을 때 발생하는 예외
      OutOfMemoryError

예외처리

  • 프로그램 실행 시 발생할 수 있는 예외를 대비한 코드를 작성하는 것
  • 프로그램의 비정상적인 종료를 막고 정상적인 실행 상태를 유지하는 것
try {
	// 예외가 발생할 가능성이 있는 코드
} catch (Exception error) {
	// Exception 발생 시 처리하기 위한 코드
} finally {
	// 예외 발생 유무와 상관없이 실행되는 코드
    // 생략가능
}
public void method() throws Exception {
		// 예외가 발생할 가능성이 있는 코드
}

public static void main(String[] args) throws Exception

  • 예외 처리하지않은 코드와 동일
  • 예외 발생 시 프로그램 종료
  • 사용하지 말자!

예외처리 시 주의사항

public void method1() throws Exception{
	method2();
}
 
public void method2() throws Exception{
	method3();
}
 
public void method3() throws Exception{
	method4();
}
  • 무의미하고 무책임한 throws 금지
    • 발생가능한 특정 예외를 설정하는 것이 아닌 그냥 Exception을 그냥 던지는 코드
    • catch 로 잡아주는 것이 아니라 호출한 메소드로 계속 넘김
    • 적절하게 예외 복구될 기회를 박탈당하는 코드

try-with-resources

  • JDK 7+
  • 예외 발생 여부와 관계없이 사용하던 리소스 객체 (입출력 스트림, 소켓 등)의 close() 를 호출하여 안전하게 리소스를 닫아줌
  • 자동으로 close() 가 호출되는 것은 AutoCloseable을 구현한 객체만 해당

221011 Java / OOP 심화

어제 수업을 마치고 토이프로젝트 과제가 시작되었다.
클래스 설계부터 구현까지 하는 과제로 자세한 내용은 나중에 포스팅 할 예정이다 😁

정리 ✏️

📦 제네릭

  • 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언
  • 컬렉션 프레임워크에서 주로 사용
  • 런타임 환경에 영향이없다 (컴파일 시점에서 전처리)
  • Object를 사용해서 할 경우 형변환이 필요하고 때에 따라 ClassCastException이 발생 가능
    -> 제네릭을 통해 해결
  • 타입 파라미터 컨벤션
    • E : element, 주로 자바 API Collection에 사용
    • K : key, 주로 Map 자료구조 키을 나타내는데 사용
    • V : value, 주로 Map 자료구조 값을 나타내는데 사용
    • N : number, 주로 숫자를 나타내는데 사용
    • T : type, 첫번째 매개변수에 사용
    • S, U, V : 2nd, 3rd, 4th types
public class 클래스명<T> { ... }
public interface 인터페이스명<T> { ... }

제한된 타입 파라미터

<자료형매개변수 extends 클래스>
Human<T extends Animal>
  • 자료형의 범위를 제한할 수 있음
  • 상위 클래스에서 선언하거나 정의하는 메서드를 활용할 수 있음
  • T에 무작위 클래스가 들어갈 수 없게 범위를 제한함!

제네릭 메서드

  • 자료형 매개변수를 메서드의 매개변수나 반환값으로 가지는 메서드
  • 제네릭 클래스가 아니어도 제네릭 메서드는 구현하여 사용 가능
<자료형매개변수> 반환타입 메서드명(자료형매개변수..) {}
public static <T, V> double makeRectangle(Point<T, V> p1, Point<T, V> p2) {}

와일드카드

  • ?
  • 자료형 매개변수를 메서드의 매개변수나 반환값으로 사용할 때 구체적인 타입 대신에 와일드카드로 대체 가능
  • 클래스/인터페이스<?>
  • 제한된 타입 파라미터에 적용 가능

👯‍♀️ 스레드

프로그램 vs 프로세스

  • 프로그램 : 실행할 수 있는 파일이나 앱
  • 프로세스 : 메모리를 차지하면서 연속적으로 실행되고 있는 프로그램

프로세스와 스레드

  • 프로세스는 OS에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로
    독립적

    • 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향 미치지 않음
  • 멀티 스레드는 하나의 프로세스 내부에 생성되기 때문에
    하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있음 종속적

    • 다른 스레드에게 영향을 미침

스레드 생성방법
1. Thread 클래스를 상속받은 클래스를 통하여 생성
2. Runnable 인터페이스를 구현하고있는 클래스를 통하여 생성
3. Runnable 익명 객체를 인자로 전달하여 생성


Synchronized

  • 두 스레드 이상이 공유 객체에 접근할 때 발생되는 문제점
    -> 공유 객체에 접근하게되는 메서드를 synchronized로 지정

221012 Java / OOP 심화


정리 ✏️

🗄 컬렉션 프레임워크

  • 프로그램 구현에 필요한 자료구조를 구현해놓은 JDK 라이브러리
  • java.util 패키지에 구현되어 있음
  • 배열을 동적으로 변경해서 사용자가 사용할 수 있도록 구현
  • 제네릭으로 구성되어 객체 생성 시 타입을 지정


Collection 인터페이스

  • 하나의 객체를 관리하기 위한 메서드가 선언된 인터페이스
  • 하위에 List와 Set 인터페이스가 있음

List 인터페이스

  • 객체를 순서에 따라 저장하고 관리하는데 필요한 메서드가 선언된 인터페이스
  • 중복을 허용함
  • ArrayList, Vector, LinkedList, Stack, Queue 등..

Set 인터페이스

  • 순서와 관계없이 중복을 허용하지 않고 유일한 값을 관리하는데 필요한 메서드가 선언된 인터페이스
  • 저장된 순서와 출력된 순서는 다를 수 있다.
  • HashSet, TreeSet 등..

Map 인터페이스

  • 으로 이루어진 객체를 관리하는데 사용하는 메서드가 선언된 인터페이스
  • 객체는 key - value의 쌍으로 이루어짐
  • key는 중복을 허용하지 않음
  • HashTable, HashMap, Properties, TreeMap 등..

Iterator

  • 컬렉션 프레임워크에 저장된 요소들을 하나씩 차례대로 참조하는 것
  • Set 인터페이스의 경우 get(i) 메서드가 제공되지 않으므로 Iterator를 활용하여 객체를 순회

    boolean hasNext() : 이후에 요소가 더 있는지를 체크, 있는 경우 true를 반환

    E next() : 다음에 있는 요소를 반환



Comparable, Comparator

TreeSet 클래스

  • 내부적으로 이진 검색 트리로 구현됨
  • 저장하기 위해 각 객체를 비교해야 함
  • 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현해야 TreeSet에 추가

Comparator 활용

  • 이미 Comparable이 구현된 경우 Comparator을 이용해 비교하는 방식을 다시 구현 가능
class MyCompare implements Comparator<String>{
	@Override
	public int compare(String s1, String s2) {
		return (s1.compareTo(s2)) *-1 ;
	}
}
public class ComparatorTest {
	public static void main(String[] args) {
		Set<String> set = new TreeSet<String>(new MyCompare());
		set.add("aaa");
		set.add("ccc");
		set.add("bbb");
		System.out.println(set);
	}
}

한 주 마무리 📚

심화부분으로 오다보니 내용이 복잡해지는데 막상 정리하자니 실습적인 개념이 많아 포스팅하기 까다로운것같다. 어려운 개념이라 잘 정리해보고 싶은데 🥲
이제 Java 막바지 부분일 터인데 부족한 점이 많은 것 같다.
그래도 계속해보면서 익숙해지는 것이 방법일 것이다 ❗️ (맞겠지?)

0개의 댓글