본문 바로가기
Backend/Java

[Java]OOP-클래스와 클래스의 관계 & Car 객체 구현 예제

by sukii 2023. 12. 28.
반응형

클래스와 클래스의 관계
=> 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

============================================================

반응형