*관계 - 4가지로 구분

-1. 일반화
-2. 실체화
-3. 의존관계
-4. 연관관계 
    -1)직접 연관
    -2)집합 연관
    -3)복합 연관

 


관계명

설명

관계

Generalization(일반화 관계)

일반적인 것(동물)과 특화된 것(포유류)과의 관계

상속

Realization(실체화 관계)

인터페이스와 그것을 구현한 것과의 관계

구현

Dependency(의존관계)

어떤 클래스가 다른 클래스를 참조하는 관계

참조

 

1) 일반화 관계

일반화 관계는 쉽게 말해 상속 관계

ex) User 라는 클래스를 상속받은 Customer 와 Admin 클래스

public class User {    
    private String id;
    private String pass;
    
    public void login(){}
}
 
public class Customer extends User {
    @Override
    public void login() {
        //일반 유저의 로그인...
    }
}
 
public class Admin extends User {
    @Override
    public void login() {
        //관리자 로그인
    }
}

2) 실체화

실체화는 인터페이스를 구현받아 추상 메서드를 오버라이딩 하는 것을 의미

이것은 UML 로 표기하는데 두가지 방법이 있다.

방법은 다르나 같은 표기

public class DateCheckLogic implements CheckLogic {
    @Override
    public boolean isTrue() {
        return true;
    }
}

 


3) 의존(Dependency)

의존 관계는 어떤 클래스가 다른 클래스를 참조하는 것을 의미

이 참조 형태는 객체 생성이나 사용 메서드 호출, 매개변수로 객체 사용 등이며, 

해당 객체는 사용 후 참조를 유지 하지 않음. 

클래스간 객체화 및 메서드 사용은 빈번한 일 이므로 가장 많이 사용되는 관계이다

public class Driving {
 
    public static void main(String[] args) {
        Car myCar = new Car();
        myCar.turnOn();
        myCar.turnOff();
    }
}
 
public class Car {
    
    public void turnOn(){
        System.out.println("시동이 켜졌습니다.");        
    }
    
    public void turnOff(){
        System.out.println("시동이 꺼졌습니다.");
    }
 
}

 


4) 연관관계(Association)

연관 관계는 직접연관, 집합연관, 복합 연관으로 나뉜다

관계

설명

직접연관

화살표의 방향에 따라 참조를 나타냄

집합연관

whole(몸통) part(액세서리)의 관계(몸통이 죽어도 부분은 살아남는다.)

복합연관

whole(몸통) part(신체일부분)의 관계(몸통이 죽으면 부분도 같이 죽는다.)


 

- 1) 직접 연관

이놈이 -> 이놈을 참조

직접 연관은 한 클래스가 다른 클래스를 참조하는 관계

이 부분은 의존(Dependency)와 헷갈릴 수도 있으나 차이가 있다.

관계

차이점

의존

참조하는 객체나 클래스가 사용 후 사라지는 관계

직접연관

참조하는 객체나 클래스가 사용 후에도 유지되는 관계

 

직접 연관 관계는 객체화 하지 않은 클래스 자체를 참조 하는 것 이라고 할ㅅ 있다.

import java.util.List;
 
public class User {    
     private List<Address> addr;
 }

 

위 그림은 User 가 Address 를 참조한다는 의미이다.

1…* 은 대상 클래스가 가질 수 있는 인스턴스의 개수 범위를 나타낸다

점(…) 을 기준으로 앞에 값은 최소값, 뒤에 값은 최대값을 의미하는데 

1…* 이라면 객체가 최소 1개는 사용되어야 하고, 최대 값은 정하지 않는다는 뜻 이다.
0…* 이라면 객체화 하지 않아도 무방하며, 최대값도 정해지지 않은 상태로 * 만으로도 표현 가능 하다.


추가로 List 라는 컬레션 프레임워크를 사용한 점과 이것을 addr 변수에 담았다는 내용.
그것을 표현하기 위해서는 아래와 같이 두 가지 방법이 있다.

 

public class Subject {    
    public String name;
}
 
public class Grade {    
    public Subject subject = null;
    public String grade;
}
  
import java.util.List;
 
public class Student {    
    private List<Grade> gradeList = null;
}


보면 아래와 같은 순서로 UML 을 그릴 수 있다.

1. Grade 는 Subject 를, Student 는 Grade 를 참조 한다.
2. Grade 클래스는 Subject 클래스를 subject 변수에 1 개만 객체화 가능 
3. Student 클래스는 Grade 클래스를 gradeList 변수에 List 형태 참조하여 가져옴 객체생성은 1~무한대

 

최종적으로 3번과 같은 그림이 그려진다.

* 의존과 연관 : 객체가 유지되느냐 사라지느냐 라는 차이

* 유지된다 -> 전역변수에 객체가 보관되어 클래스 생명 주기 까지 유지된다.

* 사라진다. -> 지역 변수에 객체 보관되어 메서드 종료 시 사라진다.


 

- 2) 집합 연관(Aggregation)

몸통 ◇-> 부분

 

집합연관은 전체와 부분의 관계 입니다.

하지만 직접 연관과는 코드상에 차이를 구분하기가 참으로 애매한 것도 사실 입니다.

그래서 가급적으로 사용하지 않는다는 주장들이 있고, 거의 그렇게 되어가는 추세 입니다

 

public class Computer {
    
    private Monitor screen;
    private Body body;
    private Keyboard keyboard;
    
    public Computer(Monitor screen, Body body, Keyboard keyboard){
        this.screen = screen;
        this.body = body;
        this.keyboard = keyboard;
    }
 
}

 

위 소스를 보면 외부 클래스를 생성시 받아 오지만 객체화를 외부에서 한다
그래서 Computer 클래스가 종료된다고 하더라도 screen, body, keyboard 의 객체는 여전히 살아 있고,
몸체(Computer)가 죽어도 액세서리(screen, body, keyboard) 가 남는 관계라고 한다


 

 

- 3) 복합 연관(Composition)


몸통 ◆-> 부분

복합연관이 집합연관과 다른 점은 앞서 말했듯이 몸체 클래스가 죽었을 경우 다른 객체도 함께 죽는 다는 것 이다. 

 

public class Computer {
    
    private Monitor screen;
    private Body body;
    private Keyboard keyboard;
    
    public Computer(){
        this.screen = new Monitor();
        this.body = new Body();
        this.keyboard = new Keyboard();
    }
 
}

 

잘 살펴 보면 이번에는 객체화가 내부에서 이루어 진다는 것을 발견 할 수 있다.

즉, 몸체 클래스 안에서 생성된 녀석 이기 때문에 몸체 클래스가 죽으면, 해당 객체들도 자연히 죽는다

 

- 집합 : 안경은 내 몸 에서 생긴 것이 아니기 때문에 내가 죽더라도 남게 된다.

- 복합 : 심장은 내 몸 안에서 생긴 것 이기 때문에 내가 죽으면 같이 죽게 된다.

'UML' 카테고리의 다른 글

UML 이란  (1) 2019.05.18

1. UML

UML은 Unified Modeling Language의 약자로, 직역 하자면 통합된 모델 언어 
이런 UML을 사용하는 유형에는 아래 3가지 정도가 있다.

- 다른 사람들과의 의사소통 또는 설계 논의
- 전체 시스템의 구조 및 클래스의 의존성 파악
- 유지보수를 위한 설계의 back-end 문서


2.class 다이어 그램

UML은 구조 다이어그램 7개, 행위 다이어그램 7개로 총 14종류의 다이어그램이 있으며, 각 특징은 아래와 같다.

1. 구조 다이어그램 : 시스템의 개념, 관계 등의 측면에서 요소들을 나타내냄(정적) 
2. 행위 다이어그램 : 요소들간의 변화나 흐름, 주고받는 데이터 등의 동작을 나타냄(동적)

이 중 클래스 다이어 그램은 구조 다이어 그램에 해당함.
클래스 다이어 그램은 클래스간의 관계나 의존성이나 구조 등에 대해 명확하게 보여줌.


3. class diagram 표기 형식

 

위 그림에서 최 상단 Person 은 클래스 명 
그리고 그 아래 age, name, sex 는 변수.
그리고 그 아래 eat( ) 과 sleep( ) 은 메서드

그리고 변수와 메서드 앞에 표시된 기호들은 다음을 의미한다.
+ : public 
-  : private 
# : protected

public class Person {    
    private int age;
    public String name;
    public String sex = "female";
    
    public void eat(String food){}    
    private void sleep(){}
}

 


4. stereo Type(스테레오 타입)

스테레오 타입이란 UML에서 제공하는 기본 요소 외에 추가적인 확장요소를 나타내는 것으로 
쌍 꺾쇠와 비슷하게 생긴 길러멧(guillemet, « ») 사이에 적는다. 
스테레오 타입으로 많이 사용되는 것은 «interface», «utility», «abstract», «enumeration» 등이 있다.

 

표현

«interface»

인터페이스 클래스

«abstract»

추상화 클래스

«enumeration»

열거형 타입 클래스

«utility»

인스턴스가 없는 static 메서드만 모아둔 클래스

«create»

생성자

 


«interface»

메소드 밑의 밑줄은 static(정적)필드 또는 메서드를 의미

public interface RemoteControl {    
    /*변수 선언*/
    public int max_volume = 10;
    public int min_volume = 0;    
    /*추상 메소드*/
    public void setMute(boolean mute);    
    /*정적 메소드(자바8 부터)*/
    public static void changeBattery(){
        System.out.println("건전지를 교체 합니다.");
    }
}

 


 

<<abstract>>


Phone(String) 옆의 «create» 는 생성자를 의미

public abstract class Phone {    
    public String owner;
    //생성자
    public Phone(String owner){
        this.owner = owner;
    }
    
    public void turnOn(){
        System.out.println(owner+"님의 폰 전원이 켜 집니다.");
    }
    
    public void turnOff(){
        System.out.println(owner+"님의 폰 전원이 꺼 집니다.");
    }
}

 

<<Utility>>

Utility 클래스는 객체화 되지 않고, 오직 static 함수만 모아놓은 클래스를 의미함

 

 메소드 밑의 밑줄은 static(정적) 필드와 메서드를 의미
 {readOnly}는 여기서 final 키워드를 사용하는 상수를 의미

public class Math {
    
    public static final double PI = 3.14159;
    
    public static double cos(double value){
        return 0;
    }
    
    public static double sin(double value){
        return 0;
    }
}

 

'UML' 카테고리의 다른 글

UML 클래스 관계  (2) 2019.05.18

1. 액터 리플리케이션 


- 액터가 리플리케이트 되면 서버에서 스폰될 떄, 나머지 클라이언트 전부에 전송된다
- 액터의 존재를 다른 머신에서도 알 수 있도록 함
- 그러나 리플리케이드 되지 않으면, 원격머신에서는 액터가 언제 스폰되었는지 알지 못함

 

리플리케이트가 되지 않아서, 클라이언트에서 보이지 안음

* 왼쪽에 액터는 리플리케이션 마킹이 되지 않기 떄문 ->  해결방법은 아래 그림 참고
* 리플리케이트 항목 체크하면 됨

BP -> 디테일 -> 리플리케이션 항목 

 

* 게임에 접속된 모든 머신과 네트워크로 연결되도록 하려면, 위를 체크되었는지 확인하는 게 좋다
* 체크를 하면 이 액터는 참가한 모든 머신에 리플리케이트 된다


Swutch Has Authority

* 위를 검사 하는 것으로 지금 블루프린트 스크립트를 실행한 것이 권위자 머신(서버)인지, 원격머신(클라이언트)인지
* 서버인지 클라이언트인지 바로 묻지 않는 이유는, 특수한 경우에 서버가 액터의 권위자가 아닌 상황이 있기 떄문
* 어느 한 오브젝트에 대한 권위자가 반드시 서버 인 것은 아니다

* 위 노드는 일종의 게이트로 사용할 수 있다. 어떤 게임플레이나 행위가 서버에서만 일어나게 할 것이냐, 아니면 클라이언트에서만 일어나게 할것인가

ex) HUD에다 액터를 추가하는 경우, 클라이언트에서만 스폰되는 것으로 서버에서는 존재조차 신경쓸 필요가 없으므로, 이러한 경우 클라이언트가 HUD에 대한 권위자가 된다. 왜냐하면 거기에 속해 있고, 다른 누구도 그에 대해 알거나 신경쓸 필요가 없기때문

 


원격머신 뒤에는 보라색으로 변하게 설정됨

 

 

서버에서는 권위자, 클라이언트에서는 원격머신 표시

 

* 서버냐 클라이언트냐에 따라 위 처럼 간단하게 처리 할 수 있따.


2. 변수 리플리케이션

노 변수, 변수 리플리케이션

 

* 서버만 알고 다른 사람은 전혀 신경쓸 필요가 없는 정보가 많을 수 있다. 그래서
* 액터의 특정 변수를 리플레키에션을 설정 가능함

* 서버 측에서는 2개다 동일한 속도로  HP가 감소함

* 클라이언트에서 노 변수 설정 된 것은 체력이 바로 0으로 됨
-> HP 값을 네트워크에서 처리되도록 설정하지 않았기 떄문이다

왼쪽 객체는 리플리케이션이 NONE, 우측 객체는 Replicated로 설정되어 있다.

 

* NONE : 기본값이며 변화를 안 알린다
* Replicated : 다른 머신 모두가 그 변화를 알 수 있도록한다
-> 설정이 되어 있으면,  변화가 다른 머신에 반드시 전달 되다는 보장이 있다
엄청난 양의 리플리케이션을 하는 경우에는 네트워크 지연(랙)이 발생할수 있다. 빠르긴 하지만 즉시 작업은 아니다

* RepNotify : Replicated키워드의 역활을 그대로 한다. 여기에 추가로 변수가 변할 떄, 누군가가 변경을 하면, 이에 대한 반응을 할 수 있는 기회를 준다. 함수를 호출하여 작업을 할 수 있는 기회를 얻는다

※ 한 프레임 내에 여러번 변경한 경우에는 감지하지 못한다.
※ 한 프레임에 값을 여러번 바꾸는 경우 전부 캡처되지 않는다. 같은 프레임 내 마지막에 가한 변경만 캡처된다
※ 프레임 끝에 리플리케이션 할지 결정할 떄, 시작과 끝 값이 같으면 클라이언트 머신에 알리지 말아야 하는 것

※ 클라이언트에서는 Replicated 변수 변경을 정말 하지 않는 것이 좋다. 변경을 하는 것은 서버에서만 하도록 하는 것이 좋으며, 그런 이후 변수 리플리케이션 시스템을 통해 클라이언트가 변화를 인지하도록 하는 것이 좋다


 

* 우측상단에 번개컴퓨터 아이콘 표시
* 서버에서 호출할 때만 작동한다고 표시된것
* 클라이언트에서 호출 할 수는 있지만, 아무 것도 하지 않을 것이다
* 실수를 하지 않도록 하기 위한 일종의 안전장치 이다. 서버에서만 사용할 수 있다고 보면 됨


* 우측 상단에 번개모니터 표시
* 이 시점 이후로 호출되는 것은 기본적으로 장식 / 시각 효과용이라는 뜻
* 게임플레이에 정말 중요한 작업 같은 것은 하지 않는다는 것을, 또는 서버에서만 일어나야 하는 것은 하지 않는다는 것을 뜻한다
* 이 표시가 있으면 서버는 이에 대해 신경을 쓸 필요가 없다

※ 데디케이티드 서버에서는 이 노드 다음에 오는 것들은 최적화의 일환으로 바로 무시해 버린다.
 앞으로 하는 모든 것들은 게임플레이에 영향을 끼치지 않으며, 데디케이티드 서버에서는 완전히 무시해도 된다.


RepNotify :
Replicated키워드의 역활을 그대로 한다. 여기에 추가로 변수가 변할 떄, 누군가가 변경을 하면, 이에 대한 반응을 할 수 있는 기회를 준다. 함수를 호출하여 작업을 할 수 있는 기회를 얻는다

 

SET w/ Notify

* SET w/ Notify 
* Streetlight Scalar 변수가 설정되어 있는데, 여기에 RepNotify 마킹을 해둬서 우리에게 알려준다
* 우측에 공2개 표시 -> Replicated 변수를 뜻한다
* 즉 한 눈에 Streetlight Scalar가 Replicated 변수임을 알 수 있다.
* 그리고 SET w/ Notify로도 RepNotify 임을 알 수가 있따.

* NONE -> RepNotify로 하면 위에 OnRep_ 구현가능 변수이름으로 된 함수를 자동 생성한다. 

자동생성된 함수

 

함수는 메시 색을 설정하는 내용

 

* 서버에서 이 변수가 변화되면, 서버에서 이 함수를 즉시 호출한다
* 스칼라 값이 변경이 감지 되면 위 함수가 호출이 되서 색을 바꾼다

* 무슨 일이 벌어진냐면, 이것을 설정할떄 서버에서도 바로 그 함수를 호출한다,
또한 클라이언트에서도 그 업데이트 알림을 받으면 바로 그 동일한 함수를 클라이언트에서 호출한다.

* 즉 클라이언트를 통해 업데이트가 전송되면, "내 값이 바뀌었은데, 색 바꾸어야 할거 같아" 하는 것이다

* 이는 게임플레이 관련 변화를 처리하는 정말 편리하고 강력한 방법이다, 클라이언트도 알아야 하는 시작 효과 연동 변화도 처리 할 수 있다. RepNotify 마킹을 해두면, 그에 대한 변화가 있을 떄 알림을 받아서, 그에 맞게 반응 할 수 있다

※ 리플리케이션은 C++을 통해 이루어지지, 블루프린트는 아니다. 노티파이 작동방식을 블루프린트에서는 살짝 다른데, 서버에서 이게 설정되면 이 함수를 자동호출한다는 점에서 다르다

※ C++에서 코딩하는 경우 중요한 내용인데, RepNotify 함수는 서버에서 자동 호출되지 않는다는 점이다. 필요하면 수동 호출해 줘야 한다. 블루프린트에서는 편의상 자동으로 호출되고 있다. 그냥 설정만 해주면 서버와 모든 클라이언트에서 자동 호출된다.

 

 

'Unreal > NetWork' 카테고리의 다른 글

4. 네트워크 연관성  (0) 2019.06.13
3. 함수호출 리플리케이션  (0) 2019.06.13
1. 네트워크 기초 (블루프린트 네트워크)  (0) 2019.05.17
언리얼 리플리케이션 개념도  (0) 2019.05.17

* 게임은 클라이언트 - 서버 모델이라는 것을 기반으로 실행된다

*  서버란 게임을 호스팅(운영)하는 역활이며, 거기에 다수의 클라이언트가 연결 가능하다

서버와 클라이언트 관계

 

* 클라이언트와 서버 사이에서 통신 방식은 클라이언트가 서버에 데이터를 전송하면, 서버는 그 데이터 중 일정부분을 다른 클라이언트에 전송한다

* 게임플레이 용도의 클라이언트끼리 서로 통신하는 일은 드물다


 

 

서버가 왕이다

* 게임 규칙 및 체력 변경 등 게임플레이가 돌아가는 방식을 결정하는 데 영향을 주는 무엇이든 서버에서만 일어난다
* 그 후 클라이언트에서 그 사실을 알아야 하는 경우 알려주고 클라이언트에서 갱신한다.
ex) 슈터 게임에서 누가 대미지를 받을 지 서버에서 결정하는 것이 좋다 -> 클라이언트 머신에서 치트 불가능하게


[언리얼 서버 2가지 유형]

1. 리슨서버
- 권위자 역활을 한다
- 동시에 클라이언도 실행한다
- 자신의 컴퓨터에 게임을 호스팅을 하면서 친구를 게임에 초대할 수 있다
- 머신이 전체 게임의 서버 역활을 한다
- 내가 하는 게임을 입력을 하고,  랜더링 됨
- 나도 플레이를 하면, 다 같이 멀티로 플레이 한다

LISTEN SERVER

2. 데디케이티드(전용) 서버
- 다른 클라이언트가 참가하는 전용 서버 역활
- 입력을 받거나 랜더링 되지는 않음
- 서버에서 로컬플레이 하는 유저는 없다
- 최적화가 되어 있어서, 실행 비용이 싸다


[리플리케이션 (중요)]

- 머신 사이를 오가여, 통신하는 데이터와 명령과 그  방법
- 머신사이의 다양한 데이터와 명령 전송 및 그 통신 방식을 말함

* (HP:100) 대미지를 받고, 다른 클라이언트에 (HP:30)으로 바뀌고 전송
* 여기서 HP 값을 리플리케이트 한다라고 한다

* 서버에서 변화를 책정한다.
* 적법한지 체크를 하고 HP를 감소시키고서, 그 값을 다른 클라리언트에 리플리케이트 시킨다

* 리플리케이션 할수 있는 것들(ex)
HP , 액터 존재 여부(스폰), 블루프린트 함수 호출

 


 

에디터에서 멀티 테스트 설정
2인시 테스트 화면

 

* 데디케이드 서버 실행을 체크하고  1인으로 실행하면 백그라운드의 데디케이티드 서버에 연결됨,
* 데디케이티드 서버는 아무것도 랜더링하지 않고, 로컬플레이어 중인 플레이어를 처리하지 않는다

1인 데디케이티드 화면

 

* 테스트에 여러가지 방법이 있는데, 2가지 버전의 바로가기를 만들고 속성-> 끝부분에 아래를 추가한다

* 프로젝트이름, 열고자 하는 맵, ?(부가옵션 넣을 수 있게됨)  listen(리슨서버로 사용) -game(에디터 아닌 게임을 실행)

* 프로젝트이름, 접속 IP 주소, listen(리슨서버로 사용) -game(에디터 아닌 게임을 실행)

위는 서버, 아래는 클라이언트

 

+ Recent posts