1일1끄적

자료구조&기본 알고리즘 입문(자바)- 배열(1) 본문

개발/Java

자료구조&기본 알고리즘 입문(자바)- 배열(1)

inkor 2021. 12. 22. 22:12

● 자료구조
자료구조(data structure) : 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계.

데이터 단위는 데이터를 구성하는 한 덩어리라고 생각, 자료구조는 쉽게 말해서 자료를 
효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법

● 배열

배열(array) : 배열은 같은 자료형의 변수로 이루어진 구성요소(components)가 모인 것.
배열 구성 요소의 자료형은 int형이나 double형 등 어떤 형이든 상관없다. 

int[]a ; // a는 자료형이 int형인 배열: 형식 A
int a[]; // a는 자료형이 int형인 배열 : 형식 B

a = new int[5] // a는 길이가 5인 배열을 참조

위 선언의 의미는 int형의 배열 본체를 생성하고 그것을 변수 a가 "참조"하도록 설정한다는 것.
new 연산자가 생성하는 것은 배열 본체에 대한 잠조. 
참조하는 곳이 a에 대입되고 그 결과 배열 변수 a가 배열 본체를 참제하게 된다.

구성요소

배열 안의 모든 구성 요소의 혀은 같고 직선 모양으로 줄지어 있다. 이러한 배열의 개별 요소에 접근하기 위해
사용하는 것이 연산자 [] 안에 넣는 정수형 인덱스이다.

첫번째 배열 요소의 인덱스는 0으로 정해져 있다. 따라서 각 구성 요소에 접근하는 식은 처음부터 순서대로
a[0], a[1], a[2], a[3], a[4]이다. 다시 말패 표현식 a[i]는 배열 a 에서 처음부터 i개 뒤의 구성 요소에 접근한다.

배열 변수 이름 [인덱스] // 배열 안의 임의의 구성 요소

○ 구성 요솟수(길이)

뱅려 본체와 함꼐 구성 요소의 개수인 구성 요솟수를 나타내닌 length라는 변수가 만들어 진다. 
또 배열의 구성 요솟수는 배열의 길이(length)라고도 한다. 

배열 변수 이름.length // 배열의 구성 요솟수

 배열의 특성

package chap02;
// 구성 요소의 자료형이 int형인 배열 (구성 요솟수는  5 : new에 의해  본체를 생성)

class IntArray {
	public static void main(String[] args) {
		int[] a = new int[5];	// 배열 선언

		a[1] = 37;				// a[1]에 37을 대입
		a[2] = 51;				// a[2]에 51
		a[4] = a[1] * 2;		// a[4]에 a[1] * 2  => 74를 대입

		for (int i = 0; i < a.length; i++)	// 각 요소의 값
			System.out.println("a[" + i + "] = " + a[i]);
	}
}

// *콘솔 출력
// a[0] = 0
// a[1] = 37
// a[2] = 51
// a[3] = 0
// a[4] = 74
int[] a; // 선언
a = new int[5] // 참조하기

배열의 구성 요솟수를 알고 있는 경우 int[]a = new int[5]와 같이 선언. 또는 배열의 변수 선언과 본체 생성을 따로 수행할 수 도 있다.
값을 대입하지 않은 경우 배열의 구성 요소는 자동으로 0으로 초기화 되는 규칙이 있다. 

구성요소를 초기화 하는 값, 곧 배열을 생성할 때 각 구성요소에 넣어지는 값을 초깃값(default value)라고 한다.
* 배열의 구성요소 뿐만 아니라 클래스의 필드(인스턴스 변수와 클래스 변수도 하단과 같은 초깃값으로 초기화)

초기값
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
char '/u0000'
boolean false
참조형 공백 참조 또는 null

(각 자료형의 초깃값)

 

○ 배열의 요솟값을 초기화하며 배열 선언
배열 본체는 배열 초기화(array initaializer)를 사용하면 배열 본체의 생성과 동시에 각 요소의 초기화가 가능하다

package chap02;
// 구성 자료형이 int형 인 배열 (요솟수는  5:배열 초기자에 의해  생성)

class IntArrayInit {
	public static void main(String[] args) {
		int[] a = {1, 2, 3, 4, 5};	// 배열 초기자에 의해  생성

		for (int i = 0; i < a.length; i++)
			System.out.println("a[" + i + "] = " + a[i]);
	}
}

// *콘솔영역
// a[0] = 1
// a[1] = 2
// a[2] = 3
// a[3] = 4
// a[4] = 5

 

○ 배열의 복제
배열의 복제는 clone 메서드를 호출하여 만들 수 있다.

배열이름. clone() // 배열의 복제
package chap02;
// 배열을 복제.

class CloneArray {
	public static void main(String[] args) {
		int[] a = {1, 2, 3, 4, 5};
		int[] b = a.clone();			// b는 a의 복제를 참조

		b[3] = 0;						// 한 요소에만 0 대입

		System.out.print("a =");
		for (int i = 0; i < a.length; i++)
			System.out.print(" " + a[i]);

		System.out.print("\nb =");
		for (int i = 0; i < b.length; i++)
			System.out.print(" " + b[i]);
	}
}

// *콘솔 출력
// a = 1 2 3 4 5
// b = 1 2 3 0 5

배열 변수 b는 a가 참조하는 배열 본체의 복제를 참조.

○ 배열 요소의 최댓값 구하기
배열 요소의 최댓값을 구하는 과정. 배열 a의 요소가 3개일 때 세요소 a[0], a[1], a[2] 중 최댓값은 아래와 같다

max = a[0]
if(a[1] > max ) max = a[1]; 
if(a[2] > max ) max = a[2];

// 요소 개수가 3이면 if 문을 2개 작성

max = a[0]
if(a[1] > max ) max = a[1]; 
if(a[2] > max ) max = a[2];
if(a[3] > max ) max = a[3];

// 요소 개수가 4이면 if문을 3개 작성

max [0];
for(i -1; i<n; i++)
	if(a[i] > max ) max = a[i];

// 요소 개수가 n이면 if문을 n-1개 작성

 

배열의 요소를 하나씩 차례로 살펴보는 과정을 알고리즘 용어를 주사(travese)라고 한다. 

주사란 원래 텔레비전 화면이나 사진을 저송할 때 화면을 여러 개의 점으로 나눠 그 점을 
전기 신호로 바꾸는 일 또는 전기 신호에서 점을 조립하여 화면을 재구성하는 것을 말한다. 
즉, 스캐닝 (scanning)을 의미한다. 여기서 주사는 데이터를 하나씩 지나면서 살피고, 조사하는 일을 말한다.
영어로는 traverse라고 하는데, 가로지르다 혹은 횡단하다라는 뜻이다.

스캔 과정에서 if문의 제어식 a[i] > max 가 참일때 (살펴보고 있는 요소 a[i]의 값이 최댓값 max보다 클 때)
a[i]값을 max에 대입한다. 결과적으로 배열의 모든 요소에 대해 스캔을 완료한 시점의 배열 a의 최대 요솟값은 
max에 대입된다. 

○ 배열 요소의 최댓값을 구하는 메서드 

package chap02;
import java.util.Scanner;
// 배열 요소의 최댓값(값을 입력 받음).

class MaxOfArray {
	// 배열 a의 최댓값을 구하여 반환.
	static int maxOf(int[] a) {
		int max = a[0];
		for (int i = 1; i < a.length; i++)
			if (a[i] > max)
				max = a[i];
		return max;
	}

	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);

		System.out.println("키의 최댓값 구하기.");
		System.out.print("사람 수 : ");
		int num = stdIn.nextInt();				// 배열의 요솟수를 입력 받음

		int[] height = new int[num];			// 요솟수가 num인 배열을 생성

		for (int i = 0; i < num; i++) {
			System.out.print("height[" + i + "]:");
			height[i] = stdIn.nextInt();
		}
	
		System.out.println("최댓값은 " + maxOf(height));
	}
}

 

배열 height 요소의 최댓밗을 구하기 위한 maxOf 메서드의 호출. 
인수 height는 배열 본체를 참조하는 배열 변수. 따라서 메서드 maxOf에 전달하는 것은 '배열 본체에 대한 참조'.
호출한 메서드 maxOf에서 배열 변수인 매개변수 a가 전달받은 참조로 초기화 되므로 
배열 변수 a는 배열 height의 본체를 참조. 그 결과 메서드 maxOf 안의 배열 a는 사실상 main 메서드의
배열 height인 것. 이런 우너리로 배열ㅇ을 전달하므로 메서드 maxOf안에서는 전달받은 배열의 요솟수를 
a.length로 얻을 수가 있고, 각 요소를 a[i]로 엑세스 할 수 있다. 

접근 제한자?
멤버는 객체 자신만의 속정이자 특징이므로 외부에 공개하는 것이 반드시 좋은 것이 아니다. 
그래서 객체의 멤버에 대한 접근을 제한할 떄가 있는데, 이를 자바에서는 접근 제한자라 한다.

제한자 종류

  1. public: 모든 접근 허용
  2. protected: 같은 패키지(폴더)의 객체, 상속 관계의 객체 허용
  3. default: 같은 패키지(폴더)의 객체 허용
  4. private: 현재의 객체 안에서만 허용

 

접근 제한자 사용 

  1. 클래스: public, defualt
  2. 생성자: public, protected, defualt private
  3. 멤버 변수: public, protected, default, private
  4. 멤버 메서드: public, protected, default, private
  5. 지역 변수: 접근 제한자를 사용할 수 없음 

-출처: 자료구조와 함꼐 배우는 알고리즘 입문[자바편] 책 중
http://www.yes24.com/Product/Goods/60547893

Comments