본문 바로가기

전체 글59

캡슐화란 무엇인가? 어떤 이점이 있는가? 객체지향을 공부하면 처음부터 귀에 못이 박히도록 듣는 단어가 있다. 바로 캡슐화다. 캡슐화가 도대체 뭐고, 이게 왜 중요한 요소일까? 일단 위키를 보도록 하자 캡슐화(영어: encapsulation)는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다: 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다. 그래, 캡슐화는 객체의. 속성과 행위를 하나로 묶고 구현 내용을 외부에 감춘다는 것, 알겠다. 그래서 뭐 어쩌라는건가? 이게 왜 중요한가?? 이에 대한 답을 한번 찾아가 보도록 하자. 위키의 정의에 따르면, 캡슐화는 클래스 안에다가 데이터와 데이터를 처리하는 행위를 묶어 놓는 것 이라고 말할 수 있다. 사실 객체지향을 처음 .. 2021. 2. 18.
디미터의 법칙(Law of Demeter)이란 뭘까? 그리고 왜 지켜야 할까? 클린코드를 읽으면서 디미터의 법칙이라는 것을 처음 접했었다. 당시에는 그냥 읽으면서, 기차충돌(Message Chains) 코드를 피하면 좋다는 건가? 라는 식으로 이해하고 넘어갔다. 왜 지켜야 하는지에 대한 진지한 고민을 못해본 것 이다. 최근 최범균님의 개발자가 반드시 정복해야 할 객체지향과 디자인 패턴 을 읽고 디미터의 법칙에 대한 인사이트를 얻었다. 일단, 디미터의 법칙이 뭔지부터 알아보자. 위키피디아에 의하면 아래와 같이 디미터의 법칙을 설명하고 있다. ... In its general form, the LoD is a specific case of loose coupling. ... Each unit should have only limited knowledge about other units.. 2021. 2. 18.
알고리즘 문제는 Stream을 사용해서 풀면 안되는 걸까? 알고리즘에 대한 감을 잃지 않기 위해 문제를 꾸준히 풀어가는 중이다. 기존에는 레거시 자바문법을 이용해서 풀어냈다면, 요즘은 모던 자바의 기능들을 활용해서 문제를 풀어나가고 있다. 그 중 가장 많이 사용하는 기법은 Stream을 이용하는 것인데, 이게 참 문제가 많은 것 같다... 백준의 2580 스도쿠 문제를 보자 www.acmicpc.net/problem/2580 2580번: 스도쿠 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루 www.acmicpc.net 스도쿠 해답을 찾는 간단한 문제이다. 이전에 풀어본 경험이 있는데 소스가 많이 더러워서 깔끔하게.. 2021. 2. 17.
[회고] SOLID 스터디 우테코를 시작하고 SOLID에 대한 스터디를 개최해 봤다. 스터디를 개최한 경위는 다음과 같다. 프리코스를 하면서 객체지향에 대해서 어느정도 공부를 했다고 느꼈지만, 막상 SOLID의 의미를 물어보니 대답하기가 참 난감했다. 분명 알고 있던건데 왜 대답을 못하는 걸까... 사실 답을 알고있다 설명할 수 없다면, 모르는 거다. 그렇다. 나는 모르기 때문에 답을 못한거다. 그래서 스터디를 만들고, 우테코 크루원들과 이야기를 나누어 보기로 마음을 먹었다. (웨지의 저 한마디가 스터디를 추진하는데 큰 도움을 줬다.) 스터디를 진행하는데 있어서, 기존의 스터디 방식처럼 누군가 주제를 공부해 오고, 단순 발표하는 진부한 형식의 스터디는 지양하고 싶었다. 우테코 슬랙의 질문 채널을 보면 여러 질문이 올라오고 그에 대.. 2021. 2. 15.
확장성은 어디까지 고려해야 할까? 우테코에서 자동차 경주 미션을 하며 소스에 대한 피드백을 많이 받았다. 그중에는 리뷰어님과 참 오랜 시간동안 의견을 나눈 부분도 있는데, 바로 확장성에 대한 부분이다. 기존에 나는 모든 부분에서 확장성을 고려하서 설계하고, 구현했다. 이번 자동차 경주 미션을 보자. 자동차 경주 미션에서 자동차의 움직임 조건은, 랜덤으로 숫자를 하나 생성하고 그 수가 4 상이면 전진, 아니면 stop인 요구사항을 가지고 있다. 그래서 나는 아래와 같이 코드를 작성했다. public interface MoveCondition { boolean isMovable(); } public class RandomMoveCondition implements MoveCondition { ... private final RandomUti.. 2021. 2. 10.
랜덤에 대한 테스트는 어떻게 이루어 져야 하는가? 테스트 코드를 작성하다 보면, 랜덤하게 발생하는 경우에 대하여 테스트를 진행할 경우가 생긴다. 이러한 상황에 봉착했을 때 우리는 어떻게 테스트 하는게 좋을까?? 우아한 테크 코스(이하 우테코)에서 1단계 미션을 진행하면서 랜덤을 테스트 할 경우가 생겼다 아래의 코드를 보자. public class Car { private static final int MAX_BOUND = 9; private static final int MOVABLE_THRESHOLD = 4; private final String name; private int position; public Car(String name, int position) { this.name = name; this.position = position; } pu.. 2021. 2. 8.