More Programmings

싱글턴: 객체를 하나만 만들 수 있는 클래스 클래스를 싱글턴을 만들면 클라이언트를 테스트하기 어려울 수 있음. JDK1.5 이전 싱글턴 구현 방법기본: 생성자는 private 선언, 객체는 static 멤버 이용1. 정적 멤버는 final로 선언- private static final로 생성된 field는 초기화시 한 번만 호출됨2. public으로 선언된 정적 팩터리 메서드 이용- getInstatnce라는 메소드를 이용하여 항상 같은 객체에 대한참조를 반환하도록 함.(이것 이외의 객체 생성 불가) 팩터리 메서드 사용시 장점1. api를 변경하지 않고도 싱글턴 패턴을 포기하는 것이 가능- 스레드마다 별도의 객체를 반환하도록 팩터리 메서드 수정하는 것도 간단2. 제네릭 타입 수용이 쉬움(규칙 27)- 하..
인자가 많은 클래스의 경우 전진적인 생성자를 이용해서 클래스를 생성할 수 있음 class A{ A(){} A(int a){}; A(int a, int b){}; A(int a, int b, int c){}...} 인자가 많을 경우 인자 별로 생성자를 생성해주어야 함.이 때 인자를 주는 순서가 달라지면 오류가 발생하기 때문에 주의할 필요성이 생김(코딩이 어려움 및 해석이 어려운 코드의 생성) Setter getter 이용시 일시적으로 code의 일관성이 깨어져버리는 결과가 발생- 매번 setting 시 일관성이 깨짐 Builder에 정의된 method는 builder 내부에서 사용하면 됨.
Class 정의시 방법1. 생성자 생성2. 멸도로 펙터리 메소드를 이용하여 생성 정적 팩토리 메서드 사용시 장점1. 팩토리 메서드에는 이름이 고유의 이름이 존재하기 때문에 클래스 내부에서 인자 등을 쉽게 확인 가능2. 호출 시 마다 새로운 객체를 생헝할 필요 없음3. 반환 값의 하위 자료형의 객체 반환 가능4. 형인자 자료형 객체를 만들때 편함 정적 팩토리 메서드 사용시 단점1. 하위 클래스 생성 불가2. 다른 정적 메서드와 유사 이름 존재시 확인이 어려울 수 있음. 종류1. value of: 인자로 주어진 값과 같은 갓을 찾음2. of : value of를 간단히 만든 것3. getInstance: 인자로 기술된 객체의 반환4. newInstance: 다른 곳에 있는 객체의 반환5. getType: g..
최상위 클래스를 만들고 난 후 에 이를 파생한 클랙스 객체를 사용하는 경우에는 팩토리 함수를 사용해야 한다.ex)class Investment{...}; //클래스 형태의 최상위 클래스Investment* createInvestment(); //Investment class를 클래스 객체로 동적 할당 후 그 포인터 반환delete createInvestment; //객체를 해제 객체 해제시 중간에 return 문이 들어가있는 경우 문제가 발생할 수 있음.따라서 이는 자원이 누수될 수 있는 문제를 방생 시킬수 있음.해결방법1. auto_ptr: 포인터와 비슷하게 동작하는 객체(스마트 포인터), 가리키고 있는 대상에 대해 소멸자가 자동으로 delete를 불러주도록 설계사용 방법 void f() { std::..
객체를 복사할 때 기존 클래스 내부에 있는 함수까지 모든 부분을 복사를 해주어야 한다.클래스가 상속한 기본 클래스의 복사함수, 해당 클래스의 데이터의 모든 부분을 복사해야 한다. *중요 사항- 객체 복사함수는 주어진 객체의 모든 데이터 및 모든 기본 클래스 부분을 빠뜨리지 말고 복사해야 한다.- 클래스의 복사 함수를 두 개 고현할 때 한쪽을 이용해서 다른 한쪽을 구현하려고 하면 안된다.
자기대입(self assignment): 어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것을 말함*px = *py;라는 구문의 경우 가리키는 대상이 같으면 자기 대입이 된다.(중복 참조) 자기 참조의 가능성이 높은 코드 예시 Widget& Widget::operator=(const Widget& rhs) //안전하지 않게 구현된 operator= { delete pb; //현재의 비트맵 사용을 중지 pb = new Bitmap(*rhs.pb); //rhs의 비트맵을 사용하도록 만듬 return *this; } *문제 되는 상황- operator= 내부에서 *this와 rhs가 같은 객체일 가능성이 있기 때문에 이를 검사해줄 필요가 있음. *해결방법1. 일치성 검사(identity test) Wid..
int x, y, z; x = y = z = 15; //대입이 사슬처럼 이어짐 좌변 인자의 좌변 객체를 반환하게 만들어야 한다. class Widget { public: Widget& operator+=(const Widget& rhs) { return this; } Widget& operator\(int rhs) //대입 연산자의 매개변수 타입이 일반적이지 않은 경우에도 동일한 규약을 적용한다. { return *this; } }; * 중요사항- 대입 연산자는 반드시 *this의 참조자를 반환하도록 하게 한다.
가상 함수는 파생 클래스 쪽으로 내려가지 않는다.(본 클래스에서 처리를 해야한다)기본 클래스 생성자는 파생 클래스 생성자보다 앞서서 실행되기 때문에 기본 클래스 생성자가 돌아가고 있는 경우 파생 클래스 생성자는 아직 초기화가 되지 않음. class Transaction { public: Transaction() { init();} // 비가상 멤버 함수를 호출하고 있다. virtual void logTransaction() const = 0; private: void init() { logTransaction(); //이 비가상 함수에서 가상 함수를 호출하고 있다. } };*위 코드는 문제가 있는 코드 *정상 코드 class Transaction { public: explcit Transaction(co..
class의 소멸자에 예외를 발생하는 코드를 추가하는 경우 문제가 발생할 수 있다.문제상황 class DBConn { public: ... ~DBConn() { db.close(); } private: DBConnection db; }; db연결이 바로 닫히지 않거나 이미 닫혀 있는 경우 문제를 발생시킨다. 해결 방법 /* 프로그램을 바로 끝냄 */ DBConn::~DBConn () { try{db.close(); } catch (...) { 호출 실패 로그 std::abort(); } } /* 예외를 삼켜 버림 */ DBConn: ~DBConn () { try { db.close(); } catch(...) { 호출 실패 로그 } } *중요사항- 소멸자에서는 예외가 빠져나가면 안됨- 어떤 클래스의 연산..
Part란? - parts block 안에 위치한 것 - parts block 안에 1개 이상의 part 배치 불가 - parts 안에는 part만 추가 가능 part 구성 group { parts { part{} /* 최하단 레이어 */ part{} part{} part{} part{} part{} /* 최상단 레이어 */ } } - part는 선 또는 rectangle 등 다양한 것들을 추가할 수 있지만 button과 같이 다른 group을 통째로 넣는 것도 가능 group { parts { ... part { name: "part_name"; type: IMAGE; mouse_events: 1; repeat_events: 0; ignore_flags: NONE; clip_to: "another_pa..
플로쨔응
'More Programmings' 카테고리의 글 목록 (2 Page)