[REVIEW]

객체 지향 프로그래밍을 하는 이유

  1. 클래스 사용 → 변수와 관련 메소드를 묶어서 처리

  2. 오버로딩 → 같은 이름인데 다른 기능 구현 (다형성 제공)

  3. 상속 → 다른 사람이 만든 것을 기능을 추가 + 접근지정자

  4. 오버라이딩 → 동적 바인딩을 이해하고 이를 이용해 코딩(업캐스팅, 다운캐스팅)

→ 오버로딩을 줄일 수 있어(하나의 함수로)

  1. 추상 클래스(오버라이딩하라고 만듦) + 인터페이스(오버라이딩하라고+스팩)

  2. 제네릭 → 어떤 데이터 타입이 오더라도 해결

  1. 컬렉션

    : 요소라고 불리는 객체들의 저장소

    → 모든 타입의 객체를 객체들을 저장할 수 있으며 사이즈가 가변적이다.

    1. 객체 배열과 차이

    객체 배열 → 자료형 지정, 고정된 크기

    컬렉션 → 일반화 되어 있고 크기 자동 조절, 위치 자동 이동

    ⇒ 수정, 삭제의 비중 유무, 데이터의 범위 초과 여부에 따라 결정

    1. 컬렉션

    : 클래스 타입에 관계없이 같이 묶어서 저장하는 저장소 ex 스택

    ← **제네릭 기법**으로 구현

    시험) 제네릭 기법으로 코딩

    1. Vector 컬렉션

    Vector<Integer> = new Vector<Integer>();

    Untitled

    시험) 제네릭 개념을 어떻게 만드느냐

    1. ArrayList<E>

    : 배열의 가장 큰 단점인 고정된 크기를 개선

    → 객체와 null만 삽입 가능 !

    1. 벡터와의 차이

    : 스레드 동기화 기능 X (=스레트 세이프 X, 데이터 훼손 가능성 O), 속도 빠르다

    → 멀티 스레드가 아닌 단일 스레드에서는 효과적

    cf. 프로세스_프로세서 하나를 점유하여 사용, 프로세스의 일부분 = 스레드

    동시성_ 여러 개의 프로세스를 하나의 프로세서에서 동작(시점 마다 다른 프로세스 실행)
    
    병렬성_ 여러 개의 프로세스를 동시에 수행
    
    스레드 동기화_ 2개의 스레드가 동시에 사용될 때 충돌 발생 가능 스레드 동기화로 해결
    

    → 동기화 코드 작성 후 실행해야 하므로 속도 저하

    예제 7-3) Arraylist에 들어있는 모든 이름 출력_ C 스타일의 프로그래밍 방식

    → Iterator라는 인터페이스 생성

    1. Iterator<E> 인터페이스

    : Vector, ArrayList, LinkedList 등이 구현하는 인터페이스 → 순차 검색

    (추상메서드로 구현되어 있는 스펙 → 클래스로 구현해야)

    hasnext() - 다음 반복에서 사용될 요소 존재 여부 확인

    next() - 다음 요소 반환

    1. HashMap<K,V>

    : 검색 기법으로 해싱을 사용하며 현존하는 가장 빠른 방법

    → 해싱 기법으로 key값을 주면 value값을 즉각적으로 전달

    → 타입 매개 변수 두 개를 사용 가능하다

    → hash를 쓸 때는 iterator랑 for문 사용하지 않고 검색 가능

    → Set은 대문자니까 동사 아니고 명사, 집합

    예제 7-6) key의 iterator 사용_해시맵에서 컬렉션을 만들고 그 컬렉션으로 iterator 사용

    Untitled

    1. LinkedList

    : 이중 연결 리스트로 만들어짐, 맨 앞과 맨 뒤에 데이터 추가가 가능하다

    → 인덱스를 이용해 중간 삽입 가능

    → 스택이나 큐로 사용 가능

    시험) LinkedList로 스택이나 큐를 구현해라

    1. 콜렉션

    : 콜렉션을 리턴