이번에는 데이터 링크 계층의 역할과

이더넷에 대하여 알아보겠습니다.

 

랜에서 데이터를 주고받으려면

데이터 링크 계층의 기술이 필요합니다.

 

 

 

데이터 링크 계층은

네트워크 장비 간에 신호를 주고받는 규칙을 정하는 계층으로,

랜에서 데이터를 정상적으로 주고받기 위해 피요한 계층입니다.

 

그 규칙들 중 일반적으로 가장 많이 사용되는 규칙이 이더넷 (Ethernet) 입니다.

 

이더넷에서 적용되는 규칙입니다.

이더넷은 허브와 같은 장비에 연결된 컴퓨터와 데이터를 주고 받을 때 사용합니다.

 

허브를 사용하는 랜 환경에서는

특정한 컴퓨터 한 대에 데이터를 보내려고 해도

다른 모든 컴퓨터에 전기 신호가 전달이 됩니다.

 

특정 컴퓨터에만 데이터를 보내는데,

관계없는 다른 컴퓨터들이 그 데이터를 받아 내용을 볼 수 있다면 싫지 않을까요?

 

이런 경우를 위해 데이터의 내용을 못보게 하는 확실한 규칙이 정해져 있습니다.

 

그 규칙에 따라 보내려는 데이터에 목적지 정보를 추가해서 보내고

목적지 이외의 컴퓨터는 데이터를 받더라도 무시하게 되어있습니다.

 

허브는 들어온 데이터를 그대로 모든 포트에 보내기만 해서

더미 허브로 불립니다.

 

그래서 컴퓨터 여러 대가 동시에 데이터를 보내면

데이터들이 서로 부딪힐 수도 있는데

이것을 충돌 (collision) 이라고 합니다.

데이터가 충돌하는 사고는 피하고 싶겠죠?

그래서 이더넷은 여러 컴퓨터가 동시에 데이터를 전송해도

충돌이 일어나지 않는 구조로 되어 있습니다.

 

예를 들어 아래 그림과 같이

데이터가 동시에 케이블을 지나면 충돌을 할 수 밖에 없습니다.

 

그래서 데이터를 보내는 시점을 늦춥니다.

이처럼 이더넷에서 시점을 늦추는 방법을 CSMA/CD 라고 합니다.

 

CSMA/CD란?

Carrier Sense Multiple Access with Collision Detection 

(반송파 감지 다중 접속 및 충돌 탐지) 의 약어

 

CSMA에서 CS

'데이터를 보내려고 하는 컴퓨터가

케이블에 신호가 흐르고 있는지 아닌지를 확인한다'는 규칙입니다.

 

MA는

'케이블에 데이터가 흐르고 있지 않다면

데이터를 보내도 좋다' 는 규칙입니다.

 

마지막으로 CD는

'충돌이 발생하고 있는지를 확인한다' 는 규칙입니다.

 

이러한 규칙으로 데이터를 주고받으면

아래 그림처럼 데이터 충돌이 일어나지 않습니다.

 

사실 지금은 효율이 좋지 않다는 이유로

CSMA/CD는 거의 사용하지 않습니다.

 

그렇다고 매번 충돌하는 것은 아니지만

스위치 (switch) 라는 네트워크 장비를 사용하면

충돌이 일어나지 않습니다.

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[백준/JAVA] 1546번 평균  (0) 2022.12.24
[13] MAC 주소의 구조  (0) 2022.12.22
[4.8] 배열  (0) 2022.12.22
[4.7] 제어문  (0) 2022.12.22
[4.6] 메서드 연습하기  (0) 2022.12.22

배열array 은 나열된 여러 값을 하나의 변수로 다룰 수 있는 타입입니다.

배열은 일렬로 나열된 방을 가진 건물이라고 생각할 수 있습니다.

방문마다 호실(순번)이 표시되어 있고, 각 방마다 값 하나가 들어갈 수 있습니다.

호실 번호를 알면 그 방으로 찾아가 값을 가져오거나 변경할 수 있습니다.

여기서 호실 번호를 인덱스index라 부르고,

각 방을 배열의 요소 또는 배열의 원소라 부릅니다.

배열을 사용하면 같은 타입의 변수가 너무 많을 때

간단하게 묶어서 관리할 수 있습니다.


4.8.1 배열로 점수 관리하기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int[] students = new int[5];
        students[0] = 100;
        students[1] = 90;
        students[2] = 80;
        students[3] = 70;
        students[4] = 60;
        Debug.Log("0 번 학생의 점수: " + students[0]);
        Debug.Log("1 번 학생의 점수: " + students[1]);
        Debug.Log("2 번 학생의 점수: " + students[2]);
        Debug.Log("3 번 학생의 점수: " + students[3]);
        Debug.Log("4 번 학생의 점수: " + students[4]);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


4.8.2 코드 설명

생략


4.8.3 for 문과 함께 사용하기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int[] students = new int[5];
        students[0] = 100;
        students[1] = 90;
        students[2] = 80;
        students[3] = 70;
        students[4] = 60;

        for (int i = 0; i < students.Length; i++)
        {
            Debug.Log((i + 1) + "번 학생의 점수: " + students[i]);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[13] MAC 주소의 구조  (0) 2022.12.22
[12] 데이터 링크 계층의 역할과 이더넷  (0) 2022.12.22
[4.7] 제어문  (0) 2022.12.22
[4.6] 메서드 연습하기  (0) 2022.12.22
[4.5] 변수 연습하기  (0) 2022.12.22

여기서는 코드 흐름을 통제하는 방법을 배웁니다.

지금까지는 모든 코드를 위에서 아래로 실행했습니다.

 

하지만 제어문을 사용하면 조건에 따라

특정 코드의 실행 여부나 실행 순서를 변경할 수 있습니다.

 

제어문에는 분기를 결정하는 조건문 (if문)

수행을 여러 번 반복하는 반복문(for 문, while 문)이 있습니다.


4.7.1 if 문

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int love = 100;
        if (love > 70)
        {
            Debug.Log("굿엔딩 히로인과 사귀게 되었다!");
        }
        if (love <= 70)
        {
            Debug.Log("배드엔딩 히로인에게 차였다.");
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


4.7.2 비교 연산자


4.7.3 if .. else 문

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int love = 100;
        if (love > 70)
        {
            Debug.Log("굿엔딩 히로인과 사귀게 되었다!");
        }
        else
        {
            Debug.Log("배드엔딩: 히로인에게 차였다.");
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


4.7.4 else if 문

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int love = 100;

        if (love > 90)
        {
            // love가 90보다 큰 경우
            Debug.Log("트루엔딩: 히로인과 결혼했다!");
        }
        else if (love > 70)
        {
            // love가 70보다 크고 90보다 작거나 같은 경우
            Debug.Log("굿엔딩 히로인과 사귀게 되었다!");
        }
        else
        {
            // love가 70보다 작거나 같은 경우
            Debug.Log("배드엔딩: 히로인에게 차였다.");
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


4.7.5 논리 연산자

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int age = 11;

        if (age > 7 && age < 18)
        {
            Debug.Log("의무 교육을 받고 있습니다.");
        }
        if(age < 13 || age > 70)
        {
            Debug.Log("일을 할 수 없는 나이입니다.");
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


4.7.6 for 문

for문은 조건이 참일 동안 처리를 반복합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 10; i++)
        {
            Debug.Log(i + " 번째 순번입니다.");
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[12] 데이터 링크 계층의 역할과 이더넷  (0) 2022.12.22
[4.8] 배열  (0) 2022.12.22
[4.6] 메서드 연습하기  (0) 2022.12.22
[4.5] 변수 연습하기  (0) 2022.12.22
[4.4] 코딩 기본 규칙  (0) 2022.12.22

4.6.1 두 점 사이의 거리

먼저 평면의 두 점 (x1, y1)과 (x2, y2) 사이의 거리

distance를 구하는 방법을 알아봅니다.

 

 


4.6.2 GetDistance() 메서드 만들기

먼저 코드를 완성한 다음에 분석을 하겠습니다.

HelloCode 스크립트의 Start()메서드에서 이전까지의 내용을 지우고,

다음과 같이 두 점 사이의 거리를 계산하는 코드를 작성합니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        float distance = GetDistance(2, 2, 5, 6);
        Debug.Log("(2,2)에서 (5,6) 까지의 거리 : " + distance);
        
        float GetDistance(float x1, float y1, float x2, float y2)
        {
            float width = x2 - x1;
            float height = y2 - y1;

            float distance = width * width + height * height;
            distance = Mathf.Sqrt(distance);

            return distance;
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 


4.6.3 GetDistance() 메서드 만드는 과정

생략

 

4.6.4 스코프

프로그램 작성 시 다음과 같이

같은 이름의 변수를 두 개 이상 선언하면

에러가 발생합니다.

 

나중에 distance를 사용할 때

두 distance 중 어떤 것을 사용하려는 건지

컴퓨터가 알 수 없기 때문입니다.

 

하지만 앞선 HelloCode 스크립트 코드에서는

다음과 같이 Start () 메서드와 GetDistance() 메서드에

같은 이름의 변수 distance를 중복 선언했지만

에러가 나지 않았습니다.

 

변수 distance가 서로 다른 중괄호 안에 선언되어 있기 때문입니다.

코드에서 중괄호{}는 밖 에서 내부가 보이지 않게 감추는 껍데기입니다.

그러므로 메서드의 중괄호 밖에서는 메서드 내 부의 구현이 보이지 않습니다.

메서드 내부에서 선언한 변수는 해당 메서드 내부에서만 유효합 니다.

이러한 유효 범위를 스코프라고 합니다.

스코프는 선언된 변수나 메서드 등이 관측되는 유효 범위입니다.

 

 

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[4.8] 배열  (0) 2022.12.22
[4.7] 제어문  (0) 2022.12.22
[4.5] 변수 연습하기  (0) 2022.12.22
[4.4] 코딩 기본 규칙  (0) 2022.12.22
[4.3] 첫 스크립트 작성하기  (0) 2022.12.22

4.5.1 캐릭터 프로필 저장하고 출력하기

다음과 같은 프로필을 가진 캐릭터의 정보를 저장하고 출력하는 예제를 만들어봅시다.

System.Collections 사용;
System.Collections.Generic 사용;
UnityEngine 사용;

공개 클래스 HelloCode: MonoBehaviour
{
    // 첫 번째 프레임 업데이트 전에 Start가 호출됩니다.
    무효 시작 ()
    {
        // 캐릭터의 프로필을 변수로 만들기
        문자열 캐릭터명 = "라라" ;
        char bloodType = 'A' ;
        나이 = 17;
        플로트 높이 = 168.3f;
        bool isFemale = 참 ;

        // 생성한 변수를 콘솔에 출력
        Debug.Log("캐릭터 이름 : " + characterName);
        Debug.Log("혈액형 : " + bloodType);
        Debug.Log("나이 : " + age);
        Debug.Log( "키 : " + 높이);
        Debug.Log("여성인가? : " + isFemale);
        
    }

    // 업데이트는 프레임당 한 번 호출됩니다.
    무효 업데이트 ()
    {
        
    }
}

 


4.5.2 변수 타입

string은 문자열을 저장합니다.

저장할 문자열은 큰따옴표로 묶습니다.

 

char은 character(문자)의 약자로서 문자 하나를 저장합니다.

저장할 문자는 작은따옴표로 묶습니다.

 

int는 정수(소수점이 없는 숫자)를 저장합니다.

 

float는 소수점을 가진 숫자(실수)를 저장합니다.

float 타입의 숫자 뒤에는 f를 붙여야 합니다.

컴퓨터가 기억할 수 있는 범위는 한계가 있습니다.

float는 32비트를 사용해 숫자를 표현합니다.

따라서 float은 소수점 아래 7자리까지만 정확하게 표현할 수 있습니다.

소수점 아래 숫자가 7자리보다 많으면 근삿값으로 처리됩니다.

따라서 값이 부정확할 수 있습니다.

 

bool으로 성별을 지정했습니다.

bool은 true(참) 과 false(거짓) 중 하나를 저장합니다.


4.5.3 변수 출력하기

우리는 메시지를 읽기 쉽도록

문장과 변수에 저장된 값을

하나의 문자열로 합쳐서 출력했습니다.

 

C#에서 문자열에 뒤에 + 연산자로 값을 더하면

문자열과 같이 하나의 문자열로 연결됩니다.

 


4.5.4 테스트하기

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[4.7] 제어문  (0) 2022.12.22
[4.6] 메서드 연습하기  (0) 2022.12.22
[4.4] 코딩 기본 규칙  (0) 2022.12.22
[4.3] 첫 스크립트 작성하기  (0) 2022.12.22
[4.2] 함수 (메서드) 개념 잡기  (0) 2022.12.21

4.4.1 주석

주석은 컴퓨터가 처리하지 않는 영역입니다.

그러므로 보통 메모 용도로 사용합니다.

코드를 주석으로 바꿔서 잠시 비활성화 시키는 용도로 사용할 수도 있습니다.

 

한 줄 주석과 여러 줄 주석


4.4.2 콘솔 출력

콘솔에 메시지를 출력할 때는

Debug.Log() 메서드를 사용합니다.


4.4.3 세미콜론

코드 한 문장이 끝나면 반드시 세미콜론 (;)을 끝에 붙입니다.

컴퓨터는 코드 한 문장을 세미 콜론으로 구분하기 때문입니다.

 


4.4.4 using

유니티에서 새로운 스크립트를 생성하면

스크립트 상단에 다음과 같은 코드가 자동으로 추가됩니다.

 

 

Debug.Log("Hello World!");

에서 Debug 부분에 마우스 커서를 대고 기다려보면

class UnityEngine.Debug 라는 창이 뜹니다.

Debug는 using UnityEngine;을 사용해서 들여온

UnityEngine에 포함되어 있었습니다.

 

사실은 Debug.Log("Hello World!"); 가

UnityEngine.Debug.Log("Hello World!"); 였던 겁니다.

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[4.6] 메서드 연습하기  (0) 2022.12.22
[4.5] 변수 연습하기  (0) 2022.12.22
[4.3] 첫 스크립트 작성하기  (0) 2022.12.22
[4.2] 함수 (메서드) 개념 잡기  (0) 2022.12.21
[4.1] 변수 개념 잡기  (0) 2022.12.21

4.3.1 새 프로젝트 생성하기

새 프로젝트를 생성하겠습니다.

프로젝트의 이름은 'Hello Coding'으로 하겠습니다.

 

이 장에서 작성할 스크립트 결과는 콘솔 창에서 확인할 수 있습니다.

만약 유니티 에디터에 콘솔 창이 보이지 않는다면

유니티 상단 메뉴에서 Windows > General > Console을 클릭하여

콘솔 창을 띄우고 시작합니다.

 

또한 콘솔 창에서 Collapse 창이 활성화된 경우 해제할 것을 추천합니다.

Collapse 가 활성화되어 있으면 같은 내용의 로그들이 하나로 묶입니다.

따라서 로그 출력 순서를 확인하기 불편합니다.

 


4.3.2 첫 C# 스크립트 파일 작성하기

 

 

스크립트 파일을 더블클릭하여

Visual Studio 코드 편집기에서 엽니다.

 


4.3.2 스크립트 구성 살펴보기

기본 생성 코드는 다음과 같습니다.

 

 

전체 스크립트가 using, class, Start() 세 부분으로 구성된 것을 알 수 있습니다.

여기에서는 using과 Start() 를 살펴보겠습니다.

 

using

using 키워드를 이용하여 사용할 라이브러리의 경로를 지정하면

해당 라이브러리에 들어있는 코드를 가져와서 사용할 수 있습니다.

여기서 using 뒤의 경로네임스페이스 (namespace) 라고 합니다.

 

C#과 유니티는 개발에 필요한 여러 라이브러리를 네임 스페이스로 제공합니다.

예제 코드의 using UnityEngine; 은

UnityEngine 네임스페이스에 존재하는 코드를 가져와서 사용한다는 의미입니다.

 

 

Start() 메서드

Start() 메서드는 코드 실행이 시작되는 시발점을 제공합니다.

유니티에는 상황에 맞춰 자동으로 실행되는 메서드유니티 이벤트 메서드가 있습니다.

Start() 메서드가 대표적인 유니티 이벤트 메서드입니다.

Start() 메서드는 게임이 시작될 때 자동으로 한 번 실행됩니다.

따라서 게임 시작과 함께 실행될 코드를 Start() 메서드 안에 넣으면 됩니다.

 

 

 


4.3.4 Hello World!

프로그래밍을 처음 배울 때는

Hello World! 라는 문장을 화면에 출력하는 전통이 있습니다.

 

 

 

변경된 코드를 저장하고 유니티 에디터 창으로 돌아갑시다.

변경된 코드를 저장하지 않으면 유니티 프로젝트에 반영되지 않습니다.

따라서 반드시 저장해야 합니다.


 

스크립트를 완성했다고 해서 코드가 작동하는 것은 아닙니다.

이 상태로는 HelloCode 스크립트가 단순한 텍스트 파일이기 때문입니다.

 

완성된 스크립트를 동작시키고 싶다면

'게임 월드에 존재하는 오브젝트' 로 만들어야 합니다.

그러기 위해서는 스크립트를 게임 오브젝트에 컴포넌트로 붙여넣어야합니다.

빈 게임 오브젝트를 생성하고

작성한 HelloCode 스크립트를 붙입니다.

 

NewBehaviourScript를 HelloCode로 바꾸지 않으면 에러가 납니다.

 

 

 


빈 게임 오브젝트 (GameObject) 가 생성됨

인스펙터 창에서 GameObject를 확인하면

HelloCode 스크립트가 추가도니 것을 확인할 수 있습니다.

 

이제 모든 준비가 끝났으므로

스크립트를 테스트 합니다.


 

 

첫 스크립트 작성과 실행을 완료했습니다.

실행을 확인했으면 플레이모드를 해제하고

HelloCode 스크립트 편집 창으로 돌아갑니다.


 

 

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[4.5] 변수 연습하기  (0) 2022.12.22
[4.4] 코딩 기본 규칙  (0) 2022.12.22
[4.2] 함수 (메서드) 개념 잡기  (0) 2022.12.21
[4.1] 변수 개념 잡기  (0) 2022.12.21
[3.4] 메시지와 브로드 캐스팅  (0) 2022.12.19

 

함수미리 정해진 동작을 수행하는 코드 묶음입니다.

어떤 처리를 미리 함수로 만들어두면 다시 반복해서 사용할 수 있습니다.

초등학교 수학시간에 나오는 마법 상자가 바로 함수입니다. 

 

4.2.1 함수로 중복 코드 줄이기

 

프로그래밍에서 함수는 미리 지정된 동작을 수행하는 코드 묶음입니다.

함수를 사용하면 같은 동작을 수행하는 코드를 여러 번 작성할 필요가 없습니다.

 

반복되는 코드를 함수로 대체하면

물체를 움직이는 기능에 관한 코드를 Move() 라는 함수로 묶습니다.

void Move() {
	체력 10만큼 감소
    오브젝트를 3미터 옮기기
    효과음 재생
}

 

 

 

물체를 움직이는 기능에 관한 코드를 Move() 라는 함수로 묶습니다.

대괄호 안에 묶인 영역은 Move() 함수의 바디 body가 됩니다.

이렇게 하면 어떤 물체를 움직일 때 Move() 함수만 사용하면 됩니다.

 


4.2.2 함수의 입력

 

나무 상자는 가볍고 금속 상자는 무겁습니다.

따라서 물체에 따라 필요한 체력과 한 번에 옮기는 거리달라야 합니다.

 

앞의 예제에서는 Move() 함수가 사용하는 수치가

체력은 10, 거리는 3으로 고정되어 있습니다.

 

나무를 옮길 때에는 체력을 10 소모하여 물체를 3미터,

금속을 옮길 때는 체력 30을 소모하여 물체를 1미터 옮기고 싶습니다.

 

 

이럴 때에는 함수의 입력을 사용합니다.

Move()의 괄호 부분은 바깥에서 값을 줄 수 있는 입구입니다.

이 입구를 사용해 값을 전달할 수 있도록 Move() 함수를 변경하겠습니다.

 

 


4.2.3 함수의 출력 (반환값)

 

Move() 함수는 실행 결과를 다른 곳에 전달할 필요가 없었습니다.

하지만 어떤 함수는 계산이나 처리 결과를 다른 곳에 전달할 필요가 있습니다.

 

임의의 숫자를 하나 생성하는 

GetRandomNumber() 함수를 살펴봅시다.

 

이 함수는 변수 number을 만들고 임의의 숫자를 할당하지만

그 값을 외부에 전달하지는 않습니다.

 

이 때 return 키워드를 사용하면

값을 외부로 전달할 수 있습니다.

 

return number; 는

number를 반환한다

라고 읽습니다.

 

return은

(1) 함수를 종료하고

(2) 자신을 실행(호출)한 곳으로 되돌아가서 값을 전달(반환)합니다.

 

 

return은

(1) 함수를 종료하고

(2) 자신을 실행(호출)한 곳으로 되돌아가서 값을 전달(반환)합니다.

 

GetRandomNumber()는 결과로 정수 int를 반환하므로

함수 이름 앞에 반환값 (출력값/리턴값) 타입을 표시해주었습니다.

 

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[4.4] 코딩 기본 규칙  (0) 2022.12.22
[4.3] 첫 스크립트 작성하기  (0) 2022.12.22
[4.1] 변수 개념 잡기  (0) 2022.12.21
[3.4] 메시지와 브로드 캐스팅  (0) 2022.12.19
[백준/Java] 숫자의 합  (0) 2022.12.18

+ Recent posts