🧑‍💻 새로이 알게된 친구들

  • 컬렉션과 제네릭
    • 배열은 여러 개의 데이터를 다루는 데 편리한 자료 구조이지만, 삽입 삭제가 빈번하고, 데이터의 크기를 예측할 수 없는 응용프로그램에서 사용하기에는 불편하다.
    • 컬렉션은 가변 크기로서 객체의 갯수를 염려할 필요가 없다.
    • 컬렉션 내의 한 객체가 삭제되면 컬렉션이 자동으로 자리를 옮겨준다.
  • 제네릭 기법
    • Vector<E> 여기서 E는 타입 매개변수이다. 이를 Integer 혹은 String으로 변경하게 되면 각각 정수 값만, 문자열만 저장하는 벡터로 사용가능하다. 이처럼 E를 일반화 시킨 타입을 "제네릭 타입"이라 한다.
    • 제네릭은 모든 종류의 타입을 다루기 위함이다. Stack<Point>는 Point 타입의 객체만 push하고 pop 할 수 있는 스택이 된다.
  • Vector<E>

    • 배열을 가변 크기로 다룰 수 있게 하고, 객체의 삽입, 삭제, 이동이 쉽도록 구성한 컬렉션 클래스.
  • ArrayList<E>

    • 경로명 : java.util.ArrayList
    • Vector 클래스와 거의 동일하다. (스레드 간 동기화를 지원 X)
    • 멀티스레드 간 동기화를 위한 시간 소모가 없어서 Vector보다 빠름.
    • 내부 배열을 가지고 있어서 인덱스로 접근이 가능하다.
    ArrayList <String> a = new ArrayList<String>();
    => ArrayList<String> a = new ArrayList<>();
    => var a = ArrayList<String>();
  • HashMap<K, V>

    • 흔히 아는 Hash이다. Key와 Value를 활용한다.
    • 인덱스로 접근할 수 없고 오직 Key로 접근해야하나 삽입, 삭제가 매우 빠르며 검색은 이보다 더 빠르다.
  • LinkedList<E>

    • 요소들을 양방향으로 연결하여 관리한다는 점을 제외하고 Vector, ArrayList와 거의 같다.
    • head, tail 레퍼런스를 갖고있으며, 맨 앞이나 뒤, 중간에 요소 삽입이 가능하고 인덱스를 이용하여 요소에 접근할 수도 있다.
  • 제네릭 클래스 생성
  public class MyClass<T> { // 제네릭 클래스 Myclass, 매개변수 T
  	T val; // 변수 val의 타입은 T
  	void set(T a){
  		val = a; // T 타입의 값 a를 val에 지정
  	}
  	T get() {
  		return val; // T 타입의 값 val를 리턴
  	}
  }
  • ! 제네릭 타입의 객체는 생성 불가능!
  public class MyVector<E> {
  	E create() {
  		E a = new E(); // 컴파일 오류. 제네릭 타입의 객체 생성 불가
  		return a;
  	}
  }
  • ! 제네릭에서는 배열에 대한 제한을 두고 있다. 제네릭 클래스 또는 인터페이스 타입의 배열은 선언할 수 없다.
  GStack<Integer>[] gs = new GStack<Integer>[10]; // 컴파일 오류
  • ! 제네릭 타입의 배열 선언은 허용된다.
    public void myArray(T[] a) {...} // 정상
  • 제네릭 메소드 -> 클래스의 일부 메소드만 제네릭으로 구현 가능하다!
  class GenericMethodEx{
  	static <T> void toStack(T[] a, GStack<T> gs) {
  		for (int i = 0; i < a.length; i++) {
            		gs.push(a[i]);
    		}
  	}
  }

👀 제네릭의 장점!

  • 동적으로 타입이 결정되지 않고 컴파일 시에 결정되므로 보다 안전한 프로그래밍이 가능하다.
  • 런타임 타입 충돌 문제 방지
  • 개발 시 타입 캐스팅 절차 불필요
  • ClassCastException 방지
    • ClassCastException 이란?
      -> 객체의 형을 변환할 때 객체의 타입 변환이 적절하지 않을 때 발생하는 에러

🙋‍♂️ 총평

자바를 정말이지 오랜만에 다시 해보는 것 같다.
첫날 수업에서는 '아~ 이랬지~ 이것도 있었나~' 정도였는데 제네릭은 정말 새로웠다.
하지만 파이썬을 쭉 하고있다보니 자바도 금방 익숙해질 것 같은 예감이 든다.
부족한 부분이 많고 처음이라 더디는 부분이 있지만 처음 이 난관(사점?)만 잘 넘기면 그 뒤부터는 큰 문제 없을거라 확신한다!
나는 또 성장하고 있다!

profile
Sever 개발할래요.

0개의 댓글