Hayden's Archive

[자바/Java] 배열 본문

Study/Java & Kotlin

[자바/Java] 배열

_hayden 2020. 4. 16. 18:47

- 배열(Array):  같은 데이터 타입(Same Data Type)을 가지는 서로 다른 값들이 하나의 변수로 처리되는 것
 ===> 데이터 타입이 다르면 하나로 못 묶는다.

- 값이 5개 있으면 변수도 5개 선언되어야 한다. 근데 값이 100개 있다고 변수도 100개 선언하면 비효율적. 그래서 배열이 필요한 것.

- 배열1. 선언 2. 생성 3. 초기화

- 배열도 객체에 해당. 객체는 반드시 기본값을 가지므로 배열도 기본값이 있다. 또 배열도 객체이므로 new 연산자를 통해 만들어내며, 배열 또한 값이 heap에 저장된다. ( 참고 : https://xxxelppa.tistory.com/75 )


- 기본형 타입의 배열에는 값이 바로 들어감.(ex. int 타입 배열) 

 

1. 선언 
int[] arr; 

2. 생성 
arr = new int[3]; 
3과 같이 반드시 사이즈를 명시. 

3. 초기화 
arr[0]=11; arr[1]=22; arr[2]=33; 

1. 선언과 생성

int[] arr = new int[3]; 
배열을 선언과 동시에 생성한 것. 값이 3개 들어가는 통 만들었고 기본값 0, 0, 0 

2. 초기화

arr[0] = 11;
arr[1] = 12;
arr[2] = 13;

1. 선언 + 생성 + 초기화를 한꺼번에

int [ ] arr = {11, 22, 33};

 

int [ ] arr = {11,22,33};
		
System.out.println(arr); // 배열의 주소값이 출력됨

// 배열은 순서가 있는데 순서가 있는 것들은 내부적으로 index로 관리된다. 
for(int i=0; i<arr.length; i++) { //length()가 아니다. 함수가 아니라 필드!
	System.out.print(arr[i]+ " "); 
}
		
System.out.println(); // print는 연달아 찍히고 println 하면 다음 줄에 찍힘
		
// 자바에서는 향상된 for문으로 더 많이 쓴다. 뭐가 어디 안에서 돌아가는가?
for(int val : arr) { // 배열 arr 안에 있는 값들이 val에 할당됨
	System.out.print(val + " ");	
}

- 배열은 자바에서 기본적으로 제공하는 라이브러리. 배열 또한 객체이고 length 필드 하나만 있다. (참고 : https://chibychi.blogspot.com/2019/01/java-size-length-length.html


- 배열은 생성할 때 사이즈를 넣게 되어 있다. 그런데 배열은 Resizing이 안 된다. 만약에 사이즈를 변경하면 아예 새로운 배열 객체가 생성된다.

- 예를 들어 int [ ] arr2 = {11, 22, 33};인 배열이 있다고 할 때, arr2 = new int[5];로 사이즈를 재조정해주고 arr2[3]=44; arr2[4]=55; 를 초기화하더라도 arr2가 아예 새로운 값들을 가리키게 되었으므로 사용자가 따로 초기화하지 않은 arr[0], arr[1], arr[2]는 기본값 0을 가진다.

 


출처 : http://nlp.jbnu.ac.kr/PL/ch04.pdf

 

 

- 클래스 데이터 타입 배열에는 기본형 타입 배열과 달리 값이 안 들어가고 값을 참조하는 주소값이 들어간다.

1. Product 타입 배열 선언과 생성 → 배열의 주소값 할당
Product[ ] pros = new Product[3]; // 배열은 생성할 때 반드시 사이즈를 명시하도록 되어 있음. 

아직 초기화를 하지 않았으므로 기본값으로 null 값이 할당된다.(배열 객체 생성) 그리고 배열의 주소값이 Stack 영역의 참조변수 pros에 할당됨. Stack 영역의 Reference Variable인 pros가 Heap 영역을 참조한다.



2. 배열 각각의 항목들이 객체로 초기화 -> 각각의 항목에 주소값이 할당됨. 
pros[0] = new Product("HP", 120000, 2);  // HP
pros[1] = new Product("SAMSUNG", 230000, 3);   // SAM
pros[2] = new Product("LG", 500000, 13);   // LG


- 참조변수는 stack에만 있다는 편견을 가지지 마라. 배열 자체는 stack에서 참조하지만, 각각의 항목들은 heap 안에서 주소값을 가지고 heap 안에서 객체를 참조함.


- 배열의 복사 ==> System.arraycopy()

int [ ] target = {1,2,3,4,5,6};
int [ ] source = {10,9,8,7,6,5,4,3,2,1};
		
System.arraycopy(source, 2, target, 1, 3);
// 배열 source에서 복사해올 건데 
		
// 2번째 값(8)부터 복사할 것이다.
		
// 그리고 그걸 배열 target에 붙여넣기 할 건데 
		
// 1번째 인덱스 자리(2)부터 붙여넣을 것이며 
		
// 연달아서 3개를 붙여넣을 것이다.
// (2,3,4 --> 8,7,6)
		
// 이렇게 되면 배열 target에서 -> 0,4,5번째 인덱스는 그대로임.
		
for(int i : target) System.out.print(i + " ");
//1 8 7 6 5 6  출력

 


배열의 추가, 제거, 수정

PK(Primary Key : 기본키) 참고 : https://terms.naver.com/entry.nhn?docId=3431150&cid=58430&categoryId=58430

 

기본키

릴레이션에서 투플을 구별하기 위해 여러 개의 후보키를 모두 사용할 필요는 없다. 데이터베이스 설계자나 관리자는 여러 후보키 중에서 기본적으로 사용할 키를 반드시 선택해야 하는데 이것이 기본키(primary key)다. 만약 후보키가 한 개만 존재하면 당연히 해당 후보키를 기본키로 선택해야 하겠지만 여러 개일 경우에는 데이터베이스 사용 환경을 고려하여 적합한 것을 기본키로 선택하면 된다. 예로 든 고객 릴레이션은 고객아이디 속성만 후보키이기 때문에 자연스럽

terms.naver.com

CRUD 관련 포스팅 : https://hayden-archive.tistory.com/64?category=775409

 

[자바/Java] CRUD

- 데이터베이스는 2차원 구조로 생겼음. 행과 열. maker price count product1 product2 product3 ... DB 테이블의 하나의 행(Low)와 1:1 매핑 되는 게 Instance ===> product1, product2, product3, ... DB 테이..

hayden-archive.tistory.com