All
68 posts
커스텀 어노테이션으로 회원가입 유효성 검사하기

@Valid 자바에서 사용되는 어노테이션 중 하나로, HTTP 요청 데이터를 객체로 반환할 때 유효성 검사를 수행하는 어노테이션이다. LocalValidatorFactoryBean 스프링에서 제공하는 Validator 인터페이스의 구현체 중 하나이다. 스프링 어플리케이션 컨텍스트 내에서 사용되며 @Valid 어노테이션을 통한 데이터 유효성 검사를 처리한다. 스프링에서는 validation 의존성만 추가해주면 자동으로 빈 등록이 되어 사용할 수 있다. 사용법 유효성을 검증할 데이터를 받아올 DTO를 생성하고, 각 필드에 검증하고 싶은 유효성 어노테이션을 붙여준다. 해당 DTO에 @Valid 어노테이션을 붙이면 유효성 검증을 할 수 있다. 검증 실패 검증에 실패할 경우 MethodArgumentNotValidException 예외를 던지게 된다. 커스텀 어노테이션 회원가입 데이터의 조건 사용자 이름 : 최소 4자 이상, 10자 이하이며 알파벳 소문자, 숫자로 구성되어야 한다. 비밀번호…

November 13, 2023
자바
Spring Security

WebSecurityConfig CSRF(Cross Site Request Forgery)란? 웹 취약점 공격 방법중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격 Spring Security에서는 CSRF 예방기능을 제공하는데 DISABLE 하는 이유 Cross Site Request Forgery (CSRF) :: Spring Security 공식 페이지에 나와있듯, CSRF 설정은 브라우저에서 처리할 수 있는 모든 요청에 대해서 사용하는 것이 좋다. CSRF를 사용하지 않도록 사용하는 경우는 브라우저 이외의 클라이언트에서만 사용하는 서비스(REST API)를 생성할 경우이다. REST API는 서버에 인증정보를 보관하지 않기 때문에 CSRF 공격에 크게 영향을 받지 않는다. authorizeRequests() : 특정 경로에 대한 접근 권한을 지정하는 메소드 requestMatchers(PathRequest.toStaticR…

November 10, 2023
보안
Filter와 Interceptor

필터와 인터셉터 모두 웹 애플리케이션에서 요청을 가로채어 중간에서 작업을 처리하는 구성요소이다. 공통점 필터 체인, 인터셉터 스택을 통해서 요청과 응답에 대한 여러 작업을 순차적으로 처리할 수 있다. 두 기능 모두 웹 애플리케이션의 핵심 로직과 분리되어 작업을 수행하고, 작업을 공통적으로 처리하여 코드의 중복을 줄일 수 있는 장점이 있다. 이 둘은 어떻게 동작하며, 차이점은 무엇이 있을까? 각 기능에 대해서 알아보자! Filter 필터는 J2EE 표준 스펙 기능으로 DispatcherServlet에 요청이 전달되기 전/후에 부가 작업을 처리할 수 있는 기능을 제공한다. 스프링이 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되지만, 스프링 빈으로 등록은 가능하다. 메소드 Filter 인터페이스는 3가지 메소드를 가지고 있다. init 메소드 필터 객체를 초기화하고 서비스에 추가하기 위한 메소드 웹 컨테이너가 init 메소드를 호출하여 필터 객체를 초기화 하면 이후 요청들은 doFi…

November 09, 2023
Spring
인증과 인가

인증과 인가 인증(Authentication) 사용자의 신원을 검증하는 행위, 보안 프로세스에서 첫 번째 단계 인가(Authorization, 권한부여) 사용자에게 권한을 허용/거부하는 행위 우리가 사용하는 HTTP의 특성 비연결성 : 리소스 절약을 위해 서버는 하나의 요청에 대해서 응답을 주고 연결을 끊어버린다. 무상태 : 서버는 클라이언트가 이전에 어떤 상태였는지 알지 못한다. 🤔 그럼 연결이 되어있지 않고 상태도 안가지고 있는데 어떻게 인증과 인가를 진행하는걸까? 쿠키-세션 방식 사용자의 인증 정보가 서버의 세션 저장소에 저장되는 방식이다. 사용자가 로그인에 성공하면 서버는 사용자의 인증 정보를 세션 저장소에 저장하고, 사용자의 정보와는 관계없는 SESSION ID를 생성하여 클라이언트에게 응답값으로 전달한다. 클라이언트는 SESSION ID를 쿠키에 저장하고 앞으로의 요청마다 SESSION ID를 함께 보낸다. 서버는 요청값에 있는 SESSION ID에 해당하는 세션 정보가…

November 08, 2023
보안
TIL) 보안은 어려워😯

📝 오늘의 내용정리 알고리즘 스터디 8일차 인증과 인가 🔚 오늘의 마무리 이번주는 강의듣는 주! 스프링 시큐리티 들어가기 전 인증과 인가, JWT에 대해서 배웠는데 내용이 머리에 쉽게 들어오지 않아 글로 따로 정리를 했다. 인증과 인가는 항상 헷갈렸는데, 오늘 내용을 정리하면서 인증은 보안 프로세스의 첫 단계라는걸 알게되어서 이제 명확하게 구분이 가기 시작했다. 인가는 내 마음대로 ‘관리자인가..? 아닌가..?’ 로 외우기로 했다😊 예전에 JWT를 구현하려다가 포기했던 적이 있었는데 이번에는 확실하게 이해해서 프로젝트에 적용하고싶다!!! 📝 오늘의 내용정리 🔚 오늘의 마무리

November 08, 2023
TIL
TIL) 공통 응답 모듈 만들기와 삽질😇

📝 오늘의 내용정리 알고리즘 스터디 7일차 공통 응답 모듈 만들기 계기 Exception이 발생했을 때 응답값을 위 이미지처럼 전달해주고 있었다. 게시글 등록/수정/삭제에 성공했을 때는 위 이미지처럼 성공한 데이터들을 전달해주고 있었다. 성공했을때도 Exception이 발생했을 때와 같은 형태로 전달해주고 싶어졌다. 그래서 공통 응답 모듈을 만들기로 결심했다! CommonApiResponse.java 상태코드와 데이터 메시지를 가지고 있는 CommonApiResponse 클래스를 생성하고 컨트롤러에서 사용을 했다. 작성을 하고보니 굳이 이렇게까지 한번 더 감싸서 값을 전달하는게 맞나..? 라는 생각이 엄청나게 들었다. 뭔가 이상해서 바로 튜터님을 찾아갔다. 튜터님의 피드백은 클라이언트와 협의 후 상황에 따라 전달되는 응답값은 언제든지 달라질 수 있다. status는 ResponseEntity를 통해서 전달되고 있으니 한번 더 감싸서 전달되는게 의미가 없다. 메시지는 주로 모호…

November 07, 2023
TIL
TIL) ResponseEntity와 Custom Exception

📝 오늘의 내용정리 알고리즘 스터디 6일차 ResponseEntity ResponseEntity는 스프링에서 제공하는 HttpEntity를 상속받아 구현한 클래스이다. 응답을 나타내는 클래스로, 응답 본문, 상태코드, 헤더를 포함하고 있다. ResponseEntity를 사용하면 응답을 상세하게 제어할 수 있어서 클라이언트와 서버간의 통신을 유연하게 처리할 수 있다. Custom Exception 현재 코드에서는 게시글이 존재하지 않을 때와 비밀번호가 일치하지 않을 때 예외상황을 처리하고 있는데, 모두 500으로 클라이언트에게 전달된다. 의미없는 데이터도 같이 전달되는 상황이다. 발생한 예외를 적절하게 전달하기 위해서 커스텀 예외를 만들어 보자! 1. ErrorCode enum 생성 2. Exception, ExceptionHandler 추가 @ControllerAdvice 여러 컨트롤러에서 발생할 수 있는 예외를 일괄처리 한다. @ExceptionHandler @Controlle…

November 06, 2023
TIL
Github Label 커스텀하기

스프링 개인 프로젝트를 진행하기 전 이슈로 할 일을 관리하려고 한다. 이슈에 라벨을 등록하려고 하는데 내가 원하는 내용이 없었다. 다른 사람들은 어떻게 관리하나 블로그 구경을 다녔는데, 다들 커스텀해서 관리하고 있었던게 아니였나..! 간단하게 할 수 있길래 따라해봤다. 이 글을 참고하면서 진행했다. 1. label.json 파일 생성하기 2. 토큰 발행하기 나는 발급해둔 토큰이 없었기때문에 이번에 발행했다. 3. github-label-sync 설치 GitHub Label Sync을 설치해준다. 4. LABEL 적용 label.json 파일이 있는 위치에서 아래 명령어를 실행하면 완료! 아래 사진과 같이 적용 된 것을 확인할 수 있다.

November 03, 2023
기타
TIL) Github Label 커스텀하기

📝 오늘의 내용정리 Github Label 커스텀하기 🤪 오늘 만난 오류 Postman으로 테스트를 진행하는데 아래와 같은 오류가 발생했다. 첫번째 오류 엔드포인트에 습관적으로 https를 입력하여 문제가 발생했다. http로 변경하니 오류가 사라졌다! 두번째 오류 Postman에서 자동 생성해주는 헤더의 Content-Type값이 text/plain으로 설정되어 있어서 발생한 문제였다. application/json으로 변경해주니 오류가 사라졌다! 🔚 오늘의 마무리 오늘은 게시판 CURD API를 만드는 스프링 개인과제가 시작되었다. 사용자도 없는 CRUD라서 시간이 오래걸리지는 않았다. 기본적인 틀은 만들어 놨으니 주말에 추가적인 부분만 조금 더 수정하고 월요일에 제출해야겠다! 📝 오늘의 내용정리 🤪 오늘 만난 오류 첫번째 오류 두번째 오류 🔚 오늘의 마무리

November 03, 2023
TIL
TIL) 이진탐색(Binary Search)

📝 오늘의 내용정리 이진탐색(Binary Search) 찾고자 하는 정답이 포함된 범위 중 가운데 요소와 정답을 비교하여 절반의 범위를 제외하면서 요소를 찾아가는 방법 이진탐색을 사용하려면 배일이나 리스트가 정렬되어 있어야 한다. 분할정복 탐색 공간을 특정 기준에 따라 나누고, 나누어진 탐색공간에서 탐색을 이어나가는 것 이진 탐색은 업다운 게임처럼 남아있는 범위의 가운데 숫자를 부르고 범위를 계속해서 반으로 나누어 간다. 이진 탐색은 한쪽 범위를 아예 제외하기 때문에 분할 정복을 이용한 효율 높은 탐색 알고리즘이다. 범위찾기 배열의 인덱스 범위인 0부터 arr.length-1이 탐색 범위가 된다. 검사 진행하기 범위 내의 속한 원소 개수는 end - start이다. 탐색 공간이 남아 있지 않을 때 까지 탐색하려면 end - start가 양수일 때 탐색을 계속 반복해야 한다. end - start > 0 은 end > start 이므로 조건으로 설정해준다. 중간 값 비교하기 중…

November 02, 2023
TIL
TIL) 다양한 의존관계 주입 방법

📝 오늘의 내용정리 알고리즘 스터디 4일차 Math.sqrt() 제곱근을 구하는 함수 ex) sqrt(9) = 3 Math.pow() 거듭제곱을 계산하는 함수 ex) pow(2, 3) = 8 BeanFactory 스프링 컨테이너의 최상위 인터페이스이며 스프링 빈을 관리하고 조회하는 역할을 담당한다. ApplicationContext BeanFactory의 모든 기능을 상속 받아서 제공하며 부가기능이 더해진 컨테이너 다양한 의존관계 주입 방법 생성자 주입 생성자를 통해서 의존 관계를 주입 받는 방식 생성자 호출 시점에서 딱 한번만 호출되는 것이 보장되어 불변이나 필수 의존관계에 사용한다. 클래스에 생성자가 한개라면 를 생략해도 자동 주입이 된다. 수정자 주입(setter 주입) 수정자 메소드를 통해서 의존관계를 주입하는 방법이며 선택이나 변경 가능성이 있는 의존관계에 사용한다. 필드 주입 필드에 바로 주입하는 방법으로 외부에서 변경이 불가능하기 때문에 테스트하기 힘들다는 치명적인 단…

November 01, 2023
TIL
TIL) parseInt()와 valueOf()의 차이

📝 오늘의 내용정리 알고리즘 스터디 3일차 코딩테스트 문제를 풀다가 parseInt()와 valueOf() 차이가 궁금해졌다. 겉으로 보기엔 같은 값을 반환하는데 왜 굳이 두 메소드가 따로 존재하는걸까? parseInt()와 valueOf()의 차이 두 메소드 모두 문자열을 정수로 변환하고 숫자로 변환할 수 없는 문자열이 입력되었을 때는 NumberFormatException이 발생한다. 두 메소드의 차이점은 반환값의 타입이다. 첫번째 valueOf()를 보면 인자에 parseInt()가 사용된 것을 확인할 수 있다. 마지막 valueOf()를 보면 반환값으로 새로운 Integer 객체를 생성한다. 결론 valueOf()는 parseInt()를 호출해서 문자열을 정수값으로 변환시키고 Integer로 박싱해서 값을 반환한다. 두 메소드 모두 반환타입만 다를 뿐 같은 기능이기 때문에 상황에 맞는 메소드를 잘 선택해서 사용하면 된다. 🔚 오늘의 마무리 스프링 주차가 시작된 오늘! 새로운…

October 31, 2023
TIL
내일배움캠프) 자바 팀 프로젝트 KPT 회고

기간 : 10.24 ~ 10.30 팀 : 칠전팔기(김환희, 손다희, 안준우, 최준희) 프로젝트 : 키오스크 프로그램 KEEP - 좋았던 부분, 계속해서 유지되었으면 하는 부분 서로 힘을 모아서 프로젝트를 완성했다. 분업이 잘 되어있고, 질문하기 편한 분위기여서 좋았다. git 활용을 적극적으로 했다. PROBLEM - 잘되지 않았던 부분, 문제라고 생각하는 부분 코드 컨벤션, git 커밋 메시지 규칙 등 초반에 결정해야 할 부분을 지나쳤다. 팀의 수준이 천차만별이라 따라가기 어려웠던 부분이 있었다. 일상적인 대화가 부족했다. TRY - Problem을 해결할 수 있도록 실천해 보았으면 하는 부분 프로젝트 시작 전 많은 대화를 나눠서 컨벤션을 정해야겠다. 팀끼리 코드리뷰를 진행해봐야겠다. 다른 과제였던 호텔 프로그램을 만들어보고, 주석 사용을 활발히 해봐야겠다. 회의시간 외에도 일상적인 대화를 자주 해봐야겠다. 팀원들 한 마디 김환희 일주일이란 짧은 시간동안 모두 기능 구현하고 …

October 30, 2023
내일배움캠프
회고
TIL) 팀 프로젝트 마무리, 알고리즘 스터디 시작!

📝 오늘의 내용정리 알고리즘 스터디 1일차 알고리즘 스터디 2일차 팀 프로젝트 회고 🔚 오늘의 마무리 내배캠에서 처음으로 만난 팀과 함께 알고리즘 스터디를 진행하기로 했다! 오늘부터 시작해서 아주 간단한 문제들이지만 이것들이 쌓이고 쌓여서 3단계도 쉽게 풀 수 있는 날이 왔으면 좋겠다! 나는 이전에 풀었던 문제들이라서 for문을 사용하여 구현했던 것들을 stream으로 변경하는 작업을 해봤다. 그런데 아주 간단한 풀이들이라서 그런지 stream으로 사용하는데 더 시간이 오래걸렸다. 그래도 지금은 간단한 문제들로 stream에 익숙해지는게 중요하니까 꾸준히 해봐야겠다. 오늘 자바 팀 프로젝트 제출이 완료되었다. 처음으로 팀장을 맡아봤는데, 의미있는 경험이였다. 다음팀에서 모두들 팀장을 하기 꺼려한다면 팀장을 할 의향은 있지만, 누군가 나서서 팀장을 한다면 팀장을 응원하는 팀원이 되어야겠다😂

October 30, 2023
TIL
내일배움캠프) JAVA 개인 프로젝트 과제 구현 5차

수정목록 1. Cart 클래스 신규 생성 현재상황 : 주문 상태를 필드가 아닌 리스트로 관리하기로 팀원들과 협의 → 주문 상태 필드 삭제 및 대기/완료리스트 신규 생성 문제점 : 대기리스트에 주문을 담으려고 하니까 값이 초기화되는 문제 발생 원인 : Order 클래스가 장바구니의 역할까지 하고 있는 것 해결방안 : Cart 클래스를 추가하여 Order 클래스의 역할 부담을 덜어줌 느낀점 : 혼자서 헤메이다가 팀원들과 대화를 나누다보니 해결방안이 딱 나왔다! 하나의 클래스는 하나의 역할을 담당하는 것이 얼마나 중요한건지 한번 더 깨닫게 되었다. 2. 관리자 모드 추가 대기목록 출력 현재상황 : 주문을 할 때마다 새로운 Order 인스턴스를 생성하여 Cart에 있는 값을 넣어주고 waitingList에 추가해 줌 문제점 : 대기목록을 출력하기위해 waitingList에 있는 Order 인스턴스의 값을 가져옴 → 다른 필드들은 값이 있는데 orderMap만 사라지는 문제 발생 원인 O…

October 27, 2023
내일배움캠프
TIL) 키오스크 프로그램 구현하기5

📝 오늘의 내용정리 키오스크 만들기 5차 🔚 오늘의 마무리 팀 과제가 거의 마무리 되어 간다. 무사히 마무리하고 스프링 주차로 들어가고 싶다!

October 27, 2023
TIL
인터페이스는 객체 생성이 불가능할까?

모던 자바 인 액션을 읽던 도중 아래와 같은 코드를 보게 되었다. 디렉토리에 숨겨진 파일을 필터링하는 코드이다. 한 눈에 들어오지 않아서 인텔리제이를 켜고 하나하나 입력해봤다. new FileFilter 부분을 타이핑하자 자동완성이 되었다. 완성된 코드는 평소에 객체 생성할 때 보던 코드와 다른 모습이였다. FileFilter가 무엇인지 알아내기 위해서 내부로 들어가보았다. 인터페이스였다. 내가 아는 인터페이스는 new 키워드로 객체 생성이 불가능한데..? 뭐지? 인터페이스도 익명 객체로 객체 생성이 가능하다. 익명 객체란 말 그대로 이름이 없는 객체이다. 이름이 없기 때문에 부를 수도 없다. 그렇기 때문에 생성과 동시에 한번만 사용되고 사라진다. 일반적으로 생성한 후에 다른 메소드의 파라미터로 넘겨줄 때 사용한다. 인터페이스도 익명 객체를 생성함과 동시에 추상메소드를 구현한다면 (익명)객체로 만들 수 있다. 자바8에서 추가된 기능으로 더 이상 위와 같이 구현하지 않고, 메소드를 …

October 26, 2023
자바
TIL) 인터페이스는 객체 생성이 불가능할까?

📝 오늘의 내용정리 인터페이스는 객체 생성이 불가능할까? 🔚 오늘의 마무리 자바8에 추가된 기능에 대해서 알고싶어서 모던 자바 인 액션을 읽기 시작했다. 책을 너무 여러권 읽는 것 같지만.. 병렬독서가 적성에 맞는 나는 어쩔수없다. 그리고 지금 당장 람다와 스트림에 얼른 익숙해지고 싶기 때문에 다른 책을 펼쳐버렸다. 모던 자바 인 액션은 예전에 읽으려고 시도했다가 포기한 책이다. 번역 어투가 적응이 잘 되지 않았고 어려웠다. 오늘도 많은 부분을 읽지는 못했다. 하지만 이대로 또 포기할 수는 없기때문에 천천히 한글자 한글자 읽어내려갔다. 중간에 이해가 안가는 부분은 구글에 검색하며, 코드를 직접 쳐가며 머리에 넣으려고 노력했다. 코드를 치면서 읽다보니 평소에는 지나쳤을 지식도 새롭게 알게되었다. 얼른 익숙해져서 스트림 잘 쓰고 싶다!

October 26, 2023
TIL
내일배움캠프) JAVA 개인 프로젝트 과제 구현 4차

팀 과제에 추가된 요구사항을 구현했다. 간단한 부분을 맡게되어서 빨리 끝났다. 1. 요청사항 입력 기능 추가 요청사항은 필수가 아니기 때문에 입력한다고 선택할 경우에만 입력받도록 했다. 20자이하의 조건이 만족할 때까지 재요청을 한다. 조건을 만족한다면 order 인스턴스가 가지고 있는 request 필드에 저장한다. 2. 주문 확인 시 요청사항 출력 order인스턴스가 가지고 있는 request를 가지고 온다. 3. 주문 상태 및 주문 상태 변경 기능 추가 Order 클래스에 status 필드를 추가하고 false로 초기화했다. 주문 상태를 받아 변경해주는 switchStatus 메소드를 구현했다.

October 25, 2023
내일배움캠프
TIL) 키오스크 프로젝트 구현하기4

📝 오늘의 내용정리 키오스크 만들기 4차 🔚 오늘의 마무리 오늘은 튜터면담으로 하루를 시작했다. 짧은 시간의 면담이였지만 이 캠프를 진행하면서 어떤 방향으로 나가야 할지 감이 잡혔다. 객체지향에 계속 집중해야지! 본격적인 팀 과제 구현이 시작됐다. 난 주문 부분을 맡아서 간단한 기능을 구현하게 됐다. 간단한 구현이라 빨리 끝나서 남은 시간에는 어제 읽었던 책을 마저 읽었다. 내일도 시간이 남는다면 자바에 대해서 더 알아가야겠다.

October 25, 2023
TIL
내일배움캠프) JAVA 개인 프로젝트 과제 구현 3차

1, 2차 과제 구현 게시글을 작성하면서 코드의 변화를 기록하기가 어려웠는데, 이번 게시글은 간단하게 작성하기로 하고 깃 커밋내역을 활용하기로 했다😗 3차 구현에서 수정된 부분은 아래와 같다. 1. OrderProcess 클래스 신규 생성 현재 상황 : Order 클래스에서 주문을 처리하기 위한 모든 작업을 진행했음 문제점 : 주문 인스턴스를 위한 멤버들과 주문을 처리하기 위한 멤버들이 혼잡하게 섞여있었다. 해결방안 : Order 클래스에서 주문을 처리하는 부분을 분리하여 OrderProcess 클래스로 신규 생성 결론 : 각각의 클래스가 본인의 역할만 수행하고 있게 된 것 같다. 2. 전체 주문 목록에 값이 잘못 들어가는 부분 수정 문제점 : 메소드에 기본값을 잘못 입력하여 전체 주문 목록에 값이 한번 더 더해져서 들어가는 상황 발생 해결방안 : 기본 값을 0으로 변경 3. 메소드의 분리 현재 상황 : 화면에 안내문구를 출력하는 메소드에서 관련 없는 작업(총 금액 구하기 등..…

October 24, 2023
내일배움캠프
TIL) 키오스크 프로젝트 구현하기3

📝 오늘의 내용정리 키오스크 만들기 3차 🔚 오늘의 마무리 자바 팀 프로젝트 시작의 날! 팀 프로젝트는 두가지를 선택할 수 있었다. 팀원들을 어느것을 해도 상관이 없다는 의견이 대부분이였다. 그래서 세가지 이유를 들면서 키오스크 프로젝트를 해야 한다고 내 의견을 말했다. 우리가 개인 과제로 진행했던 코드를 서로 리뷰할 수 있다. 새로운 프로젝트를 하면 키오스크 프로젝트와 비슷한 내용을 구현해야 하지만, 이미 구현 되어있는 것을 개선 하는거라면 코드 리팩토링을 경험해 볼 수도 있다. 주말 제외 3.5일이라는 시간내에 구현이 가능할 것 같다. 다행히 팀원들은 내 의견을 수용해 주었다! 하지만 코드 리뷰와 이미 작성되어 있는 코드들을 병합하는 것은 해본적이 없기에, 튜터님의 도움을 받았다. 튜터님께서는 모든 팀원들의 코드를 병합하기에는 코드 스타일이 다르기 때문에, 각자의 코드를 설명하고 이 프로젝트를 주도적으로 이끌어갈 사람의 코드를 개선하는 방법을 제시해주셨다. 각자 코드 설명을 마…

October 24, 2023
TIL
TIL) 스프링 입문을 위한 자바 객체 지향의 원리와 이해

📝 오늘의 내용정리 자바의 메모리 영역 static 영역 : 클래스들의 놀이터 stack 영역 : 메소드들의 놀이터 heap 영역 : 객체들의 놀이터 객체지향의 4대 특성 캡슐화 : 정보은닉 상속 : 재사용 추상화 : 모델링 다형성 : 사용 편의 🔚 오늘의 마무리 개인과제를 마무리하고 시간이 남아서 스프링 입문을 위한 자바 객체 지향의 원리와 이해의 챕터 2, 3를 읽었다. 이 책은 객체지향을 편안한 어투와 자세한 그림 예시로 친절하게 설명해줘서 좋다. 조금만 집중해서 읽으면 객체지향에 한발짝 더 다가갈 수 있다. 내가 생성한 객체가 어떻게 소멸되는지, 객체지향이 코드에 어떻게 사용되면서 우리에게 편리함을 주는지 쉽게 알 수 있다. 객체지향에 대한 개념이 내 머릿속에서 흐릿해지면 다시 이 책을 꺼내야겠다. (그리고 매번 이 부분만 읽다가 마는데 이번에는 꼭 끝까지 읽어봐야겠다😜) 개인과제 제출시간이 지나서 해설영상이 공개됐다. 해설영상을 보면서 내 코드에서 고칠 수 있는 부분이 뭐…

October 23, 2023
TIL
내일배움캠프) JAVA 개인 프로젝트 과제 구현 2차

더이상 혼자 고민하는건 의미가 없다는 생각이 들어서 제출을 완료했다! 이제 피드백을 받고 내 코드에 무슨 문제가 있는지, 앞으로 어떻게 개선해 나가면 좋을지 생각해봐야겠다🥺 1차 과제 구현과 달라진 점 예외처리 진행 메뉴 초기화 방법 변경 기능별로 메소드 분리하려고 노력함 관리자 메뉴 추가 Main.java insertMenu()는 앱이 시작될 때 항상 실행되어야 하는 메소드로, KioskApp 객체를 생성할 때 실행되도록 하였다. 예외처리를 진행하여 호출 된 메소드들이 예외를 던질 때 예외 메시지를 출력하도록 했다. KioskApp.java 각각의 입력이 숫자가 아닐 경우 오류를 던지게 수정 : if문보다 switch문이 가독성이 더 좋아보여 변경하였다. : 관리자의 메뉴를 출력하는 메소드를 추가하였다. Product.java : 개수에 따른 출력을 위해 추가하였다. Order.java : 개수 출력을 위해 List에서 Map으로 변경 : 사용자가 화면에서 선택한 값에 …

October 20, 2023
내일배움캠프
TIL) 키오스크 프로그램 구현하기2

📝 오늘의 내용정리 키오스크 만들기 2차 🔚 오늘의 마무리 키오스크 프로젝트를 수정하여 제출을 완료했다. 썩 마음에 들지는 않지만 계속 내가 보고 손에 쥐고 있는다고 답이 나오는것도 아니다. 피드백을 받아서 고치는게 더 좋은 방향이라는 생각이 든다. 주문 리스트에 동일한 상품이 담겨있다면 화면에 개수도 같이 출력해줘야 하는 선택 요구사항이 있었다. 나는 아래와 같이 구현을 진행했다. 주문 리스트에 동일한 상품이 담기지 않았다면 화면에 개수는 출력되지 않는다. 주문 리스트에 동일한 상품이 담겼다면 화면에 개수가 출력된다. 주문리스트를 Map으로 구현하여 상품을 키로, 갯수를 값으로 담았다. Map에 담긴 value가 모두 1이라면 동일한 상품이 없다는 뜻이고, 1 이상이라면 동일한 상품이 담겼다는 뜻이다. 위 조건을 구현하기 위해서 Map에 담긴 최대값을 구해와야 했다. 평소에 나라면 for문으로 Map을 순회하여 Math 클래스를 통해 최대값을 구했겠지만, 강의를 통해 스트림을 배…

October 20, 2023
TIL
내일배움캠프) JAVA 개인 프로젝트 과제 구현 1차

자바 강의 완강 후 시작 된 개인 프로젝트! 키오스크 만들기이다. 1차 기능 구현은 완료했지만 아직 부족한 부분이 많이 보인다. 선택 요구사항을 구현하면서 차차 고쳐나가봐야지! Main.java 프로젝트의 메인 클래스 KioskApp 객체를 생성한 후 메소드로 메뉴를 세팅하고, 메소드로 키오스크를 실행했다. KioskApp.java 키오스크 실행 클래스, 메뉴를 출력하는 메소드를 오버로딩하여 사용했다. 인스턴스 변수 : 상세 메뉴 전체를 담는 리스트 : 메인 메뉴를 담는 리스트 , , , : 각각의 상세메뉴를 담는 리스트 인스턴스 메소드 : 키오스크 실행 전, 메뉴를 세팅하는 메소드 : 키오스크 실행 메소드 : 메인 메뉴 출력 메소드 : 상세 메뉴 출력 메소드 Menu.java 메인메뉴 클래스 : 선택한 메뉴를 화면에 출력함 Product.java 상세 메뉴 클래스 : 상속받은 Menu의 메소드를 재정의해서 사용함 Order.java 주문 클래스, 주문에…

October 19, 2023
내일배움캠프
TIL) 키오스크 프로그램 구현하기1

📝 오늘의 내용정리 키오스크 만들기 🔚 오늘의 마무리 키오스크 앱의 기능 구현을 마무리 했다. 단순히 기능 구현에만 초점을 맞추느라 예외 상황에 대한 처리가 부족하다. 객체지향적으로 코드를 구현했는지 스스로에게 물어봤을때 음..?! 이라는 생각이 바로 들고 확신이 없었다. 그렇다면 수정을 해야할 부분이 많다는 뜻이겠지😂 ✅내일의 할 일 선택 요구사항 구현하기 코드 객체지향적으로 리팩토링하기 모르겠으면 튜터님에게 조언 얻기! 예외 상황 처리하기

October 19, 2023
TIL
TIL) 키오스크 프로그램 구현하기

✅ 오늘 한 일 키오스크 프로그램 구현 🔚 오늘의 마무리 오늘부터 자바 개인 프로젝트가 시작되었다. 키오스크 프로그램을 만드는 것이다. 화면없이 Scanner로 입력받아서 콘솔에 출력하는 형태로 제작하면 된다. 요구사항에 맞게 클래스들을 생성했다. 공통으로 동작하는 기능들은 메소드로 분리하려고 노력했다. 아직 초반이라 큰 오류나 알게된 점은 없지만, 오랜만에 자바의 개념에 집중하면서 코드를 짜다보니 시간이 훌쩍갔다. 내일 이어서 마저 해야지!

October 18, 2023
TIL
예외처리

개요 자바는 실행 시 발생할 수 있는 프로그램의 오류(런타임 에러)를 에러와 예외 두가지로 구분하였다. 에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 예외 : 프로그램 코드에 의해서 수습될 수 있는 오류 에러는 프로그램이 비정상적으로 종료되는걸로 끝나지만, 예외는 적절한 코드를 미리 작성해놓음으로써 프로그램의 비정상적인 종료를 막을 수있다. 예외 클래스의 계층구조 Exception 클래스는 체크 예외(checked exception)과 언체크 예외(unchecked exception) 으로 구분된다. 체크예외(Checked Exception) Exception 클래스의 하위 클래스 중 RuntimeException 클래스를 상속받지 않는 클래스 체크예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 같이 작성해야 한다. 예외처리를 해주지 않는다면 컴파일 에러가 발생한다. 위처럼 체크예외가 예외를 강제하기 때문에 예외를 누락시키지 않는다는 장…

October 17, 2023
자바
TIL) 예외처리

📝 오늘의 내용정리 예외처리 체크예외 : 프로그램 외적인 요인에서 발생할 수 있는 예외로 언제든지 발생할 수 있기때문에 컴파일 과정에서 에러처리를 강제함 언체크예외 : 개발자의 실수로 발생한 예외로 코드에서 적절한 처리가 가능하여 예외처리가 강제되지 않음 이렇게 이해했는데 맞을까..?! 🔚 오늘의 마무리 오늘 드디어 자바 강의를 완강했다! 쓰레드, 람다, 스트림등 한번 들어서 머리에 들어오지 않는 내용들이 많았지만 천천히 이해하기로 했다😅 예외처리에 대해서 정리를 했는데 아직 사용에 익숙하지 않아서 와닿지 않는다. 앞으로 코드 짜면서 익숙해져야겠다!

October 17, 2023
TIL
Collections

개요 컬렉션 프레임워크는 다수의 데이터를 저장하는 클래스들을 표준화한 설계이다. JDK 1.2 이전까지는 다수의 데이터를 다루기 위해서 Vector, Hashtable, Propeties와 같은 클래스를 제공했지만, 서로 각자 다른 방식으로 처리해야 했다. JDK 1.2 부터는 컬렉션 프레임워크가 등장하면서 모든 컬렉션 클래스를 표준화된 방식으로 다룰 수 있게되었다. 구성요소 이미지 출처 컬렉션 프레임워크에서는 List, Set, Map 3가지 타입의 인터페이스를 정의하였다. 그리고 공통된 부분을 다시 추출하여 Collection 인터페이스로 정의하였다. Map은 다른 두 인터페이스와 다른 형태(key, value)로 데이터를 다루기 때문에 Collection 인터페이스에 포함되지 못하였다. 인터페이스 특징 구현 클래스 List 순서가 있으며 데이터의 중복을 허용한다. ArrayList, LinkedList, Vector 등 Set 순서가 없으며 데이터의 중복을 허…

October 16, 2023
자바
TIL) Collections

📝 오늘의 내용정리 Collections 🔚 오늘의 마무리 내일까지 자바 강의를 마무리하는걸 목표로 하고 있기 때문에, 오늘도 역시나 자바 강의를 들었다. 오늘 들었던 강의들은 예전에 블로그에 내용정리해 놓은 이론위주라 강의에 집중하면서 알고있던 내용들을 한번 더 상기시켰다. 컬렉션 프레임워크를 내용정리하면서 Map은 List, Set과 같은 인터페이스에 속하지 않는다는것도 알게되었다. 코드를 짜는데 큰 영향을 끼치는 이론은 아니지만,, 난 이런점을 알면서 코드를 짜면 더 재미있다. 오늘은 시간이 많지 않아서 컬렉션 프레임워크의 간단한 내용만 정리했지만, 추후 시간이 난다면 메소드들도 정리해야겠다😁

October 16, 2023
TIL
배열의 얕은복사와 깊은복사

배열은 한번 생성하면 길이를 변경할 수 없다. 배열의 길이를 변경하기 위해서는 새로운 배열을 생성하고 데이터를 복사해야 한다. 배열을 복사하는 방법에는 얕은복사와 깊은복사가 있다. 얕은복사 얕은복사는 배열의 복사본이 원본 배열과 동일한 객체를 참조한다. 배열의 주소만 복사되고, 내부 요소들은 복사되지 않는다. 요소를 변경하게 되면 두 배열의 모든 값이 변경된다. 깊은복사 깊은복사는 원본 배열과 복사본이 서로 다른 객체를 참조한다. 하나의 배열을 변경해도 다른 배열에는 영향을 주지 않는다.

October 13, 2023
자바
Arrays class

자주 쓰면서 어떤 메소드가 있는지 정확하게 모르고 썼던 Arrays 클래스! 이번에 확실하게 머리에 넣자! 👀 배열을 다루기 위한 다양한 메소드가 포함되어 있다. 모두 클래스 메소드 이므로 객체를 생성하지 않고 클래스명으로 접근하여 바로 생성할 수 있다. 전달받은 배열을 고정 크기의 리스트로 변환하여 반환함 실행결과 list1: [오렌지, 바나나, 체리, 딸기] : 원래 배열과 같은 주소를 바라보는 리스트 list2: [사과, 바나나, 체리, 딸기] : 새로운 객체가 생성되어 별개의 주소값을 가지는 리스트 전달받은 배열에서 특정 값의 위치를 이진 검색 알고리즘을 사용하여 검색한 후 해당 인덱스를 반환하고 찾지 못한 경우 음수 값을 반환함 이진 검색 알고리즘을 사용하므로 전달되는 배열이 미리 정렬되어 있어야 제대로 동작함 실행 결과 요소 10는 배열에서 인덱스 4에 있습니다. 전달받은 배열의 특정 길이만큼을 새로운 배열로 복사하여 반환함(깊은복사) 새로운 배열의 길이가 원본…

October 13, 2023
자바
TIL) Arrays에 대해 공부하기!

📝 오늘의 내용정리 배열의 얕은복사와 깊은복사 Arrays class 🔚 오늘의 마무리 오랜만에 자바 기초 인강을 들으니까 새롭다. 배열을 공부하던 중 얕은복사와 깊은복사의 이해가 필요해서 내용을 정리했다. 코테를 풀면서 배열을 사용할 때 Arrays클래스를 자주 이용했는데 어떤 메소드가 있는지 정확히 이해하지 못하고 그냥 사용했다. 조금 더 알면서 사용하고 싶어서 내용정리를 했다. 내일도 강의 열심히 들어야지! 📝 오늘의 내용정리 🔚 오늘의 마무리

October 13, 2023
TIL
내일배움캠프) 미니프로젝트 KPT 회고

내일배움캠프 미니프로젝트를 마치며 6조 팀원들과 함께 KPT를 작성해 보고자 한다. “근데 KPT가 뭐지?” Keep, Problem, Try의 약자로 회고 내용을 세 가지 관점으로 분류하고 회고를 진행하는 회고 방법론 중 하나라고 한다… 는데 바로 시작해보자! KEEP - 좋았던 부분, 계속해서 유지되었으면 하는 부분 모르는 부분이 생길때 스스로 해결해보려 노력하고, 문제가 있을 땐 주저없이 질문하고, 반대의 상황에서도 주저 없이 서로 도와주었다. 각자 맡은 기능들을 완벽하게 구현하기 위해 모두 성실하게 임했다. 협업 경험을 위한 Git hub repository 생성과 기능별 branch 생성이 잘 이루어 졌다. PROBLEM - 잘되지 않았던 부분, 문제라고 생각하는 부분 프로젝트 기간이 너무 짧아서 개발 일정을 구체화 할 수 없었다. 회의록 작성을 하지 못했다. JavaScript 비동기 처리에 대한 이해가 부족했다. TRY - Problem을 해결할 수 있도록 실천해 보…

October 12, 2023
내일배움캠프
회고
과제11) 의존성 주입 방법

생성자 주입 생성자를 통해서 의존관계를 주입 받는 방식 생성자 호출 시점에서 딱 한번만 호출되는 것이 보장되어 불변이나 필수 의존관계에 사용한다. 클래스에 생성자가 한개라면 를 생략해도 자동주입이 된다. 수정자 주입(setter) 수정자 메소드를 통해서 의존관계를 주입하는 방식 선택이나 변경 가능성이 있는 의존관계에 주로 사용한다. 필드 주입 필드에 바로 주입하는 방법으로 외부에서 변경이 불가능하다. 잘 사용하지 않지만 테스트 코드에서 종종 사용하기도 한다. 생성자 주입을 사용해야 하는 이유 객체의 불변성을 확보해주기 때문이다. 실제로 개발을 하다보면 의존관계의 변경이 필요한 상황은 거의 없으므로 수정의 가능성을 열어둘 필요가 없다. 그러므로 생성자 주입을 통해서 변경의 가능성을 없애고 불변성을 보장하는 것이 좋다고 생각한다. 생성자 주입 수정자 주입(setter) 필드 주입 생성자 주입을 사용해야 하는 이유

August 22, 2023
스진초
과제10) HTTP METHOD

POST 요청된 리소스 생성 GET 요청 URI의 데이터를 조회하여 응답 PATCH 요청된 리소스 부분 수정 PUT 요청된 리소스 전체 수정 DELETE 요청된 리소스 삭제 HEAD GET 메소드와 동일하게 동작하지만 응답 바디는 포함하지 않음 CONNECT 대상 리소스로 식별된 서버에 대한 터널을 설정 OPTIONS 웹서버에서 지원되는 메소드의 종류를 확인할 경우 사용 TRACE 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행 POST GET PATCH PUT DELETE HEAD CONNECT OPTIONS TRACE

August 14, 2023
스진초
과제9) REST API 30초만에 이해하기

REST? REST는 Representational State Transfer의 약자로, 자원을 정의하고 자원에 대한 주소를 지정하는 방법의 모음 REST 제약조건 REST의 제약조건을 제대로 지키면서 아키텍처를 만드는것을 RESTful이라고 한다. 클라이언트 - 서버 구조 서버는 API제공, 클라이언트는 세션, 로그인정보등을 직접 관리하는 구조로 각각의 역할이 확실하게 구분됨 개발해야할 내용이 명확해지고 서로간의 의존성이 줄어들게 됨 무상태성 서버는 클라이언트의 상태 정보를 저장하지 않음 캐시 가능 REST는 HTTP의 웹표준을 그대로 사용하기 때문에, HTTP가 가진 캐싱 기능 적용 가능 계층화 시스템 REST 서버는 다중 계층으로 구성될 수 있음 자체 표현 구조 REST API 메시지만 보고 쉽게 이해할 수 있음 유니폼 인터페이스(uniform interface) URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일 REST API의 구…

August 12, 2023
스진초
과제8) 스프링에서 사용하는 어노테이션

개발자가 작성한 클래스를 빈으로 등록하기 위한 어노테이션이다. , , , , 이 붙은 클래스를 찾아서 컨텍스트에 빈으로 등록해주는 어노테이션이다. 개발자가 직접 제어가 불가능한 외부 라이브러리등을 빈으로 만들려할 때 사용되는 어노테이션이다. 외부 라이브러리 객체를 반환하는 메소드를 만들고 @Bean 어노테이션을 사용하면 된다. 해당 클래스가 컨트롤러 역할을 한다는 것을 알려준다. 해당 클래스가 비즈니스 로직을 수행한다는 것을 의미한다. 해당 클래스가 DB에 접근하는 메소드를 포함 한다는 것을 알려준다. 요청 URI와 어노테이션에 작성된 value 값이 일치하면 해당 클래스가 실행된다. HTTP 요청 바디를 자바 객체로 매핑해준다. 자바 객체를 HTTP 응답 바디로 매핑해준다. 필드, setter, 생성자에서 사용하며, 빈을 주입해준다.

August 11, 2023
스진초
과제7) Controller, Service, Repository

스프링은 각 클래스를 빈으로 등록하기 위해서 라는 어노테이션을 제공하지만, 실제 개발을 할 때는 보다 , , 를 더 많이 사용하게 되는 것 같다. 왜 를 사용하지 않고 의 하위개념인 어노테이션을 따로 제공하는걸까? 답을 찾기 위해 스프링 공식문서를 살펴봤더니 아래와 같은 문장이 있었다. Therefore, you can annotate your component classes with @Component, but, by annotating them with @Repository, @Service, or @Controller instead, your classes are more properly suited for processing by tools or associating with aspects. 를 사용하여 클래스에 주석을 달 수 있지만 , , 을 사용하는게 도구를 활용한 처리나 다양한 측면과의 연관성을 더 적절하게 갖출 수 있다고 나와있다. 너무 번역말투라 느낌가는대로 받아들…

August 08, 2023
스진초
과제6) Entity, VO, DTO

DTO(Data Transfer Object) 데이터 이동 객체라는 의미를 갖는다. 계층 간 데이터를 주고 받을 때 사용하며 로직을 갖지않는 순수한 데이터 객체이다. 데이터를 어떤 방식으로 초기화하느냐에 따라서 가변객체/불변객체로 구분된다. 가변객체 : setter로 데이터를 초기화하는 경우 불변객체 : 생성자로 데이터를 초기화 하는 경우 VO(Value Object) 값 자체를 표현하는 객체 객체의 불변성을 보장하고 값을 읽는 것만 가능하다. 서로 다른 이름을 가진 VO더라도 모든 속성 값이 같다면 두 인스턴스는 같은 객체라고 할 수 있다. 이를 보장하기 위해서는 Object 클래스의 와 를 오버라이딩 해야한다. Entity 데이터베이스 테이블과 1:1로 매핑되는 클래스로 DB 테이블 내의 컬럼만 필드로 가져야 한다. Entity를 기준으로 테이블이 생성되고 스키마가 변경되기 때문에 요청이나 응답값을 전달하는 클래스로 사용하면 안된다. 비교하기 DTO VO Entity 레이어 …

August 04, 2023
스진초
과제5) DDD와 SQL 중심 설계

오늘의 과제는 도메인 주도 설계와 SQL 중심 설계에 대해서 공부하고 비교해보는 것! DDD(Domain-Driven Design) 개념 도메인 소프트웨어로 해결하고자하는 문제의 영역 도메인 모델 특정 도메인을 개념적으로 표현한 것 도메인 모델을 사용하면 동일한 모습으로 도메인을 이해하고, 지식을 공유하는데 도움이 된다. 도메인 주도 설계 도메인 패턴을 중심에 놓고 설계하는 방식 특징 데이터 중심의 접근법이 아니라 도메인의 모델과 로직에 집중한다. 보편적인 언어를 사용한다. 분석 모델과 설계, 코드가 모두 다른 구조가 아닌 도메인 모델부터 코드까지 항상 움직이는 구조의 모델을 지향한다. SQL 중심 설계 정의 데이터베이스의 설계에서 시작되는 소프트웨어 개발 방법론중 하나 특징 데이터베이스 구조와 데이터 흐름을 중심으로 시스템을 설계하고 개발 프로세스를 진행한다. 차이점 DDD 설계 SQL 중심 설계 도메인 중심 설계 데이터베이스 중심 설계 도메인의 문제 영역을 중심으로 설계 데이터…

August 03, 2023
스진초
과제4) 제어의 역전과 의존관계 주입

제어의 역전과 의존관계 주입.. 영어로 보면 더 무슨 뜻인지 모르겠다. Inversion of Control, Dependency Injection 🙄 느에..? 두 용어에 대한 정의가 한번에 머리속에 들어오지는 않는다. 하지만 자바로 된 프로그램에 스프링을 적용하는 법을 배우다보면 어느새 은근슬쩍 내 머리에 들어와 있는 경험을 할 수 있다! 오늘은 강의를 들으면서 몸소 체험했던 IoC와 DI에 대해서 적어보려고 한다.(틀릴 수 있음 주의!🚨) 문제점 IoC와 DI가 적용되지 않은 프로그램은 아래와 같이 클라이언트 코드가 스스로 서버 객체를 생성하고 연결하고 실행했다. 수정이 필요할 경우 구현 객체를 클라이언트 코드에서 직접 수정해야 한다. 이럴경우 객체지향적인 설계원칙을 위반하게 된다. 그래서 클라이언트가 구현 객체와 상관없이 인터페이스에만 의존하도록 변경하여야 한다. 위 코드로 변경하면 객체지향적으로 설계한 것이지만 구현 객체가 없기 때문에 실행이 되지 않는다. 결국 구현 객…

August 01, 2023
스진초
과제3) @Override 꼭 적어야 할까요?

2일차 과제를 제출하면서 강사님께 질문을 드렸다. 당연히 @Override가 붙어져 있어야 한다고 생각했기 때문이다. 돌아온 대답은..! 다 계획이 있으신 거였다😎 그래서 3일차의 과제는~! 오버라이딩이 뭔가요? 여러분들이 생각하실 때, 오버라이딩을 구현하려면 @Override를 꼭 적어야 하나요? 1. 오버라이딩이란? 하위 클래스가 상위 클래스의 메소드를 재정의해서 사용하는 것 2. 오버라이딩을 구현하려면 @Override를 꼭 적어야 하나요? 어노테이션은 필수는 아니지만, 작성을 해주면 컴파일 단계에서 개발자의 실수를 방지할 수 있다. Parent 클래스의 hello 메소드를 재정의해서 사용하고 싶은 경우(오버라이딩) 매개변수, 리턴타입, 메소드명을 상위 클래스의 메소드와 동일하게 작성한다면 없이도 오버라이딩된 메소드라고 인식이 된다. 하지만 위 코드는 개발자의 실수로 매개변수가 다르게 작성되어서 오버라이딩하고 싶은 개발자의 의도와 다르게 동작한다! 이때 를 붙여준…

July 29, 2023
스진초
과제2) 인터페이스요..?

오늘도 역시나 내 머리속에 있고 나 혼자서는 응~그치그치~ 하면서 이해할 수 있는 내용이지만, 남에게 설명하려면 입이 안 떨어지고 어버버하게되는 그런 과제였다. 그 과제가 뭐냐구요..? 인터페이스가 가지고 있는 객체 지향의 특징에는 어떤 것이 있는지 그렇게 생각하는 이유는 무엇인지 자! 오늘도 머리에 있는걸 열심히 끄집어 내보자🤯 내 머릿속에 있는 생각 객체지향의 특징에는 캡슐화, 추상화, 다형성, 상속이 있다. 인터페이스는 이 속성들 4가지를 모두 가지고 있다고 생각한다. 캡슐화 인터페이스는 상수와 추상메소드만을 가질 수 있다. 추상메소드만을 가질 수 있다는 것은 메소드의 구현을 클래스에게 위임하였다는 뜻으로, 각 기능의 정의와 구현을 분리하여 캡슐화를 한 것이다. 추상화 인터페이스는 공통된 기능을 추출해서 정의한 것이기 때문에 추상화 되었다. 다형성 인터페이스를 구현한 클래스라면, 인스턴스의 참조변수 타입을 인터페이스로 할 수있다. 상속 인터페이스도 인터페이스를 상속받을 수…

July 25, 2023
스진초
과제1) 나만의 언어로 객체 지향의 특징 설명하기

어제 첫 라이브 세션을 시작으로 스진초 과정이 시작되었다! 프로그래밍은 외우는 것이 아니라 생각하고 이해하면서 해야한다고 말씀해주셨는데, 첫 과제부터 스진초의 정체성이 잘 나타나는거 같다. 내가 생각하는 캡슐화, 추상화, 다형성, 상속성 최근에 자바의 정석을 읽으면서 내용정리를 했기때문에 과제를 보고 ‘ㅎ..할만하군..’ 이라고 생각했다. 하지만 지금 이 글을 적는 이 순간 머리속에 있는 꺼내려고 하니까 쉽지않다. 그래도 최대한 적어봐야지..! 캡슐화 데이터의 무분별한 변경을 방지하기 위해서 접근제어자를 private으로 선언하여 외부의 접근을 막는 방식 추상화 추상 클래스를 상속받은 하위 클래스에게 메소드의 작성을 위임하는 방식 다형성 상위 클래스의 타입으로 하위 클래스의 인스턴스를 참조할 수 있도록 하는 방식 상속 공통된 속성을 모아놓은 클래스(상위 클래스)를 확장하여 새로운 클래스(하위 클래스)를 정의하는 방식 구글링으로 알아낸 캡슐화, 추상화, 다형성, 상속성 캡슐화 변수…

July 24, 2023
스진초
다음 큰 숫자

문제 내 최종코드 주어진 숫자 n을 이진수로 바꿔서 String형 배열에 넣었는데 시간초과 오류가 떴다. 이전 문제처럼 char형 배열로 변경해주었더니 통과되었다. 내 최종코드

July 17, 2023
프로그래머스
JadenCase 문자열 만들기

문제 내 최종코드 제일 첫 글자는 무조건 대문자이기 때문에 answer을 제일 첫글자로 초기화 해준다. for문을 돌면서 공백을 만난다면 answer을 공백을 더해준다. 공백이 아니라면 해당 글자의 앞이 공백인지 확인 후 앞 글자가 공백이면 대문자로 바꿔주고 아니라면 소문자로 바꿔준다. 다른 사람의 풀이 flag를 선언해서 공백을 판단한다. 내 최종코드 다른 사람의 풀이

July 11, 2023
프로그래머스
완벽한 괄호

문제 내 최종코드 처음에 매개변수를 String 형 배열로 만든 후 eqauls 함수를 써서 비교를 했더니 효율성 테스트에서 실패를 했다. 다른 사람의 코드를 참고하여 char로 비교를 했더니 효율성 테스트에서 통과되었다. 내 최종코드

July 11, 2023
프로그래머스
의상

문제 내 최종코드 (종류별 옷의 개수 + 1) * (종류별 옷의 개수 + 1) - 1 종류별 옷의 개수에 1을 더해주는 이유는 해당 종류의 옷을 안입는 경우 다 곱해주고 -1을 빼는 이유는 모두 안입는 경우를 빼주기 위함임 내 최종코드

July 05, 2023
프로그래머스
폰켓몬

문제 내 최종코드 내 최종코드

July 04, 2023
프로그래머스
신규 아이디 추천

문제 내 최종코드 내 최종코드

July 03, 2023
프로그래머스
개인정보 수집 유효기간

문제 내 최종코드 내 최종코드

June 27, 2023
프로그래머스
배열의 원소 삭제하기

문제 내 최종코드 arr배열을 list로 바꿔준 뒤 delete_list에 있는 숫자들을 list에서 지워준다. ArrayList의 remove()함수는 인자로 int와 Object 형태를 받을 수 있다. : 해당 인덱스의 값이 삭제 됨 : 리스트에서 인자로 받은 객체의 값을 찾아서 첫번째로 나오는 값을 삭제 내 최종코드

June 26, 2023
프로그래머스
특별한 이차원 배열1

문제 내 최종코드 다른 사람 풀이 i와 j가 같을 경우에만 1을 넣어주면 되기 때문에 위와 같은 코드로 작성하면 for문을 한 번만 작성해도 된다. 내 최종코드 다른 사람 풀이

June 26, 2023
프로그래머스
신고 결과 받기

문제 내 최종코드 내 최종코드

June 25, 2023
프로그래머스
성격 유형 검사하기

문제 내 최종코드 다른사람 풀이 참고 후 수정코드 map을 초기화 해주면 map에 해당 문자가 있는지 없는지 판단하는 코드가 줄어들게 된다. 내 최종코드 다른사람 풀이 참고 후 수정코드

June 21, 2023
프로그래머스
다형성

다형성은 여러가지로 표현될 수 있다. 상위 클래스 타입의 참조변수로 하위 클래스의 인스턴스를 참조할 수 있도록 하는 경우 오버라이딩과 오버로딩 두 클래스가 상속관계에 있을 때 상위 클래스 타입의 참조변수로 하위 클래스의 인스턴스를 참조하도록 할 수 있다. 참조변수 t로는 Tv클래스의 멤버들만 사용할 수 있다. 참조변수의 타입은 참조변수가 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 갯수를 결정한다. 참조변수와 인스턴스의 연결 메소드 : 참조변수 타입과 상관없이 실제 인스턴스의 메소드(오버라이딩된 메소드)가 호출 됨 멤버변수 : 상위 클래스와 하위 클래스에 동일한 변수명으로 정의되어 있기 때문에 참조변수 타입에 따라 출력값이 달라지게 된다. 상위 클래스 타입으로 선언되어 있을 경우 : 상위 클래스에 선언된 멤버변수 사용 하위 클래스 타입으로 선언되어 있을 경우 : 하위 클래스에 선언된 멤버변수 사용 매개변수의 다형성 매개변수가 Product타입의 변수라는 것은, 메소드의 매개…

June 20, 2023
자바
거리두기 확인하기

문제 문제풀이 흐름 대기실의 모든 응시자 위치에 대해 반복 1-1. 좌표의 상하좌우 중 빈 테이블이 있는 방향 찾기 1-2. 빈 테이블과 인접한 위치 중 응시자가 있는지 찾기 <- 거리두기를 지키지 않은 것 1의 경우를 찾지 못하면 거리두기를 지킨 것 풀이 dx, dy로 방향을 정하는 방법 dx, dy는 각각 x의 변화량, y의 변화량을 뜻한다. 변화량이란 특정 방향으로 이동할 때 해당 좌표 값이 어떻게 변화하는지를 의미한다. dx, dy는 상하좌우 네 방향에 따라서 아래와 같은 값을 가진다. 상 하 좌 우 dx 0 0 -1 1 dy -1 1 0 0 맨해튼 거리 맨해튼 거리2에 도달하려면 맨해튼 거리1(상하좌우)을 거쳐야함 맨해튼 거리1이 파티션으로 막혀있다면, 맨해튼 거리2에 응시자가 있어도 거리두기 조건을 만족함 위쪽 방향의 좌표가 파티션으로 막혀있다면 위쪽 방향의 맨해튼 거리2는 더이상 추가적인 검사를 하지 않아도 되는것 처럼 보임(파란색 화살표 방향으로…

June 19, 2023
프로그래머스
삼각 달팽이

문제 문제풀이 흐름 n*n 2차원 배열 선언하기 숫자를 채울 현재의 위치를 0,0 으로 설정 방향에 따라 이동할 수 없을때까지 반복하면서 숫자 채우기 3-1. 아래로 이동 3-2. 오른쪽으로 이동 3-3. 왼쪽 위로 이동 채워진 숫자를 차례대로 1차원 배열에 옮겨서 반환하기 풀이 dx, dy로 방향을 정하는 방법 dx, dy는 각각 x의 변화량, y의 변화량을 뜻한다. 변화량이란 특정 방향으로 이동할 때 해당 좌표 값이 어떻게 변화하는지를 의미한다. dx, dy는 상하좌우 네 방향에 따라서 아래와 같은 값을 가진다. 상 하 좌 우 dx 0 0 -1 1 dy -1 1 0 0 n*n 2차원 배열 선언하기 숫자를 채울 현재 위치를 0,0 으로 설정 방향에 따라 이동할 수 없을 때까지 반복하면서 숫자 채우기 채워진 숫자를 차례대로 1차원 배열에 옮겨서 반환하기 변수 v에는 채워넣은 숫자 마지막 + 1 숫자가 들어있으므로 v-1이 채워 넣은 숫자의 개수가 된다. …

June 13, 2023
프로그래머스
제어자

클래스, 변수, 메소드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 제어자는 접근 제어자와 그 외 제어자로 나눌 수 있는데, 접근 제어자는 선언부에 하나만 쓸 수 있으며, 그 외 제어자는 조합하여 사용이 가능하다. static - 클래스의, 공통적인 static이 사용될 수 있는 곳 : 멤버변수, 메소드, 초기화 블럭 멤버변수에 static이 붙는다면 모든 인스턴스에 공통적으로 사용되는 클래스 변수며, 인스턴스를 생성하지 않고도 사용이 가능하다. 클래스가 메모리에 로드될 때 생성된다. 메소드에 static이 붙는다면? 인스턴스를 생성하지 않고도 사용 가능한 클래스 메소드가 된다. 클래스 메소드 내에서는 인스턴스 멤버들을 사용할 수 없다. final - 마지막의, 변경될 수 없는 final이 사용될 수 있는 곳 : 클래스, 메소드, 멤버변수, 지역변수 클래스에 final이 붙는다면 확장될 수 없다. 즉 다른 클래스의 조상이 될수 없고 상속 구조에서 제일 마지막 클래스이다. 메…

June 13, 2023
자바
자바의정석
교점에 별 만들기

문제 문제풀이 흐름 모든 직선 쌍에 대해서 반복을 진행한다. 1-1. 교점 좌표를 구해서 정수 좌표만 저장하기 1의 결과에 대해 x, y 좌표의 최댓값, 최솟값 구하기 2의 결과로 2차원 배열의 크기를 결정하고 배열에 별 표시 문자열 배열로 반환 풀이 좌표를 나타내는 클래스 작성 final 사용 이유 ? 데이터를 나타내는 클래스이므로 불변성을 갖게 하기 위해서 생성자로 초기화 하도록 함 long으로 표현해야지 오버플로우가 발생하지 않음 모든 직선 쌍에 대해 반복 진행 교점 좌표 구하는 메소드 교점 좌표 구해서 정수만 리스트에 저장하기 저장된 정수 중 최댓값, 최솟값 구하기 : Long 범위 내에서 표현할 수 있는 가장 큰 숫자 값으로 초기화 구한 최솟값, 최댓값을 이용해서 2차원 배열의 크기 결정 좌표를 표현할 수 있는 최소 크기의 2차원 배열을 만들어서 ’.’ 으로 채워준다. 2차원 배열에 좌표 찍기 2차원 배열에서 (0,0)은 실제 좌표의 (0,0)이 아니므로 좌표를 변…

June 03, 2023
프로그래머스
상속

상속 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것 상속을 받는다는 것은 상위 클래스를 확장(extends)한다는 의미로 해석된다. 하위 클래스는 상위클래스의 생성자, 초기화 블럭을 제외한 모든 멤버를 모두 상속받는다. 상위 클래스가 변경되면 모든 하위 클래스는 자동으로 영향을 받지만, 하위 클래스가 변경되는 것은 상위 클래스에 아무런 영향이 없다. 포함관계 상속 이외에도 클래스를 재사용하는 다른 방법, 한 클래스의 멤버변수로 다른 클래스 타입의 참조 변수를 선언하는 것 단일상속 자바에서는 단일 상속만 허용한다. Object 클래스 Object 클래스는 모든 클래스의 상위 클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동으로 Object 클래스를 상속받는다. 오버라이딩 상위 클래스로부터 상속받은 메소드의 내용을 변경하는 것, 상속받은 메소드를 그대로 사용하기도 하지만 필요에 따라 변경을 해야하는 경우 상위 클래스의 메소드를 오버라이딩 한다. 오버라이딩의 …

June 03, 2023
자바
자바의정석
생성자

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드 생성자의 조건 생성자의 이름은 클래스 이름과 같아야 한다. 생성자는 리턴값이 없다 생성자의 정의 생성자도 오버로딩이 가능하므로 하나의 클래스의 여러개의 생성자가 존재할 수 있다. 연산자 new에 의해서 메모리에 Card 클래스의 인스턴스가 생성된다. 생성자 Card()가 호출되어 수행된다. 인스턴스를 생성할 때 반드시 클래스 내에 정의된 생성자 중 하나를 선택하여 지정해주어야 한다. 기본생성자 컴파일할 때 클래스에 생성자가 하나도 정의되어 있지 않은 경우 컴파일러는 자동으로 기본 생성자를 추가하여 컴파일한다. 컴파일러가 자동 추가해주는 기본생성자는 매개변수와 내용이 없다. 매개변수가 있는 생성자 매개변수가 있는 생성자를 사용한다면 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있다. 생성자에서 다른 생성자 호출하기 조건 생성자의 이름으로 클래스이름 대신 this를 사용한다. 반드시 첫 줄에서만 호출이 가능하다. 기본…

May 29, 2023
자바
자바의정석
클래스, 메소드, 변수, 인스턴스, 객체

클래스 클래스란 객체를 정의해 놓은 것이며, 객체를 생성하는데 사용된다. 클래스를 잘 만들어 놓으면 객체를 생성할 때마다 고민을 할 필요가 없으며, 만들어 놓은 클래스로부터 객체를 생성해서 사용하기만 하면 된다. 우리는 JDK에서 제공하는 클래스들을 이용해서 쉽게 프로그램을 작성할 수 있다. 클래스의 또 다른 정의 데이터와 함수의 결합 함수와 데이터는 관계가 깊기 때문에 자바에서는 변수와 함수를 하나의 클래스에 정의하여 관계가 깊은 변수와 함수를 함께 다룰 수 있게했다. 사용자 정의 타입 사용자 정의 타입은 사용자가 기능 동작을 위한 데이터와 함수를 묶어서 정의하는 것이다. 객체 객체는 클래스의 정의된 내용대로 메모리에 생성된 것이다. 클래스로부터 객체를 만드는 것을 클래스의 인스턴스화라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다. 객체는 포괄적인 의미를 가지고 있다면, 인스턴스는 객체보다 구체적인 의미인 어떤 클래스로부터 만들어진 것인지를 …

May 27, 2023
자바
자바의정석
재귀호출

메소드 내부에서 메소드 자신을 다시 호출하는 것 어떻게 메소드가 자기 자신을 호출할 수 있는걸까? 메소드 입장에서는 자기 자신을 호출하는 것과 다른 메소드를 호출하는 것은 차이가 없다. ‘메소드 호출’ 이라는 것이 특정 위치에 저장되어 있는 명령들을 수행하는 것일 뿐이기 때문 호출된 메소드는 원래의 값이 아닌 복사된 값으로 작업하기 때문에 호출한 메소드와 관계없이 독립적인 작업 수행이 가능하다 : 재귀호출과 반복문 재귀호출은 반복문과 유사한 점이 많으며, 대부분의 재귀호출은 반복문으로 작성하는것이 가능하다. 어떤 작업을 반복적으로 처리해야한다면, 먼저 반복문으로 작성해보고 너무 복잡하다면 재귀호출로 간단하게 할 수 없는지 고민해봐야한다. 반복문보다 재귀호출이 비효율적이므로 재귀호출에 드는 비용보다 재귀호출의 간결함이 주는 이득이 충분히 큰 경우에만 사용해야한다. 대표적인 재귀호출 : 팩토리얼 팩토리얼은 한 숫자가 1이 될 때까지 1씩 감소시켜가면서 계속해서 곱해 나가는 것 …

May 27, 2023
자바
자바의정석
기본형 매개변수와 참조형 매개변수 / 참조형 반환타입

매개변수의 타입이 기본형일 때는 값이 복사되어서 변수의 값을 읽는 것만 가능하다. 참조형일 때는 인스턴스의 주소가 복사되어서 변수의 값을 읽고 변경할 수 있다. 기본형 매개변수 호출한 메소드에 기본형 매개변수가 선언되어 있는 경우 인자(d.x)의 값을 복사하여 넘겨준 것 호출한 메소드에서 값을 1000으로 변경하더라도 호출한 메소드의 매개변수 값만 변경 될 뿐, 인자로 넘겨준 변수는 영향을 받지 않는다. 참조형 매개변수 호출된 메소드에 참조형 매개변수가 선언되어 있는 경우 값이 저장된 주소를 호출된 메소드에 넘겨준다. 호출된 메소드의 매개변수가 넘겨받은 인자와 같은 주소값을 가리키고 있기 때문에 호출된 메소드에서 값을 변경하게되면 그 주소값을 가지고 있는 변수의 값이 변경된다. 참조형 반환타입 copy메소드에서 생성한 객체를 main메소드에서 사용하려면 copy메소드 내에서 생성한 객체의 주소를 반환해주어야 한다. 그렇지 않으면 copy메소드가 종료되면서 생성한 객체의 참…

May 24, 2023
자바
자바의정석