일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- GDSC
- DB #데이터베이스
- 우선순위상속프로토콜
- Java
- 놀러와요_해커톤
- 회고
- 부스트캠프웹모바일
- 모던 자바스크립트
- 모던자바스크립트
- 변수
- GDSC_PKNU
- 그룹프로젝트
- 운영체제
- 부스트캠프7기
- CSSOM
- 브라우저 렌더링
- 데이터독립성
- 타입
- 확인문제
- 상태관리
- OS
- 멤버십
- javascript
- 우선순위역전
- 부스트컨퍼런스
- 부스트캠프
- 인프콘
- js
- 렌더 트리
- CRDT
- Today
- Total
dohun.log
[Java]05.참조 타입 본문
배열
배열이란 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스(index)를 부여해 놓은 자료구조
다음과 같은 4명의 학생의 점수를 담은 score 배열이 있다고 하자.
인덱스 | 0 | 1 | 2 | 3 |
데이터 | 83 | 90 | 87 | 93 |
score 배열의 각 인덱스는 각 항목의 데이터를 읽거나, 저장하는데 사용되고 다음과 같이 배열 이름 옆에 대괄호 []에 기입된다.
score[인덱스]
이렇게 성적을 배열로 만들면 평균값은 for문을 사용하여 쉽게 구할 수 있다.
int sum = 0;
for(int i = 0; i < 4; i++) {
sum += score[i];
}
int avg = sum / 4;
❓ 배열은 같은 타입의 데이터만 저장할 수 있다. → 다른 타입의 값을 저장하려고 하면 타입 불일치(Type mismatch) 컴파일 오류 발생
❓ 프로그램 실행 도중 배열의 길이는 수정할 수 없다. → 길이를 수정하려면 새로운 배열을 생성하고, 기존 배열을 새 배열로 복사시켜야 함
배열 선언
배열을 사용하기 위해서는 배열 변수를 선언해야한다.
다음과 같이 두 가지 형태로 작성할 수 있다.
1. 타입[] 변수;
2. 타입 변수[];
// 1.
int[] intArray;
double[] doubleArray;
String[] strArray;
//2.
int intArray[];
double doubleArray[];
String strArray[];
❓ 배열 변수는 참조 변수에 속한다. → 힙 영역에 생성
값 목록으로 배열 생성
배열 항목에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열 객체를 만들 수 있다.
데이터타입[] 변수 = {값0, 값1, 값2, 값3, ...};
String[] names = {"신용권", "홍길동", "감자바"};
감자바 이름을 박자바로 바꾸고 싶다면 다음과 같이 대입 연산자를 사용하면 된다.
names[2] = "박자바";
❓ 배열을 이미 선언한 후에 다른 실행문에서 중괄호를 사용한 배열 생성은 허용되지 않는다. → new 연산자를 사용해서 값 목록을 지정해주면 된다.
타입[] 변수;
변수 = {값0, 값1, 값2, 값3, ...}; // 컴파일 에러
변수 = new 타입[] {값0, 값1, 값2, 값3, ...};
String[] names = null;
names = new String[] {"신용권", "홍길동", "감자바"};
❓ 메소드의 매개값이 배열일 경우, 값 목록으로 배열을 생성함과 동시에 메소드의 매개값으로 사용하려고 하려면 반드시 new 연산자를 사용해야 한다.
int add(int[] scores) {...}
int result = add({95, 85, 100}); // 컴파일 에러
int result = add(new int[] {95, 85, 100});
new 연산자로 배열 생성
값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶다면 new 연산자로 배열 객체를 생성시킬 수 있다.
타입[] 변수 = new 타입[길이];
int[] intArray = new int[5];
❓ 길이 → 배열이 저장할 수 있는 값의 수
new 연산자로 배열을 생성할 경우에는 이미 배열 변수가 선언된 후에도 가능하다.
타입[] 변수 = null;
변수 = new 타입[길이];
int[] intArray = null;
intArray = new int[5];
배열이 생성되고 나서 새로운 값을 저장하려면 대입 연산자를 사용하면 된다.
변수[인덱스] = 값;
intArray[1] = 30;
배열 길이
코드에서 배열의 길이를 얻으려면 다음과 같이 배열 객체의 length 필드를 읽으면 된다.
배열변수.length;
int[] intArray = {10, 20, 30};
int len = intArray.length;
length 필드는 읽기 전용 필드이기 떄문에 값을 바꿀 수 없다.
intArray.length = 10; // 잘못된 코드
커맨드 라인 입력
프로그램 실행을 위해 main() 메소드가 필요하다. 이때 매소드의 매개값인 String[] args가 왜 필요한 것일까?
public static void main(String[] args) {...}
"Java 클래스"로 프로그램을 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고 main() 메소드를 호출할 때 매개값으로 전달한다.
String args = {}; // 길이가 0인 String 배열을 먼저 생성
public static void main(String[] args) { // 이때 매개값으로 전달
...
}
"Java 클래스" 뒤에 공백으로 구분된 문자열 목록을 주고 실행하면, 문자열 목록으로 구성된 String[] 배열이 생성되고 매개값으로 전달된다.
java 클래스 문자열0 문자열1 문자열2 ... 문자열n-1
String[] args = {문자열0, 문자열1, ... , 문자열n-1}; // 문자열 생성
public static void main(String[] args) { // 생성된 문자열 매개값으로 전달
...
}
다차원 배열
지금까지 살펴본 배열은 값 목록으로 구성된 1차원 배열이다.
이와는 달리 행과 열로서 구성된 배열을 2차원 배열이라고 한다.
자바는 2차원 배열을 중첩 배열 방식으로 구현한다.
int[][] scores = new int[행][열];
자바는 일차원 배열이 서로 연결된 구조로 다차원 배열을 구현하기 때문에 수학 행렬 구조가 아닌 계단식 구조를 가질 수 있다.
int[][] scores = new int[2][];
scores[0] = new int[2];
scores[1] = new int[3];
그룹화된 값 목록을 가지고 있다면 다음과 같이 중괄호 안에 다시 중괄호를 사용해서 값 목록을 나열하면 된다.
타입[][] 변수 = {{값0, 값1, 값2}, {값0, 값1, 값2}, ...};
int[][] scores = {{95, 80}, {92, 96}};
위 코드로 생성된 scores 배열에서 항목 값은 다음과 같이 읽을 수 있다.
int score = scores[0][0]; // 95
int score = scores[1][1]; // 96
배열 복사
배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다.
배열 간의 항목 값들을 복사하려면 for문을 사용하거나 System.arraycopy() 메소드를 사용하면 된다.
// for문으로 배열 복사하기
public static void main(String[] args) {
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
for(int i = 0; i < oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
}
System.arraycopy() 메소드는 다음과 같이 호출하면 된다.
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
❓ src → 원본 배열
❓ srcPos → 복사할 항목의 시작 인덱스
❓ dest → 새 배열
❓ destPos → 새 배열에서 붙여넣을 시작 인덱스
❓ length→ 복사할 개수
System.arraycopy(oldIntArray, 0, newIntArray, 0, oldIntArray.length);
복사되지 않은 항목은 배열의 기본 초기값으로 그대로 유지된다.
❓ 얕은 복사(shallow copy) → 복사되는 값이 객체의 번지 → 새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일
❓ 깊은 복사(deep copy) → 참조하는 객체도 별도로 생성한다.
출처: 이것이 자바다 Chater05 참조 타입
'Study > Java' 카테고리의 다른 글
[Java]01.자바 시작하기 (1) | 2022.01.11 |
---|---|
[Java]04.조건문과 반복문 (0) | 2022.01.11 |
[Java]03.연산자 (0) | 2022.01.10 |
[Java]06.클래스-확인문제 (0) | 2021.12.29 |
[Java] 02.변수와 타입 (0) | 2021.12.20 |