본문 바로가기
JAVA

[JAVA] 클래스들의 관계 - has a 관계, is a 관계

by Amy IT 2022. 5. 26.

◆ has a 관계

 

한 객체와 다른 객체가 포함관계인 경우 has a 관계에 있다고 할 수 있습니다. 하나의 클래스 안에 다른 클래스가 인스턴스 변수로 선언된 경우입니다. 예를 들어 자동차 객체는 엔진 객체, 바퀴 객체와 같은 객체들로 구성되어 있습니다. 

자동차 has a 엔진, 자동차 has a 바퀴

 

자동차 클래스 안에 엔진 클래스가 포함되어 있는 경우를 표현해 보겠습니다.

public class Engine {
	String sn; //시리얼넘버
	String year; //생산연도
	public Engine() {}
	public Engine(String sn, String year) {
		super();
		this.sn = sn;
		this.year = year;
	}
	public String getSn() {
		return sn;
	}
	public void setSn(String sn) {
		this.sn = sn;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
}
public class Car {
	Engine engine; //다른 클래스를 인스턴스변수로 선언
	String modelName; 
	public Car() {}
	public Car(Engine engine, String modelName) {//Car객체생성시 Engine객체 받아서 engine에 저장
		this.engine = engine;
		this.modelName = modelName;
	}
	public Engine getEngine() {
		return this.engine;
	}
	public void setEngine(Engine engine) {//매개변수로 Engine객체 받아서 engine에 저장
		this.engine = engine;
	}
	public String getModelName() {
		return this.modelName;
	}
	public void setModelName(String modelName) {
		this.modelName = modelName;
	}
	public String getData() {
		return "Engine sn: " + engine.sn + ", year: " + engine.year + ", modelName: " + modelName;
	}
}
public class Test {

	public static void main(String[] args) {
		//Car 클래스에 Engine 객체 값 저장 방법
		//1.생성자 이용 
		Car car1 = new Car(new Engine("A111", "2011"), "소나타");
		System.out.println(car1.getData());
		
		//2.get() set() 함수 이용
		Car car2 = new Car();
		car2.setEngine(new Engine("B222", "2015"));
		car2.setModelName("아이오닉");
		System.out.println(car2.getData());
	}

}

Car 클래스는 Engine 객체를 인스턴스변수로 가집니다. Engine 객체의 값을 저장하기 위해서 생성자를 이용하는 방법과 set() 함수를 이용하는 방법이 있습니다. 첫째로 Car 객체를 생성할 때 생성한 Engine 객체의 값을 전달할 수도 있고, 둘째로 Car 객체를 생성한 후 set() 함수에 생성한 Engine 객체를 전달할 수도 있습니다. 주고 받는 데이터가 클래스 객체라는 점에서 차이가 있을 뿐, 이제까지 계속해서 해왔던 객체 생성 방법과 크게 다르지 않습니다. 이렇게 하면 한 클래스 안에 다른 클래스가 포함되어 있는 has a 관계를 표현할 수 있게 됩니다. 

 

 

 

◆ is a 관계

 

비슷한 속성 및 동작을 가진 객체들의 경우 is a 관계로 표현할 수 있습니다. 비슷한 개념의 객체들은 공통된 속성 및 동작을 가지고 있으며, 이 공통점들을 추출해서 상위개념의 객체로 만들 수 있습니다. 예를 들어 매니저, 개발자 등은 모두 공통된 개념의 직원 객체들입니다. 

매니저 is a 직원, 개발자 is a 직원

 

이렇게 객체들 간에 is a 관계가 성립하면 자바의 상속을 적용할 수 있습니다. 상속에 대해서는 다음 글에서 자세히 다루고, 여기서는 간단하게 살펴보겠습니다. 매니저 객체가 직원 객체를 상속받는 것을 표현해 보도록 하겠습니다.

class Employee{
	String name;
	int salary;
}
class Manager extends Employee{
	String depart;
	public String getManager() {
		return name + " " + salary + " " + depart;
	}
	public Manager() {
		super();
	}
	public Manager(String name, int salary, String depart) {
		super(); 
		this.name = name;
		this.salary = salary;
		this.depart = depart;
	}
}
public class TestMain {

	public static void main(String[] args) {
		Manager man = new Manager("이순신", 4000, "영업"); 
		System.out.println(man.getManager()); 
	}
    
}

매니저 또한 직원입니다. 따라서 직원 객체가 가지는 멤버변수들을 상속받아 사용합니다. 위의 Manager 클래스에서는 depart만 인스턴스 변수로 선언됐지만, name과 salary도 자신의 변수처럼 사용하고 있는 것을 확인할 수 있습니다. 이렇게 객체들 간의 is a 관계를 잘 이용하면 중복되는 코드를 없앨 수 있게 됩니다. 

 

 

이번 글에서는 has a 또는 is a 라는 클래스들의 관계에 대해서 알아보았습니다. 다음 글에서 이어서 상속에 대해 자세히 다루어 보도록 하겠습니다. 

 

 

댓글