클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

클래스와 객체 9 - 객체 배열 3: 객체 배열 나머지 학습 본문

프로그래밍 언어/자바

클래스와 객체 9 - 객체 배열 3: 객체 배열 나머지 학습

huenuri 2024. 8. 17. 23:50

이제 저녁을 먹고 나서 빨래도 널고 여러 가지 집안일을 하다가 9시 넘어서 공부를 시작해본다. 영상 시청의 유혹을 이기며 오늘 저녁에 해야 할 공부를 하며 하루를 마무리하려고 한다. 오늘은 새벽 공부는 하지 못했지만 그래도 아침과 오후에는 학습을 진행했고 밤에는 새벽 3시까지는 공부를 하다 취침하려고 한다.

이번에는 객체 배열을 책으로 학습해볼 것이다.


 

 

 

 

1. 객체 배열

자바에서는 기본 타입 데이터뿐 아니라, 객체를 원소로 하는 객체 배열도 만들 수 있다. C/C++과 달리 자바의 객체 배열은 객체에 대한 레퍼런스를 원소로 갖는 배열이다.

Circle [] c;
c = new Circle[5];

for(int i = 0; i < c.length; i++) 	// c.length는 배열 c의 크기로서 5
	c[i] = new Circle(i);

 

다음은 배열에 들어 있는 모든 Circle 객체의 면적을 출력하는 코드 사례이다.

for(int i = 0; i < c.lenth; i++)
	system.out.print((int)(c[i].getArea() + " ");

 

 

 

 

2. 배열 선언 및 생성

객체 배열을 만들기 위해서는 다음의 3단계가 필요하다.

 

1. 배열에 대한 레퍼런스 선언

Circle 클래스의 배열에 대한 레퍼런스 변수 c를 선언한다.

Circle[] c;

 

이 선언문은 레퍼런스 변수 c만 선언할 뿐, 배열을 생성하는 것은 아니다 .그러므로 다음과 같이 배열의 원소 개수를 지정해서는 안 된다.

Circle[5] c;	// 오류. 배열의 크기를 지정하면 컴파일 오류 발생

 

 

 

 

2. 레퍼런스 배열 생성

두 번째로 5개의 레퍼런스를 원소로 하는 배열을 생성한다. 배열의 원소는 객체가 아니라 레퍼런스이다.

c = new Circle[5];		// Circle 객체에 대한 레퍼런스 5개 생성

 

이 코드의 실행 결과 Circle 객체에 대한 레퍼런스 배열이 생성되며, 변수가 c를 가리킨다. Circle 객체들은 아직 존재하지 않는다.


 

 

 

 

3. 객체 생성

이제 Circle 객체를 하나씩 생성하여 배열 c[ ]의 각 레퍼런스에 대입한다.

for(int i = 0; i < c.length; i++)	// c.length는 배열 c의 크기로서 5
	c[i] = new Circle(i);		// i번째 Circle 객체 생성

 

배열의 크기만큼 Circle 객체를 생성하여 레퍼런스 배열에 하나씩 대입한다. 이렇게 하면 다음 그림과 같은 Circle 객체 배열이 생성된다. 

 

 


 

 

 

 

3. 배열의 원소 객체 접근

배열 c의 i번째 객체에 접근하기 위해서는 c[i] 레퍼런스를 사용하면 된다. 다음 코드는 배열 c에 들어있는 모든 Circle 객체의 면적을 출력한다.

for(int i = 0; i < c.length; i++)
	system.out.print((int)(c[i].getArea()) + " ");

 


 

 

 

Circle 객체 배열 만들기

반지름이 0~4인 Circle 객체 5개를 가지는 배열을 생성하고, 배열에 있는 모든 Circle 객체의 면적을 출력하라.

 

 

 

두 개의 클래스에 담아보았다. 분명 책에는 하나의 클래스로 담은 것 같아 어떻게 하면 하나의 클래스로 담을 수 있을까 연구하느라 이 한 문제를 푸는데 1시간이나 걸리고 말았다.

그래도 정말 중요한 사실을 깨달았다. 패키지에 담게 되면 클래스는 한 개로 생성할 수 없다는 거였다. 클래스 하나에 담는 방법은 메인 메소드 위쪽에 있는 클래스 이름이 적힌 메소드를 지우면 된다. 하지만 이런 식으로 풀고 싶지는 않아 패키지를 만들어서 두 개로 분리시켰다.

 

왜 선생님이 그동안 패키지별로 클래스를 관리했는지 이제 알 것 같다. 이 결과값이 무엇인지 처음에는 알지 못했는데, 원의 넓이를 구하는 거였다. 하지만 int이기 때문에 소수점이 사라진 것이다.

 


 

 

 

 

 

객체 배열 만들기 연습

Book 클래스를 활용하여 2개까지 Book 객체 배열을 만들고, 사용자로부터 책의 제목과 저자를 입력 받아 배열을 완성하라.

 

 

 

 

 

 

이렇게 객체 배열을 만드는 실습을 진행해보았다. println을 사용하니 책과 달리 한줄씩 출력되니 더 보기가 좋은 것 같다. 이제 핵심 문제를 풀어보며 이 단원을 정리하려고 한다.


 

 

 

 

핵심 체크문제 풀기

1. String 타입의 name, int 타입의 age, double 타입의 height, weight 등 네 개의 필드를 갖는 Human 클래스를 작성하라. 생성자를 작성하여 string 타입의 이름으로 전달받아 멤버 name에 저장하라.

 

 

 

원래는 출력하는 문제는 아니었으나 진짜 문제다운 문제를 풀어보고 싶어 이 기능을 넣어보았다. 생성자를 만들 때 초기화시키는 여러가지 방법에 대해서 배울 수 있었다. 이런 식으로 this를 사용해서 null이나 0으로 쓰는 되었다.


 

 

 

 

 

2. 문제 4에 메소드를 추가하여 레퍼런스 변수명을 aHuman으로 하고 Human 객체를 생성한 후 name 피들를 "홍길동"으로 age는 21, height는 180.5, weight는 73.2를 대입하라.

 

2번에 미쳐 이런 문제가 있는지 몰랐는데 1번에서 충분히 연습했기에 이 문제는 쉽게 풀 수 있었다.


 

 

 

 

3. 배열의 크기가 5인 Human 타입 객체 배열을 생성하라.

 

 

원래는 객체 배열만 생성하는 문제였으나 해당 배열만큼 사람의 정보를 출력해보았다. 객체 배열을 어떻게 생성하는지 이제 좀 알 것 같다.


 

 

 

 

학습을 마치고

드디어 객체 배열 학습을 마쳤다. 이처럼 오래 걸릴 줄 몰랐는데 조금 천천히 학습하며 제대로 기본기를 다지고 싶었다. 예제를 풀 때는 몰랐는데 스스로 핵심 체크문제를 풀어보면서 아무것도 없는 상태에서는 아직 할 수 있는 게 많지 않음을 알게 되었다.

다음 포스트에서는 메소드 활용에 대해서 학습해보려고 한다.