목차
- 객체배열 선언 및 할당
- 객체배열 초기화
- 객체배열 사용 예시(DTO)
객체배열
Student studentA = new Student();
- String name, int age, double height 등이 담긴 클래스일 때, 변수명 studentA는 어쨌거나 A학생만을 가리킨다.
- 결국 여러 학생을 만들기 위해서는 studentB, studentC... 등으로 한 명 한 명 따로 변수를 생성해야 할 것이다.
- 이 과정을 대체해 편의성을 높이는 방법이 바로 객체배열이다.
Student[] stArr = new Studnet[100];
- 레퍼런스 변수에 대한 배열을 말한다. 즉 주소값이 들어간다.
- 동일한 타입의 여러 인스턴스를 배열로 관리한다.
- 기본 배열과의 차이점은 '인스턴스'를 다룬다는 데에 있다.
1. 객체배열 선언 및 할당
1-1. 선언
Product[] pArr;
클래스명[] 배열명;
클래스명 배열명[];
- stack 영역에 주소값을 보관할 공간이 생긴다.
1-2. 할당
pArr = new Product[3];
배열명 = new 클래스명[배열크기];
- 할당이라 함은 new 연산자가 쓰인다는 것이다.
- 선언한 크기만큼의 레퍼런스 배열이 생성된다.
pArr[0] | pArr[1] | pArr[2]
- heap 영역에 만들어지며, 이 또한 주소값을 관리할 공간만 생긴 것이다.
- 우선적으로 기본값 null로 초기화된다.
1-3. 선언과 동시에 할당
Product[] pArr = new Product[3];
클래스명[] 배열명 = new 클래스명[배열크기];
2. 객체배열 초기화
2-1. 인덱스 이용한 초기화
pArr[0] = new Product("TV", 300);
배열명[i] = new 클래스명();
- pArr[0].set@@@(300);, pArr[0].get@@@(); 처럼 사용할 수 있다.
2-2. 선언과 동시에 초기화
Product[] pArr = {
new Product("TV", 300),
new Product("스피커", 20),
new Product("모니터", 500)
};
클래스명[] 배열명 = {new 클래스명(), new 클래스명()};
stack | heap | static |
pArr (주소값0x123) |
{pArr[0] | pArr[1] | pArr[2]} (주소값0x123) - - - - - - - - - - - - pArr[0] → TV | 300 (주소값0x997) (주소값0x997) pArr[1] → 스피커 | 20 (주소값0x998) (주소값0x998) pArr[2] → 모니터 | 500 (주소값0x999) (주소값0x999) |
❗ arr[index]가 하나하나의 참조형 변수==레퍼런스 변수인 것이다.
arr[0].method();
arr[1].method();
2-3. 반복문 for문 통한 출력
- index를 가진 배열이기 때문에 반복문 for문 또는 향상된 for문으로 출력할 수 있다.
for(int i=0; i < carArray.length; i++) {
carArray[i].driveMaxSpeed();
}
❗ 향상된 for문 작성법
❗ for(타입 변수명 : 반복하고자 하는 배열) {}
기본 배열일 때는 아래와 같이 쓸 수 있었다.
for(int i:arr) {
System.out.println(i);
}
for(Car c : carArray2) {
c.driveMaxSpeed();
}
3. 객체배열 사용 예시
- 동일한 타입의 여러 인스턴스를 인자로 전달하는 경우, 또는 리턴 받는 경우에도 객체 배열을 이용할 수 있다.
- DTO 통해 회원 정보를 관리하는 프로그램을 예시로 들자.
MemberDTO.class
- 관리할 회원 정보를 추상화하여 필드로 작성한다.
- 기본 생성자, 모든 필드를 초기화하는 생성자, 설정자(setter)와 접근자(getter)를 선언한다.
- 모든 필드값을 문자열로 반환하는 getInformation() {} 메소드 역시 하단에 선언한다.
❗ alt + shift + s → Source 창 불러오기 단축키
생성자 자동 생성 > 우클릭 → Source → generate constructor using fields
설정자/접근자 자동 생성 > 우클릭 → Source → generate Getter and Setter
Application.class
- Scanner 통해 입력 받을 변수를 선언한다.
- 반복문 while을 활용해 프로그램 기본 출력문을 작성한다.
- 프로그램 종료하게 될 경우 반복문에 이름을 붙여 해당 반복문이 일괄 종료될 수 있도록 쓴다.
MemberManager.class
- 두 가지 메소드를 다룬다: public void signUpMembers() {}, public void printAllMembers() {}
- signUpMembers에서는 A. 객체 배열 생성, B. 각 인데스에 정보 할당, C. 입출력 용도의 MemberInsertManager.class 클래스 추가 호출한다.
- printAllMembers에서는 A. MemberSelectManager.class를 추가 호출, B. 회원 목록 출력 기능을 한다.
- 호출한 클래스의 메소드에게서 반환 받은 값을 레퍼런스 변수에 저장한다.
여기서 객체 생성 및 호출을 두 줄로 나눠 작성할 수도 있다.
MemberSelectManager memberSelectManager = new MemberSelectManager();
MemberDTO[] selectedMembers = memberSelectManager.selctedAllMembers();
하지만 이를 여러 번 사용할 게 아니라면 객체 생성과 동시에 기능 호출이 가능하다.
위 두 줄을 한 문장으로 줄인 사용 예시이다.
MemberDTO[] selectedMembers = new MemberSelectManager().selectAllmembers();
MemberInsertManager.class
public class MemberInsertManager {
/**<pre>
* 여러 명의 회원 정보를 한 번에 등록할 수 있는 기능 제공
* </pre>
* @param members 회원 정보를 객체 배열 형태로 전달
* */
public void insert(MemberDTO[] members) {
System.out.println("회원을 등록합니다.");
/* 일반 for문 */
for(int i=0; i < members.length; i++) {
System.out.println(members[i].getName() + "님을 회원 등록에 성공했습니다.");
}
System.out.println();
/* 향상된 for문 */
for(MemberDTO member : members) {
System.out.println(member.getName() + "님을 회원 등록에 성공했습니다.");
}
System.out.println("총 " + members.length + "명의 회원 등록에 성공했습니다.");
}
}
MemberSelectManager.class
당장은 주어진 정보를 불러왔지만, 나중에는 외부에 있는 정보를 가져와 활용할 수 있을 것이다.
package com.greedy.section02.uses;
public class MemberSelectManager {
/**<pre>
* 회원 정보 전체를 반환하는 메소드
* </pre>
* @return 전체 회원 정보 객체 배열로 반환
* */
public MemberDTO[] selectAllmembers() { //리턴타입이 MemberDTO[]
return new MemberDTO[] {
new MemberDTO(1, "user01", "pass01", "김영희", 20, '여'),
new MemberDTO(2, "user02", "pass02", "홍길동", 22, '남'),
new MemberDTO(3, "user03", "pass03", "박진희", 24, '여'),
new MemberDTO(4, "user04", "pass04", "이순신", 26, '남'),
new MemberDTO(5, "user05", "pass05", "한지희", 28, '여')
};
}
}
✅ 객체배열의 사용 목적에 대해 이해할 수 있다.
✅ 객체배열의 구조에 대해 이해할 수 있다.
✅ 객체배열을 선언하고 할당할 수 있다.
✅ 반복문 이용해 객체배열을 연속 처리할 수 있다.
'Java' 카테고리의 다른 글
[JAVA] 8. 상속 | super | 오버라이딩 (0) | 2022.01.04 |
---|---|
[JAVA/수업 과제 practice] 객체배열 Lv. 1~2 (0) | 2022.01.03 |
[JAVA] 6-4. 클래스변수, 인스턴스변수, 지역변수, 초기화 순서 (0) | 2022.01.03 |
[JAVA/수업 과제 practice] 배열 | 다차원 배열 Lv. 3~4 (0) | 2022.01.02 |
[자바의 정석] Ch 5. 배열 예제 응용 학습 (0) | 2022.01.02 |