개발자의 길 58

[SQLite3][C++] database is locked 에러가 나올 때 ?

database is locked 에러가 나올 때 SQLite 개발을 하다 보면 저런 에러메시지를 만나거나 에러코드 SQLITE_BUSY (5) 를 반환받아서 DB 에 대한 읽기/쓰기 가 불가능한 경우를 본 적이 있을 것이다. 해당 에러코드가 리턴되는 경우는 DB 에 Write 작업을 하는 도중, Read/Write 를 하고자 접근을 한 경우이다. SQLite 는 기본적으로 Atomicity (원자성) 을 지키기 위해서 DB 에 write 작업이 발생을 할 경우 File 단위로 lock 을 걸어 버려서, 같은 Database 의 다른 table 에 접근한다 하더라도 lock 이 걸린 상태에서는 읽기/쓰기가 불가능하다. 혹시나 SQLite3 Lib 을 이용한 프로그램에서 저런 문제가 나온다면, 읽기/쓰기가..

[Design pattern] 추상 팩토리 패턴 ( Abstract Factory pattern )

팩토리 메서드 패턴과 유사해서 구분이 애매한 패턴인 추상 팩토리 패턴에 대해 소개하고자 한다. ( 팩토리 메서드 패턴 : makedotworld.tistory.com/44 ) 팩토리 메서드 패턴과 공통점으로는, 객체 생성을 하고자 할때 객체에 대한 구상 형식을 알 필요가 없이, 추상 형식만 알면 된다는 점이다. 예를 들면, 팩토리 메서드 패턴에서 PIzza 가 추상 형식이고, PotatoPizza 가 구상 형식이 된다. 하지만 방법에서의 차이점이 있다. 팩토리 메서드 패턴은 Client 가 Creator 를 상속하여 팩토리 메서드를 Override 함으로써 Client 가 원하는 객체를 만든다. 추상 팩토리 패턴은 interface 로 선언되어 있는 Creator 를 Implement 하여, 추상 형식의..

개발자의 길 2020.09.15

[Design pattern] 팩토리 메서드 패턴 ( Factory method pattern )

코딩을 하다 보면, 내가 만들지 않은 다른 클래스를 사용 할 때 맨 처음 하는 것은 객체 생성이다. 객체 생성을 하고, 해당 객체를 온전하게 사용하기 위해서는 해당 클래스에대한 설명을 듣고, 함수 사용 방법을 익힌 뒤 생성된 객체를 통해 함수를 호출할 것이다. 피자를 만든다고 예를 들면, 아래와 같이 말이다. Pizza *myPizza.= new PotatoPizza(); myPizza.prepare(); myPizza.bake(); myPizza.cut(); myPizza.box(); 여기까지는 좋다. 하지만 실수는 언제나 있기 마련이다. 1) Pizza 클래스를 사용하는 클라이언트가 prepare() 함수를 호출하는 것을 뺴먹었다면? 어떤 피자는 자르면 안 되는데 cut() 함수를 호출해 버렸다면? ..

개발자의 길 2020.08.30

[Effective C++] Chapter 5 구현

항목 26: 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 쓸데없는 생성자와 소멸자 호출을 막기 위해, 변수 정의는 최대한 늦추도록 하자. 또한, for 문 안에서 변수를 정의해야할 경우, 생성자/소멸자 호출과 대입연산 중 어느것이 더 자원을 많이 먹을지 고려한 다음 사용하자 항목 27: 캐스팅은 절약, 또 절약! 잊지 말자 구형 스타일의 캐스트가 아닌 C++ 스타일의 캐스트를 선호하자, 발견하기도 쉽고 의도파악에 도움이 된다. 가능한 캐스팅을 피하되, 어쩔수 없이 써야 된다면 함수 안에 숨길 수 있도록 하자. 그러면 최소한 사용자는 자신의 코드에는 캐스팅을 넣지 않을 수 있다. 항목 28: 내부에서 사용하는 객체에 대한 핸들을 반환하는 코드는 되도록 피하자 캡슐화 정도를 높이고, 상수멤버 함..

[Effective C++] Chapter 4 설계 및 선언

항목 18: 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 인터페이스는 일관성 있는 네이밍, 새로운 타입을 제공하여 함수 인자로 받도록 하여 잘못된 동작 사용 못하도록 하기, 자원 관리 책임을 사용자에게 주지 않기 등이 있다. shared_ptr 을 사용하면 자원에 대한 권한은 라이브러리에 있게 된다. 항목 19: 클래스 설계는 타입 설계와 똑같이 취급하자 클래스를 설계할 때는 기본 타입을 정의하는 것만큼 고민을 하자. 책에 정리되어 있는 모든 고려사항을 참고하여 클래스를 짜 보도록 하자. 항목 20: '값에 의한 전달'보다는 '상수객체 참조자에 의한 전달'방식을 택하는 편이 대개 낫다 함수를 호출할때 기본타입을 제외하고는 복사 생성자가 호출될 가능성을 없애기 위해, 상수객체 참조자..

[Effective C++] Chapter 3 자원 관리

항목 13: 자원 관리에는 객체가 그만! 스마트 포인터를 활용하여 별도로 객체 관리를 하지 않아도 되도록 만들자. std::auto_ptr, std::shared_ptr 을 활용 항목 14: 자원 관리 클래스의 복사 동작에 진지하게 고찰하자 RAII 객체를 복사할 때, 복사를 수행한 후 원래 객체가 해제가 되어 버리면 복사를 한 객체 쪽에서 해제 된 객체를 가질 가능성이 있다. 레퍼런스 카운터를 쓰거나 복사를 금지하는 방법을 활용하자 항목 15: 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자 캡슐화는 사용하기 편하고 실수를 줄이기 위해 만든 것이지, 반드시 데이터를 무조건 접근 금지하도록 하기 위한 것은 아니다. 암시적 변환이나 Get() 함수등을 통해 접근을 가능하도록 만들면 해..

[Effective C++] Chapter 2 생성자, 소멸자 및 대입 연산자

항목 5 : C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자.이유 : 컴파일러는 클래스의 생성자, 소멸자 등을 자동으로 만들어 내는데, 만약 멤버 변수로 포인터 등이 존재할 경우. 완전한 깊은 복사를 수행하지 않게 된다. 해결 : 클래스 선언시 생성자, 복사 생성자, 복사 대입 생성자, 소멸자, 이동 생성자( c++ 11) 이동 복사 생성자 (c++ 11) 등을 명시적으로 선언해두자. 항목 6 : 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자이유 : 구조적으로 복사되면 안되는 경우 ( 단 하나만 존재하는 클래스 등 ) 클래스를 사용하는 쪽에서 자동으로 생성된 복사 생성자를 이용해 버릴 수 있다. 해결 : 자동으로 생성되는 함수들을 private 로 선언하거나, =..

[C++] C++에서 문자열 줄단위로 받기

알고리즘 문제를 풀면서 Input을 벡터 파라미터로 주는것이 아니라 문자열로 주는 경우, 또는 문자열 자체를 처리하는 알고리즘인 경우에 C++로 풀어야 되는경우, 익숙하지 않으면 문자열을 읽는 부분에서부터 문제점이 생긴다. Input 42 3 4 5 6 8 2 4 1 2 31 1 2 31 1 4 *첫번째 값은 줄 수 N, 그다음부터 N개의 줄에 랜덤한 갯수의 값들이 들어온다. 위와같이 문자열이 주어지면 C++ 초보자의 입장에서 처리하기가 난감하다. cin 으로 처음 표준입출력을 배운 경우 공백과 개행문자를 무시해버리는 특성 때문에 어떻게 현재 라인을 구분해야할지 잘 모르게 되고, 다른 방법을 찾아보면서 getline() ,cin.getline() 등의 함수를 찾아보게 되는데 왜 또 그렇게 사용법은 많고 ..

개발자의 길 2018.09.29
반응형