[20240118 TIL] JAVA 총 정리 ① - Data Type 및 Collection Framework편

Haizel·2024년 1월 19일
1
post-thumbnail

01. JAVA의 DATA TYPE


🐹 JAVA의 변수 타입

int a = 1; // 정수 (정수 리터럴)
double b = 1.5; // 실수 (실수 리터럴)
boolean c = false; // boolean (불리언 리터럴), true/false 입력 가능
char d = 'A'; // 문자 하나 (문자 리터럴), 작은 따옴표('') 사용
String e = "string"; // (문자열 리터럴) "문자열"을 다루는 특별한 타입, 큰 따옴표("") 사용

🐹 변수 vs 상수 vs 리터럴

  • 변수(variable) : 하나의 값을 저장하기 위한 공간
  • 상수(constant) : 값을 한번만 저장할 수 있는 공간
  • 리터럴(literal) : 그 자체로 값을 의미하는 것

🐹 숫자 타입

// 정수
byte b = 127; // -128 ~ 127
short s = 32767; // -32,768 ~ 32,767
int i = 2147483647; // 약 +- 20억 (정수 기본)

long l = 9,223,372,036,854,775,807; // -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

// 실수
float f = 10.0f;
double d = 10.1; // (실수 기본)

// 정밀도 : float < double

🐹 자주 사용하는 DATA Type

1. 정수 : int , long : 자바는 기본으로 int 를 사용한다.만약 20억이 넘을것 같으면 long 을 쓰면 된다. 만약 파일을 다룬다면 byte 를 사용한다.

2. 실수 : double: 고민하지 말고 double 을 쓰면 된다.

3. Boolean : boolean

4. 문자열 : String : 문자 하나든 문자열이든 모두 String 을 사용하는 것이 편리하다.(큰 따옴표"" 사용)


🐹 변수 명명 규칙

  • 변수 : camelCase 표기법
  • 클래스 : PascalCase 표기법
  • 상수 : 모두 대문자를 사용하고 언더바로 구분 ( ex. USER_LIMIT)
  • 패키지 : 모두 소문자로 작성 (ex. org.spring.boot)

🐹 참조 자료형(Reference Types)

  1. 객체를 참조한다.
    • 변수는 객체의 메모리 주소를 저장하며, 이를 통해 객체에 접근한다.
  2. 참조 변수의 기본값
    • 초기화되지 않은 참조 변수의 기본값은 null이다.
  3. 동적할당
    • 객체는 new키워드를 사용해 동적으로 생성되며, 가비지 컬렉터에 의해 관리된다.
  4. 주소 저장
    • 힙 메모리를 사용해 객체를 저장하고 관리한다.
  5. 클래스 기반
    • 사용자 정의 클래스 타입 또는 자바가 제공하는 클래스 타입을 사용할 수 있다.

❶ 클래스 객체

사용자가 정의한 클래스 또는 자바 라이브러리의 클래스 인스턴스

String str = 'class';
MyClass object = new MyClass();

❷ 배열

동일한 타입의 여러 요소를 저장하는 컬렉션

int[] numbers = new int[0];
String[] strings = new String[5];

❸ 인터페이스

구현된 메서드 없이 메서드의 시그니처만 정의한 타입

List<String> list = new ArrayList<>();

⛔️ caution!

참조 자료형을 사용할 때엔 객체의 생성, 접근, 메모리 관리에 주의해야 한다.

객체는 new키워드로 생성되며 가비지 컬렉터가 더 이상 사용되지 않는 객체를 자동으로 정리하긴 하지만, 개발자 또한 메모리 누수 방지를 위해 불필요한 참조를 제거하는 것이 좋다.


🐹 Array와 ArrayList

💡핵심 키워드

  • Array : 고정된 크기, 빠른 접근, 기본 및 참조 타입 모두 지원
  • ArrayList : 동적 크기 조정, 다양한 메서드, 객체만 저장 가능

고정된 데이터 세트를 다룰 때는 Array을, 데이터의 크기가 자주 변경되거나 복잡한 데이터 조작이 필요할 때는 ArrayList를 사용하는 것이 좋다.

① Array

기본 자료형이나 객체 참조를 위한 고정된 크기의 연속적인 메모리 공간이다.

int[] numbers = new int[5];
String[] names = {"Alice", "Bob", "Charlie"};
  • 고정된 크기 : 배열의 크기는 선언 시 정해지며, 이후 변경할 수 없다.
  • 빠른 접근 : 인덱스를 통해 요소에 빠르게 접근이 가능하다.
  • 요소의 타입 제한 : 배열의 모든 요소는 동일한 타입이어야 한다.
  • 이터 타입 지원 : 기본 자료형(int, double 등) 또는 객체 참조(String, MyClass 등)를 저장할 수 있다.
  • 문법 : 대괄호([])를 사용해 선언한다.

② ArrayList

ArrayListjava.util 패키지의 일부로, 크기가 동적으로 변하는 배열을 말한다. 주로 배열을 사용해 요소를 저장하는 용도로 사용한다.

ArrayList<String> list = new ArrayList<>();
list.add('Cat');
lst.add('Puppy');
  • 동적 크기 : 요소 추가, 제거 등 배열의 크기를 동적으로 조절할 수 있다.
  • 참조 자료형만 저장 : 기본 자료형은 저장할 수 없으며, 대신 래퍼 클래스(Integer, Double 등)을 사용한다.
  • 다양한 메서드 : 요소 추가, 삭제, 검색 등을 위한 다양한 메서드를 제공한다.
  • 성능 이슈 : 크기 조정과 요소 이동으로 인해 배열보다 성능이 느릴 수 있다.
  • 제네릭 지원 : 다양한 타입의 객체를 저장할 수 있고 타입 안정성도 제공한다.

02. Java Collection Framework


Collection Framework는 데이터 그룹을 저장하는 클래스들을 표준화한 설계를 말한다.

자바 1.2 이전까지 Vertor, Hashtable, Properties와 같은 컬렉션 클래스나 다수 데이터를 저장할 수 있는 클래스들은 서로 다른 방식으로 다뤄야 하는 번거로움이 있었다.

하지만 자바 1.2버전부터 컬렉션 프레임워크(java.util 패키지) 를 지원하면서 모든 컬렉션을 표준화된 방법으로 작성할 수 있게 되었다.

🌻 Collection Framework 장점

👉 컬렉션 프레임워크의 지원으로 이전보다 객체지향적이고 재사용성 높은 코드 작성이 가능해졌는데, 주요 장점은 다음과 같다.

  1. 일관된 API
    • List, Queue, Set, Map 등의 인터페이스를 제공하고 이를 구현하는 클래스를 제공한다.
  2. 프로그래밍 속도 및 품질 향상
    • 품질 높은 추상화 개념이 구현되어 있으며 자료구조, 알고리즘을 구현하기 위한 코드를 직접 작성할 필요 없이 이미 구현된 컬렉션 클래스 목적에 맞게 선택해 사용하면 된다.
    • 또한 제공되는 API 코드는 검증과 최적화가 되어있다.
  3. 가변적인 공간 제공
    • 고정적인 저장 공간을 제공하는 배열에 대비되는 특징이다.

🐹 주요 Collection Framework

① 리스트 (List)

순서가 있는 데이터 집합으로 데이터 중복을 허용한다.

❶ ArrayList

  • 배열을 이용하여 만든 리스트로 대표적인 컬렉션 클래스이다.
  • 기본 크기는 10이지만, 원소가 늘어나면 더 큰 배열에 옮긴다.
  • 특정 원소 조회가 많은 경우 사용하는 것이 좋다.
    - 단방향 포인터 구조로 인덱스로 조회가 가능하기 때문에, 인덱스만 안다면 빠르게 조회 가능하다.
    - 삽입/삭제 뒤에 데이터를 뒤로 밀거나 앞으로 당겨야 하기 때문에 느리다.(O(N))

❷ LinkedList

  • 노드와 포인트를 이용해 만든 리스트이다.
  • 특정원소를 조회하는 경우, 첫 노드부터 순회하기 때문에 ArrayList보단 느리다.
  • 조회보다 삽입/삭제가 많은 경우 사용하는 것이 좋다.
    - 양방향 포인터 구조로 삽입/삭제 시 포인터를 끊고, 새로운 노드에 연결만 하면 되므로 빠르다.
  • 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰인다.

❸ Vertor

  • ArrayList와 비슷하게 배열로 만들어진 리스트로, 과거에 대용량 처리를 위해 사용했다.
  • 현재는 thread-safe 이슈가 있어 성능이 좋지 않고 무겁기 때문에, 잘 사용하진 않는다.

❹ Stack

  • LIFO(Last-In-First-Out) 특성을 가지는 자료구조로, push, pop 메서드를 사용한다.

② 큐(Queue)

처음 들어온 원소가 처음으로 나가는 FIFO(First-In-First-Out) 특징을 가진다.

❶ PriorityQueue

  • 우선순위를 가지는 큐로, 들어오는 순서가 아닌 부여된 우선순위에 따라 높은 순으로 먼저 반환한다.

❷ Deque

  • 양쪽으로 넣고 빼는 것이 가능한 큐이다.

③ 집합 (Set)

순서가 없는 데이터 집합으로 데이터 중복을 허용하지 않는다.

❶ HashSet

  • 가장 빠른 임의 접근 속도를 가진다.
  • 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출한다.
    - 만약 같다면 equals()로 두 객체를 비교하여 동등성을 판단한다.

❷ LinkedHashSet

  • 중복을 허용하진 않지만 순서를 가진다.

❸ TreeSet

  • 중복을 허용하지 않고 순서도 없다. 그러나 정렬 되어있다.
  • 이진트리를 기반으로한 Set 컬렉션이다.

④ 맵(Map)

Key - Value 쌍으로 이루어진 데이터의 집합으로, 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다. 그리고 순서는 유지되지 않는다.

❶ HashMap

  • 키와 값을 가지고 순서는 없다.
  • 키는 중복을 허용하지 않지만 값은 중복이 가능하다.
  • 키와 값에 Null을 허용한다.
  • 동기화를 보장하지 않는다.

❷ HashTable

  • HashMap과 동일한 특징을 갖지만, thread-safe하여 동기화를 지원한다.
  • get(), put(), remove()sycronized 키워드가 붙어있다.

❸ LinkedHashMap

  • 들어온 순서대로 순서를 가지는 Map이다.

❹ TreeMap

  • 키를 기준으로 정렬이 되어 저장되는 Map으로, 이진트리를 기반으로 한다.
  • 부모 키값을 비교하여 낮은 건 왼쪽으로, 높은 건 오른쪽에 Map.Entry를 저장한다.
  • 저장시간이 다른 자료 구조에 비해 오래 걸린다.

📂 참고자료

profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글

관련 채용 정보