Programming/Java

[Java9 프로그래밍] 05-06. 데이터 구조, ArrayList, Map

빠모스 2020. 3. 13. 19:21
반응형

배열의 선언과 초기화

  • 배열 : 여러개의 데이터를 한꺼번에 처리할 때 사용
char[] arrayVar = new char[7]; // => 캐릭터 배열 타입       
//=> 7개짜리 캐릭터 배열을 만든다.

 

=> 네모 하나가 char 타입의 변수다. 7개가 들어가는 캐릭터 배열을 만들었다. 빈 배열. 크기만 할당.

 

배열에 값 넣기

arrayVar[2] = ‘c’; // 2번 인덱스에 'c' 문자 할당
arrayVar = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’}; // 모든 문자 할당

 

  • 배열 안의 하나하나를 element/item, 요소라고 말한다.
  • Java에서는 배열을 생성하면 엘레먼트의 값이 디폴트 값으로 초기화됨.
Int[] arrayVar = new int[7]; 

=> 인트형 배열의 경우 모두 0으로 초기화되어 생성.

 

배열과 반복문

  • 반복문을 사용하지 않은 배열 탐색은 비효율적이다.

<예시 1>

각 배열 인덱스에 점수를 할당하고 반복문을 통해 모든 인덱스의 점수와 그 합을 출력하는 코드

int[] scores = new int [4];

scores[0] = 97;
scores[1] = 90;
scores[2] = 91;
scores[3] = 98;

int sum = 0;

for ( int i = 0; i < scores.length; i++ ) {
	System.out.println(“scores[“+i+”] : “ + scores[i];
	sum = sum + scores[i];
}

 

 

2차원 배열의 선언과 초기화

 

char[][] twoDimArr = new char[3][7];

=> tabular 형태의 배열

int[][] square = {
	{14,2,3,1,4},
	{3,24,67,5},
	{25,4,67,2},
	{3,86,8,57}
};

=> but, 직접 이렇게 세우는 경우는 흔치 않다.

 

<예시 2>

이차원 배열을 출력하는 코드. i가 행, j가 열이 된다.

for (int i=0; i<square.length; i++) {
	for (int j=0; j<square[i].length; j++) {
		System.out.print(square[i][j] + “ ”);
	}
	System.out.println();
}

 

향상된 for문 사용

 

<예시 3> 

이차원 배열을 출력하는 코드. row가 행, item이 원소가 된다. row는 square 배열 안의 각각의 행을 의미.

for (int[] row : square) {
	for (int item : row) {
		System.out.print(item + “ “);
	}
	System.out.println();
}

 

ArrayList

배열의 특징 (단점)

 

  • 같은 타입의 엘레먼트만 사용 가능
  • 한번 생성하면 길이를 바꿀 수 없음

ArrayList

 

  • 배열을 사용하기 쉽도록 만든 클래스
  • 객체 내부의 배열을 관리 - 자동으로 길이를 조절

=> 요즘은 배열보다 ArrayList를 많이 씀.

 

ArrayList 생성과 사용

ArrayList<String> colors = new ArrayList<>();
//=> 제너릭 문법을 사용해서 type을 파라미터로 받음. String타입만 가지는 ArrayList를 만들겠다.

colors.add(“red”);
colors.add(“yellow”);
colors.add(“green”);

// 데이터 인덱스 접근
colors.get(0);
colors.get(1);

// 데이터 모두 삭제
colors.clear();

 

Map

ArrayList 특징

 

  • 데이터 저장을 인덱스 기반으로 수행 (배열과 동일)
  • 데이터의 순서가 있음 (Sequence data type)
  • 인덱스는 제로(0) 베이스

Map

 

  • 데이터를 키를 통해 관리
  • 데이터를 키/값 쌍으로 저장/관리

=> key/value pair 인덱스가 없음 - 데이터의 순서가 없음.

=> 실무에서 많이 쓴다.

 

Map 생성과 사용

 

// Map 생성
HashMap<String, String> products = new HashMap<>();
		//key   value (key와 value 모두 string을 쓰겠다)

// Map에 데이터 추가
products.put(“i01”, “iphone 7”); 
  			 //key     value
products.put(“i02”, “iphone 7s”);

// 데이터 접근 - 키 사용
products.get(“i01”);
products.get(“i02);

// 데이터 모두 삭제
products.clear();

 

ThinkPoint

주변에서 키와 값을 활용한 예가 있을까?

키는 유일한 값이 되어야 하고 그 키에 데이터를 바인딩해서 간단한 키로 데이터를 찾아오는 방식, 예를 들어 주민번호를 통해 주민의 정보를 찾을 수 있다. 키는 유일하고 중복되지 않아야 한다. ㄷ이터베이스도 키/값을 저장할 수 있는 레디스(Redis) 같은 DB도 많이 사용되고 있다. 서버에서 사용자 인증을 위한 정보를 저장하는 세션도 키/값 타입으로 데이터를 사용한다.

 

==> 자바에는 리스트와 맵, 집합 세 가지 컬렉션 프레임워크를 통해 구조적으로 지원한다. 각 데이터타입은 약간씩 변형된 파생형 타입을 갖는다. 사용할 데이터의 구조에 맞게 컬렉션을 사용하는 것이 중요하다. 처리하고자하는 데이터 구조에 맞는 적절한 컬렉션을 사용하는 것이 프로그램을 효율적으로 작성할 수 있는 방법이다.

 

실습 코드 1 - 배열

package java9Politec;

public class Lesson05_Arrays {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] intArr = new int[5];
		intArr[0] = 1;
		intArr[1] = 2;
		intArr[2] = 3;
		intArr[3] = 4;
		intArr[4] = 5;
		
		System.out.println(intArr);
		//=> 이렇게 출력하면 객체가 있는 주소값이 출력되게 됨.
		System.out.println(intArr[3]);
		//=> 인덱스가 주어지면 값에 접근 가능. 
		
		//배열 전체를 풀스캔 할땐 반복분 사용.
		for (int i=0; i<intArr.length; i++) {
			System.out.printf("%d", intArr[i]);
		}
		
		System.out.println();
		
		//새로운 for문이 자바 5부터 추가됨.
		for (int item:intArr) {
			System.out.printf("%d", item);
		}
		
		System.out.println();
		
		//배열 선언 다른 방법 
		int[] intArr2 = {1,2,3,4,5,6};
		for(int item:intArr2) {
			System.out.printf("%d", item);
		}
		
		//2차원 배열
		int[][] twoDimArr = {
				{101, 102, 103, 104},
				{201, 202, 203, 204},
				{301, 302, 303, 304},
				{401, 402, 403, 404}
		};
		//2차원 배열 : 테이블 형 데이터
		//202호, 403호는 배달하지 않고, 나머지 집에 우유를 배달하는 코드.
		for(int[] floor:twoDimArr) {
			for(int home:floor) {
				if(home==202||home==403) {
					continue; //밑코드를 수행하지 않고 다음 for문으로 돌아간다.
				}
				System.out.println(home);
			}
		}
	}

}

 

실습 코드 2 - ArrayList, Map

package java9Politec;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class Lesson06_ArrayList {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	/////// List 사용 ///////
		// List는 배열 대체용이다. 배열보다 사용하기 편리하고 성능은 떨어질 수 있지만 대용량에선 오히려 성능을 발휘할 수 있도록 최적화되있다.
		List<String> myList = new ArrayList<>();
			// List 객체지만 실제론 ArrayList. 과거엔 ArrayList<String> 식으로 다 써줘야 했으나 지금은 상관 없다.
		myList.add("red");
		myList.add("blue");
		myList.add("green");
		myList.add("yellow");
		System.out.println(myList);
			// 배열은 반복문 써서 하나씩 출력해야하는데 리스트는 컨텐츠까지 잘 출력해준다.
		myList.add("black");
			// 리스트의 마지막 인덱스에 추가한다. 리스트도 배열과 마찬가지로 인덱스 시스템을 이용한다.
		String third = myList.get(2);
		System.out.println(third);
			// 2번 인덱스인 green이 출력됨을 확인.
			// 사이즈는 추가할때마다 계속해서 늘어난다.
		//myList.clear();
		//System.out.println(myList);
			// 	비어있는 리스트가 출력됨을 확인. 
	
	/*------------------------------------------------------------------------*/
	
	// Immutable List (unmodifiableList)
		// 요즘에는 리스트 컨텐츠를 함부로 바꿀수 없는 형태인 Immutable List를 많이 사용함.
		// readonly의 느낌이고, 장점은 데이터를 병렬로 처리한다 할 때 데이터의 컨텐츠가 바뀌지 않아서 코드가 더 강건하게 작성될 수 있다.
		List<String> readOnlyList = Collections.unmodifiableList(myList);
		System.out.println(readOnlyList);
		//readOnlyList.add("white");
		//System.out.println(readOnlyList);
			// readOnly 리스트에 요소를 추가했을 때 에러가 발생함을 확인. readOnly 리스트에선 add자체가 불가능하다.
		
	/*------------------------------------------------------------------------*/
	
	// Java9 of 메소드 사용하여 Immutable List 사용. 
		List<String> java9List = List.of("red", "blue", "green");
			// 이렇게 만들어진 java9List는 디폴트로 immutable List이다. 
			// 따로 리스트 생성하고 add 할 필요 없이 바로 요소 추가 가능하다. 
		System.out.println(java9List);
		java9List.add("white");
			// 에러 발생함을 확인. immutable collection이 디폴트기 때문에 add 불가능.
	
	/*=========================================================================*/
		
	/////// Map 사용 ///////
		Map<String, String> myMap = new HashMap<>();
			// Key와 Value 모두 String타입인 Map을 만들겠다. 
		myMap.put("i5", "아이폰5");
		myMap.put("i6", "아이폰6");
		myMap.put("i7", "아이폰7");
		System.out.println(myMap);
	
		myMap.clear(); // 전체 데이터 삭제
	
		// Immutable Map
		Map<String, String> immutableMyMap = Collections.unmodifiableMap(myMap);
	
		// Java9 of 메소드 - 최초의 데이터 초기
		Map<String, String> java9Map = 
			Map.of("i5", "아이폰5", 
					"i6", "아이폰6",
					"i7", "아이폰7");
		java9Map.put("i8",  "아이폰8"); 
			// immutable이기 때문에 추가가 안됨을 확인.
	}

}
반응형