[기본 개념] 1 | (1.3) 객체 배열, 클래스의 정의
1 클래스와 객체의 정의 & 용도
2 객체와 인스턴스
3 객체의 구성요소 (속성 & 기능)
4 인스턴스 생성 & 사용
5> 객체 배열
6> 클래스의 또 다른 정의
5. 객체 배열
많은 수의 객체를 다뤄야할 때, 배열로 다루면 편리할 것이다. 객체 역시 배열로 다루는 것이 가능하며, 이를 '객체 배열'이라고 한다. 객체 배열 안에는 객체의 주소가 저장된다.
Tv tv1, tv2, tv3 ; → Tv[ ] tvArr = new Tv[3]
길이가 3인 객체 배열 tvArr을 이와 같이 생성한다면, 각 요소는 참조변수의 기본값인 null로 자동 초기화 된다. 그리고 이 객체 배열은 3개의 객체, 정확히는 객체의 주소를 저장할 수 있다.
Tv[ ] tvArr = new Tv[3]; // 참조변수 배열 (객체 배열) 을 생성
// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv( ) ;
tvArr[1] = new Tv( ) ;
tvArr[2] = new Tv( ) ;
객체 배열을 생성한 후 각 요소에 저장하는 것을 잊으면 안된다. 그리고 위 코드를 배열의 초기화 블럭을 사용한다면, 다음과 같이 한 줄로 간단히 할 수 있다.
Tv[ ] tvArr = { new Tv( ), new Tv( ), new Tv( ) } ;
다뤄야할 객체의 수가 많을 때는 for문을 사용하면 된다.
Tv[ ] tvArr = new Tv[100] ;
for (int i = 0 ; i < tvArr.length ; i++) {
tvArr[i] = new Tv( ) ;
}
예제/TvTest4.java
public class TvTest4 {
public static void main(String[] args) {
Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv객체 배열
// Tv객체를 생성해서 Tv객체 배열의 각 요소에 저장
for (int i = 0; i < tvArr.length; i++) {
tvArr[i] = new Tv();
tvArr[i].channel = i + 10; // tvArr[i]의 channel에 i+10을 저장
}
for (int i = 0; i < tvArr.length; i++) {
tvArr[i].channelUp(); // tvArr[i]의 메서드를 호줄. 채널이 1증가
System.out.printf("tvArr[%d].channel=%d%n", i, tvArr[i].channel);
}
} // main의 끝
}
class Tv {
String color; // 색상
boolean power; // 전원상태(on/off)
int channel; // 채널
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
실행결과
tvArr[0].channel=11
tvArr[1].channel=12
tvArr[2].channel=13
6 클래스의 또 다른 정의
1. 클래스 - 데이터와 함수의 결합
프로그래밍언어에서 데이터 처리를 위한 데이터 저장형태의 발전과정은 다음과 같다.
1. 변수 하나의 데이터를 저장할 수 있는 공간 2. 배열 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간 3. 구조체 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간 4. 클래스 데이터와 함수의 결합(구조체 + 함수) |
하나의 데이터를 저장하기 위해 변수를, 그리고 같은 종류의 데이터를 보다 효율적으로 다루기 위해서 배열이라는 개념을 도입했으며, 후에는 구조체(structure)가 등장하여 자료형의 종류에 상관없이 서로 관계가 깇은 변수들을 하나로 묶어서 다룰 수 있도록 했다.
함수는 주로 데이터를 가지고 작업하기 때문에 자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 했다.
2. 클래스 - 사용자정의 타입(user-defined type)
프로그래밍언어에서 제공하는 자료형(primitive type)외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자정의 타입(uwer-defined type)이라고 한다.
기본형의 개수는 8개로 정해져 있지만 참조형의 개수가 정해지지 않은 이유는 이처럼 프로그래머가 새로운 타입을 추가할 수 있기 때문이다.
int hour ; // 시간을 표현하기 위한 변수
int minute ; // 분을 표현하기 위한 변수
float second ; // 초를 표현하기 위한 변수, 1/100초까지 표현하기 위해 float로 했다.
시간을 표현하기 위해 위와 같이 3개의 변수를 선언하였다. 만일 3개의 시간을 다뤄야한다면 다음과 같이 해야 할 것이다.
int hour1, hour2, hour3 ;
int minute1, minute2, minute3 ;
float second1, second2, second3 ;
이처럼 다뤄야 하는 시간의 개수가 늘어날 때마다 시, 분, 초를 위한 변수를 추가해줘야 하는데 개수가 많아지면 이런 식으로는 곤란하다.
int[ ] hour = new int[3] ;
int[ ] minute = new int[3] ;
float[ ] second = new float[3] ;
위와 같이 배열로 처리하면 다뤄야 하는 시간 데이터의 개수가 늘어나더라도 배열의 크기만 변경해주면 되므로, 변수를 매번 새로 선언해줘야 하는 불편함과 복잡함은 없어진다. 하지만 하나의 시간을 구성하는 시, 분, 초가 서로 분리되어 있기 때문에 프로그램 수행과정에서 시, 분, 초가 따로 뒤섞여서 올바르지 않은 데이터가 될 가능성이 있다. 이런 경우 시, 분, 초를 하나로 묶는 사용자정의 타입, 즉 클래스를 정의하여 사용해야 한다.
class Time {
int hour ;
int minute ;
float second;
}
이 코드는 시, 분, 초를 저장하기 위한 세 변수를 멤버변수로 갖는 Time클래스를 정의 한 것이다. 이제 새로 작성된 사용자정의 타입인 Time클래스를 사용해서 코드를 변경하면 아래와 같다.
비객체지향적 코드 | 객체지향적 코드 |
int hour1, hour2, hour3 ; int minute1, minute2, minute3 ; float second1, second2, second3 ; |
Time t1 = new Time( ) ; Time t2 = new Time( ) ; Time t3 = new Time( ) ; |
int[ ] hour = new int[3] ; int[ ] minute = new int[3] ; float[ ] second = new float[3] |
Time[ ] t = new Time[3] ; t[0] = new Time( ) ; t[1] = new Time( ) ; t[2] = new Time( ) ; |
출처 | Java의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 1 | (2.3) 메서드 호출, RETURN 문 (0) | 2021.08.18 |
---|---|
[기본 개념] 1 | (2.2) 메서드 선언/구현 (0) | 2021.08.17 |
[기본 개념] 1 | (2.1) 선언 위치에 따른 변수 종류, 클래스/인스턴스 변수 (0) | 2021.08.17 |
[기본 개념] 1 | (1.2) 인스턴스 생성 (0) | 2021.08.10 |
[기본 개념] 1 | (1.1) 클래스와 객체 (0) | 2021.08.09 |