공부할것:
UML : 통합 모델링 언어 (Unified Moderling Language)
Iterator : 반복자
lamda와 stream api때문에 1.8버전 이후로 사용하라함
이름없는 함수 컬렉션 처리
big data나 parrell programming과 연관이 많다
java는 "완전한" 객체지향 언어
씨언어는 상수 변수 함수로 이루어져 있다
C++은 C언어에서 클래스만 추가함
Java는 오로지 클래스밖에 없음
클래스간의 영향력이 적다보니 프로그램이 안전해졌다
빅데이터에선 크다와 가치 다양성 속도가 중요하다 (Velocity = 속도가 중요해짐)
함수형 프로그래밍 - scala Kotlin Swift
java에서 lamda가 다른곳의 lamda랑 다를 수 있다
(Stream API도 똑같음)
aws의 lamda는 serverless lamda랑 똑같다
Stream API는 컬렉션 처리를 위해 생김
Parrell programming을 쉽게할 수 있어짐
하둡은 자바로 돌아감
->Nested ClasS(내포클래스)
클래스 안에 존재하는 클래스
자바는 클래스 안에 클래스를 생성하는 문법을 지워
->Inner Class
클래스 안에 존재하는 클래스
클래스 내부에서만 사용할 목적으로 생성
일반클래스는 접근 지정자가 package(접근 지정자가 없는 경우)와 public 만 가능하지만
Innerclass에서는 Private과 protected도 가능함
클래스가 컴파일 되었을 때는 외부클래스이름$내부클래스이름.class로 만들어 진다
->Static Inner Class
Class앞에 static을 붙이는 클래스
내포 클래스에 static 멤버가 있으면 일반 inner class는 에러가 발생\
내포 클래스에 static 멤버가 있는 경우는 인스턴스 생성없이 사용 할 수 있도로 static을 붙혀준다
static이 붙은 클래스는 인스턴스 생성없이 사용 가능하다
->Local Inner Class
메서드 안에 만들어지는 내포 클래스
메서드 안에서만 사용 가능하다
->Anonymous Class
이름없는 클래스 또는 객체
인터페이스를 구현하거나 클래스를 상속받아야 할 때 별도의 클래스를 만들지 않고 필요한 메서드만 재정의해서 사용
이벤트 처리할 때 많이 사용됨
이경우에 인터페이스 안에 메서드가 1개 인 경우 람다 표현식으로 작성하는 것이 가능함
->문법적으로는 수업 도중 많이 사용하는 것
Anonymous Class이다
--OuterClass
상속은 부모자식이 아니라 has a 랑 is a로 나뉨
Super&Based ->Sub&Drived라고 부름
변수 -> 반복문 -> 메서드 -> 클래스 -> 상속
->Anonymou Class(익명객체 또는 익명 클래스 - 클래스 이름이 없는)
인터페이스를 구현하거나 클래스를 상속받아서 사용하고자 하는 경우에 별도의 클래스를 생성하지않고 사용하는 방법
상속이나 구현을 하는 클래스를 만들지 않고 활용
new 인터페이스 이름이나 상위클래스이름(매개변수 나열){
필요한 메서드 정의
};
->Lamda
-개요
Jdk 1.7부터 함수형 프로그래밍을 위해서 추가함
이름없는 함수를 만들기 위해서 사용함
익명 객체를 만들어서 사용하던 것을 조금 더 간결하게 함수를 대입하는 형태처럼 보이도록 하기 위해서 사용
메서드가 1개만 존재하는 인터페이스에서만 사용 가능
-작성방법
(매개변수 나열) -> {내용을 작성}
매개변수를 작성할때는 자료형과 매개변수 이름을 작성하는데 이때 배개변수의 자료형은 생략이 가능함
자료형을 생략하면 호출할 때 자료형을 결정함
매개변수가 1개인 경우는()를 생략 가능함
매개변수가 없거나 2개이상인 경우는 생략하면 안됨
메서드에 return 타입이 있다면 return을 만들어주면 된다
중괄호 안에 리턴하는 문장만 있다면 {}를 생략하는게 가능함
Arrays.sort(ar, new Comparator<String>() {
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
이걸 람다식으로 줄이면
Arrays.sort( ar, ( o1 , o2 ) -> o2.compareTo( o1 ) );
이거로 바뀐다
●●●●●●●●인텔리제이나 안드로이드스튜디오를 쓰면 코드 최적화작업을 해주기때문에 람다식을 읽을줄 알아야한다.
->자바가 제공하는 람다 인터페이스
Consumer : 매개변수는 있고 리턴값은 없는 메서드를 소유한 인터페이스
Supplier : 매개변수는 없고 리턴값만 있는 메서드를 소유한 인터페이스
Function : 매개변수와 리턴이 모두 있는 메서드를 소유한 인터페이스
Operator : 매개변수가 있고 리턴도 있는 메서드를 소유한 인터페이스 ( 이 인터페이스는 일반적으로 메서드 내부에서 연산작업을 수행함
Perdicate : 배개변수가 있고 리턴값이 boolean 인 메서드를 소유한 인터페이스
Iterator (옛날 Java에서는 Enumeration) 반복자
향상된 포문을 이용해서 배열출력을하는게 제일 빠름
->Stream API
-Mapping : 변환
-Filtering : 추출
-Reduce : 연산
기존 - 모아서 연산 ->요즘 - 연산 후 합산
->스트림API 개요
Collection 데이터를 다룰 때 내부 반복자를 만들어서 접근하기 위한 API
내부반복자를 이용해서 접근하면 반복문이나 빠른 열거를 사용하는것보다 빠르게 작업을 수행할 수 있다
How 보다 What
->작업의 과정은
생산 -> 중간 작업 -> 최종 작업
중간작업은 여러개를 묶어도 된다
-생성은 배열이나 List를 가지고 수행
-중간작업은 스트림의 데이터를 순회하면서 작업을 수행해서 다시 스트림을 리턴하기 때문에 다른 중간작업을 연속해서 배치하는것이 가능하다
-최종작업은 1번만 수행 가능하다 - 집계를 수행하는 함수나 forEach처럼 하나씩 순회하면서 작업을 수행하기 위한 함수 또는 collect처럼 배열이나 List를 생성해주는 함수를 사용한다
Stream 생성
1. Collection 인터페이스로부터 상속받은 객체는 stream()이나 parallelStream()을 호출
parallelStream()을 호출하면 병렬처리가 가능한 스트림
2. 배열의 경우는 Arrays.stream(배열)을 이용해서 생성
3. 일련번호 형태의 정수 스트림은 IntStream.range(start,end)나 rangeClosed(start,end)를 이용해서 생성하는것이 가능
중간작업 = 작업을 수행한 후 Stream을 리턴
1. distinct(): 중복을 제거
2. filter(매개변수를 1개 받아서 Boolean을 리턴하는 람다) : 람다가 True를 리턴하는 데이터만 모아서 스트림을 생성
3. map(매개변수를 1개 받아서 리턴하는 람다) : 리턴하는 데이터를 모아서 새로운 스트림을 리턴
4. sorted(비교처리를 수행해주는 람다) : 람다를 기준으로 정렬
5. skip(long n) : n만큼 건너 뜀
6. limit(long n ) : n개 만큼 추출
최종연산
count() : 데이터 개수 리턴
max() : 최대값 리턴
min() : 최소값 리턴
average() : 평균 리턴
forEach() : 데이터를 순회하면서 작업
collect() : 데이터를 모아서 다른 자료형으로 변경
계산에 의해서 나오는 max, min, average는 리턴타입이 Optional 입니다.
Optional은 isPresent()로 데이터의 존재 여부를 확인할 수 있고 get()으로 실제 데이터를 가져올 수 있다
NullPointException은 값이 null이라 발생하는 예외가 아니다
null이 멤버를 호출해서 발생시키는 예외이다
이걸 예방하는법은 if(str!=null)로 확인한다
Optional의 존재 이유는 Null인지 아닌지 빠르게 확인하기 위해서;
->Thread
프로그래밍에서 가장 중요한 개념중의 하나인데 실제 생성해서 사용하는 경우는 안드로이드나 자바 어플리케이션을 만들때 이고
Web프로그래밍에서는 직접 생성해서 사용하는 경우가 드물다
1. 작업단위
Process = 실행중인 프로그램
프로세서를 할당받아서 실행되는 것
Process는 한번 실행되면 자신의 작업이 종료될 때 까지 제어권을 다른 프로세스에세 넘기지 않고 계속 수행한다
Thread Process를 작게 나누어서 작업을 수행하는 단위
Thread는 단독으로는 실행될 수 없고 Process안에서 실행되어야한다.
Thread는 자신의 작업 도중 쉬는시간이 생기거나 일정한 시간이 지나면 다른 스레드에게 제어권을 양도 할 수 있다
Thread Programming을 할대 반드시 알아야될 상황
하나의 스레드가 사용중인 자원은 다른 스레드가 수정하면 안된다.
Mutual Exclusion(상호 배제), Synchronus(동기화)
생산자와 소비자 문제
소비자는 생산자가 물건을 생성해 주어야만 작업을 수행함
Dead Lock
결코 발생할 수 없는 사건을 무한정 기다리는 것
Java에서 Thread를 생성하는 기본적인 방법
Thread클래스로 부터 상속받는 클래스를 만들고 public void run 이라는 메서드에 스레드로 수행할 내용을 작성한 후 인스턴스를 만들고 start메서드를 호출
runnable 인터페이스로부터 상속받는 클래스를 만들고 public void run 이라는 메서드에 스레드로 수행할 내용을 작성한 후 Thread클래스의 인스턴스를 만들 때 생성자에 생성한 클래스의 인스턴스를 대입하고 Thread클래스의 인스턴스가 start 메서드를 호출하면 된다.
Callable 인터페이스를 구현한 클래스를 이용해서도 생성 가능하다
Thread.sleep(long msec [,long nano])
msec 미리초 동안 현재 스레드를 중지
nano를 입력하면 msec 밀리초 + nano 나노초 만큼 대기
이 메서드를 사용할때는 InterruptedException을 처리해주어야 합니다.
실습할때 이 메서드를 사용하는 이유는 일정시간 이상 대기를 해야만 다른 스레드에게 제어권이 이동되기 때문이다
입력되는 시간의 의미는 거의 없다
Processer(CPU, GPU) - 일
Main Memory(RAM) - 실행을 위한 데이터 저장
쓰레드의 상태변화는 수명주기라고 부름(https://mainpower4309.tistory.com/26)
Daemon Thread = 백그라운드에서 대기하다가 처리할 요청이나 조건상황이 맞으면 수행하고 자동으로 종료하는 스레드 이다
다른 스레드가 수행중이 아니라면 자동으로 종료되는 스레드
스레드의 역할을 도와주는 보조적인 목적으로 사용
Start 하기전에 SetDaemon 메서드를 호출하면 되는데 true값을 설정해주면 된다
응용프로그램에서 자동 저장 기능이나 자동으로 데이터를 전송하는 작업을 데몬 스레드로 작성함
Thread의 Priority(우선순위)
여러개의 쓰레드가 수행될때 어떤 스레드가 먼저되고 어떤 스레드가 나중에 수행될 지는 알 수 없다
우선순위를 설정하면 확률적으로 먼저 또는 자주 실행 되도록 할 수 있다
setPriority메서드를 이용해서 설정한다
setPriority(int priority)
매개변수가 정수로 되어있지만 아무 정수나 사용하는것은 안되고, 제약이 있다
일반 정수를 사용해도 에러는 발생하지 않지만 되도록이면 Thread.MAX_Priority,Normal,MIN_Priority의 상수를 사용하는것을 권장
일반적으로 개발자들은 클래스의 인스턴스를 1개만 생성할때는 변수의 이름을 클래스이름과 동일하게 만들고 첫글자만 소문자로 변경
String string = "asflaksdj";
어떤 클래스로 부터 상속받는 클래스를 1개만 만들때는 클래스이름뒤에 Ex를 붙임
Thread클래스로 부터 상속받는 클래스를 만들려면
class ThreadEx extends Thread{ 이런식으로 만듬
ThreadEx th = new ThreadEx();
Thread th = new ThreadEx();
인터페이스를 구현한 클래스를 1개만 만들때는 클래스 이름 뒤에 impl을 붙임
Runnable 인터페이스를 구현한 클래스를 만들땐
class Runnableimpl implements Runnable{ 이런식으로 만듬
Extends 하거나 Implements했을때 변수의 이름은 상위 클래스나 인터페이스 이름을 사용
List<String> list = new ArrayList<>();
'노트정리' 카테고리의 다른 글
2022_11_07 정리 Map & List 리뷰 (0) | 2022.11.07 |
---|---|
2022_10_31 정리 (0) | 2022.10.31 |
2022_10_27 정리 (0) | 2022.10.27 |
2022_10_26 정리 (0) | 2022.10.26 |
10_25_정리 (0) | 2022.10.25 |
댓글