
Abstract class vs Interface / 어떨 때 사용해야 할까?
2022. 8. 28. 18:32
Java
프로그래밍을 하다보면 추상 클래스(Abstract class)를 사용할 지, 인터페이스(Interface)를 사용할 지 고민이 될 때가 많다. 보통은 웬만하면 interface로 처리를 하려고 하는데, 어떨 때는 두 가지 경우 모두 사용해보며 더 나은 방식을 채택하기도 했다. 오늘은 강의를 듣다가 두 가지의 차이점에 대해 정리를 해주셔서 이 부분을 정리해보려 한다. 일반적으로 Interface를 Abstract class보다 선호한다 abstract class와 interface 모두 추상화를 하는 데에 사용이 된다. 차이점이 있다면 abstract class는 적어도 하나의 메소드는 추상화하여 메소드 바디가 없어야 하고, interface는 전체 메소드를 추상화하여 메소드 바디가 없어야 한다. 따라서,..

[Python Type Checking] 덕타이핑(Duck Typing)이란?
2022. 8. 17. 07:18
Python
Python으로 코드를 작성하는데, 하도 현업에서 OOP로만 코드를 작성하다보니 코드를 작성할 때에 interface나 abstract class와 비슷한 구문을 계속해서 찾기 시작했다. 그런데 작성하다보니 Java처럼 작성할 수 없고, 한계점도 들어나고 했다. 덕타이핑이란? 그래서 알아보니 Python과 같은 동적타입의 언어의 성질과는 다르다는 것을 알 수 있었다. Python에서는 덕타이핑(duck typing) 이라는 개념을 사용한다. 아래의 내용을 참고하면 된다. “If it walks like a duck, and it quacks like a duck, then it must be a duck.” (There are other variations). 즉, Python은 본질적으로 다른클래스라도..

PyMySQL을 이용하여 Python과 MySQL를 연동하기
2022. 7. 30. 13:32
Python
Python에 MySQL을 연동하는 방법은 두 가지가 있습니다. 오늘은 그 중에 PyMySQL을 이용하여 데이터를 처리하는 방법에 대해 알아보겠습니다. 1. PyMySQL 다운받기 우선 PyMySQL을 다운받습니다. pip install pymysql 2. MySQL 연동하여 데이터 가져오기 PyMySQL을 이용하여 데이터를 가져오는 방법은 아주 간단합니다. 아래의 중괄호 내용을 수정하고 중괄호를 제거하여 사용하면 됩니다. database = pymysql.connect(host={데이터베이스 주소}, port={데이터베이스 포트}, user={데이터베이스 사용자}, passwd={데이터베이스 비밀번호}, db={데이터베이스명}, charset='utf8') cursor = database.cursor(..

[Python] Dataframe toSql 할 때, unique key로 인한 sqlalchemy.exc.IntegrityError 발생
2022. 7. 29. 07:48
Python
오늘은 Python의 DataFrame을 활용하여 MySQL에 데이터를 넣을 때에, 정의해 둔 unique Key 스키마로 인해 에러가 나는 경우 처리하는 방법에 대해 알아보겠습니다. 우선 발생하는 에러는 아래와 같습니다. Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1782, in _execute_context self.dialect.do_executemany( File "/usr/local/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/mysqldb.py", line 193, in do_execu..

Spring Boot 프로젝트 생성하기
2022. 7. 15. 23:58
Spring
오늘은 Spring Boot 프로젝트를 만드는 방법에 대해서 알아보겠습니다. IntelliJ Ultimate를 사용하시는 분들은 에디터 자체에서 스프링 프로젝트를 생성할 수 있도록 기능을 제공하고 있어 손쉽게 프로젝트 생성이 가능합니다. 본 포스트는 저와 같이 학생 계정이 끝났거나 에디터에 돈을 쓰지 않은 IntelliJ Community를 사용하시는 분들을 위한 가이드입니다. Spring Initializr Spring Boot 프로젝트 생성을 간단하게 하기 위해 Spring Initializr를 제공하고 있습니다. 사실 대단한 것을 해준다기 보다는 UI 상에서 필요한 라이브러리들을 추가하고 간단하게 프로젝트를 생성해줍니다. Spring Initializr 링크 UI를 아주 간단하고 간편하게 만들어놔서..

(Java) JSON.simple을 이용하여 JSON 파일 읽고 쓰기
2022. 5. 30. 20:51
Java
간단한 JSON 파일을 읽어 파싱하는 예제를 해보겠습니다. 너무 간단하고 쉬운데 외우지는 않아서 매번 검색하기가 귀찮아서 정리를 해두어야겠습니다... 😢 개발 환경 개발 환경은 아래와 같습니다. Java 11 Gradle 6.8 Gradle 설정하기 이제 Simple JSON 라이브러리를 사용하기 위해 build.gradle 파일에 아래와 같이 dependency를 추가해줍니다. Simple Json Gradle dependencies { implementation 'com.googlecode.json-simple:json-simple:1.1.1' // ... } JSON 파일 작성하기 우선 Formatter를 통해 예쁘게 JSON을 작성합니다. 온라인 포매터 JsonFormatter를 이..

Head First Design Patterns 14. Compound Pattern
2022. 3. 25. 23:18
Design Patterns
컴파운드 패턴(Compound Pattern)의 정의 컴파운드 패턴(Compound Pattern)이란 하나의 디자인 문제를 해결하기 위해 여러 패턴을 함께 사용하는 것을 뜻합니다. MVC 패턴도 바로바로 컴파운드 패턴의 한 예시입니다. MVC 집중 탐구 Controller가 존재하는 이유 모델(Model)을 조작하는 임무를 뷰(View)에서 수행한다면, 뷰에서 두 가지 역할을 하게 되면서 코드가 복잡해지는 문제가 있습니다. 뷰를 모델에 너무 밀접하게 연관시켜야 한다는 문제가 있습니다. 이러한 경우, 재사용하기가 아주 힘들어집니다. 컨트롤러(Controller)를 사용하면 모델과 뷰의 결합을 끊어줄 수 있어서 나중에 확장하기가 용이합니다. MVC에 사용된 디자인 패턴 모델(Model) : 옵저버 패턴(O..

Head First Design Patterns 13. Proxy Pattern
2022. 3. 19. 23:26
Design Patterns
프록시 패턴(Proxy Pattern)의 정의 프록시 패턴(Proxy Pattern) - 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴 프록시 패턴에서 접근을 제어하는 활용은 아래와 같습니다. 원격 프록시(remote proxy) 프록시 패턴을 써서 원격 객체에 대한 접근을 제어할 수 있습니다. 다른 JVM에 들어있는 객체의 대변인에 해당하는 로컬 객체입니다. 가상 프록시(virtual proxy) 프록시 패턴을 써서 생성하기 힘든 자원에 대한 접근을 제어할 수 있습니다. 실제 객체 생성을 미루게 해 주는 기능을 제공하기도 합니다. 보호 프록시(protection proxy)를 써서 접근 권한이 필요한 자원에 대한 접근을 제어할 수 있습니다.

Head First Design Patterns 12. State Pattern
2022. 3. 18. 21:22
Design Patterns
스테이트 패턴(State Pattern) 예제 개선할 샘플 코드 reference code to refactor 위의 예제는 현재 상태에 따라서 수행하는 동작이 달라지는 Gumball Machine을 구현한 것입니다. 각 메소드는 아래와 같이 현재 상태에 따라서 수행하는 동작이 달라지게 됩니다. GumballMachine.java public void insertQuarter() { switch (state) { case SOLD_OUT: System.out.println("SOLD OUT"); break; case NO_QUARTER: state = HAS_QUARTER; System.out.println("Inserted quarter"); break; case HAS_QUARTER: System.o..

Head First Design Patterns 11. Composite Pattern
2022. 3. 13. 21:20
Design Patterns
컴포지트 패턴(Composite Pattern) 디자인 컴포지트 패턴(Composite Pattern)은 객체들을 트리 구조로 구성할 때 쓰는 디자인 패턴입니다. 우선, 객체는 트리 구조와 동일하게 1. Leaf 노드와 2. Leaf 노드가 아닌 Composite 노드가 있습니다. 이 두 객체는 상위 개념인 Component 클래스를 상속받고 재귀적인 구조를 구성합니다. 상위 클래스인 Component 클래스는 이 두 객체에서 구현해야하는 모든 함수를 포함하고 있습니다. Composite 클래스는 자식이 있는 구성요소의 행동을 정의하고 자식 구성요소를 저장하는 역할을 합니다. Leaf 클래스는 그 안에 들어있는 원소에 대한 행동을 정의합니다. 컴포지트 패턴(Composite Pattern) 예제 아래 다..

Head First Design Patterns 10. Iterator Pattern
2022. 3. 12. 22:39
Design Patterns
이터레이터 패턴(Iterator Pattern)은 언제 필요할까? code reference 두 개의 구성 객체에서 하나는 정보를 ArrayList 데이터 타입로 가지고 있고 하나는 정보를 Array 데이터 타입으로 가지고 있을 경우, 아래와 같이 각각 다른 loop 를 통해 탐색을 해야합니다. ArrayList - size() 함수 이용 Array - 배열에 들어있는 원소의 크기 변수 이용 Waitress.java public void printMenu() { ArrayList breakfastItems = pancakeHouseMenu.getMenuItems(); for (int i = 0; i < breakfastItems.size(); i++) { MenuItem menuItem = (MenuIt..

Head First Design Patterns 9. Adapter Pattern
2022. 3. 11. 20:47
Design Patterns
객체지향 어댑터(Adapter) 어댑터(Adapter)는 클라이언트로부터 요청을 받아서 업체에서 제공하는 클래스에서 받아들일 수 있는 형태의 요청으로 변환시켜주는 중개인 역할을 합니다. 어댑터 패턴(Adapter Pattern) 예시 reference code 레퍼런스 코드를 확인해보면 클라이언트에서 Turkey 를 기존에 제공하는 클래스인 Duck 으로 변환시켜주기 위해 TurkeyAdapter 코드를 추가하였습니다. TurkeyAdapter.java public class TurkeyAdapter implements Duck { Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } @Override public voi..