◆ 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 라는 클래스들의 관계에 대해서 알아보았습니다. 다음 글에서 이어서 상속에 대해 자세히 다루어 보도록 하겠습니다.
'JAVA' 카테고리의 다른 글
[JAVA] 상속 - 메소드 오버라이딩, 다형성 (0) | 2022.05.27 |
---|---|
[JAVA] 상속 (Inheritance) (0) | 2022.05.26 |
[JAVA] 싱글톤 디자인 패턴 (Singleton Design Pattern) (0) | 2022.05.25 |
[JAVA] 객체와 클래스 - static 키워드 (0) | 2022.05.25 |
[JAVA] call by value 와 call by reference (0) | 2022.05.24 |
댓글