[알고리즘] 2장-1. 기본자료구조:배열

msriver·2020년 5월 29일
0

⚛ 자료구조란?

데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계

뭔소린가.. 데이터 단위? 물리적인 관계는 뭐고 논리적인 관계는 뭐야! 🤔
쓴것과 어려운건 몸에 해롭기때문에 쉽게 말을 바꾸어 보자.
데이터 단위라는건 데이터를 구성하는 한 덩어리,
자료구조는 데이터(자료)를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법 이라고 !

⚛ 배열!

-배열의 시작

가장 기본적인 자료구조이다. 같은 자료형의 변수들로 이루어진 하나의 모임이다.
대부분 책에서 예로 드는 학생성적! 학생이 100명일 때 각각의 국어점수를 입력받는다고 하면,
배열을 사용하지 않았을때와 배열을 사용했을 때는 많은 차이가 있을 것이다. 그리고 배열은 반복문과 함께 쓰일때 아주 강력하다!

//배열 변수 선언
int[] a;
int b[];

//배열 생성 후 참조시키기
a = new int[5];

별다른 설명은 생략하겠다. 이 블로그에 쓰이는 글들은 내가 공부한걸 내가 나중에 보려는 것이기에 불친절을 모토로 삼고있다.
단 주의할 것은 위 코드에서 a는 int형이 아니다. a는 레퍼런스 변수로 new 연산자로 인해 메모리에 생성된 배열 본체를 가리키는 참조변수이다. a의 타입은 int가 아닌 int[], 즉 int형 배열타입 이라고 하는것이 맞는것 같다.
또한 C언어에서 배열을 사용할 때는 배열의 크기를 상수로 받아 고정된 크기의 배열을 생성하였었다. 만약 배열의 크기를 결정짓는 부분에 변수를 사용하면 에러가 났을 것이다. 만일 동적으로 배열의 크기를 결정하고 싶다면 동적메모리할당을 사용해야 했다. 자바는 그와는 달리 new int[5] 부분에서 리터럴 상수인 5 대신 변수를 사용 가능하다.

-배열 초기화

배열을 만들고 직접 명시적으로 초기화를 해주지 않았을 경우 자동으로 초기화 값을 가진다.

초기값
byte0
short0
int0
long0L
float0.0f
double0.0d
char'\u0000'
booleanfalse
참조형공백 참조 또는 null
위 표와 같이 자동으로 초기화가 된다. 많아보이지만 대부분 0을 가진다고 생각하면 된다. boolean은 true가 아니라 false를 가진다는것을 주의!⚠ 배열의 구성요소들 뿐만 아니라 클래스의 필드(인스턴스 변수, 클래스변수)도 이 표의 초깃값대로 초기화된다. 단 메서드 내부에서 선언한 지역변수는 자동으로 초기화가 되지않는다.
public class Main{
	static int a;
	public static void main(String[] args) {
		int b;
		System.out.println(a); //0이 출력
		System.out.println(b); //The local variable b may not have been initialized
	}
}

-배열의 복제

배열은 clone()메서드로 복제가 가능하다.

public class Main{
	public static void main(String[] args) {
		int[] a = new int[] {1,2,3,4,5};
		int[] b = a.clone();
		
		b[3] = 0;
		
		System.out.println("배열 a의 요소들");
		for(int i=0; i<a.length;i++) {
			System.out.print(a[i]+" ");
		}
		
		System.out.println("\n-------------------");
		
		System.out.println("배열 b의 요소들");
		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가 가리키던 배열이 아닌 새로 메모리에 올라간 배열임을 알 수 있다.
만일 clone을 사용하지 않고 아래와 같이 코드를 작성하면

		int[] a = new int[] {1,2,3,4,5};
		int[] b = a;

참조변수인 a와 b는 하나의 배열을 가리키게 된다. 배열공유가 일어나는 것이다.
왜? a와 b는 배열 그 자체가 아니라, 단지 배열을 가리키는 참조변수이기 때문이다!
참고로 배열을 복사하는 방법에는 여러가지가 있다.

  1. System 클래스의 arraycopy() 메소드
  2. Arrays 클래스의 copyOf() 메소드
  3. Object 클래스의 clone() 메소드
  4. for 문과 인덱스를 이용한 복사

이 중에서 가장 좋은 성능을 보이는 것은 배열의 복사만을 위해 만들어진 arraycopy() 메소드입니다.
하지만 현재 배열의 복사를 위해 가장 많이 사용되는 메소드는 좀 더 유연한 방식의 copyOf() 메소드입니다.

-메서드에서 배열 리턴

public int[] maxOfArray() {
	int[]  a = new int[4];
    return a;
}

메서드 내부에서 선언된 변수는 지역변수로써 그 유효범위는 가장 가까운 블록이 끝날때 까지 이다.
위 예제에서는 return으로 a를 반환하고 나면 지역변수는 사라진다.
그럼 maxOfArray() 메서드에서 생성된 크기가 4인 int형 배열은 만든 의미가 없을까?
자바에서 배열은 만드는 단계가 크게 2단계가 있다.

  1. 배열을 참조할 레퍼런스변수를 만든다.
  2. 실제 배열을 new연산자를 사용하여 메모리에 할당한 후 레퍼런스변수에 그 참조값을 넣어준다.

배열을 메서드에 인자로 넘겨줄 때나 메서드의 반환값으로 되돌려 줄때는 그 배열 자체가 왔다리갔다리 하는게 아니다. 배열을 가리키는 참조값을 넘겨주는 것이다.
따라서 아래와같이 그 참조값을 참조변수로 받는다면 메서드 안에서 생성한 배열도 밖에서 사용이 가능하다.

int[] array = maxOfArray(); 
profile
NOBODY

0개의 댓글