정의부모 클래스에서 구현해야할 객체의 단계를 전체적으로 정의한다음, 자식 클래스마다 달라지는 단계에 대해서만 부모 클래스단에서 추상 메서드로 정의하여 자식클래스가 해당 메서드를 오버라이드할 수 있게 하는 패턴목적비슷한 개념을 가진 객체들의 중복되는 코드는 부모클래스에서 정의하기에 코드 길이가 줄어들며, 관리하기가 용이하다.해당 패턴을 사용하지 않을 경우class Coffee { fun make(): List { val result = mutableListOf() result.add("물을 끓입니다.") result.add("커피 원두를 내립니다.") result.add("컵에 따릅니다.") result.add("설탕과 우유를 넣습니다."..
정의 상태를 관리하는 Subject 객체가 자신을 구독한 Observer 객체들의 참조를 보관하고 있다가, 상태가 변경되면 등록된 Observer들의 공통 알림 메서드를 호출하여 변경 사실이나 변경된 데이터를 전달하는 행동 패턴목적Observer 패턴을 씀으로서 알림을 주는 객체는 마치 구독자 관리 시스템처럼 알림을 받는 대상의 참조값과 알림 기능의 호출 method만 가지만 된다.알림을 받는 객체는 알림을 주는 객체에게 알림을 받겠다고 요청만 하면, 알림을 주는 객체는 알림을 받겠다는 객체의 참조값만을 저장하고 관리하여 해당 객체들에게만 알림을 주는 함수를 호출하면 알림을 받는 객체들에게만 알림을 줄 수 있다. 코드전체 코드package designpatterninterface Observer { ..
정의프로그램 전체 관점에서 특정 클래스의 객체를 하나만 생성하고 그 하나의 객체를 여러곳에서 공통으로 사용하도록 하는 패턴해당 패턴은 특히 예외적으로 특정 언어 플랫폼에 따라서 구현법이 달라진다. 목적설정관리자, 로그 관리자, 캐시 관리자처럼 여러 객체를 두어 따로 존재할 필요없이 한 곳에서만 집중 관리가 필요한 경우생성자 호출하여 객체를 여러개 생성하여 필수 설정 내용이 각 객체마다 따로 관리되어 달라진다.프로그램 전체에서 동일한 설정을 요한다면 문제가 된다. 코드object ConfigManager { var timeout = 30 fun printConfig() { println(timeout) }}코틀린에서는 보통 object 문법을 활용하여 싱글톤 패턴을 구현한다.코..
정의빌더 패턴은 최종 객체 생성에 필요한 여러 설정값을 Builder 객체에 임시로 저장한 뒤, 그 설정값을 바탕으로 최종 목적 객체를 생성하는 패턴이다. 필요한 이유class Computer( val cpu: String, val ram: Int, val storage: Int, val gpu: String?, val wifi: Boolean, val bluetooth: Boolean)val computer = Computer("Intel i7", 32, 1000, "RTX 5070", true, true)각 값이 무엇인지 코드만 보고 바로 구분하기 힘들며, 매개 변수 순서도 틀릴 가능성 존재한다.(가독성 문제)선택항목이 많아지면 필요없는 값까지 어쩔 수 없이 null,..
정의공통된 업무 흐름은 부모 클래스에 두고, 해당 공통 업무 흐름 부분에서 객체 종류에 따라 달라지는 생성 부분은 자식 클래스가 부모의 팩토리 메서드를 오버라이하여 결정하는 디자인 패턴이다 필요한 이유abstract class Logistics { abstract fun deliverSequence()}class RoadLogistics : Logistics() { override fun deliverSequence() { checkOrder() prepareCargo() Truck().deliver() sendNotification() }}class SeaLogistics : Logistics() { override fun deli..
Git 이란분산 제어 버전 시스템이다.분사 제어 버전 시스템이란 전체 저장소의 로컬 복사본을 모든 팀 구성원의 컴퓨터에 저장한 다음, 로컬에서 커밋 분기 병합할 수 있도록 한 시스템이다.그래서 서버와 클라이언트간 동기화 한다는 느낌이고, 물리적 파일들 모두 동기화할 때 해당 파일들을 object 폴더 아래 저장 관리한다. Branch(분기)코드를 통쨰로 복사하고 원래 코드와는 상관없이 독립적으로 개발을 진행하는 것을 말한다.예를 들어, 개발자 2가 파일 2와 파일 4에 기능 추가 기능 및 수정한다고 하면 마스터 브랜치에서 새로운 브랜치를 생성한 다음 파일 2와 4를 추가 및 수정한다.(파란색 부분 Feature-2) 이때, 개발자 2이 건드는 작업은 서버에 저장된 원래 코드에 아직 반영되지 않았다.보라색..
단위 테스트란 무엇인가?단위 테스트는 코드의 가장 작은 기능적 단위를 테스트하는 프로세스특징코드 품질 보장을 위해 소프트웨어 개발의 필수 요소소프트웨어를 작은 기능적 단위로 작성한 다음 코드 단위별 단위 테스트를 작성하는 것이 소프트웨어 개발 모범 사례단계단위 테스트 코드(함수, 클래스 OR 메서드)를 선택접근 방식 선택: 수동 테스트 OR 프레임워크를 이용한 자동화된 단위 테스트테스트 환경 구축: test data, dependancy, mock objects 등 test를 실행하기위한 환경을 구축IDE(Integrated Development Environment) 를 활용하는 것이 필수테스트 케이스 사용 및 생성테스터는 테스팅 프레임워크와 테스트 케이스를 선택 및 실행한다면, 그 결과를 확인(버그가..
개요이번 시간에는 자바와 코틀린 언어를 성능, 개발편의성, 활용 측면에서 소개해드리도록 하겠습니다. 성능자바나 코틀린이나 컴파일 하면 자바 바이트 코드로 변환되고 그걸 jvm에 올려서 실행하는 단계에서는 성능상 그렇게 차이가 안 날 수는 있다. 다만, 결국 언어마다의 컴파일러가 다르기에 컴파일 단계에서는 성능상의 차이가 존재할 수 있다. 그리고 자바에서 코틀린 함수를 호출하는 것은 100퍼센트 가능하다고 장담할 수는 없으나, 코틀린에서 자바 코드를 호출하는 건 장담할 수 있다. 개발 편의성자바상대적으로 코드가 길고, Getter/Setter 등 보일러플레이트(Boilerplate) 코드가 많다. 런타임 시 NullPointerException 발생 위험이 있다.코틀린문법이 매우 간결하다. 코틀린 공식 ..
컴퓨터마다 실제 사용 가능한 메모리 크기가 다 다르다. RAM 크기도 다를 것이고, HDD/SDD의 SWAP 영역으로 할당된 메모리 크기도 다 다를 것이다. 이러한 메모리를 다룰때 범용 OS 나오기전에는 SW 개발시 이러한 물리 메모리를 직접적으로 핸들링을 하였다. 그래서 개발되는 SW 가 제품자체에 대한 메모리 의존성이 높았다. 그러나 범용 OS가 나타나고 메모리 자체에 대한 추상화가 가능해지다보니. 가상 메모리라는 개념이 나타났다. 가상 메모리가 나오고나서부터 앞에서 언급한 메모리 의존성이 사라졌고, 특히나 관리적 측면(보안)에서 매우 높은 효과를 보였다.가상 메모리 체계에서 먼저 따져야할 것은 관리의 최소 단위인 메모리 1바이트 이며, 해당 1바이트에 접근하기 위해 과거에는 32bit 주소 체계로..
물리적 메모리 분할 방식에는 두가지 방식이 있다.가변 분할 방식과 고정 분할 방식가변 분할 방식이란 프로세스마다 필요한 메모리 공간 만큼 할당해주고, 각 프로세스마다의 메모리 공간을 연속으로 할당하는 방식을 말한다. 이때, 필요한 메모리 공간 단위가 세그먼트라고 하며, 그 크기만큼 메모리 공간을 분할하는 작업을 세그먼테이션이라 한다.고정 분할 방식이란 메모리 공간을 일정한 크기만큼 나누고 프로세스마다 필요한 공간만큼 분배해주는 방식을 말한다.이때, 일정한 크기가 페이지이며, 그 크기만큼 필요한 공간을 나눈다는 개념을 페이징 이라 부른다. 메모리 공간을 분할해서 저렇게 할당해주는 이유는 프로세스마다 필요한 메모리가 다르므로 필요한 크기만큼 메모리 공간을 할당해줘야하기에 그렇다. 그리고 가변 분할 방식과 고..
