자바 기본기 정리 3

유승선 ·2023년 2월 7일
1

자바 독학

목록 보기
4/10
post-thumbnail

배열

선언 - 생성

배열의 선언은 많이 문제를 풀면서 많이 해봤지만 생성 하는 부분에서 조금 몰랐던 부분을 몇개 알아내서 적용해보니 아래와 같다.

int[] arr = new int[30]; //크기를 정하고 생성한다 
int[] arr = {0,1,2}; //값을 처음부터 지정해주고 생성을 한다. 

//그렇지만! 
int[] arr; 
arr = {0,1,2}; //이런 식으로 배열을 먼저 선언하고 나중에 목록을 주는것을 자바에서 허용해주지 않는다. 

int[] arr; 
arr = new int[]{0,1,2}; //배열을 먼저 선언하고 이런식으로 new 키워드를 사용해서 배열을 다시 지정해주는것은 가능하다. 

결국 배열을 일반적으로 생성하는거 외에도 값을 지정해서 사용하는 경우도 많을거다. 아니면은 바로 배열을 반환하는 문제들도 많을텐데 잘 활용해보자.

다차원 배열

다차원 배열에서의 선언도 일반 배열과 비슷하다.

int[][] scores = new int[2][3]; 
int[][] scores = {{95,80},{92,96}}; 

힙영역 안에서는 위와 같은 구조로 객체의 주소를 참조하게 된다.

계단식 구조

2차원 배열에서는 행수만 결정해두고 열수는 나중에 결정해도 괜찮다.

int[][] scores = new int[2][]; 
score[0] = new int[2]; 
score[1] = new int[3]; 

이런 식으로 만들어서 나중에 하나씩 채워줘도 괜찮을거같다. 삼각혁 or 피라미드 구조에 문제가 나온다면 말이다.

배열 복사

배열을 복사하는 함수도 존재한다.

//사용법
System.arraycopy(원본배열, 원본배열시작 인덱스, 대상배열, 대상배열시작 인덱스, 복사개수); 

String[] oldStrArray = {"java","array","copy"}; 
String[] newStrArray = new String[5]; 
System.arraycopy(oldStrArray,0,newStrArray,0,oldStrArray.length); 

복사되는 과정은 위와 같다.


컬렉션 프레임워크

시작하기 전에

  • 프레임 워크: 자바는 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 인터페이스 구현 클래스를 java.util 패키지에서 제공해준다. 그리고 이렇게 효율적으로 관리해주는 인터페이스 구현 클래스를 컬렉션 프레임워크라고 부른다.
  • List, Set, Map: 컬렉션 프레임워크의 주요 인터페이스. 이것들은 컬렉션 클래스를 사용하는 방법을 정의한것.
  • 컬렉션 요소는 객체들만 가능하다 -> 기본타입 int, char, double은 사용 불가능.

List 컬렉션

List 컬렉션은 C++의 Vector와 비슷한 역활을 한다. 앞서 말했지만 컬렉션 프레임워크는 인터페이스 다. 그렇기 때문에 이 인터페이스를 구현하는 구현체가 따로 있고 공통적으로 사용가능한 메서드가 존재한다.

아래는 공통적으로 사용 가능한 List 인터페이스의 메서드다.

여기에서 가장 신기하게 느꼈던거는 set 메서드. 자바에서는 컬렉션에 인덱스로 접근해서 바로 값을 지정해줄 수 없다.

ArrayList

ArrayList는 List 인터페이스의 대표적인 구현 클래스이다.

List<String> list = new ArryaList<>(); 
list.add("홍길동"); 

여기서 주목해야 하는 점은 <> 안에 어떠한 타입도 안적어줬다. 이렇게 파라미터를 생략하면은 앞에 List로 지정된 E타입 파라미터를 따라간다.

LinkedList

LinkedList는 List 구현 클래스로 ArrayList와 사용 방법은 같으나 내부 구조가 다르다. 위에서 언급한 공통 메서드를 전부 사용할 수 도 있지만 구조 자체가 링크드 리스트고 고유하게 사용할 수 있는 다른 특징들도 존재한다.

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

list.add("홍길동"); 
list.remove(1); //첫번째 인덱스 element 삭제 

SET 컬렉션

SET은 가끔 코딩테스트에서도 나오고 C++로 할때도 사용하긴 해도 그렇게 좋아하는 자료구조는 아니지만 자바에서도 컬렉션으로 사용가능하다.

  • Set 컬렉션은 저장 순서가 유지되지 않는다
  • 객체를 중복해서 저장할 수 없다
  • SET 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있는데 공통적으로 사용가능한 Set 메소드가 존재한다.

여느 자료구조와 마찬가지로 SET은 인덱스로 객체를 검색하는 방법이 없기때문에 iterator 메소드를 호출해서 값을 얻을 수 있다.

Set<String> set = ...; 
Iterator<String> iterator = set.iterator(); 
while(iterator.hasNext()){
	String str = iterator.next(); 
}

이렇게 Iterator 클래스를 활용해서 hasNext() 그리고 next() 메소드를 활용해서 Set 안에 있는 값을 꺼내는 방법도 있지만 사실 너무 귀찮다.

for(String str : set){
	System.out.println(str); 
}

그냥 이 방법이 내가 원래 사용하던 Auto 방법과 가장 유사하기 때문에 제일 괜찮은거같다.

HashSet

HashSet은 Set 인터페이스의 구현 클래스이다. 선언하는 방법은 평범하다. Set의 특성을 살려서 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다. HashSet이 중복 객체를 확인하는 방법은 equals() 메서드와 hashCode 값을 보면서 비교하는데 나중에 필요하면 찾아봐도 좋을거같다.

Set<String> set = new HashSet<>(); 

set.add("가"); 

for(String str : set){
	System.out.println(str); 
}

set.clear() //전체 비우기 

Map 컬렉션

Set(HashSet), List(ArrayList, Vector, Stack), Queue(LinkedList)는 Collection을 상속받아 단일 클래스의 객체만을 요소로 다룬다는 공통점이 있지만 Map은 Collection을 상속받지 않는다!

Map컬렉션은 key와 value로 구성된 Map.Entry 객체를 저장하는 구조를 가지고 있다. Entry는 Map인터페이스 내부에 선언된 중첩 인터페이스다. key 와 value는 모두 객체이다.

Map컬렉션에는 HashMap, HashTable, LinkedHashMap, Properties, TreeMap 등이 있고 다음은 공통으로 사용가능한 Map 인터페이스 메서드다.

코딩테스트 문제를 풀다보면은 Map안에 있는 데이터들을 읽어야할 때가 많을것이다. 이때 자바에서는 두가지 방법이 있다.

첫번쨰는 keySet() 메서드로 모든 키를 Set 컬렉션으로 얻은 다음 반복문을 통해 키를 하나씩 받고 get() 메서드로 값을 얻는 방법.

두번째는 entrySet() 메서드로 모든 Map.Entry를 Set 컬렉션으로 얻은 다음 반복문을 통해서 getKey() 와 getValue()를 통해서 얻을 수 있다.

그런데 Set컬렉션으로 뽑게되면 일반적인 for 문으로 데이터를 쉽게 얻을 수 있다.

HashMap

HashMap은 Map인터페이스를 구현한 Map컬렉션이다. HashMap의 키로 사용할 객체는 hashCode와 equals 메서드를 통해서 중복 확인이 된다. 특이 점은 HashMap의 key와 value의 타입은 기본타입이 아닌 반드시 클래스 및 인터페이스 타입마 사용 가능하다.

Map<String, Integer> map = new HashMap<>(); 

map.put("key1",10); 
map.put("key2",20); 

//방법1 
Set<String> keySet = map.keySet(); //모든 키를 set컬렉션으로 변환 

//for 문 
for(String str : keySet){
	System.out.println(key + map.get(key)); 
}

추가적으로 getOrDefault() 라는 메서드가 있다.
이 메서드는 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면은 기본값을 반환하는 메서드다.

HashMap<String, Integer> hm = new HashMap<>(); 
String[] alphabet = {"A","B","C", "A"}; 
for(String alpha : alphabet){
	hm.put(alpha,hm.getOrDefault(alpha,0)+1);  
}

Stack

스택도 자주 사용되는 자료구조는 아니지만 그래도 배워두면 쓸만하다. 아주 가끔 코딩테스트에서 사용된다. 다음은 주요 메서드이다.

Stack<Integer> stack = new Stack<>(); 

stack.push(3);
stack.push(4); 

while(!stack.isEmpty()){
	Integer number = stack.pop(); 
    System.out.println(number); 
}

Queue

BFS 자료구조에서 많이 사용되는 큐다. Queue 인터페이스를 구현한 대표적 클래스가 LinkedList 인데 LinkedList는 List 인터페이스를 구현했기 때문에 List컬렉션이기도 하다. 간단하게 Queue 타입 인터페이스 변수에 LinkedList 객체를 대입하면 된다.

Queue<int[]> q = new LinkedList<>(); 
q.add(new int[]{123}); 
q.poll(); 

Collections 활용 메서드

Collections 클래스는 static 타입으로 여러 메서드를 지원한다.

  • sort() 정렬
  • reverse() 요소를 반대 순으로 정렬
  • max(), min() 최대 최소값
  • binarySearch() 이진 탐색, 값을 찾으면 인덱스 값을 반환하고, 음숙이면 탐색 실패, 반환되는 음수는 삽입되어야 하는 위치 -1을 반환, 즉, 반환된 음수를 양수로 바꾸고 +1을 해주면 삽입 되어야 할 위치.
LinkedList<String> myList = new LinkedList<>(); 

Collections.sort(myList); 
Collections.reverse(myList); 
int index = Collections.binarySearch(myList,"아바타"); 

참고:

모든 내용은 백토니 블로그에서 옵니다.

profile
성장하는 사람

0개의 댓글