[JAVA] 2주차 : 배열, 컬렉션

INHEES·2023년 7월 25일

Java

목록 보기
3/13

Java 문법 2주차 : 배열, Collection

배열

  • 선언과 생성

    배열(Array)는 기본형 변수가 아닌 참조형 변수들 처럼 new 명령을 통해서 생성하며 대괄호 안에 크기를 지정한다. 대문에 실제 값을 담지 않고 실제값이 가리키는 주소값을 저장한다.
  • 배열의 초기화
    중괄호와 반복문을 이용한 방법 외에 Arrays 클래스에서 제공하는 메서드를 활용할 수 있다.
	int[] intArray = {1, 2, 3, 4, 5};
    //1. 중괄호를 이용한 초기화
    
    for (int i = 0; i < intArray.length; i++) {
			intArray[i] = i;
		}
	//2. 반목문을 이용한 초기화
    
	Arrays.fill(intArray, 1);
    //3. 배열의 주소를 모두 같은값으로 초기화 
  • 복사
    복사의 종류에는 2가지가 있는데 얕은 복사, 깊은 복사가 있다.

    -얕은 복사 : 배열은 참조형 변수로 대입 연사자인 '=' 를 이용해서 복사를 하게 되면 주소값이 복사되고 실제값은 1개로 유지된다. 즉 2개의 변수가 같은 주소를 가르킨다.

// 얕은 복사

int[] a = { 1, 2, 3, 4 };
int[] b = a; // 얕은 복사

b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
System.out.println(a[0]); // 출력 3  <- a 배열의 0번째 순번값도 3으로 조회됩니다. 

-깊은 복사 : 새로운 배열을 만들고 싶을때 배열의 기본형 값을 꺼내주어 복사를 해주면 되는데 for 문을 통해서 하나씩 꺼내주는 방법도 있지만 Arrays 클래스의 copyOf 함수를 활용하면 된다.

	int[] a = { 1, 2, 3, 4 };
	int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
  • String 배열
    String은 참조형 변수로 실제값의 주소값을 저장하는 변수이다. 때문에 많은 기능들을 가지고 있다. 그 종류는 다음과 같다.

    메서드응답값 타입설명
    length()int문자열의 길이를 반환한다.
    charAt(int index)char문자열에서 해당 index의 문자를 반환한다.
    substring(int from, int to)String문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다. (to는 범위에 포함되지 않음)
    equals(String str)boolean문자열의 내용이 같은지 확인한다. 같으면 결과는 true, 다르면 false가 된다.
    toCharArray()char[]문자열을 문자배열(char[])로 변환해서 반환한다.
    new String(char[] charArr)String문자배열(char[]) 을 받아서 String으로 복사해서 반환한다.
	String str = "ABCD";

  	char[] strCharArray = str.toCharArray();
    // String 을 char[] 로 변환
    
    char[] charArray = {'A', 'B', 'C'};
  	String charArrayString = new String(charArray);
  	// char[] 를 String 으로 변환
    
    

Collection

  • 역할 및 기능
    Java 에서 컬렉션은 배열보다 다수의 참조형 데이터를 더 쉽고 효과적으로 처리할 수 있는 기능을 가지고 있다. 그 기능으로는 자동조정/ 추가/ 수정/ 삭제/ 반복/ 순회/ 필터/ 포함확인 등 많은 것들이 있으며 기본형 변수가 아닌 참조형 변수를 저장한다.

    참조형 변수는 기본형 변수와 대개 대소문자로 구분한다. 1.double -> Double
    2.int -> Integer
    3.String은 자체로 참조형 변수이다.

아래 그림은 컬렉션 프레임워크의 상속관계를 나타낸다.

List

List 는 순서가 있는 데이터의 집합(데이터의 중복 허용) 으로 ArrayList, LinkedList, Stack으로 구성되어있다.

  • ArrayList : 배열 처럼 일렬로 데이터를 저장하고 조회하여 인덱스로 값에 접근 가능하다.
    크기가 정해져 있지 않는 가변적인 특징을 가지고 있는 동적배열이다. 반면 Array는 연속된 공간을 요청한 사이즈 만큼 실제값을 저장하는 기본형 변수로 저장하기에 정적 배열이다.

선언, 생성, 핵심 내장함수로는 다음과같다.

ArrayList<Integer> initList = new ArrayList<Integer>();
intList.add({추가할 값}),set({수정할 순번}, {수정할 값}), toString()
  • LinkedList : 메모리에 남는 공간을 요청해서 여기저기 나누어 실제값을 담아놓고, 실제값이 있는 주소값으로 목록을 구성하고 저장한다.
    특징으로는 값을 나누어 담기에 모든값을 조회하는 속도가 느리지만 값을 중간에 추가하거나 삭제할 때는 속도가 빠르다. 기능은 ArrayList와 동일하다. (중간에 값을 추가하는 기능이 있다.) 선언 및 생성은 다음과 같다.
LinkedList<Integer> linkedList = new LinkedList<Integer>();
  • Stack : 나중에 들어간 것이 가장 먼저 나오는 LIFO(Last In First Out) 성질을 가진다. 특징으로는 최근 저장된 데이터를 나열하거나 데이터의 중복처리를 막고싶을때 사용한다. 삽입(push), 조회(peek), 꺼내기(pop) 기능이 존재한다.
Stack<Integer> intStack  = new Stack<Integer>();
iniStack.peek(), pop(), isEmpty(), size(), push();	

Queue

Queue는 들어간 순서대로 값이 조회되는 FIFO(First In First Out)의 형태이다. 기능으로는 add(), peek(), poll() 이 존재한다. Queue는 생성자가 없는 인터페이스 이기에 바로 생성이 불가합니다. 때문에 선언및 생성은 생성자가 존재하는 클래스인 LinkedList를 통해 생성이 가능하다.

Queue<Integer> intQueue = new LinkedList<Integer>();
intQueue.add(), peek(), poll();

Set

Set 은 순서가 없고 중복이 없는 배열이다. Set은 HashSet, TreeSet등으로 응용하여 사용 가능하다. 또한 Queue 와 마찬가지로 생성자가 없는 인터페이스 이다. 즉 생성자가 존재하는 HashSet을 이용한다.

Set<Integer> intSet = new HashSet<Integer>();
intSet.add(), get(), contains();

TreeSet vs HashSet

Map

key-value 형태로 데이터를 저장하기 때문에 key 값을 기준으로 value를 조회할 수 있다.
key는 unique한 성격을 지니기에 중복이 허용하지 않으며 Set과 마찬가지로 생성자가 존재하는 HashMap, TreeMap, ConcurrentHashMap 등이 있다.

Map<String, Integer> intMap = new HashMap<>();
for(String key : iniMap.ketSet()){}
for(Integer key : initMap.values()){}
intMap.put("일",11);
intMap.get("일"); //result = 11

HashMap 은 중복된 키 가 존재하면 마지막으로 put() 된 value 값으로 덮혀 쓰인다.

HashMap 외에도 TreeMap 이 있습니다.
  • HashMap : 중복을 허용하지 않고 순서를 보장하지 않음 , 키와 값으로 null이 허용
  • TreeMap : key 값을 기준으로 정렬을 할 수 있습니다. 다만, 저장시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래 걸림

HashMap vs TreeMap
ConcurrentHashMap

참고

length vs length() vs size() - 길이값 가져오기

1. length

  • arrays(int[], double[], String[])
  • length는 배열의 길이를 조회해줍니다.

2. length()

  • String related Object(String, StringBuilder etc)
  • length()는 문자열의 길이를 조회해줍니다. (ex. “ABCD”.length() == 4)

3. size()

  • Collection Object(ArrayList, Set etc)
  • size()는 컬렉션 타입목록의 길이를 조회해줍니다.

정리

자바 컬렉션의 대한 개념을 다시 복습할 수 있는 시간이였다. 다음 3주차에는 자바의 객체지향의 특징에 대해 알아본다.

profile
이유를 찾아보자

0개의 댓글