코딩을 하다 보면 변수, 함수, 클래스, 패키지 등 다양한 요소에 이름을 붙여야 할 상황이 빈번히 발생한다. 사실, 이름을 잘 지어주는 것만으로도 코드의 가독성과 유지 보수성이 크게 향상되곤 한다.

< 의도를 노출하는 이름 선택하기 >

이름을 지을 때 핵심은 '의도를 명확하게 표현'하는 것이다. 그럼 이게 무슨 말인지 예시를 통해 살펴보자.

int d; // 경과 시간(단위 : 날짜)

 

위의 코드에서 'd'라는 이름은 경과 시간을 의미한다는 것을 전혀 알려주지 않는다. 따라서 아래처럼 이름을 수정하면 더 좋을 것이다.

int elapsedTimeInDays;

 

이렇게 이름을 바꾸면 해당 변수가 어떤 정보를 담고 있는지 한 눈에 알 수 있게 된다.

< 예제로 보는 이름의 중요성 >

아래와 같은 함수가 있다고 가정해보자.

public List<int[]> getThem() {
    List<int[]> list1 = new ArrayList<int[]>();
    for(int[] x : theList)
        if (x[0] == 4)
            list1.add(x);
    return list1;
}

 

이 함수의 코드는 단순하지만 그 의도를 알기 어렵다. 이름이 그다지 도움이 되지 않기 때문이다.

만약 이 코드가 지뢰찾기 게임의 일부라고 하면, theList는 게임 판을 의미하고, x[0] == 4는 깃발이 표시된 셀을 찾는 것을 의미하게 된다. 이런 의도를 이름에 반영하면 아래처럼 코드를 개선할 수 있다.

public List<int[]> getFlaggedCells() {
    List<int[]> flaggedCells = new ArrayList<int[]>();
    for(int[] cell : gameBoard)
        if (cell[STATUS_VALUE] == FLAGGED)
            flaggedCells.add(cell);
    return flaggedCells;
}


이처럼 이름만 바꾸어도 코드가 무엇을 하는지 이해하기 훨씬 쉬워진다. 심지어, Cell이라는 클래스를 만들어 isFlagged()라는 메서드를 사용하면 더욱 명확해진다.

public List<Cell> getFlaggedCells() {
    List<Cell> flaggedCells = new ArrayList<Cell>();
    for (Cell cell : gameBoard)
        if (cell.isFlagged())
            flaggedCells.add(cell);
    return flaggedCells;
}

단순히 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌다. 바로 이것이 좋은 이름이 주는 위력이라고 볼 수 있다.

 

 

출처 : 출판사 인사이트북 / 클린 코드 / https://product.kyobobook.co.kr/detail/S000001032980

※저의 블로그에 있는 모든 참고 서적,강의 내용은 출판사,저자(혹은 편집자)에게 허락을 직접 맡고, 게시하는 글 입니다.

 

Clean Code(클린 코드) | 로버트 C. 마틴 - 교보문고

Clean Code(클린 코드) | 프로그래머, 소프트웨어 공학도, 프로젝트 관리자, 팀 리더, 시스템 분석가에게 추천하는더 나은 코드를 만드는 책『Clean Code(클린 코드)』은 오브젝트 멘토(Object Mentor)의 동

product.kyobobook.co.kr

 

20230622(목) 울산 맑은샘 헬스

  • 인클라인 트레드밀 10분
  • 자전거 10분
  • 트레드밀 30분

'건강운동관리' 카테고리의 다른 글

헬스  (0) 2023.06.28
헬스  (0) 2023.06.27
헬스  (0) 2023.06.21
헬스  (0) 2023.06.20
헬스  (0) 2023.06.19

재밌어 보여서 구매했다. 당분간 닭가슴살 1개씩만 먹어야겠다.... 돈이 아까워서라도 꼭 완독 해야겠다.. 내돈 내산이 아프지만 효과는 제일 큰 것 같다....😭

'일상' 카테고리의 다른 글

근황  (0) 2023.07.12
2023 07/01~2023 07/07 MES Project  (0) 2023.07.07
AWS 16만원 청구...  (0) 2023.06.15
Slid Application 사용 리뷰 및 인터뷰  (0) 2023.06.15

20230621(수) 울산 맑은샘 헬스

  • 트레드밀 1시간
  • 레그프레스 60KG 3SET

'건강운동관리' 카테고리의 다른 글

헬스  (0) 2023.06.27
헬스  (0) 2023.06.22
헬스  (0) 2023.06.20
헬스  (0) 2023.06.19
헬스  (0) 2023.06.16

Dictionary는 키와 값 쌍을 저장하는 컬렉션이다. 다른 언어에서는 '해시맵', '해시 테이블', '맵' 등으로 불리는 자료구조와 같다. Dictionary는 키를 사용하여 빠르게 데이터를 검색할 수 있도록 설계되어 있다.

Dictionary<TKey, TValue>는 두 개의 타입 매개변수를 사용한다

TKey: 딕셔너리의 키의 타입 지정

TValue: 딕셔너리의 값의 타입을 지정

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 정수 키와 문자열 값을 저장하는 Dictionary 생성
        Dictionary<int, string> dictionary = new Dictionary<int, string>();

        // 키-값 쌍 추가
        dictionary.Add(1, "One");
        dictionary.Add(2, "Two");
        dictionary.Add(3, "Three");

        // 키를 사용하여 값을 검색
        string value = dictionary[2];
        Console.WriteLine(value); // 출력: Two

        // 키-값 쌍 제거
        dictionary.Remove(1);

        // Dictionary의 모든 키-값 쌍을 반복 처리
        foreach (var pair in dictionary)
        {
            Console.WriteLine($"Key: {pair.Key}, Value: {pair.Value}");
        }

        // 키가 Dictionary에 존재하는지 확인
        if (dictionary.ContainsKey(3))
        {
            Console.WriteLine("Key 3 exists in the dictionary.");
        }
    }
}

 

① 하나의 배열이 주어지고, 해당 배열의 각 데이터는 숫자다.
배열 절반의 길이보다 큰 갯수만큼 특정 숫자가 들어가 있으면 해당 숫자,그렇지 않으면 -1을 리턴하는 함수를 만들어라. 

예: [2,7,7,7,1,7,2], 리턴값 : 7

using System;
using System.Collections.Generic;

class Program
{
    static int FindMajorityElement(int[] arr)
    {
        // 숫자와 빈도수를 저장하는 Dictionary 생성
        Dictionary<int, int> counts = new Dictionary<int, int>();
        
        // 각 숫자의 빈도수를 계산
        foreach (int number in arr)
        {
            if (counts.ContainsKey(number))
            {
                counts[number]++;
            }
            else
            {
                counts[number] = 1;
            }
        }
        
        // 배열의 길이의 절반을 계산
        int halfLength = arr.Length / 2;
        
        // 빈도수가 배열 길이의 절반보다 큰 숫자를 찾음
        foreach (var entry in counts)
        {
            if (entry.Value > halfLength)
            {
                return entry.Key;
            }
        }
        
        // 해당하는 숫자가 없는 경우 -1을 리턴
        return -1;
    }
    
    static void Main()
    {
        // 예제
        int[] arr = {2, 7, 7, 7, 1, 7, 2};
        int result = FindMajorityElement(arr);
        
        Console.WriteLine("리턴값: " + result); // 리턴값: 7
    }
}

 

 

② 최빈값 찾기: 주어진 배열에서 가장 많이 등장하는 숫자를 찾아서 반환하라. 만약 두 개 이상의 숫자가 같은 횟수로 등장한다면, 그 중 아무 숫자나 반환하라.

using System;
using System.Collections.Generic;

class Program
{
    static int FindMode(int[] arr)
    {
        if (arr == null || arr.Length == 0)
        {
            throw new ArgumentException("Input array should not be null or empty");
        }

        Dictionary<int, int> counts = new Dictionary<int, int>();

        // 배열의 모든 요소에 대해 반복하여 빈도수를 계산한다.
        foreach (int number in arr)
        {
            if (counts.ContainsKey(number))
            {
                counts[number]++;
            }
            else
            {
                counts[number] = 1;
            }
        }

        int maxCount = 0; // 최대 빈도수를 저장할 변수.
        int mode = 0; // 최빈값을 저장할 변수.

        // Dictionary의 모든 항목에 대해 반복한다.
        foreach (var entry in counts)
        {
            if (entry.Value > maxCount) // 현재 항목의 빈도수가 최대 빈도수보다 크면
            {
                maxCount = entry.Value; // 최대 빈도수를 현재 항목의 빈도수로 갱신한다.
                mode = entry.Key; // 최빈값을 현재 숫자로 설정한다.
            }
        }

        return mode; // 최빈값을 반환한다.
    }

    static void Main()
    {
        int[] arr = { 4, 1, 2, 2, 3, 3, 4 };

        try
        {
            int mode = FindMode(arr); // FindMode 메서드를 호출하여 최빈값을 얻는다.
            Console.WriteLine("Mode: " + mode); // 최빈값을 콘솔에 출력한다.
        }
        catch (ArgumentException e) // ArgumentException이 발생하면
        {
            Console.WriteLine(e.Message); // 예외 메시지를 콘솔에 출력한다.
        }
    }
}

 

 

< 인터네트워킹(InterNetworking)이란? >

인터네트워킹은 'Inter'와 'Networking'의 합성어로, 서로 다른 네트워크 간에 연결을 의미한다. 이 연결은 라우터나 게이트웨이 같은 중간 장치를 통해 이루어진다. 인터네트워킹을 통해 개인, 기업, 정부 등 다양한 유형의 네트워크를 하나의 큰 네트워크로 연결하여 서로 정보를 주고받을 수 있게 된다.

인터네트워킹을 가능하게 하려면 네트워크 노드들이 같은 프로토콜(예: TCP, IP)을 사용해야 한다. 같은 통신 규악을 가진 네트워크끼리 연결되면 그것을 인터네트워킹이라고 부른다. 가장 크고 유명한 인터네트워킹의 예는 인터넷이다.

[인터네트워킹과 네트워크 확장의 차이]


스위치나 허브를 사용해 두 개의 LAN을 연결하는 것은 단순히 네트워크를 확장하는 것이다. 반면, 라우터를 사용해 연결하는 것은 인터네트워킹의 한 예다. 인터네트워킹은 OSI-ISO 모델의 3계층(네트워크 계층)에서 구현된다.

< 인터네트워킹의 주요 유형: Extranet, Intranet, Internet >
Extranet: 특정 조직 또는 단체에 국한된 네트워크로, 다른 네트워크와 제한적으로 연결된다. 이는 일반적으로 개인 영역에서 구현된다.

Intranet: 특정 조직 내부에서 사용하는 네트워크로, 인터넷 프로토콜과 기반 도구(웹 브라우저, FTP 도구)를 사용하여 서로 연결된다. 일반적으로 외부와는 단절되어 있고 특정 사용자만 액세스할 수 있다.

Internet: 전 세계의 정부, 학술, 공공 및 민간 네트워크들이 연결된 거대한 인터네트워킹이다. 이는 월드 와이드 웹(WWW)을 포함하고 있다.

< 인터네트워킹 주소 >
Data Link Layer 주소: OSI 모델의 제 2계층인 Data Link Layer는 통신이 이루어지는 장치들 간의 물리적 연결을 관리한다. 예를 들어, 컴퓨터 A와 B가 이더넷 케이블을 통해 직접 연결된 상황을 생각해보자. 이 경우, 컴퓨터 A는 컴퓨터 B로 데이터를 전송하려면, 컴퓨터 B의 Data Link Layer 주소를 알아야 한다. 이 주소는 보통 MAC 주소로 표현되며, 컴퓨터 B의 네트워크 카드에 할당된 고유한 식별자다.

그렇다면 상대방의 Data Link Layer 주소를 어떻게 확인하고 데이터 프레임을 전송할까?

바로 데이터 프레임을 전송할 때 상대방의 Data Link Layer 주소, 즉 MAC 주소를 확인하는 과정은 주로 ARP(Address Resolution Protocol)라는 프로토콜을 사용하여 이루어진다.

ARP 요청: 송신자 컴퓨터는 상대방의 IP 주소를 알고 있지만, MAC 주소는 모른다. 그래서 네트워크 상에 ARP 요청을 브로드캐스트한다. 이 ARP 요청 메시지에는 "이 IP 주소를 가진 사람은 누구인가?"라는 질문과 송신자의 IP 및 MAC 주소가 포함되어 있다.

ARP 응답: 모든 장치들이 ARP 요청을 받지만, 해당 IP 주소를 가진 장치만 ARP 응답을 송신자에게 보낸다. 이 응답에는 상대방의 MAC 주소가 포함되어 있다.

MAC 주소 사용: 송신자 컴퓨터는 ARP 응답을 받고, 상대방의 MAC 주소를 알게 된다. 이제 송신자는 이 MAC 주소를 사용하여 Data Link Layer에서 데이터 프레임을 상대방에게 직접 전송할 수 있다.

캐싱: 송신자는 상대방의 MAC 주소를 나중에 빠르게 참조할 수 있도록 ARP 캐시라는 로컬 메모리에 저장한다. 이로 인해 동일한 대상에게 추가 데이터를 전송할 때마다 ARP 요청 과정을 반복할 필요가 없다.

 

쇼핑몰에 가서 특정 상품을 찾고 싶다고 가정해보자. 그런데 어디에 있는지 모른다. 이 상황에서 여러분은 고객 서비스 직원에게 물어봐야 한다.
이 상황을 네트워킹 세계로 옮겨 보겠다.

ARP 요청 (고객 서비스 직원에게 물어보기): 여러분의 컴퓨터(고객)는 특정 상품(IP 주소)을 찾고 싶다. 그런데 어디에 있는지 모른다. 컴퓨터는 쇼핑몰의 모든 매장(네트워크의 모든 장치)에 큰 소리로 "이 상품(IP 주소)을 파는 매장은 어디인가요?!!!"라고 묻는것이 ARP요청이다.

ARP 응답 (고객 서비스 직원의 답변): 쇼핑몰의 모든 매장이 질문(이 상품~~어딘가요?!!!)을 듣지만, 해당 상품을 파는 매장만이 대답을 해준다. 그 매장(상대방 컴퓨터)은 "저 여기 있어요! 이쪽으로 와주세요!"라고 말하며, 매장의 위치(MAC 주소)를 알려준다.

MAC 주소 사용 (상품 찾아가기): 이제 매장의 위치를 알았으니, 상품을 찾아간다. 마찬가지, 컴퓨터도 상대방의 MAC 주소를 알게 되었고, 이제 데이터 프레임을 직접 보낼 수 있다.

캐싱 (메모하기): 상품을 찾았으니 다음 번에 또 찾을 일이 있으면 빠르게 찾을 수 있도록 메모장에 메모해둔다. 컴퓨터도 이와 비슷하게 상대방의 MAC 주소를 ARP 캐시에 저장하여 나중에 빠르게 찾을 수 있다.

 


MAC 주소: MAC(Media Access Control) 주소는 네트워크 장치의 고유 식별자로 사용된다. Wi-Fi 라우터에 연결하려고 할 때, 라우터는 MAC 주소를 확인한다. 이 주소는 네트워크 인터페이스 카드(NIC)에 '각인'되어 있어서, NIC가 무엇인지 식별하는 역할을 한다. MAC 주소는 보통 6바이트(48비트) 길이로, 12자리의 16진수로 표현된다. 예를 들면, "1A:2B:3C:4D:5E:6F" 같은 형식이다.

Network Layer 주소: Network Layer, 즉 OSI 모델의 제 3계층에서는 IP 주소가 사용된다. IP 주소는 인터넷상의 모든 장치가 고유하게 갖는 식별자로, 이를 통해 인터넷 상의 다른 장치와 통신할 수 있다. 가장 일반적인 IP 주소 형식은 IPv4와 IPv6이다. IPv4 주소는 4바이트(32비트) 길이로, 각 바이트를 10진수로 표현하고 점(.)으로 구분한다. 예를 들면 "192.168.1.1" 같은 형식이다. IPv6 주소는 16바이트(128비트) 길이로, 16진수 4자리를 콜론(:)으로 구분하여 표현한다. 예를 들면, "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 같은 형식이다.


 

 

 

Reference : https://www.geeksforgeeks.org/introduction-of-internetworking/

 

Introduction of Internetworking - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

'Network' 카테고리의 다른 글

서브넷팅(subnetting)  (0) 2023.06.29
LAN,MAN,WAN  (0) 2023.06.20
데이터 통신 시스템  (0) 2023.06.20
컴퓨터 네트워크란?  (0) 2023.06.20
2.네트워크 구성  (0) 2023.05.12

+ Recent posts