⚫클래스와 클래스의 관계
=> UML(Unified Modeling Language)를 사용하여 클래스 다이어그램(Class Diagram)으로 표현
1. 일반화(Generalization) 관계 : 상속 관계 - X is a Y
=> 클래스를 선언할 때 기존 클래스를 제공받아 작성하기 위한 관계
=> 사원 클래스와 관리자 클래스의 관계 - 관리자는 사원이다.(O), 사원은 관리자다.(X)
2. 실체화(Realization) 관계 : 상속 관계
=> 인터페이스를 제공받아 새로운 클래스를 작성하기 위한 관계
=> 인터페이스 : 현실에 존재하는 대상을 클래스보다 추상적으로 표현하기 위한 자료형
=> 도형 인터페이스와 삼각형 클래스의 관계
3.연관(Association) 관계 : 포함 관계 = X has a Y
=> 클래스 내부에 객체를 저장하는 필드를 작성하여 만들어지는 관계
=> 의사와 환자와의 관계
=> 직접 연관 관계(Directed Association) : 한 방향으로만 관계가 설정되어 기능을 제공하는 관계
4.집합 연관 관계(Aggregation) : 포함 관계로 설정된 객체의 생명주기가 다른 포함 관계
=> 프린터와 컴퓨터와의 관계
5.복합 연관 관계(Composition) : 포함 관계로 설정된 객체의 생명주기가 다른 포함 관계
=> 게임과 캐릭터와의 관계
6.의존 관계(Dependency) : 포함 관계로 설정된 클래스가 변경되어도 현재 클래스에 영향을 주지 않는 관계
=> TV와 리모컨의 관계
[참고]클래스 다이어그램 작성법⬇️
https://www.nextree.co.kr/p6753/
UML: 클래스 다이어그램과 소스코드 매핑
불과 몇 년 되지 않은 학생 시절... 처음으로 UML을 접했고, UML의 기초적인 그리는 법과 사용법을 배웠습니다. 개인적으로 쉽지 않은 수업이었는데 그 중 가장 많이 사용되는 클래스 다이어그램에
www.nextree.co.kr
실습예제👩💻
1) Engine 클래스 작성
package association;
//엔진 정보를 저장하기 위한 클래스
public class Engine {
//필드
private String fuelType;
private int displacement;
//기본 생성자
public Engine() {
// TODO Auto-generated constructor stub
}
//생성자
public Engine(String fuelType, int displacement) {
super();
this.fuelType = fuelType;
this.displacement = displacement;
}
//Setter & Getter
public String getFuelType() {
return fuelType;
}
public void setFuelType(String fuelType) {
this.fuelType = fuelType;
}
public int getDisplacement() {
return displacement;
}
public void setDisplacement(int displacement) {
this.displacement = displacement;
}
public void displayEngine() {
System.out.println("엔진타입 = "+fuelType);
System.out.println("배기량 ="+displacement);
}
}
2) Car class 작성
//자동차 정보(모델명, 생산년도, 엔진정보)를 저장하기 위한 클래스
public class Car {
//필드
private String modelName;
private int productionYear;
//엔진정보를 저장하기 위한 필드 - Engine 클래스를 사용하여 필드 작성
// => 필드에는 생성자 또는 Setter 메소드를 사용하여 Engine 객체를 제공받아 저장 - 포함 관계 구현
private Engine carEngine;
//생성자
public Car() {
}
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);
//필드에 저장된 Engine 객체를 이용하여 메소드 호출해 Engine 객체의 필드값을 반환받아 출력
// => 포함 관계로 만들어진 클래스의 메소드를 객체를 저장한 필드로 호출하여 필요한 기능 구현
// => 포함 관계가 만들어져 있지 않은 상태로 메소드를 호출할 경우 NullPointerException 발생
System.out.println("엔진정보(연료타입) = "+carEngine.getFuelType());
System.out.println("엔진정보(배기량) = "+carEngine.getDisplacement());
}
}
3)
package association;
public class CarApp {
public static void main(String[] args) {
//Engine 클래스의 기본 생성자를 사용하여 객체 생성 - 엔진 생성
Engine engine = new Engine();
//Setter 메소드를 호출하여 객체 필드값 변경
engine.setFuelType("경유");
engine.setDisplacement(2500);
//필드값이 제대로 변경됐는지 확인용
//engine.displayEngine();
//자동차 생성 - Car 클래스의 기본 생성자를 사용하여 객체 생성 - 자동차 생성
Car carOne = new Car();
//Setter 메소드를 호출하여 객체 필드값 변경
carOne.setModelName("쏘렌토");
carOne.setProductionYear(2020);
//Setter 메소드를 호출하여 Car 객체의 필드에 엔진 정보(Engine 객체)를 전달받아 저장
// => Setter 메소드를 이용하여 포함 관계 구현
carOne.setCarEngine(engine);
//1번
carOne.displayCar();
System.out.println("============================================================");
//2번
//자동차 생성 - Car 클래스의 매개 변수가 있는 생성자를 사용하여 객체 생성 - 자동차 생성
// => Engine 클래스의 매개변수가 있는 생성자를 사용하여 객체 생성 - 엔진 생성
// => 생성자를 사용하여 Engine 객체를 Car 객체의 필드에 저장 - 포함 관계
Car carTwo=new Car("싼타페", 2022, new Engine("휘발유", 3000));
carTwo.displayCar();
System.out.println("============================================================");
//3번
System.out.println(carOne.getModelName()+"의 엔진정보 >> ");
engine.displayEngine();
System.out.println("============================================================");
//4번
System.out.println(carTwo.getModelName()+"의 엔진정보 >> ");
//Car 객체의 carEngine 필드에 저장된 Engine 객체를 Getter 메소드로 반환받아 Engine 클래스의 메소드 호출
carTwo.getCarEngine().displayEngine();
System.out.println("============================================================");
}
}
1번 carOne.displayCar() 출력 결과
모델명 = 쏘렌토
생산년도 = 2020
엔진정보(연료타입) = 경유
엔진정보(배기량) = 2500
============================================================
2번 carTwo.displayCar() 출력 결과
모델명 = 싼타페
생산년도 = 2022
엔진정보(연료타입) = 휘발유
엔진정보(배기량) = 3000
============================================================
3번 출력 결과
쏘렌토의 엔진정보 >>
엔진타입 = 경유
배기량 =2500
============================================================
4번 출력 결과
싼타페의 엔진정보 >>
엔진타입 = 휘발유
배기량 =3000
============================================================
'Backend > Java' 카테고리의 다른 글
[Java]싱글톤 클래스(Singleton Class) (1) | 2024.01.25 |
---|---|
[Java]OOP - 기타제한자 - (2) final & abstract (1) | 2024.01.03 |
[Java]OOP-member 클래스 (2) | 2023.12.27 |
[Java]OOP - 메소드(Method) (1) | 2023.12.27 |
[Java]접근제한자(Access Modifier) - (1) (0) | 2023.12.26 |