본문 바로가기

전체 글112

#4. 스트레티지 패턴 (Strategy Pattern) 스트레티지 패턴은 행위를 클래스로 캡슐화하여 동적으로 바꿀 수 있게 해주는 패턴이다. 이번 포스트에서는 귀납적으로 코드를 살펴보겠다. public class DuckSimulator { public static void main(String[] args) { Duck mallard = new MarllardDuck(); mallard.performQuack(); // 꽥꽥 mallard.performFly(); // 난다! // 캡슐화된 행위를 바꾸는 부분 mallard.setFlyBehavior(new FlyNoWay()); mallard.setQuackBehavior(new SQuack()); mallard.performQuack(); // 삑삑 mallard.performFly(); // 날지 못해.. 2021. 1. 19.
#3. 컴포지트 패턴 (Composite Pattern) 컴포지트 패턴은 복합 객체와 단일 객체를 클라이언트에서 구별없이 다루게 해주는 패턴이다. (일종의 일반화를 위한 인터페이스를 정의) OCP(Open-Closed Principal)을 준수하기에 용이하다. (변화에는 닫혀있고, 확장에는 열려있다.) public class Computer { private Keyboard keyboard; private Body body; private Monitor monitor; ... } 위와 같은 코드는 확장에 용이하지 못하다. 그 이유는 Keyboard, Body, Monitor의 공통된 타입이 존재하지 않기 때문이다. (컴퓨터라는 전체 시스템의 부분집합이라는 공통점이 존재함에도 불구하고) 단점 : 공통점(부분집합)으로 묶은 인터페이스에 공통되는 기능들은 메소드 멤.. 2021. 1. 19.
#0. Linux 환경변수에 관련된 총 정리 1. '~' 의 의미 /Users/사용자명/ : 사용자의 홈 디렉터리를 의미한다. 2. ls -a list all 옵션을 의미한다. 홈 디렉터리에서 환경변수를 추가해주기위한 .bash_profile 파일이 있을 것이다. 만약 존재하지 않는다면 touch .bash_profile 명령어를 통해 새로 생성해주자. 3. vi .bash_profile vi 에디터를 통해 환경변수를 관리하는 파일을 수정한다. vi 에디터는 일반 에디터와 다르게 편집모드와 명령모드로 구분된다. 기본적으로 명령모드이며 편집모드에 진입하려면 i (insert)를 눌러야 한다. 반대로 명령모드로 돌아오려면 esc를 누르면 된다. 명령모드 상태에서 명령어를 쓰려면 : 를 쓴다. 그후 명령어들을 쓴다. 주로 쓰는 명령어는 q(그냥 종료),.. 2021. 1. 4.
#5. 덕 타이핑 (Duck Typing) 필자는 스트래티지 패턴을 공부하던 도중 인터페이스를 사용하는 예제를 보았다. 그러자 갑자기 의구심이 들었다. 파이썬에는 인터페이스가 없나?? 그래서 바로 구글링을 했다. 그리고 다음과 같은 답변을 보았다. 파이썬이 다중 상속이 가능한 것은 알고있었지만 덕 타이핑? 이라는 말은 처음 들어봤다. 그래서 바로 또 서칭서칭! Duck Typing - 'If it walks like a duck and it quacks like a duck, then it must be a duck' 해석해보면 '오리처럼 걷고, 오리처럼 꽥꽥거리면, 그것은 틀림없이 오리다.' 라는 뜻입니다. 그렇다. 필자는 오리를 매우 좋아한다. 그게 중요한게 아니라 파이썬은 객체의 타입보다 행위를 더 중요하게 여긴다는 의미이다. 어떤 의미인지.. 2020. 12. 29.
#4. 추상 클래스 (Abstract Class) 디자인 패턴을 공부하면서 구체화 되어 있는 것 보다 고수준이든 저수준이든 추상화된 것에 의존하라는 원칙을 알게 되었다. 그러나 대부분의 디자인 패턴 포스트를 확인해보면 자바로 설명이 자주 쓰여있어서 필자는 파이썬에 추상 클래스가 없는지 궁금했다. 그리고 오늘도 열심히 서칭과 뜨거운 밤을 보내고 있다. 그리고 파이썬에도 추상 클래스가 있다는 사실!.. 그러나 기본적으로 제공되는 것은 아니다. 역시나 import를 해야한다는 사실.. 그래도 있다는 것에 감사하고 열심히 포스팅을 해보려 한다. 일단 필자가 생각하는 추상 클래스의 필요성에 대해 말을 해보자면.. 1. 특정 개념을 추상화 및 일반화하는데에 유리하고, 2. 추상 클래스에 속해 있는 추상 메소드는 반드시 구현(오버라이딩)을 해야하므로 만약에 무조건 .. 2020. 12. 28.
#0. closeEvent 다이얼로그를 띄운 상태에서 해당 다이얼로그를 띄우는 버튼을 누르면 중복되서 띄워지는 현상이 발생했다.. -_-;; 그래서 혼자 예외처리를 한 결과.. if not self.dialog_legend: DialogLegend(....) 다이얼로그 객체가 존재하지 않은 경우에만 띄우도록 예외처리를 했다. 그랬더니 문제가 발생했다. 중복되는 현상은 방지할 수 있었지만, 창을 닫고나서 두 번째부터 창을 띄울 수 없게 된 것이다. 이는 다이얼로그 객체가 남아있게 때문에 해당 조건문을 만족시키지 않기 때문이었다. 그렇다면 해당 객체를 없애냐? 그렇게 되면 이벤트가 발생하지 않는 좀비상태로 빠져버리고 말것이다.. 그 순간! 옆에 계신 선배님이 팁을 주셨다. closeEvent class DialogLegend(QDia.. 2020. 12. 28.