반응형

 

 

 

기계식 키보드에 입문한 뒤로는 키보드는 레오폴드만 사용하다가, 유튜브 알고리즘에 듀가드 k330w 영상을 본 뒤로 바로 구입해버렸다.

 

레오폴드 키보드를 사용하면서 다음 키보드를 구입할때의 기준을 정해뒀었다.

1. 무선

2. 텐키리스

3. 저소음 적축

4. 건전지가 아닌 충전식일 것

레오폴드도 블루투스로 나오긴했지만, 건전지를 넣는 방식이어서 구입하진 못했다. 그러다가 이번에 듀가드 k330w를 보면서 내가 희망하는 조건에 전부 부합해서 망설임없이 구입!

 

 

색상은 Ion Storm이 제일 맘에 들어서 해당 색상으로 구매했다.

미니배열 키보드이다보니 당연하게 없어진 키들에 대해서는 fn키를 조합해서 사용해야한다. 밑에 있는 사진처럼 측각으로 fn키로 사용할 수 있는 기능들이 새겨져있는데, 키들이 꽉차있어서 그런지 색상때문에 그런지 측각에 새겨져있는 각인이 생각보다 눈에 잘 안들어온다. 이부분은 사용하면서 손에 익으면 굳이 확인할 필요가 없어지니 큰 문제는 아닌거같다.

 

 

개인적으로 생각하는 장단점

1. 장점

  • 무선이라 너무 편하다.
  • 윤활이 되어있어서 그냥 저소음 적축보다 조용하고 쫀득한 느낌도 있어서 재미있다.
  • 영문 각인으로 되어있고 각인이 크게 새겨져있어서 보기 편하다.
  • fn키가 제일 끝에 있어서 사용하기 편했다.
  • 팜레스트가 사은품으로 딸려왔다. (사용하지는 않지만 일단 감사합니다. :))

2. 단점

  • 키보드 커버가 딱 들어맞지 않아서 좌우로 흔들린다.
  • 키의 각도가 가팔라서 측각 각인이 다소 보기 힘들었다.
  • 프린트 스크린키가 없다. (키 팹핑 프로그램이나, Shift + Win + S로 대체 가능)

3. 두 달 사용후 단점

  • o키가 간헐적으로 입력이 되지 않는다. (한 번 입력이 안되면 강하게 입력해야 그때 다시 입력됨)
  • 키캡이 이탈한다. (윈도우 키가 사용하다가 빠짐..)

4. 10개월 사용 후기 추가

  • 키캡 이탈 : 키캡은 듀가드 퓨전 키캡 구매해서 바꿈

 

이 외에는 home, delete, end 등이 기존에 사용하던 레오폴드 키보드와 다른 위치에 있어서 헷갈리는 수준이라 단점으로 꼽기엔 알맞지 않은듯하다.

 

이번에 듀가드 k330w를 구매한게 개발용 노트북을 구매하면서 노트북 키보드에 올라오는 열 문제도 있고 키보드 배열이 불편해서 반 충동, 반 필요에 의해 구매하게 되었는데 매우 만족중이다.

 

+) 크기나 기능적인 면에서는 만족스러우나, 품질이 떨어지는것같다. 저소음 적축이라 같은 제품라인 중에서도 제일 비싼편이었는데, 저렴한 키보드에서나 볼 수 있을 현상이 벌어지는것을 보고 실망했다.

 

 

 

기존에 사용하던 레오폴드 fc660m과 같이 한 컷. fc660m은 중고로 판매할 예정.

 

 

 

반응형

'Manage > Review' 카테고리의 다른 글

MS Designer Compact 키보드 후기  (0) 2022.03.01
티스토리 네이버 서치어드바이저 후기  (0) 2022.02.08
반응형

 

 

포톤 에셋을 받은 후, 비주얼 스튜디오로 작업을 하게되면 한번씩 다음과 같은 에러를 본다.

 

  • CS0246 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.

실수로라도 포톤에셋의 코드들을 건드릴일이 없는데 CS0246에러를 만나면 성가시기 짝이없다.

물론 무시하고 사용해도 기능적으로 문제가 생긴다거나 하지는 않지만, 참조를 못하는 상황이니 자동완성으로 편하게 코딩은 불가능하다.

 

 

해결방법

1. 유니티 프로젝트와 비주얼 스튜디오를 닫는다.

2. 유니티 프로젝트 폴더에서 .csproj.sln확장자의 파일을 모두 삭제한다. (유니티를 다시 실행하면 자동으로 생성이 되니 안심하고 지우면 된다.)

3. 유니티를 재실행한다.

 

 

 

반응형
반응형

 

 

 

유니티 스크립트를 편집하려할 때, 유니티 스크립팅 API에 대한 자동완성이 되지 않을때가 있다.

 

원인

- 유니티 프로젝트에서 .csproj.sln파일 생성이 안되서 발생하는 문제이다.

- 유니티 프로젝트 폴더를 열어보면 다음과 같이 유니티 프로젝트 관련 폴더만 보이고 비주얼스튜디오 관련 파일은 보이지 않는것을 확인할 수 있다. (비주얼 스튜디오의 솔루션 탐색기에서도 확인이 가능하다.)

 

 

 

 

해결방법

1. EditPreferenceExternal ToolsExternal Script Editor에서 비주얼 스튜디오를 선택한다.

 

2. 비주얼 스튜디오를 재시작하면 프로젝트 폴더에서 .csproj와 .sln 파일이 생성되는것을 확인할 수 있다.

 

 

 

 

반응형
반응형

 

 

namespace

- 특정 영역에 이름을 붙여주기 위한 문법적 요소

- namespace가 다르면 같은 이름의 선언이 허용된다.

- 여러 외부 라이브러리 사용 중 발생하는 문제를 해결하기 위해 만들어졌다.

- namespace는 다른 namespace 안에 삽입될 수 있다.

- namespace의 별칭 지정이 가능하다.

 

namespace 예제

#include <iostream>

namespace A
{
    void Func()
    {
        std::cout << "Namespace A : Func()" << std::endl;
    }
}

namespace B
{
    void Func()
    {
        std::cout << "Namespace B : Func()" << std::endl;
    }
}

void main()
{
    A::Func();
    B::Func();
    
    //결과
    //Namespace A : Func()
    //Namespace B : Func()
}
  • 위의 예제에서 ::을 범위지정 연산자라고 한다.

 

namespace 중첩 예제

#include <iostream>

namespace A
{
    int num = 0;
    
    namespace B
    {
        int num = 1;
    }
    
    namespace C
    {
        int num = 2;
    }
}

void main()
{
    std::cout << A::num << std::endl;
    std::cout << A::B::num << std::endl;
    std::cout << A::C::num << std::endl;
    
    //결과
    //0
    //1
    //2
}

 

 

namespace 별칭 지정 예제

#include <iostream>

namespace A
{
    namespace B
    {
        int num = 1;
    }
}

void main()
{
    namespace AB = A::B;
    std::cout << AB::num << std::endl;
    
    //결과
    //1
}

 

 

 

 

using

- namespace에 선언된 모든것에 대해 namespace 지정의 생략을 명령한다.

- 편리함은 증가하지만 무분별하게 사용하면 충돌이 발생할 확률이 상대적으로 높아진다.

 

using 예제

#include <iostream>
using namespace A;
using namespace C;

namespace A
{
    int num = 0;
    
    namespace B
    {
        int num = 1;
    }
	
    namespace C
    {
        int num = 2;
    }
}

void main()
{
    std::cout << num << std::endl;		//모호함으로 인해 에러 발생
    std::cout << B::num << std::endl;	//namespace A 생략 가능
    std::cout << C::num << std::endl;	//namespace A 생략 가능
}

 

 

 

반응형

'Stack > C++' 카테고리의 다른 글

C++ 연산자 오버로딩 (대입, 인덱스 연산자)  (0) 2021.12.26
C++ 연산자 오버로딩  (0) 2021.12.05
C++ friend  (0) 2021.12.05
C++ 다중상속  (0) 2021.11.22
C++ 멤버함수, 가상함수 동작원리  (0) 2021.11.17
반응형

 

 

※ firend의 개념을 모른다면 다음 포스팅을 먼저 숙지할 것.

 

C++ friend

friend 선언 - 접근지시자에 관계없이 모든 멤버의 접근을 허용하는 선언이다. ※ 그렇기 때문에, 클래스의 friend 선언은 객체 지향의 정보 은닉 개념에 위배된다. - friend는 사용되는 클래스에서 선

srdeveloper.tistory.com

 

연산자 오버로딩

- 사용자 정의 자료형(클래스)에 연산자를 재정의한다.

- operator 키워드와 연산자를 묶어서 함수이름을 정의하면 연산자 오버로딩이 이루어진다.

  • 예 : class operator+(const class& ref)

- 연산자 오버로딩은 멤버함수에 의한 연산자 오버로딩, 전역함수에 의한 연산자 오버로딩이 있다.

  • 멤버함수 연산자 오버로딩 : class.operator+(class)
  • 전역함수 연산자 오버로딩 : class.operator+(class, class)

 

 

  • 멤버함수, 전역함수 연산자 오버로딩 예제
#include <iostream>
using namespace std;

class OverloadingOP
{
private:
    int m_iNum1, m_iNum2;

public:
    OverloadingOP(int n1 = 0, int n2 = 0) : m_iNum1(n1), m_iNum2(n2) { }
    void ShowMember()
    {
        cout << m_iNum1 << " / " << m_iNum2 << endl;
    }
    //멤버함수 연산자 오버로딩
    OverloadingOP operator+(const OverloadingOP& ref)
    {
        return OverloadingOP(m_iNum1 + ref.m_iNum1, m_iNum2 + ref.m_iNum2);
    }
    //전역함수 연산자 오버로딩
    friend OverloadingOP operator+(const OverloadingOP& ref1, const OverloadingOP& ref2);
};

OverloadingOP operator+(const OverloadingOP& ref1, const OverloadingOP& ref2)
{
    return OverloadingOP(ref1.m_iNum1 + ref2.m_iNum1, ref1.m_iNum2 + ref2.m_iNum2);
}

void main()
{
    OverloadingOP op1(3, 4);
    OverloadingOP op2(10, 10);
    OverloadingOP op3 = op1 + op2;
    
    op3.ShowMember();
    
    //결과 : 13 / 14
}

 - 전역함수로 연산자 오버로딩을 할 시, 해당 클래스의 멤버에 접근할수 있어야하므로 friend 선언을 해준다. (friend 키워드의 적절한 사용예)

 

 

 

연산자 오버로딩 주의점

- 연산자 오버로딩이 멤버함수, 전역함수로 둘 다 존재할 경우, 멤버함수로 오버로딩된 함수가 우선시되어 호출되므로, 특별한 경우가 아니라면 멤버함수 기반으로 연산자 오버로딩을 하는것이 좋다.

- 매개변수의 디폴트값 설정이 불가능하다.

- 연산자의 우선순위와 결합성은 바뀌지 않는다. (연산자가 지니는 우선순위와 결합성은 그대로 따라간다.)

 

 

 

단항연산자의 오버로딩

- 단항연산자(++, --)는 매개변수가 없다.

  • 멤버함수 연산자 오버로딩 : class.operator++()
  • 전역함수 연산자 오버로딩 : operator++(class)

- 단항연산자의 전위, 후위 구분은 int로 구분한다.

  • 전위 : operator++()
  • 후위 : operator++(int)

  ※ int는 데이터를 전달하는 뜻이 아닌, 단순히 전위와 후위를 구분하기 위해서 사용하는것이다.

 

 

  • 단항연산자 오버로딩 예제
#include <iostream>
using namespace std;

class OverloadingOP
{
private:
    int m_iNum1, m_iNum2;

public:
    OverloadingOP(int n1 = 0, int n2 = 0) : m_iNum1(n1), m_iNum2(n2) { }
    void ShowMember()
    {
        cout << m_iNum1 << " / " << m_iNum2 << endl;
    }
    //전위
    OverloadingOP& operator++()
    {
        m_iNum1++;
        m_iNum2++;
        return *this;
    }
    //후위
    const OverloadingOP operator++(int)
    {
        const OverloadingOP returnValue(m_iNum1, m_iNum2);
        m_iNum1++;
        m_iNum2++;
        return returnValue;
    }
};

void main()
{
    OverloadingOP op(5, 10);
    (++op).ShowMember();
    (op++).ShowMember();
    
    //결과
    //6 / 11
    //6 / 11
}

 - C++가 ++(++obj)의 연산은 허용하되 (obj++)++를 허용하지 않는 연산특성을 가지고 있으므로 후위증감연산자의 경우 반환값을 const로 지정한다.

 

 

 

 

단항연산자의 오버로딩 시 교환법칙의 문제 해결하기

- 교환법칙 : A + B와 B + A의 결과가 서로 같음을 뜻한다. 즉, 연산자를 중심으로 한 피연산자의 위치는 연산 결과값이 같다는 법칙이다. (곱셈, 덧셈 연산이 있음)

- 자료형이 다른 두 피연산자를 대상으로 연산을 해야하는 경우, 형 변환으로 하여 자료형을 맞춘 다음에 연산이 이루어져야한다.

- 연산자 오버로딩을 이용하면 위와 같은 규칙에 예외를 둘 수 있다.

 

 

  • 교환법칙 예외두기 예제
#include <iostream>
using namespace std;

class OverloadingOP
{
private:
    int n;

public:
    OverloadingOP(int x) : n(x){ }
    void ShowMemver()
    {
        cout << n << endl;
    }
    //이 오버로딩은 OverloadingOP * int만 허용한다.
    OverloadingOP operator*(int i)
    {
        return OverloadingOP(n * i);
    }
    //이 오버로딩은 int * OverloadingOP만 허용한다.
    friend OverloadingOP operator*(int i, OverloadingOP& ref);
};

OverloadingOP operator*(int i, OverloadingOP& ref)
{
    return OverloadingOP(ref.n * i);
    //or
    return ref * i;
}

void main()
{
    OverloadingOP op1(5);
    OverloadingOP op2 = op1 * 2;
    OverloadingOP op3 = 2 * op1;
    
    op2.ShowMemver();
    op3.ShowMemver();
    
    //결과
    //10
    //10
}

 - 멤버함수의 형태로 오버로딩을 하게되면, 멤버함수가 정의된 클래스의 객체가 오버로딩 된 연산자의 왼편에 있어야 컴파일이 가능해진다.

 - 우측에 클래스의 객체를 둔 연산이 필요할 때에는 전역함수의 형태로 오버로딩을 해야 컴파일이 가능해진다.

 

 


 

C++ 연산자 오버로딩 (대입, 인덱스 연산자)

※ 연산자 오버로딩 기본 개념 참고 C++ 연산자 오버로딩 ※ firend의 개념을 모른다면 다음 포스팅을 먼저 숙지할 것. C++ friend friend 선언 - 접근지시자에 관계없이 모든 멤버의 접근을 허용하는 선

srdeveloper.tistory.com

 

 

 

반응형

'Stack > C++' 카테고리의 다른 글

C++ 연산자 오버로딩 (대입, 인덱스 연산자)  (0) 2021.12.26
C++ 네임스페이스(namespace), using  (0) 2021.12.12
C++ friend  (0) 2021.12.05
C++ 다중상속  (0) 2021.11.22
C++ 멤버함수, 가상함수 동작원리  (0) 2021.11.17

+ Recent posts