JAVA의 정석 | Chapter 5 : 배열 array

Yunny.Log ·2022년 5월 25일
0

JAVA

목록 보기
12/29
post-thumbnail

1 배열

  • 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

배열의 선언과 생성

선언방법
1) 타입[ ] 변수이름;
(ex) int[ ] score; or String[ ] name;

2) 타입 변수이름 [ ];
(ex) int score[ ]; or String name [ ]

배열의 생성

  • 배열 선언 뒤에는 배열 생성 필요해
  • 배열 선언은 단지 생성된 배열 다루기 위한 참조변수 위한 공간 만들어지는 것
  • 배열 생성해야만 비로소 값 저장가능한 공간 만들어짐
1) 배열 선언 
int[ ] score; # score이라는 참조변수만 생성, 데이터 저장 공간은 마련 x
2) 배열 생성 
score = new int[5]; #score -> [   ] 실제 int 리스트 공간 생성 

  • 유효하지 않은 값을 index로 사용하게 되면 ArrayIndexOutodBoundsException 발생

배열의 길이

  • 배열의 길이는 0도 가능하다.
  • 배열이름.length를 통해서 배열의 길이에 대한 정보 얻기 가능
    => 배열 한번 생성 시 길이 변경 불가능
    => 이미 생성된 배열의 길이는 변하지 X
    => 배열이름.length 는 상수다. 변경 불가능!

배열의 길이 변경 시 비용의 문제

  • 물론 배열 길이 변경하고싶을 때 존재하게 될 가능성 있다.
    그렇다면
    1) 더 큰 배열 새로 생성
    2) 기존 배열 내용을 새 배열에 복사

=> 이는 비용이 많이 드는 작업, 처음부터 배열의 길이 넉넉히 잡기 - 새로 배열 생성 상황 가능한 적게 해야함

  • 너무 크게 잡으면 메모리 낭비, 기존의 2배 정도로 설정하는 것이 좋음

1.4 배열의 초기화

  • 배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화
  • 원하는 값으로 초기화, 저장 하기 위해서는 값을 지정해주기

1.5 배열의 복사

  • System.arraycopy() 를 이용한 배열의 복사가 효율적
System.arraycopy(num, 0, newNum, 0, num.length);

=> num[0]에서 newNum[0]으로 num.length 개의 데이터 복사

  • 만약 복사하려는 배열의 위치가 복사하려는 내용보다 여유공간 작으면 ArrayIndexOutodBoundException 발생

1.6 배열의 활용

1) 총합, 평균 구하기

class ArrayEx5 {
	public static void main(String[] args) {
		int sum =0;				// 총점을 저장하기 위한 변수
		float average = 0f;		// 평균을 저장하기 위한 변수

		int[] score = {100, 88, 100, 100, 90};

		for (int i=0; i < score.length ; i++ ) {
			sum += score[i];
		}

		average = sum / (float)score.length ; // 계산결과를 float로 얻기 위함.


	}
} 
  • int 끼리 나눌 때 정확 값 얻기 위해서는 이 결과 int 값을 float로 형변환 해주는 것!

2 String 배열

2.1 String 배열의 선언과 생성

  • 변수의 타입에 따른 기본값은 false, 0, 참조형 변수는 null

2.2 String 배열 초기화

  • 초기화도 위 과정과 동일, { } 로 쉽게 초기화도 가능
String[] name = new String[]{"1", "2", "3"};
String[] name = {"1", "2", "3"};
=> new String[] 생략도 가능
  • new 안쓴다고 해서 참조변수 사용하는 것이 아니다. String도 클래스(붕어빵 틀) new 연산자를 통해서 객체(붕어빵) 를 생성해야 한다.

2.3 char 배열 vs String 클래스

  • 자바에서 char 배열이 아닌 String 클래스 이용 이유는 char 배열 사용하는 것보다, String 클래스 사용하는 것이 문자열 다루기 더 편리해서, 다양한 메소드를 제공해주기 때문이다.

  • String 제공 메소드

    1) charAt(int index) 문자열에서 해당 위치에 있는 문자 반환
    2) length() 문자열의 길이 반환
    3) substring(int from, int to) from<= ~ <to 까지의 문자열 (to는 포함 안된다)
    4) equals - 문자열의 내용이 obj와 같은지 확인
    5) char[] to CharArray() 문자열의 문자배열(char[ ] )로 변환해서 반환

char 배열과 String 클래스의 중요 차이점

  • String 객체 (문자열)는 읽기만 가능, 내용 변경은 불가능하다는 것! (아예 객체를 생성해버린 것이니깐)

객체지향

  • 객체지향 언어에서는 데이터와 그에 관련된 기능(메소드) 을 하나의 클래스에 묶어 다룰 수 있게 됨
  • 이전엔 데이터와 기능(메소드) 따로 다룸
  • 서로 관련된 것들끼리 데이터와 기능을 구분하지 않고 함께 묶는 것

tmi : 메소드들 복습한 것

  • Math.random() * 범위
(ex) Math.random()*10 => 0~9 의 범위
  • Integer.parseInt
    • integer 로 문자를 바꿔주기
(ex) int num1 = Integer.parseInt("1")

위까지는 일차원 배열에 대해서 다뤘던 것

3. 다차원 배열

  • 2차원 배열을 선언하는 방법은 1차원 배열과 the same, [ ] 하나 더 추가됨

3.2 2차원 배열의 초기화

  • 2차원 배열도 선언과 동시에 초기화 가능
int[] [] arr = new int [] [] { {1,2,3}, {4,5,6} };

=> new int 생략 가능

2차원 배열 score이 메모리에 만들어지는 과정

  • 배열 참조변수의 관계로 생성이 되게 된다.

3.3 가변 배열

int[][] A = new int[5][3];

위와 같이 미리 고정된 형태가 아니라

int[][] A = new int[5][];
A[0] = new int[4];
A[1] = new int[2];
A[2] = new int[5];
A[3] = new int[3];
A[4] = new int[4];

이와 같이 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 배열을 생성 -> 고정된 형태가 아닌 유동적인 가변 배열 구성 가능

출처 :

남궁성 저자님의 자바의 정석, public 깃허브 코드, 깃허브 업로드 ppt : https://github.com/castello/javajungsuk3/blob/master/source/ch5/ArrayEx5.java

0개의 댓글