전체 글
텍스트파일 인코딩 확인 후 다르면 변경하기
텍스트파일 인코딩 확인 후 다르면 변경하기
2018.05.15현재 회사에서 제가 개발하는 프로그램이 MFC로 제작된 프로그램인데, 텍스트파일을 읽는데 유니코드로 되어있으면 에러를 뿜고 프로그램이 다운되는 상태가 발생되었습니다. 텍스트파일은 서버에서 MFC 클라이언트로 전송을 하기에 서버에 올릴 텍스트파일의 인코딩을 확인해서euc-kr이 아닐때 euc-kr로 바꿔줘야 했습니다. 그래서 두가지를 찾아보았습니다. 1. 텍스트파일의 인코딩 확인 2. euc-kr이 아닐때, euc-kr로 변환 먼저 텍스트파일인코딩 확인은 아래처럼 하면 됩니다. private static Encoding GetTextEncodingInfo(string path) { Encoding enc; using (StreamReader sr = new StreamReader(path, true)) {..
코딩 스타일
코딩 스타일
2018.02.13코딩 스타일 https://namu.wiki/w/코딩%20스타일 구글 가이드 https://google.github.io/styleguide/ 어릴 때 리코더 배울 때 운지법 배우셨죠? 그것처럼 코드를 짤 때는 코딩 스타일이 있습니다. (https://namu.wiki/w/코딩%20스타일) 간단하게 설명해 드리면 그냥 프로그래머 간의 프로토콜이죠. 컴파일 단에서는 문법, 논리만 맞으면 잘 작동하고 상용에서도 문제가 없지만, 코딩스타일이 파일마다, 함수마다 다르다면 유지보수 하기가 정말 힘들어집니다. 불가능해질지도 모르죠…. 보통 기획이 아닌 경우에는 그냥 회사에서, 프로젝트에서 코딩하는 스타일에 맞춰가시면 됩니다. (규모가 크다면 가이드가 있을 것이고 작다면 선임개발자를 따라가면 되죠) 그게 아닐 경우에..
[MFC] 다수의 컨트롤들을 관리하고자 할때
[MFC] 다수의 컨트롤들을 관리하고자 할때
2017.12.07네이버 지식인 활동을 하다가 괜찮은 질문을 발견했습니다. "mfc 체크박스를 에디트컨트롤로 입력받은 수만큼 체크하고 나머지를 비활성화시키고 싶은데어떻게 코딩해야 할까요?" 그래서 답변을 다음과같이 달아드렸습니다. "여러가지 방법이 있겠습니다만 이렇게 해보세요 우선 에디트컨트롤의 값을 숫자로 바꿔서 클래스의 멤버 변수에 저장시키세요. 이 값을 maxCheckCount라고 하겠습니다. 그리고 제한을 하고싶으시니 현재 체크되어있는 수를 변수로 둬야겠죠? 그 값을 checkCount라고 하겠습니다.(이 값은 0으로 초기화가 되어있어야 하겠죠?) 마지막으로 maxCheckCount에 도달하게되면, 나머지를 비활성화 시키고 싶다고하셨으니 그것들을 일괄적으로 활성화/비활성화 시키는 함수가 필요하겠네요. 그 함수는 C..
7. 후위식으로 이루어진 데이터 배열을 연산하여 결과를 추출
7. 후위식으로 이루어진 데이터 배열을 연산하여 결과를 추출
2017.11.261. 중위식을 전용 데이터 배열로 변환 2. 중위식으로 이루어진 전용 데이터 배열을 후위식으로 이루어진 전용 데이터배열로 변환 3. 후위식으로 이루어진 데이터배열을 연산하여 결과를 추출 후위식으로 이루어진 데이터배열을 연산하는 일만 남았습니다. 개발 계획서에 있지만, 다시한번 원리를 설명드리자면 이렇습니다. 후위식까지 처리가 되었다면 배열에는 다음과 같은 값들이 담겨있습니다. | 값,10 | 값,20 | 덧셈기호,+ | 위의 값이 후위표기이며, 풀어쓰면 다음과 같습니다. 10 20 + 스택을 이용하여 다음처럼 계산합니다. 1. 데큐의 끝까지 반복한다.2. 숫자일경우 스택에 삽입한다.3. 연산자일경우 스택의 두 값들을 뺀다 (차례대로 opr2, opr1이라합시다)* 스택은 후입선출의 구조이기 때문에 opr..
6. 중위식 데이터 배열 -> 후위식 데이터 배열로 변환
6. 중위식 데이터 배열 -> 후위식 데이터 배열로 변환
2017.11.261. 중위식을 전용 데이터 배열로 변환 2. 중위식으로 이루어진 전용 데이터 배열을 후위식으로 이루어진 전용 데이터배열로 변환 3. 후위식으로 이루어진 데이터배열을 연산하여 결과를 추출 이번 포스트에는 2번의 내용을 담습니다. 간단하게 설명을 드리자면 이 로직에는 두가지의 자료구조가 있습니다. 스택과 데큐입니다(데큐는 배열, 큐로 대체가 가능합니다) 처음부터 끝까지 순회 하면서, 조건이 없는 숫자들은 일단 데큐에 넣습니다. 그리고 연산자들은 스택에 넣습니다. 괄호는 왼쪽괄호는 스택에 넣고, 오른쪽 괄호가 나올때까지 스택의 값들을 데큐에 넣습니다. +, - 기호의 경우는 스택이 비거나, 왼쪽 괄호가 나올때까지의 값들을 데큐에 넣은 후 해당 위치의 기호를 스택에 넣습니다. * / 기호의 경우는 스택이 비거나..
5. 중위식 문자열 -> 전용 데이터 배열로 변환(파싱)
5. 중위식 문자열 -> 전용 데이터 배열로 변환(파싱)
2017.11.26자료구조들이 구현 되었으니, 이제 스택을 이용하여 식을 계산하는 함수를 구현하는일이 남았습니다. 우선 간략한 순서는 다음과 같습니다. 1. 중위식을 전용 데이터 배열로 변환 2. 중위식으로 이루어진 전용 데이터 배열을 후위식으로 이루어진 전용 데이터배열로 변환 3. 후위식으로 이루어진 데이터배열을 연산하여 결과를 추출 이 포스트에서는 1. 중위식을 전용 데이터 배열로 변환 하는 부분을 다룹니다. 중위식으로 이루어진 문자열을, 이전 포스트에서 작성하며 설명한 계산기 전용 데이터로 변환하여 배열에 담는과정인데, 설명드리자면 순서는 다음과 같습니다. 1. 문자열 전체를 처음부터 순회합니다1. 해당 위치의 문자의 타입을 판별합니다2. 문자의 타입이 마이너스 기호일 경우에는 유효성 검사를 통해서 음수표시인지, 연..
4. 계산기 함수에 이용하는 열거형과 데이터
4. 계산기 함수에 이용하는 열거형과 데이터
2017.11.26일반적으로 계산기는 문자를 파싱해서 중위표기된 식을 후위표기된 식으로 변환 후 각 문자를 판별해서 연산을 합니다. 제가 만드려는 계산기는 미리 데이터를 정의해서, 그 데이터의 값이 연산자인지, 값인지를 판별하여 후에 있는 수고를 조금 덜어주는 방식으로 만듭니다. 구조는 다음과 같습니다. type -> 값의 타입을 정의합니다.(계산기 열거형)value -> 값을 저장합니다.(문자열) 오직 생성자만 있는 구조체입니다. 계산기 열거형의 종류는 다음과 같습니다. value -> 값입니다. 계산기이므로 수가 들어갑니다.dot -> 점입니다. 소수점인경우입니다.operator -> 순서대로 곱셈,나눗셈,덧셈,뺄셈 기호입니다.Paren -> 왼쪽괄호, 오른쪽 괄호입니다.delimiter -> 구분자입니다etc -> ..
3. 데큐 구조체
3. 데큐 구조체
2017.11.26사실 스택 계산기에 데큐는 크게 필요 없습니다. 다만 개인적으로 배열의 Insert[0] 이게 귀찮기도 하고, 처음에 생각을 잘못해서 일단 구현을하고 조금씩 쓰면서 만들어 두었습니다. 실제로 제가 구현하려는 계산기에 데큐 -> 배열로 100% 치환이 됩니다.(데큐, 배열의 자료구조를 아시는분들은 당연히 아시겠지만, 데큐 -> 배열로 치환은 다 됩니다) 일단 코드는 스택과 크게 차이가 없습니다. Pop할때 앞부분을 뺄지, 뒷부분을 뺄지만 정하게 되어있으며, 앞부분은 큐와 같고 뒷부분은 스택과 같습니다. 삽입은 오직 뒤에서만 이루어집니다. 그리고 추가로, 배열 데큐를 치환하는 연산을 추가했습니다. 12345678910111213141516171819202122232425262728293031323334353..
2. 스택 구조체
2. 스택 구조체
2017.11.23C++에서는 구조체와 클래스의 차이가 거의 없습니다. 구조체는 기본값이 public, 클래스는 기본값이 private인것 외에 차이는 거의 없다고 들었습니다. 그래서 보통 개념적으로만 구분을 했었죠. 클래스는 정말 객체지향의 의미로 하나의 객체의 요구사항들을 정의할때 이용하는것이었고, 구조체는 단순한 값들의 묶음(레코드?)을 이용할때만요(틀릴수도 있겠지만 개인적으론 그렇게 이용했습니다) 하지만 스위프트에서는 조금 다릅니다. 대표적으로 스위프트에서의 클래스는 참조, 구조체는 복사의 의미를 가지고 있습니다. 스위프트 클래스A를 B로 가져오면, B=A가 됩니다. 1234567891011121314151617181920212223242526public Class MyClass{ public var integer..
2. 스택 클래스
2. 스택 클래스
2017.11.22스택은 가장 기본적인 자료구조중 하나입니다. 가장 늦게 삽입한 값이 가장 빨리 나오는 구조로써, 이를 후입선출이라 합니다. A,B,C순서대로 입력을 하고 다시 출력을 하면 C,B,A가 나오는 구조입니다. 스위프트에서 구현할 스택에 필요한것들은 다음과 같습니다. 속성 stack -> 템플릿 배열입니다. 자료를 보관합니다.length -> 스택이 가지고있는 값의 수를 나타냅니다. 사실 Swift에 자체적인 count가 있지만, 개인적으로 따로 만들어 씁니다. 연산 Push -> 스택에 값을 삽입할때 이용합니다. 스택의 크기가 반환됩니다.Pop -> 스택의 맨 마지막 값을 제거하는 동시에 반환합니다.IsEmpty -> 스택이 비어있는지를 확인합니다. 주로 반복작업을 할때 호출합니다.GetLength -> 스택..
1. 개발 계획(수정)
1. 개발 계획(수정)
2017.11.21금일부터 스위프트를 이용한 IOS 앱 개발 스터디를 시작했습니다. 스터디에서 서로의 실력과 페이스를 맞추기 위하여, 연습용 간단한 앱을 선정하여 만들어보기로 했습니다. 제가 잽싸게 계산기를 만들겠다고 선점을 해서 간단한 계산기 프로젝트를 맡았습니다. 개인적으로 언어를 처음 익힐때 예제를 따라하지 않고, 항상 남들 "Hello, World!" 치듯이 저는 기념비적으로 계산기를 만들어 봅니다. 개인적으로 책을 따라하면 재미가 없더라구요.. 본론으로 가보자면 거창하게 코코아 프레임웍까지 공부할 목적은 아니고, (물론 당연히 UI구현하면서 필수적이지만, 계산기 UI는 정말 간단하기에..) 스택을 이용한 계산기 라이브러리를 구현 후 그것을 IOS용 프레임웍인 코코아 프레임웍으로 이식할 생각입니다. 급하지않은 목표..
메서드 체이닝?
메서드 체이닝?
2017.11.19Method Chaining 메서드를 연속적으로 사용하는 패턴입니다. "http://herohjk.com/" 다음과 같은 URL을 대문자로 변환하고, 순수하게 도메인 주소만 가져오고싶을때, 아래와같이 코드를 만들 수 있습니다. (짬뽕문법입니다 수도코드정도로 이해해주시면됩니다) 123456789101112131415//herohjkUrl = "http://herohjk.com/" String GetDomainToUpper(String herohjkUrl){ String herohjkUrlUpper = herohjkUrl.toUppercase(); // "HTTP://HEROHJK.COM/" String herohjkUrlReplaceSlash = herohjkUrlUpper.Replace("/",""); ..