TIL:2024/04/24 - Java 다양한 문법들

White 와잇·2024년 4월 24일

TIL

목록 보기
5/40
post-thumbnail

공부한 것

예외처리

정의 ~ 실행 순서

  1. 예외 클래스 정의 - 예외 발생시 에러메세지를 보낼 메서드들을 정의 (extends Exception)
  2. 실제 사용하려고 하는 클래스 정의 내부에 예외 발생 가능성이 있는 메서드에 throws / throw 정의
    ( 실제 예외 발생 여부를 판단해서 if(a==null)
    정의한 예외메서드를 throw { throw new exceptionMethod(); })
  3. main() 등에서 2번의 메서드를 사용시 try-catch-finally

제네릭

  • C++의 템플릿

  • 제네릭 클래스 = 원시 타입

  • T = 타입 변수

  • static 멤버는 사용불가

  • 배열 불가

  • 타입변수 여러 개 가능

  • 타입변수 와일드카드 가능 - <?>: 제한없음
    와일드카드 응용부터 복잡해짐... 나중에 다시 공부하고 여기까지

  • 제네릭 클래스 선언 예시
    public class ClassName { ..
    public T t; // 유연한 필드 타입
    public T method1() { ... } // 유연한 메소드
    public void method2(T a) { ... }

함수형 인터페이스

  • 메서드 이름 + 실행 내용이 다르고 리턴 + 매개변수가 같으면 활용할 수 있는 듯 보임 (오버라이딩, 오버로딩의 이름이 다른 버전? 이랄까)
  • 인터페이스 정의 당 1개의 추상 메소드만 선언 가능
  • 추상 메소드의 리턴형, 매개변수는 실제 적용할 함수들의 리턴형과 매개변수로 선정
interface f<T> { boolean myMethod(T t); }

람다식

  • 익명 함수
  • 1회용
  • 문법: (파라미터 값, ...) -> { ... }
    파라미터 값이 없을 때: () -> { ... }

Thread 스레드

두 가지 생성방법

  1. Thread 클래스 사용 - 다중 상속 불가
  2. Runnable 인터페이스 사용 - 다중 상속 가능, 즉 여러 다양한 task를 하나의 클래스에 동시에(정확히는 병렬적으로) 돌릴 수 있음

람다식 활용 예시

public class Main {
    public static void main(String[] args) {
        Runnable task = () -> {
            int sum = 0;
            for (int i = 0; i < 50; i++) {
                sum += i;
                System.out.println(sum);
            }
            System.out.println(Thread.currentThread().getName() + " 최종 합 : " + sum);
        };

        Thread thread1 = new Thread(task);
        thread1.setName("thread1");
        Thread thread2 = new Thread(task);
        thread2.setName("thread2");

        thread1.start();
        thread2.start();
    }
}

Runnable 람다식을 활용하자.

스레드 활용

  • 스레드에 우선순위 부여기능
  • 스레드 데몬(daemon)화
  • 스레드 그룹화
  • 스레드 제어 (알파이자 오메가)

스트림

  • 자료구조를 다루는 데에 사용 (코드 줄이기)
  • 원본의 데이터 변경 x
  • 일회성이므로 한 번에 작성
  • 자주 사용하는 스트림 API (stream().forEach(), stream().map(), stream().filter(), ...)
  • 사용법 예시: myList.stream().filter( ()->{...} ).toList();
    컬렉션(자료구조)객체.stream() // 자료구조를 stream 객체로 변환
    stream객체.filter(함수식) // 각 요소를 함수식에 의한 필터링, true/false로 반환하는 람다의 함수식이 필요
    stream객체.toList() // 스트림을 다시 자료구조화 (예시는 리스트)

어려웠던 것

  • 스트림
  • 제네릭 중첩표현(?)
    메서드를 스코프로 제네릭을 별도로 선언? 이게 무슨 말
출처 : Head First Java
  • 스레드 제어 기능들 다시 정리할 것

회고, 생각

스레드 파트는 C++에서 멀티스레딩 개발 경험이 있었어서 러프하게 넘어갔음.
대신 Java 스레딩 제어 방식에 대해 내일 한 번 정리해야 할 듯하다.

전체적으로 내가 평소 개발에 활용하지 못하는 고급(?) 문법들이라 정말 열심히 읽었음.
옛~날에 (대략 10년 전?) 자바 공부할 때 한 번씩 접했던 키워드들이긴 했다. 그 땐 전혀 이해가 안되고 다룰 자신이 없었어서 크게 이해하지 못하고 넘어갔었다.

아무튼 오늘에서야 어떤 기능들인가-어떻게 사용하나를 알게되어
발전하는 내가 되고 있는 거 같은 기분이 든다!

하지만 스코프어쩌고는 무슨 말인지.. 영어로 되어있어서 오늘은 해석하지 않겠다. 피곤함😅

그리고 스트림파트는 읽을 때 집중이 안됐었는지.. 어렵다고 잠시 패스했는데
찬찬히 읽어보니 쉽더라. 적용할 수 있을 것 같음.

오늘 예외처리 (try-catch, extends Exception) 실습해봤는데 OOP 프로그래밍에 큰 도움이 되었음
이론적으로는 이해가 가는데, 직접 객체마다의 관계를 설계하는 게 헷갈릴 것 같음... <- 아마 이게 가장 큰 산이 될 것 같다

끝!

profile
웹개발 도전! 데브옵스 도전!

0개의 댓글