티스토리 뷰

Java

다시 복습하는 JAVA [3/3]

GiHoo 2023. 5. 25. 18:43

기본 API 클래스       

java.lang 패키지 - 자바 프로그램의 깁적인 클래스를 담고 있는 패키지, import 하지 않아도 사용 가능

   Object 클래스 - 모든 클래스의 최고 조상

         equals(Object obj), 객체의 주소를 비교, 대게 overrding 하여 인스턴스 변수의 값을 비교한다.

         hashCode(), 객체의 해시코드를 반환하는 메서드, 다량의 데이터 저장 및 검색 시 사용, 객체의 내부 주소 반환

         toString(), 객체의 문자 정보를 리턴, 클래스이름@16진수해시코드 정보 리턴

   String 클래스 - 문자형 배열과 그에 관련된 메서드들이 저의되어 있음

         String인스턴스의 내용은 바꿀 수 없다, 새로운 Stirng인스턴스가 생기는 것

   StringBuffer 클래스 - String처럼 문자형 배열을 내부적으로 가질 수 있다. 

       String 클래스와 차이점은 내용을 변경할 수있다.

   Class 클래스 - 클래스와 인터페이스의 메타 데이터(클래스 이름, 생성자 정보, 필드 정보, 메서드 정보)를 저장하는 곳

   Math 클래스 - 수학 계산에 유용한 메서드들이 구성 -> max, min, abs, ceil, round, floor …

   Wrapper 클래스 - 기본형을 클래스로 정의한 것, 기본형 값도 객체로 다뤄야 할 때가 있기에 정의

 

java.util 패키지 - 자료구조와 날짜 정보를 제공해주는 패키지

 

 

스레드(Thread)

프로세스 - 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션을 실행하는 과정, 실행중인 프로그램, 자원과 스레드로 구성

       모든 프로세스는 최소 하나 이상의 스레드를 가진다. (스레드는 일꾼 프로세스는 공장)

멀티 스레드는 하나의 프로세스에서 두 가지 이상의 스레드를 지원한다,

       장점 - 시스템 자원을 효율적으로 사용, 사용자에 대한 응답성이 향상

       단점 - 동기화에 주의, 교착상태(스레드가 자원에 동시에 접근)를 주의, 각 스레드의 효율을 고려

실행 순서는 os의 스케쥴러가 담당한다.

 

구현 방법

       Thread 클래스를 상속

              public void run() { 스레드가 할 작업 작성 } 오버라이딩

              클래스명 t1 = new 클래스명();   t1.start();

       Runnable 인터페이스 구현(더 좋다)   

              public void run() { 스레드가 할 작업 작성 } 오버라이딩

              Runnable r = new 클래스명();   -> 

              Thread t2 = new Thread(r); t2.start();

 

스레드 - 사용자 스레드, 데몬 스레드(보조) / 실행중인 사용자 스레드가 없을 시 프로그램이 종료

멀티스레드의 경우 context swithcing이 발생한다. 실행 중인 스레드를 교체하기 위한 시간이다.

I/O 블락킹 - 사용자의 입력을 기다리는 동안 스레드는 아무 일도 하지 못함 -> 멀티 스레드 사용 시 해결 가능

우선순위를 통해 많은 작업시간을 스레드에 부여할 수 있다.

 

데몬스레드 - 일반 스레드를 보조하는 스레드, GC나 화면 자동갱신 등에 사용

       무한루프와 조건문을 이용하여 실행하다가 특정 조건을 만족하면 작업 수행 후 다시 대기하는 방식으로 구현

 

스레드의 상태

       생성(New) - 생성되고 실행되지 않는 상태

       실행(Runnable) - 실행 중 혹은 실행 가능한 상태(순서 대기)

       소멸(Terminated) - 스레드 작업이 종료된 상태

       대기(Waiting) - suspend(), sleep(), wait(), join() 이 호출되거나 I/O block일 경우

 

sleep() - 현재 스레드를 지정 시간동안 멈춤, 실행제어 static,

                 자기 자신에게만 sleep을 시킬 수 있다. (yield() 도 있음), 예외처리 해야 함

interrupt() - waiting 상태의 스레드를 runnable 상태로 만든다

 

스레드의 동기화(Synchronization)

       멀티 스레드 프로세스에서 다른 스레드의 작업에 영향을 줄 수 있으므로 동기화(진행중인 스레드의 작업을 방해 못하게)를 해야 함

       간섭받지 않을 문장들을 임계 영역으로 설정, 이 영역은 lock을 얻은 단 하나의 스레드만 출입가능

 

 

컬렉션 프레임워크(Collection Framework)

컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식, 편리하게 다룰 수 있는 다양한 클래스 제공

 

List - 순서가 있는 데이터의 집합, 데이터의 중복을 허용한다. 

       Vector -> ArrayList - 벡터의 개선 후가 어레이리스트

              vector는 동기화처리, arrayList는 동기화x

              데이터의 저장 공간으로 배열을 사용, List인터페이스 구현

       LinkedList 

              배열의 단점 -크기를 변경할 수 없고, 비순차적 데이터의 추가 삭제 시간이 길다.

              이 배열의 단점을 보완

 

Iterator, ListIterator, Enumeration

       Iterator - 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스 (hasNext(), next())

              Enumeration의 신버전이라 할 수 있다.

       ListIterator - Iterator의 접근성을 향상 ( 단방향에서 양방향으로 )

       Iterator의 구현

              Iterator it = list.iterator(); while(it.hasNext()) { System.out.print(it.next()); }

              list의 내용을 while문을 통해 순차적으로 호출하는 코드, 1회용이다.

 

Comparator, Comparable - 객체 정렬에 필요한 메서드를 정의한 인터페이스

       Comparable - 기본 정렬 기준을 구현하는데 사용

              compareTo(Object o) 객체와 자신을 비교

       Comparator - 기본 정렬 기준 외에 정렬 시 사용 (사용자 정의)

              compare(Object o1, Object o2) o1과 o2 비교, 양수 - 왼쪽이 큼, 음수 - 오른쪽이 큼. ( o1 - o2 ), 오름차순 기준을 제공

       -> Arrays.sort( 정렬 대상, 정렬 기준) 기준에 사용

 

Set - 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.

       HashSet - Set인터페이스를 구현한 대표적인 컬렉션 클래스

       TreeSet - 범위 검색과 정렬에 유리, HashSet보다 데이처 추가, 삭제 시간이 더 소요 - 이진트리(비교하며 저장, 삭제)

              순서 유지하고 싶으면 LinkedHashSet 사용

 

 

Map - key-value 형태의 쌍을 이루어진 데이터의 집합, 순서는 유지되지 않고 key의 중복x value의 중복 o

       HashMap - Hashtable의 개선(동기화 -> 비동기화), Map인터페이스를 구현한 대표적은 컬렉션 클래스

              해싱 기법으로 데이터 저장, 검색이 빠르다.

                     해싱(Hashing) - key 값을 넣으면 배열의 저장위치(hashCode)를 알려주는 해시함수를 사용하여 저장 및 읽기를 하는 기법 

TreeMap - 범위 검색과 정렬에 유리, HashMap보다 추가,삭제 시간이 더 걸림

 

 

제네릭스(Generics)

제네릭스? - 컴파일 시 타입을 체크해 주는 기능

       int 와 Integer의 차이 - int는 자료형이고 Integer는 wrapper class 즉 객체로 사용할 때 필요함

       객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌

 

타입 변수 - 클래스를 작성할 때, Object타입 대신 타입 변수 E를 선언하여 사용.

                     —> (예외처리의 타입변수도 마찬가지 ex NullPointerException e )

       타입 변수 대신 실제 타입이 지정된다면 형변환을 생략할 수 있다.

       ArrayList<E> list - > ArrayList<Tv> list    =>  Tv t = (Tv)list.get(0) -> Tv t = list.get(0)

 

제네릭스 용어 

       Box<T> - 제네릭 클래스, T Box라 함

       T - 타입 변수, 타입 매개변수

       Box - 원시 타입(일반 클래스)

 

와일드 카드 <?>

     제네릭 클래스는 참조변수와 생성자의 대입된 타입이 같아야 한다.ArrayList<String> list = new ArrayList<String>();

       <? extends T> -> 와일드 카드의 상한 제한, T와 자손이 가능. — 자주 씀

       <? super T> -> 와일드 카드의 하한 제한, T 와 조상 가능

       <?> -> 제한이 없다. <? extends Object>와 동일

 

열거형(Enum)

       관련된 상수(static final)들을 묶어 놓은 것

 

 

애너테이션(Annotation)

       주석처럼 프로그래밍 언어에 영향을 주지 않으면서, 유용한 정보 제공

       설정에 대한 정보를 소스 코드에 넣기 위해서 애너테이션을 사용한다.

 

       표준 애너테이션 

             @Override - 오버라이딩을 올바르게 했는지 컴파일러한테 체크해라~

             @Deprecated - 앞으로 사용하지 않을 부분에 표시

             @FunctionalInterface - 함수형 인터페이스를 올바르게(하나의 추상 메서드만 가졌는지) 작성했는지 컴파일러 체크

 

       메타 에너테이션 - 에너테이션을 위한 에너테이션, 에너테이션 만들 때 사용한다.

              @Target - 애너테이션 정의할 때, 적용 대상 지정에 사용

             @Retention - 에너테이션이 유지되는 기간을 지정에 사용

 

       애너테이션 타입 정의하기 - 애너테이션을 직접 만들기

             @interface 애너테이션이름 { 타입 요소이름() }   , 메서드는 추상 메서드로 구현

             모든 애너테이션의 조상은 Annotation 인터페이스다. 상속 불가능하며 그냥 사용 가능

 

 

 

람다식(Lambda Expression) - 함수(메서드)를 간단한 식으로 표현하는 방법

JDK 1.8부터 함수형 언어의 기능을 사용 가능하게 되었다. 

 

Int max(int a, int b) { return a > b ? a : b }.      ===>.    (a, b) -> a > b ? a : b

함수는 일반적 용어, 메서드는 객체지향 개념의 용어 ( 근본적으로 동일)

함수는 클래스 독립적이고, 메서드는 클래스에 종속적이다.

 

람다식 작성 방법

메서드의 이름과 반환타입을 제거하고 ‘->’ 을 블록 앞에 추가한다.  

반환값이 있을 경우 식만 작성하고 return 생략 가능, 세미콜론도 생략 가능 

매개변수의 타입이 추론 가능하다면 생략 가능(대부분이 생략)

 

주의사항

매개변수가 하나라면 괄호 생략 가능 (타입 추론이 가능한 경우만)

블록 안의 문장이 하나라면 괄호 생략 가능(세미콜론 적기 x)

 

람다식은 익명 함수가 아닌 익명 객체다.

 

함수형 인터페이스 - 단 하나의 추상 메서드만 선언된 인터페이스

 

메서드 참조(method reference) - 하나의 메서드만 호출하는 람다식을 더 간단히 -> 클래스이름::메서드이름

       static메서드 참조 - ClassName :: method

       인스턴스 메서드 참조 - Classname::method

 

스트림(Stream) - 다양한 데이터 소스(컬렉션, 배열 등)를 표준화된 방법으로 다루기 위한 기술 

다양한 데이터 소스로 스트림을 만들고 작업을 처리한다.

1. 스트림 생성하기 -> 2. 중간연산(0번~n번) -> 3. 최종연산(1번만) => 결과

ex) Stream<String> stream = Stream.of(strArr); -> stream.filter().distinc();   ->int total = stream.count();

 

특징

       스트림은 데이터 소스로부터 데이터를 읽기만 하고 변경하지 않는다. ReadOnly

       스트림은 Iterator처럼 일회용이다. Disposable

       최종 연산 전까지 중간연산이 수행되지 않는다. 지연된 연산 (필요할 때 수행한다.)

       스트림은 작업을 내부 반복으로 처리한다.

       작업을 병롤로 처리한다. - 병렬 스트림

 

Optional<T> - T타입 객체의 WrapperClass 

       T타입 객체? -> 모든 종류의 객체 저장 가능(null도 가능!)

       간접적으로 null을 다루기 위한 클래스

       null이라도 항상 Optional 객체에 넣기에 null체크를 하지 않아도 , NullPointerException 발생 가능성이 존재하지 않음.

 

 

 


스프링 공부를 시작하기 위한 자바 복습을 마쳤습니다. 

자바를 완벽하게 마무리 한 것은 아닙니다. 

개인적으로 자바 이펙티브 책을 보며 더욱 자바의 이해와 실력을 기르려고 합니다.

이후에도 중요하다고 생각하는 것이나 추가 공부를 하다 알게된 것, 삽질한 내용을 작성하겠습니다.

 

감사합니다.

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30