→ UML(Unified Modeling Language)를 사용하여 클래스 다이어그램(Class Diagram)으로 표현
1.일반화 관계(Generalization) : 상속 관계(is a 관계)
→ 클래스 선언시 기존 클래스를 상속받아 작성
→ 사원클래스와 관리자클래스 - 관리자는 사원이다.(O) 사원은 관리자이다(X)
2.실체화 관계(Realization) : 상속 관계(is a 관계)
→ 클래스 선언시 인터페이스를 상속받아 작성
→ 인터페이스 : 클래스보다 추상적으로 표현된 자료형
3.연관관계(Association) 또는 직접연관관계(Direct Association) : 포함 관계(has a 관계)
→ 클래스 선언시 필드를 참조변수로 선언하여 객체를 저장한 관계
→ Computer <--- CPU + MainBoard + Memory
4.집합연관관계(Aggregation) : 포함관계의 객체간의 생명주기가 다른 경우
→ Computer --- Printer
5.복합연관관계(Composition) : 포함관계의 객체간의 생명주기가 같은 경우
→ Game --- Character
6.의존관계(Dependency) : 포함관계 - 참조필드에 저장된 객체가 변경될 수 있는 관계
→ TV --- RemoteControl
package association;
//자동차정보(모델명,생산년도,엔진)를 저장하기 위한 클래스
public class Car {
private String modelName;
private int productionYear;
//엔진정보(Engine 객체)를 저장하기 위한 참조필드 - 포함관계 : Direct Association
// => 포함관계가 성립되기 위해서는 반드시 생성자 또는 Setter 메소드를 이용하여 참조필드에
//객체가 저장되도록 설정
private Engine carEngine;
public Car() {
// TODO Auto-generated constructor stub
}
public Car(String modelName, int productionYear, Engine carEngine) {
super();
this.modelName = modelName;
this.productionYear = productionYear;
this.carEngine = carEngine;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public int getProductionYear() {
return productionYear;
}
public void setProductionYear(int productionYear) {
this.productionYear = productionYear;
}
public Engine getCarEngine() {
return carEngine;
}
public void setCarEngine(Engine carEngine) {
this.carEngine = carEngine;
}
//필드값(자동차정보)을 출력하는 메소드
public void displayCar() {
System.out.println("모델명 = "+modelName);
System.out.println("생산년도 = "+productionYear);
//System.out.println("엔진 = "+carEngine);
//참조필드에 저장된 객체를 사용하여 메소드 호출
// => 참조필드에 객체가 저장되어 있지 않은 경우 메소드를 호출하면 NullPointerException 발생
// => 포함관계로 설정된 객체의 메소드 호출 가능
//System.out.println("연료타입 = "+carEngine.getFualType());
//System.out.println("배기량 = "+carEngine.getDisplacement());
carEngine.displayEngine();
}
}
package association;
public class CarApp {
public static void main(String[] args) {
//엔진 생성
Engine engine=new Engine();
//engine.displayEngine();
engine.setFualType("경유");
engine.setDisplacement(2000);
//자동차 생성
Car carOne=new Car();
//carOne.displayCar();
carOne.setModelName("쏘렌토");
carOne.setProductionYear(2018);
//자동차에 엔진 포함 - Setter 메소드를 이용하여 참조필드에 객체 저장 : 포함 관계 성립
carOne.setCarEngine(engine);
carOne.displayCar();
System.out.println("===============================================================");
//자동차 생성 >> 엔진 포함 - 생성자를 이용하여 참조필드에 객체 저장 : 포함 관계 성립
Car carTwo=new Car("싼타페", 2022, new Engine("휘발유", 3000));
carTwo.displayCar();
System.out.println("===============================================================");
System.out.println(carOne.getModelName()+"의 엔진정보 >> ");
engine.displayEngine();
System.out.println("===============================================================");
System.out.println(carTwo.getModelName()+"의 엔진정보 >> ");
//자동차(Car 객체)에서 엔진정보(Engine 객체)를 반환받아 메소드 호출
carTwo.getCarEngine().displayEngine();
System.out.println("===============================================================");
}
}
package association;
//엔진정보(연료타입, 배기량)를 저장하기 위한 클래스
public class Engine {
private String fualType;
private int displacement;
public Engine() {
// TODO Auto-generated constructor stub
}
public Engine(String fualType, int displacement) {
super();
this.fualType = fualType;
this.displacement = displacement;
}
public String getFualType() {
return fualType;
}
public void setFualType(String fualType) {
this.fualType = fualType;
}
public int getDisplacement() {
return displacement;
}
public void setDisplacement(int displacement) {
this.displacement = displacement;
}
//필드값(엔진정보)를 출력하는 메소드
public void displayEngine() {
System.out.println("엔진타입 = "+fualType);
System.out.println("배기량 = "+displacement);
}
}