전체 글 89

[알고리즘] graph와 탐색

비선형 자료구조 선형으로 표현할 수 없는 데이터를 표현할 때 사용되는 자료구조 예를 들어 지하철 노선도와 같이 하나의 선으로 표현할 수 없는 데이터를 표현하고자 할 때 사용된다 대표적으로 graph가 비선형 구조이다 graph 데이터를 갖는 Node와 Node들을 이어주는 Edge로 구성 Edge는 단방향 / 양방향의 방향성을 가질 수 있다 Edge는 가중치를 가질 수 있다 데이터의 탐색 선형 자료구조와 달리 비선형 구조는 시작과 끝이 모호하다 따라서 먼저 하나의 Node를 탐색하고 해당 Node와 Edge로 연결된 Node들을 탐색한다 연결된 Node들은 Queue / Stack 등에 넣어 탐색을 예약해둔다 원하는 Node를 찾을 때 까지 이 과정을 반복한다 탐색에 사용하는 자료구조에 따른 탐색 순서 ..

[객체지향의 사실과 오해] 3장 - 타입과 추상화

초기의 지하철 노선도는 실제와 유사한 물리적인 지형 위에 구불구불한 운행 노선과 불규칙적인 역 간의 거리를 사실적으로 묘사하고 있었다. 문제는 이렇게 사실적인 정보가 오히려 지하철을 이용하는 승객들로 하여금 노선도를 이해하기 어렵게 만들었다는 점이다. (p.73) 해리 벡은 승객이 꼭 알아야 하는 사실만을 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하는 지하철 노선도를 창조해 낼 수 있었다. (p.75) 추상화를 통한 복잡성 극복 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정 불필요한 부분을 무시해 현실에 존재하는 복잡성을 극복하는게 추상화의 목적 훌륭한 추상화는 목적에 부합하는 것이어야 한다 추상..

스터디/자바 2023.03.20

[객체지향의 사실과 오해] 2장 - 이상한 나라의 객체

세상을 더 작은 객체로 분해하는 것은 본질적으로 세상이 포함하고 있는 복잡성을 극복하기 위한 인간의 작은 몸부림이다. 인간은 좀 더 단순한 객체들로 주변을 분해함으로써 자신이 몸담고 있는 세상을 이해하려고 노력한다. (p.41) 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. (중략) 현실 세계에서는 사람이 직접 주문 금액을 계산하지만 소프트웨어 세계에서는 주문 객체가 자신의 금액을 계산한다. (p.42) 객체의 정의 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다. (p.47) 객체란 식별 가능한 개체 또는 사물이다 객체는 자동차처럼 만질 수 있는 구체적 사물일 수도..

스터디/자바 2023.03.20

[알고리즘 - DP] 프로그래머스 - 등굣길

문제 문제 링크 풀이 문제 이해 아래와 같은 m x n 크기의 격자가 있을 때, 가장 왼쪽 위 (1, 1) 에서 가장 우측 아래쪽 (m, n) 으로 가는 방법의 개수를 구하는 문제이다. (1,000,000,007로 나눈 나머지 반환) 단, 이때 위 그림에서처럼 웅덩이가 있는 곳은 지나가지 못한다. 입력으로는 격자의 크기 m, n과 웅덩이의 좌표가 [[2, 2]]와 같은 형태로 puddles 이름으로 제공된다. 풀이 방법 문제에서 우측 및 아래로 움직이는 경로만 가능하다고 했으므로 (1, 1)에서 시작하여 (m, n)까지 우측 및 아래로 한 칸씩 이동하며 경로의 개수를 계산한다. 이때, 예를 들어 (3, 3)까지의 경로 경우의 수는 아래와 같이 (2, 3) 까지의 경로 경우의 수와 (3, 2) 까지의 경로..

[객체지향의 사실과 오해] 1장 - 협력하는 객체들의 공동체

서론 객체지향으로 향하는 4가지 걸음 클래스가 아니라 객체를 바라보는 것 개체를 독립적인 존재가 아니라 기능을 구현하기위해 협력하는 공동체의 존재로 바라보는 것 협력에 참여하는 객체들에게 적절한 역할과 책임을 부여하는 것 위 개념들을 사용하는 프로그래밍 언어라는 틀에 잘 담아내는 기술을 익히는 것 1장 실세계의 모방이라는 개념은 객체지향의 기반을 이루는 철학적인 개념을 설명하는 데는 적합하지만 유연하고 실용적인 관점에서 객체지향 분석, 설계를 설명하기에는 적합하지 않다. (중략) 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것..

스터디/자바 2023.03.13

[Spring Security] 웹 시큐리티

스프링 시큐리티 ignoring() 아래와 같이 index 페이지에 css를 적용하고 다시 요청을 해보자. Hello #hello { font-size: 100px; } css로 폰트 크기를 변경했음에도 실제로는 반영이 되지 않은 것을 확인할 수 있다. 개발자 콘솔로 요청과 응답 상태를 확인해보면, css 파일을 요청하는데 302(리다이렉션) 코드가 뜨고 login 페이지를 추가로 요청한 것을 확인할 수 있다. 이는 WebSecurityConfigurerAdapter를 통해 시큐리티를 설정할 때 지정한 경로 외의 모든 요청은 인증을 받도록 했기 때문에 정적 리소스를 요청하는 경로 또한 인증을 필요로 하게 되었기 때문에 발생하는 문제이다. 이를 해결하기 위해서는 시큐리티 필터가 적용되지 않도록 ignori..

[자바 스터디] 15주차 : 람다식

람다식이란 람다식은 자바 8에서 추가된 문법으로 자바에서 함수형 프로그래밍을 지원하기 위해 도입되었다. 람다식 람다식은 메서드를 하나의 식 (Expression) 으로 표현한 것으로, 아래와 같이 작성된다. // 기존 메서드 int sum(int a, int b) { return a + b; } // 람다식 (a, b) -> a + b 위 코드에서 볼 수 있듯 람다식으로 메서드를 작성하면 이름이 사라지기 때문에 익명 함수 라고 부른다. 람다식을 사용하면 기존에 메서드를 작성하기 위해 클래스를 만들고, 메서드 시그니처를 작성하는 등의 과정 없이 단순히 식 (Expression) 하나만으로 메서드를 만들고 사용할 수 있다. 함수형 프로그래밍 함수형 프로그래밍에는 아래와 같은 큰 특징들이 있다. 1. 순수 함..

스터디/자바 2023.02.27

[Spring Security] 아키텍처

SecurityContextHolder와 Authentication SecurityContextHolder SecurityContext 를 제공. 기본적으로 ThreadLocal을 사용하기 때문에 SecurityContext는 동일 쓰레드 내에서 항상 접근이 가능 SecurityContext Authentication을 제공 // SecurityContextHolder -> SecurityContext -> Authentication Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); // Principal Object principal = authentication.getPrincipal(); //..

[자바 스터디] 14주차 : 제네릭

제네릭이란 JDK 1.5에서 처음 도입된 기능으로 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기술을 말한다. 자바에서 리스트를 사용할 때 로 타입을 지정했던 것이 바로 제네릭이다. public interface List extends Collection { ... } --- List list = new ArrayList(); // 사용 예시 제네릭의 필요성 (사용 이유) 1. 컴파일 타임의 타입 안전성 제네릭으로 타입을 지정하면 자바 컴파일러가 컴파일 타임에 강력하게 타입을 체크해서 이상이 있을 경우 오류를 발생시켜준다. 컴파일 오류는 런타임에 발생하는 오류보다 훨씬 안전하다. 2. 불필요한 형 변환 삭제 제네릭이 없는 List를 사용하는 아래와 같은 코드가 있다고 해보자. List ..

스터디/자바 2023.02.18

[자바 스터디] 13주차 : IO

스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O 스트림 자바에서는 어느 한 쪽에서 다른 쪽으로 데이터를 전달하기 위해서는 두 대상을 연결할 무언가가 필요한데, 이를 스트림이라 한다. 즉, 스트림은 데이터를 전송하는데 사용되는 연결 통로 의 역할을 하고 이를 통해 I/O가 이루어진다. 스트림은 단방향으로만 데이터를 전송할 수 있다. 따라서 입력과 출력을 동시에 처리하기 위해서는 아래와 같이 입력 스트림과 출력 스트림, 총 두 개의 스트림이 필요하다. 스트림은 먼저 보낸 데이터를 먼저 받게 되고, 중간에 건너뜀 없이 데이터를 전송한다. 즉, 큐와 같은 FIFO 구조로 이루어져있다. NIO (New I/O) 자바 1.4버전부터 추가된 API로 기존 스트림을 사용하는 I..

스터디/자바 2023.02.16