- 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다.
- 오퍼레이션
오퍼레이션은 클래스가 수행하는 액션이며, 클래스에서 메소드에 대응된다. 오퍼레이션에 대한 UML 문법은 아래와 같다.
[가시성] [이름] ([매개변수 리스트]) : [리턴 값 타입] {[프로퍼티 문장]}
ex) + balanceOn (date: Date) : Money
-
가시성(visibility): public(+)와 private(-)가 있다. (다른 것은 추후에 다룬다.)
-
이름: 이름을 나타내는 스트링
-
매개변수 리스트: 매개변수의 목록
-
리턴 값 타입: 리턴값이 있는 경우 해당 타입
-
프로퍼티 문자열: 오퍼레이션에 적용되는 프로퍼티 값
매개변수 리스트에 매개변수들의 문법은 아래와 같다. 방향은 매개변수의 입력, 출력, 입출력 여부는 나타내며 생략했다면 기본적으로 입력이다.
[방향] [이름]: [타입] = [기본 값], ex) (date: Date)
오퍼레이션을 상태 변경 여부에 따라 두 가지로 나누기도 한다.
-
쿼리(query): 시스템의 상태를 바꾸지 않고 클래스의 값을 가져오는 오퍼레이션이다. 프로퍼티 문자열에 {query}라고 표시할 수 있다.
-
커맨드(command) 또는 변경자(modifier): 상태를 변경시키는 오퍼레이션
좀더 엄격하게 정의한다면 외부에서 관찰 가능한 상태의 변경 여부이다. 만약 캐시를 변경하는 오퍼레이션이 있다면 해당 상태변화는 외부에서 관찰 불가능하므로 외부에서 보는 관점에서는 변화가 없다.
일반적으로 변경자는 값을 리턴하지 않는다는 원칙을 일관되게 지키면 값을 리턴하는것은 쿼리라고 확신할 수 있다. 이를 커맨드-쿼리 분리원칙이라고 한다.
- 오퍼레이션과 메소드
보통 오퍼레이션과 메소드를 동일하게 하지만 엄밀하게 구분할 수도 있다. 오퍼레이션은 객체에서 호출되는 프로시저의 정의이다. 반면 메소드는 프로시저의 본체이다.
오퍼레이션과 메소드를 가장 쉽게 구분할 수 있는 예제는 다형성이다.
자동차에 대한 기본 클래스인 Car 가 있다. 바퀴휠 수와 가격에 대한 속성과 오퍼레이션(쿼리)가 있으며, 자동차에 대한 정보를 제공하는 메소드(쿼리)도 있다. 이를 상속받는 Truck, Bus, Taxi가 있고, Bus와 Taxi 에는 승객수 속성이 있다.
위 다이어그램에서 Car와 Bus를 Java 코드로 변환하면 아래와 같이 된다.(Taxi, Truck 생략)
public class Car {
private int numberOfWheels;
private int price;
public Car(int numberOfWheels, int price) {
super();
this.numberOfWheels = numberOfWheels;
this.price = price;
}
public int getNumberOfWheels() {
return numberOfWheels;
}
public int getPrice() {
return price;
}
public String getCarInformation() {
return "Car [numberOfWheels=" + numberOfWheels + ", price=" + price + "]";
}
}
public class Bus extends Car{
private int numberOfPassenger;
public Bus(int numberOfWheels, int price) {
super(numberOfWheels, price);
}
public String getCarInformation() {
return "Bus [numberOfPassenger=" + numberOfPassenger + ", getNumberOfWheels()=" + getNumberOfWheels()
+ ", getPrice()=" + getPrice() + "]";
}
}
그리고 Enum Car Factory 코드는 아래와 같다.
interface ICarFactory{
Car createCar();
}
public enum CarFactory implements ICarFactory {
CAR {
public Car createCar() {
return new Car(2000, 4);
}
}
,BUS {
public Car createCar() {
return new Bus(10000, 4);
}
}
,TRUCK {
public Car createCar() {
return new Truck(5000, 6);
}
}
,TAXI {
public Car createCar() {
return new Taxi(3000, 4);
}
}
}
이를 이용해 객체를 생성하고 자동차 정보를 출력한다.
public static void main(String[] args){
CarFactory busFactory = CarFactory.BUS;
Car bus = busFactory.createCar();
System.out.println(bus.getCarInformation());
CarFactory truckFactory = CarFactory.TRUCK;
Car truck = truckFactory.createCar();
System.out.println(truck.getCarInformation());
}
여기서 각 하위타입들(Taxi, Bus, Truck)은 getCarInformation 을 재정의하였다. 이렇다고 할 때, 오퍼레이션과 메소드는 각각 몇 개 일까? 이 때 객체에서 호출되는 오퍼레이션은 1개 이며, 그것의 본체가되는 메소드는 4 개이다.
'Concepts > UML' 카테고리의 다른 글
UML - 클래스 다이어그램과 의존 (0) | 2021.02.10 |
---|---|
UML - 클래스 다이어그램과 일반화 (0) | 2021.02.10 |
UML - 클래스 다이어그램과 프로퍼티 (0) | 2021.02.10 |
UML - 개발 공정 (0) | 2021.02.10 |
UML - 개요 (0) | 2021.02.10 |
댓글