🏠 Home

모든 포스트를 최신순으로 확인해보세요.

128개의 포스트 태그별 보기 →

Set

Set에 대해 알아보자

Kotlin 범위지정 함수(apply, with, also, let, run)

apply, with, let, also, run 위와 같은 함수들을 범위지정 함수라고 한다. 위 함수들은 와 파라미터와 작동방식, 결과가 매우 비슷하기 때문에 많은 경우에 서로를 대체해서 사용이 가능하다.

Kotlin 함수형 프로그래밍

다중 패러다임언어 코틀린 코틀린은 과 패러다임을 모두 사용 가능한 언어이다. 이번 페이지에서는 가볍게 함수형 프로그래밍에 대한 개념과 코틀린에서 어떻게 사용하는지 간단하게 살펴본다.

HttpSession & Spring Session

`HttpSession`은 `Spring`이 아니라 `Tomcate`과 같은 `Servlet Container`가 생성하여 Spring에 주입한다. **Tomcat은 기본적으로 HttpSession의 구현체로 StandardSession을 사용한다.**

최단 경로

`최단경로` 문제란 **두 노드를 잇는 가장 짧은 경로**를 찾는 문제다. **가중치가 있는 그래프**(Weighted graph)에서는 가중치의 합이 최소가 되는 경로를 찾는것이 목적이다.

Ch12 요약(다형성)

챕터 12 `다형성`의 내용은 `객체지향 설계`에 대한 내용이라기 보다는 `상속이 다형성을 구현하는 메커니즘`에 대한 내용이다.

Java Stream API(1-1)

`Stream`을 사용하면 데이터를 `선언형`으로 처리할 수 있다. 여기서 `선언형`이란 의미가 와닿지 않는다면 **데이터를 'How(어떻게)' 처리하는지를 기술하는게 아니라 `What(무엇)`을 하는지를 기술하는 것이라고 이해하면 쉽다.**

Ch11 요약(합성과 유연한 설계)

`코드 재사용`과 관련하여 `상속`은 간편한 방법이지만 부모 클래스와 자식 클래스의 `결합` 때문에 변경에 불안정하고 유연하지 못하다.

Ch8 요약(의존성 관리)

6장까지 이르며 `자율적인 객체`, `캡슐화`, `응집도`, `결합도`에 대한 개념과 `책임 주도 설계` 에 따른 `책임 할당 방법`을 학습했다.

Ch5 요약(책임 할당하기)

이전 4장에서는 `캡슐화`, `응집도`, `결합도`를 설계 품질의 기준으로 삼고 `데이터 중심 설계`가 어떻게 `캡슐화`를 위반하면서 변경하기 어려운 설계가 되는지에 대해 살펴보았다.

Ch4 요약(설계 품질과 트레이드오프)

앞선 챕터를 통해서 우리는 객체지향 설계에 있어 `협력`, `책임`, `역할`을 가장 먼저 고려해야 하고, 그 중 `책임`이 가장 중요하다는 것을 알았다.

Ch3 요약(역할, 책임, 협력)

앞선 챕터에서는 간단한 `영화 예매` 코드를 통해서 `구현 관점`의 객체지향 설계에 대해서 배웠다. `캡슐화`, `상속`, `합성`, `다형성`, `추상화`, `메시지와 메서드`의 개념을 확인하고 `컴파일 타임 의존성`과 `런타임 의존성`을 다르게 함으로써 보다 ...

Ch2 요약(객체지향 프로그래밍)

`객체지향 프로그래밍`에서 사용되는 전반적인 주제들을 `영화 표 예매(할인 조건, 할인 정책)` 코드와 함께 대략적으로 설명한다.

Ch1 요약(객체, 설계)

`오브젝트`의 첫 챕터로써 간단한 `극장 표 판매` 코드를 프로세스와 데이터가 격리된 `절차 지향적 코드`에서 데이터와 프로세스가 통합된 `객체 지향적 코드`로 적절하게 리팩토링 하는 과정을 보여주며 객체 지향적인 설계란 무엇인가에 대해 보여준다.

디자인 패턴과 프레임워크

디자인 패턴과 프레임워크 애플리케이션을 설계하다 보면 어떤 요구사항을 해결하기 위해 과거에 경험했던 유사한 해결 방법을 다시 사용하는 경우가 있다.

일관성있는 협력

앞서 11장에서 구현한 `핸드폰 과금 시스템`의 요금 정책을 수정해야 한다고 가정하자. 지금까지 `기본 정책`에는 `일반 요금제`와 `심야 할인 요금제`의 두 가지 종류가 있었다. 이번 장에서는 `기본 정책`을 아래 표와 같이 4가지 방식으로 확장할 것이다. `부...

타입 계층의 구현

객체지향을 처음 접한 입문자들이 흔히 오해하는 부분이 을 동일한 것으로 간주하는 것이다.

그래프 (인프런 강좌)

`방향 그래프`는 이름에서 알 수 있듯이 `방향`을 가지고 있다. 여기서 방향을 표현하는 `(u, v)`는 노드 u로부터 노드v로의 방향을 갖는데, 무방향 그래프와 다르게 `(u, v)`와 `(v, u)`는 서로 다르다.

서브클래싱과 서브타이핑

`객체지향 프로그래밍에서의 타입`에 대해서 이해를 하기 위해서는 먼저 `프로그래밍 언어 관점에서의 타입`과 `개념 관점에서의 타입`을 함께 살펴볼 필요가 있다.

해슁(인프런 강좌)

`해쉬 테이블`은 `Dynamic Set`을 구현하는 효과적인 방법 중 하나이다. `적절한 가정` 하에서 평균적인 탐색, 삽입 삭제 시간은 `O(1)`을 갖는다. 하지만 보통 최악의 경우에는 `O(n)` 시간복잡도를 갖는다.

계약에 의한 설계

`인터페이스` 만으로는 객체의 행동에 관한 다양한 관점을 전달하기 어렵다. 우리에게 필요한 것은 `명령의 부수효과를 쉽고 명확하게 표현할 수 있는 커뮤니케이션 수단`이다. 이 시점이 되면 **_계약에 의한 설계(Design By Contract, DBC)_** 가...

Programmer 2020_괄호_쌍_L

알고리즘 문제에 자주 등장하는 `괄호 쌍 검증` 문제이다. 다만 기존의 문제들과 조금 다른 점이 있다면 이번 문제는 괄호 쌍이 총 `4 쌍` 이라는 점과 주어진 문자열이 괄호만으로 이루어져 있지 않는 `임의의 문자열`에서 괄호들을 검증한다는 점이다.

다형성

`다형성(Polymorphism)`이라는 단어는 컴퓨터 과학에서 **_하나의 추상 인터페이스에 대해 코드를 작성하고 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력_** 으로 정의한다. 간단히 말해서 다형성은 여러 타입을 대상으로 동작할 수 있는...

합성과 유연한 설계

`상속`과 `합성`은 객체지향 프로그래밍에서 가장 널리 사용되는 `코드 재사용` 기법이다. 상속이 부모 클래스와 자식 클래스를 연결해서 부모 클래스의 코드를 재사용하는데 비해 **_합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 ...

WAS(톰캣) 구조

몇몇 자료에서는 **_엄밀히 따지면 톰캣은 WAS가 아니다_** 라고 말한다.

상속과 코드 재사용

객체지향 프로그래밍의 장점 중 하나는 `코드 재사용`이 용이하다는 것이다. 전통적인 패러다임에서 코드를 재사용하는 방법은 코드를 복사한 후 수정하는 것이다. 객체지향은 조금 다른 방법을 취한다. **_객체지향에서는 코드를 재사용하기 위해 새로운 코드를 추가한다._...

Programmers(KAKAO) 방금 그곡

라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금 그곡' 서비스를 이용하곤 한다.

Programmers(KAKAO) 캐시

기본적으로 `LRU(Least Recently Used)`에 대한 지식이 필요한 문제이다. 나같은 경우 찾아보기 귀찮아서 예제 입출력을 보고 `캐시 내에서 더 많이 hit한 요소가 가장 오래 유지`하는 것으로 오해하여 `우선순위 큐`를 이용하여 접근을 하였다.

유연한 설계

확장 가능하고 변화에 유연하게 대응할 수 있는 설계를 만들 수 있는 원칙 중 하나는 `개방-폐쇄 원칙(OCP)`이다. 개방-폐쇄 원칙은 다음과 같은 문장으로 요약할 수 있다.

요약 정리

`의존성`은 `변경`과 관련이 깊다. 의존하는 대상(**_의존 객체_**)이 변경 될 경우 함께 변경 될 가능성이 바로 `의존성`이다.

Programmers(재귀/DP)_땅따먹기

2차원 배열의 `loop` 또는 `재귀`를 이용하여 해결이 가능하다. 또한 `시간 초과`를 피하기 위해 `메모제이션`을 활용해야 보다 효율적인 코드를 짤 수 있겠다.

Programmers(수학)_N개의_최소공배수

`수학` 알고리즘에서 자주 출제되는 `최소 공배수` 구하기 문제이다. 다만 이 문제는 배열 내의 모든 수의 최소공배수를 구하는 문제로써, 어떻게 보면 최소공배수 알고리즘 공식을 배열 요소들 모두에 적용해야 한다고 생각할 수 있다.

의존성 관리하기

잘 설계된 객체지향 애플리케이션은 작고 응집도 높은 객체들로 구성된다. **_작고 응집도 높은 객체란 책임의 초점이 명확하고 한 가지 일만 잘 하는 객체를 의미한다._** 이런 작은 객체들이 단독으로 수행할 수 있는 작업은 거의 없기 때문에 일반적인 애플리케이션의...

객체 분해

`추상화`의 목적은 복잡하게 얽히고 섥힌 문제에서 `공통점을 취하고 세부적인 사항은 생략`함으로써 인지과부화를 최소화하고 `문제 해결에 필요한 핵심`에 집중하는 것이다. 다시말해 한 번에 다뤄야 하는 정보의 수를 줄이기 위해 `본질적인 정보만 남기고 불필요한 세부...

메시지와 인터페이스

협력은 어떤 객체가 다른 객체에게 무언가를 __요청__ 할 때 시작된다. **_메시지는 객체 사이의 협력을 가능하게 하는 유일한 매개체이다._** 즉, 어떤 객체가 다른 객체에게 접근할 수 있는 유일한 방법은 바로 메시지를 전송하는 것 뿐이다.

Programmers(DFS)_타겟넘버

문제 해결의 실마리는 상당히 간단하다. 위 문제는 _+_ 또는 _-_ 로 __분기__ 되기 때문에 단순한 __for 루프__ 로는 해결하기 쉽지 않다.

Programmers_숫자야구

처음 문제를 보고서 약 2시간 가량 접근법이 떠오르지 않아 한참을 고민하다가 결국 다른 분들의 블로그를 보고 접근법을 참고하여 해결하였다.

2020 신년 계획

2019 회고록을 작성하면서 주 키워드를 `입사, 운동, 자기개발`로 꼽았다. 비슷한 맥락으로 신년 계획은 __업무, 운동, 자기개발__ 이라는 키워드로 작성해보려 한다.

2019년을 돌아보며

나의 20대 전반을 돌아봤을때 가장 큰 이벤트와 행복감을 느낀 해를 꼽는다면 올해가 아닐까 싶다. 그리고 1년간의 가장 굵직한 키워드 3개를 꼽는다면 `입사`, `운동`, `자기개발(학습)`이 되겠다.

책임 할당하기

앞 절에서는 __데이터 중심의 접근법__ 을 취할 경우 직면하게 되는 다양한 문제에 대해서 살펴보았다. 데이터 중심의 설계는 __행동보다 데이터를 먼저 결정__ 하게 되고 협력이라는 문맥을 벗어나 __고립된 객체의 상태에 초점__ 을 맞추기 때문에 캡슐화를 위반하...

캡슐화, 응집도, 결합도

앞선 챕터에서 __역할, 책임, 협력__ 의 관점에서 객체지향 설계를 하는것의 중요성을 살펴보았다.

역할,책임,협력

앞선 챕터에서 객체지향 프로그래밍을 구성하는 다양한 요소와 구현 기법을 살펴보았다. __클래스__ / __추상 클래스__ / __인터페이스__ 를 조합하여 객체지향 프로그램을 __구조화__ 하는 기본적인 방법과 상속을 이용해 __다형성__ 을 구현하는 기법을 소개...

객체, 설계

__객체지향의 사실과 오해__ 도서 1독 이후 개념적으로나마 객체지향 설계에 대한 맥락을 짚어보았다.

Reflaction 응용

지난 포스팅에서 __리플렉션__ 에 대한 기본적인 개념을 다루었다.

Java Reflaction(리플랙션)

최근 자바 웹 프로그래밍 기초를 학습하면서 Servlet, JSP를 지나 기본적인 Spring MVC 모델을 따르는 __미니 MVC 프레임워크__ 를 만드는 실습중이다.

자바 웹 개발자 로드맵

약 한 달이 넘게 개발 공부를 등한시 함에 따라 위기감을 다시 느끼고 의식적 학습과 연습을 위해서 다시금 동기부여를 받았다.

Framework/Library

면접에서도 단골질문이기도하고 피상적으로만 이해하고 있던 라이브러리와 프레임워크에 대해 이해하는 기회를 갖는다.

Gradle

기존 스프링 프레임워크를 사용하면서 빌드 도구로써 메이븐을 사용했었다. 단순히 디펜던시 라이브러리를 자동으로 다운로드 해주는 기능으로만 사용했던 빌드도구(그레이들)에 대해 학습해 본다.

GenericServlet

이전에 서블릿 클래스는 서블릿 인터페이스를 구현하고 서블릿 컨테이너에 의해 init(), service(), destory() 등의 메소드를 호출함으로써 메모리 로딩, 서비스 수행, 메모리 해제 등의 과정을 거치는 것을 알았다.

Servlet

웹 개발을 함에 있어 Http Servlet에 대한, 더 원론적으로 Servlet에 대한 이해가 많이 부족함을 느낀다.

Web Application Deploy (TOMCAT)

그동안 IDE에서만 웹 컨테이너(톰캣)을 구동함으로써 웹 어플리케이션을 실행하고 테스트하느라 실제 운영시 배포 방법에 대해서는 고민해 본적이 없다.

Http Protocol

웹 개발을 함에 있어 Http Servlet, Http Protocol 등 보다 원론적인 개념에 대해 많이 부족함을 느껴 다시 한번 정리하는 기회를 갖겠다.

Generic

컬렉션 프레임워크(List, Set)와 Map을 사용하면서 별 다른 생각 없이 많이 사용은 해왔지만 오픈소스나 다른 소스코드에서 표현되는 <T extneds Blah> 등의 확장, 제한된 제네릭스를 보면 지레 겁부터 먹거나 다른 소스코드를 찾아보기가 일쑤였다.

JVM(Java Virtual Machine)

`JVM`은 Java 책을 폈을 때 머릿말 혹은 가장 첫 단원에서 소개되지만 당장 프로그래밍 언어를 어떻게 사용할 것인지에 대해서만 관심이 있는 입문자들은 주의깊게 살펴보지 않는다.

깃헙 페이지 업로드 오류

깃헙 페이지를 활용하여 블로그를 개설한지 약 __세 시간__ 만에 난항에 부딪혔다.

Compile & Build

Compile & Build 컴파일 및 빌드 팀의 업무 프로세스를 최대한 빠르게 학습하기 위해서 우선적으로 솔루션 개발의 전반적인 툴(Git, Framework, Jenkins 등)을 먼저 공부해야할 필요성을 느꼈다.

폰 노이만 아키텍쳐

폰 노이만 아키텍처 4개의 기본 하드웨어 구성요소 입력장치 출력장치 주기억장치(Main Memory) : 프로그램과 데이터를 모두 저장 중앙 처리 장치(CPU) : Control Unit + ALU 머신코드(Machine Code) 컴퓨터가 실제로 읽고, 해석하고, 실행하는 프로그램 C

공유 라이브러리(DDL)

Shared Library(DDL) 공유 라이브러리(shared library) 그 동안 IDE가 자동으로 해결해주었던 컴파일 및 빌드 등에 대해서 간단하게나마 개념을 학습하고 있는 중이다.

추상화

추상화 OOP 기본 '추상화' Java 코드를 숱하게 접하면서 가장 기본적인 개념이 부족함을 많이 느낀다. 보다 세련된 코드를 작성하거나 세련된 코드를 독해하기 위해서는 객체지향에 녹아있는 철학과 소스코드에 점철된 여러 디자인 요법들에 대해 알아두면 도움이 된다.