상속과는 다른 방식으로 클래스 사이에 관계를 맺는 방법
클래스의 멤버변수로 다른 클래스의 참조변수를 선언하여 관계를 맺는 것
예를들어 Car
class Car{
Engine e = new Engine();
Door[] d = new Door[4];
}
참조변수 배열
Door
참조변수 배열을 생성할 때, 사용된 new
는 배열생성에 사용한것이고, 인스턴스를 생성하는 것은 아니다. 요소마다 새로운 인스턴스를 new
를 이용해서 생성해야한다.public class Main {
public static void main(String[] args){
Student[] st = new Student[5];
for (int i=0; i<st.length; i++){
st[i] = new Student("00"+i, "홍길동"+i, "남자");
}
}
}
Point[] p = {
new Point(100,100),
new Point(140, 50),
new Point(200, 100)
};
Car
public class Composite_car {
public static void main(String[] args) {
Car bmw_520d = new Car("BMW 520d");
bmw_520d.make(4, true, 4);
System.out.println(bmw_520d);
Car benz_c_c = new Car("Mercedes Benz C-Class Cabriolet");
benz_c_c.make(4, false, 2);
System.out.println(benz_c_c);
}
}
class Car {
String name;
Engine e;
Door[] d;
Car(String name){
this.name = name;
}
void make(int cylinder, boolean isDiesel, int doorNum){
e = new Engine(cylinder, isDiesel);
d = new Door[doorNum];
for (int i=0; i<d.length; i++){
d[i] = new Door(true, true, true);
}
}
@Override
public String toString() {
String message;
message = name+" : "+e.cylinder+"기통, "+(e.isDiesel?"디젤, ":"가솔린, ")+"창문 개수("+d.length+") 자동창문"+(d[0].autoWindow?"O, ":"X, ")+
"도어라이트"+(d[0].doorLight?"O, ":"X, ")+"열선시트"+(d[0].heatSeat?"O":"X");
return message;
}
}
class Engine{
// number of cylinders
int cylinder;
// true == diesel, false == gasoline
boolean isDiesel;
Engine(int cylinder, boolean isDiesel){
this.cylinder = cylinder;
this. isDiesel = isDiesel;
}
}
class Door{
boolean doorLight;
boolean heatSeat;
boolean autoWindow;
Door(boolean doorLight, boolean heatSeat, boolean autoWindow){
this.doorLight = doorLight;
this.heatSeat = heatSeat;
this.autoWindow = autoWindow;
}
}