ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022-08-02 : JAVA
    TIL ( Today I Learned ) 2022. 8. 2. 11:05

    1. 제네릭( Generic )

    : 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법

    - 제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것

     

    장점

    1. 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다

    2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다

    3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

     

    사용방법

    타입 설명
    <T> Type
    <E> Element
    <K> Key
    <V> Value
    <N> Number

    - 암묵적인 규칙

     

    1. 클래스 및 인터페이스 선언

    public class ClassName <T> { ... }
    public Interface InterfaceName <T> { ... }
    public class ClassName <T, K> { ... }
    public Interface InterfaceName <T, K> { ... }
     
    // HashMap의 경우 아래와 같이 선언되어있을 것이다.
    public class HashMap <K, V> { ... }

     

    2. 제네릭 클래스

    // 제네릭 클래스 
    class ClassName<K, V> {	
    	private K first;	// K 타입(제네릭)
    	private V second;	// V 타입(제네릭) 
    	
    	void set(K first, V second) {
    		this.first = first;
    		this.second = second;
    	}
    	
    	K getFirst() {
    		return first;
    	}
    	
    	V getSecond() {
    		return second;
    	}
    }

    - 외부 클래스에서 제네릭 클래스를 생성할 때 <> 괄호 안에 타입을 파라미터로 보내 제네릭 타입을 지정해주는 것

       이것이 바로 제네릭 프로그래밍이다.

     

    3. 제네릭 메소드

    public <T> T genericMethod(T o) {	// 제네릭 메소드
    		...
    }
     
    [접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) {
    	// 텍스트
    }

    - 클래스와는 다르게 반환타입 이전에 <> 제네릭 타입을 선언한다

    - 제네릭이 사용되는 메소드를 정적메소드로 두고 싶은 경우 제네릭 클래스와 별도로 독립저인 제네릭이 사용되어야 한다.

     

    4. 제한된 Generic(제네릭)과 와일드 카드

    - ? 는 와일드 카드라고 해서 쉽게 말해 '알 수 없는 타입'이라는 의미

    <K extends T>	// T와 T의 자손 타입만 가능 (K는 들어오는 타입으로 지정 됨)
    <K super T>	// T와 T의 부모(조상) 타입만 가능 (K는 들어오는 타입으로 지정 됨)
     
    <? extends T>	// T와 T의 자손 타입만 가능
    <? super T>	// T와 T의 부모(조상) 타입만 가능
    <?>		// 모든 타입 가능. <? extends Object>랑 같은 의미

    - extends T : 상한 경계

    - ? super T : 하한 경계

    - <?> : 와일드 카드 ( Wild card )

     

    참고 자료 : https://st-lab.tistory.com/153

     

    2. instanceof, Class.isAssignableFrom

    instanceof

    : 해당 Object가 특정 Class, Interface를 상속하거나 구현 했는지를 boolean type으로 return 해주는 method 이다.

    public class Gillog extends Gil {
    	...
    }
    
    Gillog obj = new Gillog();
    
    // true
    if (obj instanceof Gil) {
    	...
    }

     

    Class.isAssignableFrom

    : 특정 Class가 특정 Class, Interface를 상속하거나 구현 했는지를 boolean type으로 return 해주는 method 이다.

    // true
    if (Gillog.class.isAssignableFrom(Gil.class)) {
    	...
    }

     

    참고 자료 : https://velog.io/@gillog/Java-instanceof-Class.isAssignableFrom

     

    3. newInstance()

    - Class 객체를 이용하면 new 연산자를 사용하지 않아도 동적으로 객체를 생성할 수 있다

    - 이 방법은 코드 작성 시에 클래스 이름을 결정할 수 없고 런타임 시에 클래스 이름이 결정되는 경우 유용하게 사용

     

    - newInstance() 메서드는 기본 생성자를 호출해서 객체를 생성하기 때문에 반드시 클래스에 기본 생성자가 존재해야 한다.

    - 만약 매개 변수가 있는 생성자를 호출하고 싶다면 리플레션을 사용하여 Constructor을 사용하여 객체를 얻어 newInstance() 메서드를 호출하면 된다.

     

    참고 자료 : https://kdg-is.tistory.com/23

     

    4. 이터레이터(Iterator)

    - iterator는 ArrayList, HashSet과 같은 컬렉션을 반복하는 데 사용할 수 있는 객체이다.

    - Iterator는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 것

    - 컬렉션 프레임워크 : 데이터를 저장하는 클래스들을 표준화한 설계

    - 컬렉션 프레임워크는 아래 그림과 같이 데이터를 저장하는 구조에 따라 3가지 인터페이스로 구성

    - Set, List, Map은 어떤 데이터들의 집합체

    - Set과 List는 데이터의 그룹 ( Collection )이다.

     

    - Iterator는 이런 집합체로부터 정보를 얻어 낸다.

    - Iterator을 쓰게 되면 어떤 컬렉션이라도 동일한 방식으로 접근 가능하여 그 안에 있는 항목들에 접근할 수 있는 방법을 제공

     

    Iterator 메소드

        ㆍhasNext() : 읽어올 요소가 남아있는지 확인하는 메소드, 요소가 있으면 true, 없으면 false

        ㆍnext() : 다음 데이터를 반환

        ㆍremove() : next()로 읽어온 요소를 삭제

     

    Iterator 의 장점

    1. 컬렉션에서 요소를 제어하는 기능

    2. next() 및 previous() 를 써서 앞뒤로 이동하는 기능

    3. hasNext() 를 써서 더 많은 요소가 있는지 확인하는 기능

     

    * 자료구조 중 Set의 경우 인덱스가 없기 때문에 일반 for문을 사용할 수 없지만, for-each문은 사용할 수 있다.

    그러나 for-each문으로 자료구조를 돌다가 값을 수정, 삭제해야 해서 수정, 삭제를 수행하는 코드를 넣으면 ConcurrentModificationException이 발생한다.

     

    * 인덱스가 없는 자료구조의 경우 그 안의 데이터를 돌기 위해서 for-each문과 iterator 중 하나의 방법으로 가져올 수 있단 건 알겠다.

     

     

    참고 자료 :

    1. https://thefif19wlsvy.tistory.com/41

    2. https://onlyfor-me-blog.tistory.com/319

     

    5. OkHttp

    - HTTP는 최신 애플리케이션 네크워크 방식이다. 우리는 현재 주로 HTTP를 통해 데이터와 미디어를 교환한다.

      HTTP를 효율적으로 사용하면 리소스를 더 빠르게 로드하고 대역폭을 절약할 수 있다

    - OkHttp는 기본적으로 효율적인 HTTP 클라이언트이다

        ㆍHTTP/2 지원을 통해 동일한 호스트에  대한 모든 요청이 소켓을 공유할 수 있다

        ㆍ연결 풀링은 요청 대기 시간을 줄여준다. ( HTTP/2를 사용할 수 없는 경우 )

        ㆍ투명 GZIP은 다운로드 크기를 줄인다

        ㆍ응답 캐싱은 반복 요청에 대해 네크워크를 완전히 피한다

     

    장점

    1. 인터셉터 처리하는 것이 편하다

        ㆍApplication Interceptors : Application과 OkHttp 사이에 Request, Response 정보를 intercept하여 추가적으로 처리

           ( 예: Request시 추가적인 비즈니스 로직을 공통적으로 수행해야 되는 경우 로그 등 )

        ㆍNetwork Interceptors : Network와 OkHttp 사이에 Request, Response 정보를 intercept하여 추가적으로 처리

           ( 예: Network의 Response 정보를 보고 retry 할지 여부 등.. )

    2. 기본설정값 : OkHttp는 강력한 기본값들이 잘 설정되어 있다. 또한 사용자가 내용을 수정할 수도 있다

    3. Retofit은 OkHttp위에서 동작한다.

     

    * 즉, OkHttp로 REST API를 호출한다.

     

    참고 자료 :

    1. https://velog.io/@yyong3519/OkHttp

     

    6. URL과 URLConnection

    - 자바 java.net.URL 클래스를 통해 URL 주소를 인식할 수 있으며, 프로토콜, 도메인, 포트, 경로 등을 지정할 수 있다.

    - URL 객체의 getInputStream메서드를 호출해서 URL을 읽어 올 수 있다. 하지만 웹 리소스에 대한 추가정보 혹은 데이터를 써야 한다면 URLConnection 클래스를 사용

     

    1. URL 객체 가져오기

    URLConnection conn = url.openConnection();

    - HTTP URL일 때 실제 반환받는 객체는 HttpURLConnection의 인스턴스다

     

    2. 필요하면 요청 프로퍼티 설정

    conn.setRequestProperty("Accept-Charset","UTF-8,ISO-8859-1");

    3. 서버로 데이터 보내기

    conn.setDoOutput(true);
    try(OutputStream out = conn.getOutputStream()) {
    	out에 쓴다?
    }

    4. 응답헤더를 읽으려고 하고 getOutputStream을 호출하지 않았다면

    conn.connect();
    Map<String,List<String>> headers = conn.getHeaderFields();

    - 키가 같은 헤더 필드가 여러개 있을 수 있으므로 키별로 값의 리스트를 얻는다.

     

    5. 응답 읽기

    try(InputStream in = conn.getInputStream()){
        in에서 읽는다?
    }

     

    참고자료 : 

    1. https://mainpower4309.tistory.com/23

    2. https://jeong-pro.tistory.com/21

     

     

     

    'TIL ( Today I Learned )' 카테고리의 다른 글

    2022-08-03 : Spring  (0) 2022.08.03
    2022-08-02 : Spring  (0) 2022.08.02
    2022-08-01 : webpack & React  (0) 2022.08.01
    2022-07-29 : JAVA & Spring  (0) 2022.07.29
    2022-07-28 : Spring  (0) 2022.07.28

    댓글

Designed by Tistory.