[Kotlin] 봉인된 클래스(Sealed Class)와 봉인에 대하여
·
Language/Kotlin
1. 시작모두가 잘 알고 사용하고 있는 클래스와 상속을 이용한 다형성은 Open-Closed Principal의 기본이자 단순한 구현에서 벗어나 각 클래스들에 명확하고 분명한 책임을 부여하는데 이점이 있다. 하지만 높은 확장성은 인터페이스나 추상 클래스를 사용해 결과로 받은 객체가 내가 정의한 서브타입임을 보장할 수 없음을 의미하기도 하다. 이러한 구조를 '제한 없는 계층구조(non-restricted hierarchy)'라고 하며, 아래와 같이 작성할 경우 else 구문이 강제된다.abstract class Resultclass Success(val data: String) : Result()class Failure(val exception: Throwable) : Result()// 'when' ex..
[Kotlin] 다양한 형태의 객체(object, companion, data, constant)
·
Language/Kotlin
1. 시작'클래스의 인스턴스(instance)'라는 간단명료한 정의에서 시작하여, '상태를 가지고 행동을 수행하며, 책임을 지고 다른 객체와 협력하는 프로그램의 구성 단위'라는 보다 능동적인 정의까지. 개발자들에게 객체에 대한 개념은 이제는 조금 친숙해지기도 했지만 여전히 그 개념을 충분히 이해하고 살려서 프로그래밍하는데는 어려움을 겪고 있다고 생각한다. 클래스와 객체를 '설계도-실체'의 관점으로 바라봤을 때, 객체를 생성할 수 있는 가장 간단한 방법은 다음과 같다.class DaFaNew// Hi~ 데페뉴~val a = DaFaNew() 하지만 다양하고 복잡한 현실과 마찬가지로, 객체 역시 다양한 목적과 용도로 만들어질 필요성을 갖고 있으며 오늘은 이를 지원하는 몇 가지 수단들을 알아본다. 2. 누구냐..
[Kotlin] 데이터 묶음을 표현하는 Data Class
·
Language/Kotlin
1. 시작클래스 명칭에서 드러나듯이 '데이터 자체'를 표현하기 위해 만들어진, 그리고 그렇게 사용하는 Data class에 대해서 알아본다. 2. 누구냐 넌클래스 명 앞에 data 제어자를 사용해 정의하는 코틀린의 Class 중 하나로, 코틀린의 철학 중 하나인 실용성(Pragmatic)이 강하게 반영된 결과물 중 하나다. 다시 말하면, 어떤 점에서 실용성을 만족시키고 있는가를 이해하는 것이 'data class'를 이해하는 가장 중요한 키라고 생각한다. 대규모 시스템의 안정적인 운영과 용이한 유지보수를 위해 활성화된 ‘객체지향’이라는 하나의 규약을 지켜내기 위해 Java 진영에서 만들어진 문화는, 결국 개발자에게 반복적인 노동을 요구하게 된다. 특히 객체의 내부 상태를 직접 노출하지 않고 캡슐화하기 위..
[동시성 제어 - 1] Java가 제공하는 Lock
·
Language/Java
1. 동시성 제어 왜 필요한 것일까?한정된 자원을 가장 효과적으로 사용해 낭비를 줄이는 경제적 효율성의 원리는 어김없이 서버에도 적용된다. 수 백, 수 천만에 이르는 사용자들의 요청을 1:1로 순차적으로 대응하는 것은 극히 비효율적이고 생산성이 떨어지기 때문에, 요청에 유연하게 대응하기 위해서는 '동시성'은 필연적으로 수반되어야 한다. 요청에 최적의 응답시간을 보장하기 위해 클라이언트 요청마다 스레드를 할당하거나 비동기 / 논블로킹 IO를 사용할 수 있는데, 이 때 공유자원(shared resource)에 대하여 서로 다른 두 스레드가 동시에 조회, 수정하는 일이 발생할 수 있다. 만약 공유 자원에 대한 접근을 제대로 제어하지 않는다면 API의 멱등성이 깨지고, 원치 않는 결과와 장애를 만들어낼 수 있기..
[오브젝트] Chapter 2. 객체지향 프로그래밍
·
개발서적/오브젝트
01. 영화 예매 시스템 영화 예매 시스템을 구현하면서 객체지향 프로그래밍에 대한 개념을 잡아본다. 1) 요구사항 정의 영화: 영화에 관련된 기본 정보(제목, 상영시간, 가격정보, ...) 상영: 실제로 관객들이 영화를 관람하는 사건 할인조건: 가격의 할인 여부(순서조건, 기간조건), 할인 정책에는 다수의 할인 조건을 설정할 수 있음 순서조건: 상영 순번을 이용해 할인 여부를 결정 기간조건: 영화 상영 시작 시간을 이용해 할인 여부를 결정 할인정책: 할인 요금을 결정, 영화당 하나의 할인 정책만 할당할 수 있음 금액 할인 정책: 예매 요금에서 일정 금액을 할인해주는 방식 비율 할인 정책: 정가에서 일정 비율의 요금을 할인해주는 방식 02. 객체지향 프로그래밍을 향해 진정한 객체지향 프로그래밍으로의 전환은..
[ 백준 14891번 ] 톱니바퀴
·
Algorithm/문제풀이
1. 문제 14891번: 톱니바퀴 첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 www.acmicpc.net 2. 풀이 단순 구현 문제이지만 문제에서 유의해야 할 점은 바로 톱니바퀴가 연쇄적으로 상태가 바뀌는 것이 아니라는 점이다. 이게 무슨 말이냐면 아래 이미지에서 1번 톱니바퀴를 회전시킨 결과에 따라서 2, 3, 4번 톱니바퀴의 회전이 결정되는 것이 아니라는 말이다. 즉, 아래 이미지와 같이 정적인 상태에서 회전 여부가 결정이 되고 최종적으로 한 번에 회전하게 된다는 것이다. 회전에 대한 결과가 다음 회전에 대해 영향을 미치지 않게 구현하기 위해서는 ..
[TDD] 01. TDD(Test-Driven Development) 시작하기
·
ETC/TDD
00. 들어가며 테스트 주도 개발(TDD, Test-Driven Development), 말 그대로 테스트가 메인이 되는 소프트웨어 개발 방법론으로 선 개발 후 테스트가 아닌, 선 테스트 후 개발 방식을 의미한다. TDD가 반드시 필요한가 혹은 유리한 것인가에 대한 다양한 포스트들이 존재하지만, 현재 필자는 TDD가 필요하다는 입장이다. 현재 서비스 운영회사를 다니고 있고, Legacy와의 전쟁이 이어지고 있는 가운데 리팩토링 과정에서 수정으로 인한 사이드이펙트를 발생시키지 않기 위해서는 TDD를 도입하는 것이 바람직할 것이라고 생각하기 때문이다. 또한 동료들이 TDD에 대한 관심도가 상당히 높은 편인데, 스스로 많이 부족하다고 생각하여 본격적으로 TDD에 대한 공부도 함께 하고자 한다. 다른 카테고리의..
스택(Stack)
·
Computer Science/자료구조
개요 스택 자료구조에 대해서 알아본다. 스택(Stack)이란? 스택은 데이터를 저장할 객체와 객체에 적용할 수 있는 연산을 함께 정의한 추상 자료형으로써, 앞으로 다룰 큐(Queue), 데크(Deque)와 같이 자료 구조 형태에 이름이 붙었다는 것에서 큰 의의를 갖는 자료형이다. 스택은 너무나도 잘 알려져 있기에 간단하게 특징을 살펴본다. 위 이미지에서 6개의 선으로 간단하게 표현해서 알아보기 힘들 수는 있지만, 아래 용어정의들을 통해서 스택의 개념을 온전히 이해할 수 있을 것이라 생각한다. 1. LIFO(Last In First Out) 스택은 한쪽 끝에서만 자료를 넣고 뺄 수 있는데, 가장 늦게 들어간 자료가 가장 먼저 나오게 된다. 2. TOP 한쪽 끝에서만 데이터 입출입이 발생한다고 하였는데, 스..
[ 백준 2842 ] 집배원 한상덕
·
Algorithm/문제풀이
1. 문제: https://www.acmicpc.net/problem/2842 2842번: 집배원 한상덕 문제 상덕이는 언덕 위에 있는 마을의 우체국에 직업을 얻었다. 마을은 N×N 행렬로 나타낼 수 있다. 행렬로 나뉘어진 각 지역은 우체국은 'P', 집은 'K', 목초지는 '.' 중 하나로 나타낼 수 있다. 또, www.acmicpc.net 2. 풀이 문제의 핵심 조건은 아래와 같다. 1) 상하좌우 뿐만 아니라 대각선으로도 움직일 수 있다. 2) 방문하는 장소들 중 고도의 최고점과 최저점의 차이를 '피로도'라고 하며 이를 최소화 해야한다. 대각선을 추가하는 것이야 방향을 설정해주는 dy, dx 배열만 추가로 설정해주면 되는데 피로도를 최소화하기 위해서는 어떤 방법을 써야할 것 인가? 지도에서 주어진 모..
[ 백준 2504 ] 괄호의 값 - Stack
·
Algorithm/문제풀이
1. 문제: https://www.acmicpc.net/problem/2504 2504번: 괄호의 값 4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 www.acmicpc.net 2. 풀이 Stack을 응용한 대표적인 문제를 꼽으라면 단연 괄호와 관련된 문제라고 할 수 있다. 괄호의 쌍이 올바르게 되어 있는가를 판단할 때 스택의 특성을 가장 적극적으로 활용할 수 있는데, 여는 괄호는 스택에 넣고 닫는 괄호는 스택에서 pop을 해 쌍을 확인함으로써 풀이할 수 있다. 문제 해석에 앞서 잠시 올바른 괄호의 쌍인가를 확인하는 코드를 정리하고 간다. // '()' 소..