diff --git a/week01/README.md b/week01/README.md index 0168152..1e0e66e 100644 --- a/week01/README.md +++ b/week01/README.md @@ -17,27 +17,130 @@ # 필수 -## www.google.com을 치면 일어나는일 -Keywords : DNS, TCP/IP프로토콜, WS, WAS +## www.google.com 을 치면 일어나는일 + +1. URL을 입력하면 가장 먼저 DNS를 조회한다. +2. 여러 DNS를 거쳐 IP 주소를 파악한다. 이때 브라우저는 도메인이 캐시에 있는지 확인하고, 없다면 hosts파일, gethostbyname 함수를 통해 IP 주소를 받아온다. +3. IP 주소를 얻은 후 웹 브라우저는 TCP/IP 프로토콜을 이용해 서버와의 연결을 시도한다. 이때 TCP 소켓 통신을 사용한다. +4. 연결에 성공한다면, HTTP 통신을 통해 서버와 웹 브라우저가 통신한다. +5. 통신을 통해 브라우저가 HTML 컨텐츠를 사용자에게 보여준다.
+ +이러한 일련의 과정을 거쳐 www.google.com 과 같은 url을 입력했을때 브라우저에 사이트를 띄울 수 있다.
+ +### DNS + +DNS란, 네트워크에서 도메인이나 호스트 이름을 숫자로 된 IP 주소로 해석해주는 TCP/IP 네트워크 서비스이다.
+계층적 이름 구조를 갖는 분산형 데이터베이스로 구성되고 클라이언트 서버 모델을 사용한다.
+DNS는 3가지 요소로 구성되는데,
+도메인 네임 스페이스": 데이터에 대한 이름 관련 규칙을 정의하고 IP 주소 요청에 IP 주소를 반환한다.
+네임 서버: 도메인 트리 구조와 트리에 보관된 정보 집합체를 관리하는 프로그램이다.
+해석기: 네임 서버로부터 클라이언트의 요청 정보를 얻어내는 프로그램이다.
+ +### TCP/IP 프로토콜 + +프로토콜은 통신 시스템이 데이터를 교환하기 위해 사용하는 통신 규칙이다.
+네트워크 프로토콜을 통해 데이터를 교환할 때는 먼저 데이터를 특정 형태로 규격화 하려는 작업이 필요한데, 이는 네트워크에서 데이터를 프로토콜에 맞춰 묶어주기 때문이다.
+TCP/IP 프로토콜이란 컴퓨터들이 인터넷에 엑세스 가능하게 하는 네트워크 프로토콜들의 모음으로, TCP/IP가 가장 많이 사용되는 대표적인 핵심 프로토콜이다.
+일반적으로 네트워크는 계층적으로 구성이 되는데, TCP/IP는 네트워크 엑세스 계층, 인터넷 계층, 전달 게층 및 응용 계층의 4개층으로 구성되어 있다.
+가장 상위 계층은 애플리케이션 계층으로 일반적으로 사용자가 접하는 웹서비스, 메일 전송 등의 서비스를 제공하며 HTTP, SMTP, FTP 등의 프로토콜을 포함한다.
+전달 계층은 종점간 연결과 데이터 전달을 담당한다. 애플리케이션의 메시지를 좀 더 작은 패킷으로 나누고, 수신된 패킷들을 원래대로 재조립하는 일을 수행한다.
+전송 제어 프로토콜(TCP 프로토콜)은 오류를 제어하고, 흐름제어 및 혼잡제어와 같은 일을 수행한다.
+IP 프로토콜은 인터넷 계층을 담당하며, IP 주소에 기반해 각 패킷이 목적지까지 가도록 하는 라우팅(routing)을 담당한다.
+네트워크 엑세스 계층은 IP 패킷이 물리적 네트워크를 통해 실제적으로 전달되도록 데이터 전송을 담당한다. 최하위 계층이며 MAC 주소를 기반으로 노드 간 전송 또한 담당한다.
+ +### WS, WAS + +WS는 Web Server의 약자, WAS는 Web Application Server의 약자이다.
+DNS 및 IP 주소 조회, TCP 연결 HTML 컨텐츠를 웹 브라우저(클라이언트)에 전달하는 것은 WS의 역할이다.
+WAS는 주로 동적인 컨텐츠를 제공하는 역할로, 요청에 맞는 데이터를 데이터베이스에서 가져와 그때 그때 결과를 제공하는데에 주로 사용된다.
+보통 WS와 WAS를 조합해서 서버를 구성하며 이 경우 역할 분담을 통한 서버 부하 방지, 한 서버에서 여러 WAS를 사용할 수 있는 등의 장점이 있다.
--- ## API, HTTP통신 +API란, 운영체제와 응용프로그램 사이에 통신에 사용되는 언어나 메세지 형식을 말한다.
+API는 프로그램 내에서 실행을 위해 특정 서브루틴에 연결을 제공하는 함수를 호출해 구현한다.
+쉽게 말해서 응용 프로그램과 소통하기 위한 일련의 약속이 API라고 할 수 있다.
+최근에는 여러 기업이나 국가 기관이 자체 서버를 운영하며 데이터를 관리하고 있는데, 이런 서버에 접근하여 데이터를 사용할 수 있도록 '오픈 API'라는 형태로 API를 공개하고 있다.
+ +HTTP 통신이란, Hyper Text Transfer Protocol의 약자로 클라이언트와 서버 간 통신을 위한 통신 규칙 세트 또는 프로토콜을 말한다.
+네트워크 통신을 작동하게 하는 기본 기술으로, HTTPS는 HTTP에서 서버와 클라이언트 간 통신에서 암호화된 연결을 지원하는 기술이다.
+HTTP 통신은 먼저 HTTP 클라이언트가 요청문, 헤더, 바디로 구성된 형식에 맞춰서 HTTP 서버에 요청 메시지를 보낸다.
+그 후 HTTP 서버는 HTTP 클라이언트가 보낸 요청 메시지를 수신해 상태문, 헤더, 바디로 구성된 형식에 맞춰 응답 메시지를 보낸다.
+이러한 통신 방식을 비상태 연결이라고 한다.
+HTTP의 요청 및 응답 메시지는 MIME(Multipurpose Internet Message Extensions) 유사 구조를 사용해 데이터를 전송한다.
+ --- ## 백엔드가 하는 일 +1. 데이터베이스 제작, 유지 및 보수
+2. 데이터 유효성 검사
+3. 서버 측 소프트웨어 프로그래밍
+ +이 외에도 서버 측에서 발생하는 모든 코드를 작성하는 것이 백엔드의 업무이기에, 계산 수행이나 머신 러닝 사용 등의 업무도 맡을 수 있다. + + --- ## 객체지향 특징 및 장점 +프로세스 지향 방법과 데이터 지향 방법의 문제점을 해결하기 위해 고안된 것이 객체 지향(Object-oriented) 방법이다.
+기능이나 데이터 대신 객체가 중심이 되는 것이 특징으로, 데이터(속성)를 가장 먼저 찾고 그 데이터를 조작하는 메서드(함수)를 찾아 그 둘을 객체로 묶어 모듈을 구성한다.
+또한 필요한 객체를 간단히 추가할 수 있어 확장성이 높고, 객체의 재사용을 통해 개발 비용과 시간을 줄일 수 있다.
+ --- ## 코드 컨벤션이란 +코드 컨벤션이란 프로그램 개발을 위한 스타일 가이드라인이다.
+기본적으로 변수와 함수에 대한 명명 및 선언에 대한 규칙, 공백 및 들여쓰기 사용 규칙 등을 포함하고 있으며, 개발 환경에 따라 추가되기도 한다.
+이러한 코드 컨벤션을 사용하면 코드 가독성의 향상을 기대할 수 있으며, 프로젝트에서 코드의 유지 및 관리가 원활해질 수 있다.
+Oracle에서 97년에 투고한 Java 코드 컨벤션에 코드 컨벤션은 '소프트웨어의 가독성을 높여주며 새 엔지니어들이 코드를 더 빠르고 철저히 이해할 수 있도록 한다.' 라고 명시되어 있을 정도로 예전부터 개발의 중요한 축이었다고 할 수 있다. +
+ --- ## MVC 패턴 - +소프트웨어 설계에서 3가지의 구성 요소인 모델(Model), 뷰(View), 컨트롤러(Controller)를 활용한 설계 방식이다.
+모델(Model)은 소프트웨어 내에서 데이터(Data)를 의미하고, 뷰(View)는 사용자에게 보이는 영역을 의미한다.
+이러한 모델과 뷰의 상호작용을 컨트롤러(Controller)가 관리하는 구조로 MVC는 구성되어 있다.
+이러한 모델, 뷰, 컨트롤러가 독립적으로 분리되어있기 때문에 다수의 프로그래머가 각 기능을 개발할 수 있고, 기능을 업데이트 할 때에도 기존 요소를 활용할 수 있어 편리하다.
+GUI 개발에 지속적으로 사용되어 왔으며 오늘날 업계 표준 개발 프레임워크로 사용되고 있다.
+MVC 모델을 웹 애플리케이션에 쉽게 적용가능한 라이브러리로는 앵귤러자바스크립트(AngularJS), 엠버자바스크립트(EmberJS), 자바스크립트엠브이시(javaScriptMVC) 등이 있다.
+
+ +1. 컨트롤러(Controller)
+컨트롤러는 기본적으로 뷰와 모델 간 상호 연결을 중개하는 역할을 맡는다.
+사용자의 입력을 받아 모델을 업데이트하고 맞는 뷰를 찾아 데이터를 전송한다.
+
+2. 뷰(View)
+사용자를 위한 사용자 인터페이스를 생성한다.
+뷰에 띄우는 데이터는 모델에 구성되어 있으며 컨트롤러를 통해 데이터를 가져온다.
+즉 뷰는 컨트롤러와만 상호작용하지 모델과는 상호작용 하지 않는다.
+
+3. 모델(Model)
+일반적인 유저 데이터 부터 비즈니스 로직 관련 데이터 등 모든 데이터 관련 논리는 모델에 해당한다.
+데이터베이스에서 데이터를 추가할 수 있으며, 컨트롤러는 자체적으로 데이터베이스와 상호 작용할 수 없기 때문에 필연적으로 모델을 거쳐 상호 작용한다.
+
--- + +## 참고 자료 +[모델 · 뷰 · 컨트롤러](https://terms.naver.com/entry.naver?docId=5714708&cid=42346&categoryId=42346)
+[MVC Framework Introduction](https://www.geeksforgeeks.org/mvc-framework-introduction/#what-is-mvc)
+[JavaScript Style Guide](https://www.w3schools.com/js/js_conventions.asp#:~:text=Coding%20conventions%20are%20style%20guidelines%20for%20programming.%20They,the%20use%20of%20white%20space%2C%20indentation%2C%20and%20comments.)
+[Java Code Conventions](https://www.oracle.com/technetwork/java/codeconventions-150003.pdf)
+[객체지향 방법](https://terms.naver.com/entry.naver?docId=3532990&cid=58528&categoryId=58528)
+[What Does a Back-End Developer Do?](https://www.codecademy.com/resources/blog/what-does-a-back-end-developer-do/?utm_source=ccblog&utm_medium=ccblog&utm_campaign=ccblog&utm_content=cw_what_is_back_end_blog)
+[API](https://terms.naver.com/entry.naver?docId=1179553&cid=40942&categoryId=32837)
+[API](https://terms.naver.com/entry.naver?docId=6653674&cid=69974&categoryId=69974)
+[HTTP와 HTTPS의 차이점은 무엇인가요?](https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/)
+[요청과 응답](https://terms.naver.com/entry.naver?docId=2271986&cid=51207&categoryId=51207&expCategoryId=51207)
+[HTTP의 동작 과정](https://terms.naver.com/entry.naver?docId=2271987&cid=51207&categoryId=51207&expCategoryId=51207)
+[웹 브라우저에서 URL을 입력했을 때 일어나는 과정](https://f-lab.kr/insight/web-browser-url-process)
+[주소창에 url을 검색하면 생기는 일들 (DNS, ARP, TCP, TLS/SSL, HTTP)](https://goldfishhead.tistory.com/23)
+[DNS](https://terms.naver.com/entry.naver?docId=2271994&cid=51207&categoryId=51207#TABLE_OF_CONTENT3)
+[DNS](https://terms.naver.com/entry.naver?docId=1179826&cid=40942&categoryId=32848)
+[[WEB] 🌐 웹 서비스 구조 (Web서버 / 웹컨테이너 / WAS) 정리](https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-%EC%9B%B9-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%EC%A1%B0-%EC%A0%95%EB%A6%AC#web_server)
+[WAS, WS 그리고 servlet](https://velog.io/@qf9ar8nv/WAS-WS-%EC%A0%95%EB%A6%AC)
diff --git a/week02/README.md b/week02/README.md index 5cc6920..977110a 100644 --- a/week02/README.md +++ b/week02/README.md @@ -1 +1,172 @@ # 2주차 학습 내용 +과제를 완벽하게 하지 못했습니다. +함수를 최대한 작게 만드려고 노력했는데 클래스 구분을 잘 못한 것 같고 매직넘버도 너무 많은 것 같고 많이 부족한 거 같습니다. +솔직히 GPT 많이 썼고 인터넷에 올라와 있는거나 이전 COW 사람들이 올린 PR 보면서 해본다고 해봤는데 많이 부족한거 같네요 앞으로 공부 더 열심히 하겠습니다. +JDK 버전도 11로 맞춰두고 했는데 제 컴퓨터에선 작동엔 문제가 없는데 계속해서 + +WARNING: An illegal reflective access operation has occurred +WARNING: Illegal reflective access by camp.nextstep.edu.missionutils.Console (file:/C:/Users/lc011/.gradle/caches/modules-2/files-2.1/com.github.woowacourse-projects/mission-utils/1.0.0/dad5230ec970560465a42a1cade24166e6a424f4/mission-utils-1.0.0.jar) to field java.util.Scanner.sourceClosed +WARNING: Please consider reporting this to the maintainers of camp.nextstep.edu.missionutils.Console +WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations +WARNING: All illegal access operations will be denied in a future release + +이런 오류가 뜨네요 찾아보니까 자바 9이상에서 발생하는 스캐너 관련 오류 인거 같은데 실행에 문제 없으면 무시해도 된다고 해서 일단 제출해봅니다. +열심히 하겠습니다. + +--- + +## enum + +Enumeration, 열거형, 상수 데이터들의 집합 +핵심은 상수를 객체 지향적으로 객체화해서 관리하자 +C언어의 enum은 상수, C++의 enum은 타입이지만 JAVA의 enum은 독립된 특수한 클래스로, 객체 취급이라 힙 메모리에 저장된다. + + +enum을 사용하면 구현의 의도가 열거임을 분명히 할 수 있으며 자체 클래스 상수 같은건 switch문에서 사용 못하기도 하는데 이 친구는 가능하다. +또한 데이터의 그룹화 및 관리에 용이하다. + +``` +// 계절 열거 타입 +enum Season { + SPRING("봄"), + SUMMER("여름"), + FALL("가을"), + WINTER("겨울"); +} +``` +``` +//실제로는 이렇다 (enum 나오기 전에는 이렇게 썼다) +//자기자신의 인스턴스를 만들어서 상수화하는 것 +final class Season { + public static final Season SPRING = new Season("봄"); + public static final Season SUMMER = new Season("여름"); + public static final Season AUTUMN = new Season("가을"); + public static final Season WINTER = new Season("겨울"); +``` + +[자바 Enum 열거형 타입 문법 & 응용 💯 정리](https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%B4%EA%B1%B0%ED%98%95Enum-%ED%83%80%EC%9E%85-%EB%AC%B8%EB%B2%95-%ED%99%9C%EC%9A%A9-%EC%A0%95%EB%A6%AC#:~:text=Enum%20%EC%97%B4%EA%B1%B0%20%ED%83%80%EC%9E%85) + +--- + +## Stream + +스트림이란, 자바 8부터 추가된 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다. + +``` +//String 배열 +String[] strArray = { "홍길동", "이순신", "임꺽정"}; +Stream strStream = Arrays.stream(strArray); +strStream.forEach(a -> System.out.print(a + ",")); +System.out.println(); + +//int 배열 +int[] intArray = { 1, 2, 3, 4, 5 }; +IntStream intStream = Arrays.stream(intArray); +intStream.forEach(a -> System.out.print(a + ",")); +System.out.println(); + +``` + +이 경우 stream() 메소드로 스트림 객체를 얻은 후 strStream.forEach()를 통해 실행된다. + +스트림의 장점은 배열과 컬렉션을 함수형으로 처리해 코드를 간결하게 작성할 수 있다는 것, +스트림을 활용해 간단하게 병렬처리가 가능하다는 점 등이 있다. + +[[Java] 자바 스트림(Stream) 사용법 & 예제](https://coding-factory.tistory.com/574)
+[Java 스트림 Stream (1) 총정리](https://futurecreator.github.io/2018/08/26/java-8-streams/) + +### 병렬처리 + +하나의 작업을 둘 이상의 작업으로 세분화해서 동시에 진행하는 것 +list.parallelStream() 이라는 메소드를 사용하면 여러개의 스레드가 병렬적으로 데이터를 처리한다. + +``` +Sequential Stream: +one - Thread: main +two - Thread: main +three - Thread: main +four - Thread: main +five - Thread: main + +Parallel Stream: +one - Thread: ForkJoinPool.commonPool-worker-3 +two - Thread: ForkJoinPool.commonPool-worker-1 +three - Thread: ForkJoinPool.commonPool-worker-2 +four - Thread: ForkJoinPool.commonPool-worker-3 +five - Thread: ForkJoinPool.commonPool-worker-1 +``` + +이런 식으로 순차 스트림의 경우 단일 스레드 (main 스레드)를 통해, 병렬스트림의 경우 동시에 여러 스레드를 통해 데이터를 처리한다. +(또한 이름에서 보이듯 순차 스트림은 데이터 처리 순서 = 입력 순서이다. 병렬은 무작위) + +### 람다식 + +람다식이란, 식별자없이 실행가능한 함수이다. +함수를 따로 생성하지 않고 코드 한줄로 간결하게 호출하는 방식이다. + +``` +//식별자(multiply)를 통해 일반 메서드로 정의된 함수 +public int multiply(int x, int y) { + return x * y; +} +``` +``` +//식별자 없이 정의된 람다식 +(int x, int y) -> x * y +``` +람다식을 사용하면 코드를 간결하게 만들 수 있지만, 재귀로 만들기엔 부적합하다는 단점이 있다. +또한, 기본적으로 즉석에서 정의되고 실행되기 때문에, 기본적으로는 재사용이 불가능하다. +람다식을 재사용가능한 함수로 만들기 위해서는 람다식을 변수에 저장하거나 또 다른 메소드로 정의해야한다. + +[[Java] 람다식(Lambda Expressions) -> 사용법 & 예제](https://coding-factory.tistory.com/265) + +--- + +## IllegalArgumentException + +메소드가 유효하지 않거나 컨텍스트에서 부적절한 인수를 받았을 때 발생하는 런타임 예외처리이다. +과제에서 사용한 IllegalArgumentException의 경우 입력받은 당첨 로또 번호가 6개인지, 중복된 번호를 입력받았는지, 입력받은 번호의 범위가 1~45 인지 검증하는 메소드에서 사용됐다. + +``` +private void validateNumber(List numbers) { + if (numbers.size() != 6) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 6개여야 합니다."); + } + } +``` + +--- + +## 매직 넘버 + +매직 넘버는 코드에서 값의 의미나 목적이 명확하게 알려지지 않은 것이다. +이러한 매직 넘버는 코드의 가독성이 떨어지고 유지 보수가 어렵게 만들기에 상수나 변수를 사용해야 한다. + +``` +// 3.14의 의미가 무엇인지 명확하게 명시되어 있지 않음 +function calculateArea(radius) { + return 3.14 * radius * radius; +} +``` +``` +// 이렇게 확장자 값을 직접적으로 사용해도 매직 넘버가 됨 +function getFileType(fileName) { + if (fileName.endsWith(".jpg")) { + return "image"; + } else if (fileName.endsWith(".mp3")) { + return "audio"; + } else if (fileName.endsWith(".txt")) { + return "text"; + } else { + return "unknown"; + } +} +``` +``` +// 이렇게 new Date(birthDate).getFullYear();가 어떤 의미인지 정확히 명시되어 있지 않은 것도 매직 넘버가 될 수 있음 +function calculateAge(birthDate) { + const currentYear = new Date().getFullYear(); + const birthYear = new Date(birthDate).getFullYear(); + return currentYear - birthYear; +} +``` diff --git "a/week03/[3\354\243\274\354\260\250] \354\235\264\354\244\200\355\230\201.md" "b/week03/[3\354\243\274\354\260\250] \354\235\264\354\244\200\355\230\201.md" new file mode 100644 index 0000000..daffbf9 --- /dev/null +++ "b/week03/[3\354\243\274\354\260\250] \354\235\264\354\244\200\355\230\201.md" @@ -0,0 +1,126 @@ +## 기존 코드와 다른 점 (변경점) + +### 매직 넘버 수정 + +일단 전체적으로 매직 넘버? 스트링? 정확한 용어를 모르겠지만 명확하게 의미가 지정되지 않은 숫자와 문자열에 이름을 달아주었다.
+예를 들어
+``` +if (purchaseAmount % 1000 != 0) { + throw new IllegalArgumentException("[ERROR] 구입 금액은 1,000원 단위로 입력해야 합니다."); + } +``` +이런 코드 같은 경우 나는 로또 가격이 하나 당 1000원인 것을 알기에 1000 이라는 숫자가 의미하는 것이 이해가 되지만, 남이 이 코드를 봤을 때 1000 이라는 숫자가 무엇을 의미하는 지 모를 수 있기 때문에
+``` +private static final int pricePerLotto = 1000; + +if (purchaseAmount % pricePerLotto != 0) { + String multiplesPurchaseAmountError = "[ERROR] 구입 금액은 1,000원 단위로 입력해야 합니다."; + throw new IllegalArgumentException(multiplesPurchaseAmountError); + } +``` +이런 식으로 미리 선언을 해줘서 의미를 명확히 부여하고 수정도 용이하게 작성했다. + +### 구입 금액 입력 메소드 수정 + +원래 구입 금액을 입력받는 메소드(inputPurchaseAmount)에서 구입 금액을 입력받고 입력받은 값이 옳은 값인지 검증하는 것 까지 한번에 했는데, 그러면 이 메소드의 역할이 너무 많아지는 것 같아 검증하는 메소드를 따로 나눴다.
+또, 입력 받은 값이 음수일 경우 IllegalArgumentException을 띄우도록 추가했다.
+ +``` +// 기존 메소드 +private static int inputPurchaseAmount() { + System.out.println("구입금액을 입력해 주세요."); + int purchaseAmount = Integer.parseInt(Console.readLine()); + if (purchaseAmount % 1000 != 0) { + throw new IllegalArgumentException("[ERROR] 구입 금액은 1,000원 단위로 입력해야 합니다."); + } + return purchaseAmount; + } +``` + +``` +// 수정된 메소드 +private static int inputPurchaseAmount() { + String inputPurchaseAmount = "구입금액을 입력해 주세요."; + System.out.println(inputPurchaseAmount); + return Integer.parseInt(Console.readLine()); + } + +private static void validatePurchaseAmount(int purchaseAmount) { + if (purchaseAmount <= 0) { + String negativePurchaseAmountError = "[ERROR] 구입 금액은 음수가 될 수 없습니다."; + throw new IllegalArgumentException(negativePurchaseAmountError); + } + if (purchaseAmount % pricePerLotto != 0) { + String multiplesPurchaseAmountError = "[ERROR] 구입 금액은 1,000원 단위로 입력해야 합니다."; + throw new IllegalArgumentException(multiplesPurchaseAmountError); + } + } +``` +--- + +## 과제 진행하며 생긴 궁금한 점 (= 공부해야 할 것) + +1. for each 반복문에 대해서
+
+2. +``` +private static List generateLotto(int purchaseAmount) { + List purchasedLotto = new ArrayList<>(); + int numberOfLotto = purchaseAmount / 1000; + System.out.println(numberOfLotto + "개를 구매했습니다."); + for (int i = 0; i < purchaseAmount; i++) { + // purchasedLotto.add(로또 생성 메소드); + } + return purchasedLotto; +} +``` +에서 List에서 <> 안 Lotto가 가지는 의미
+ +``` +private static List inputWinningNumbers() { + System.out.println("당첨 번호를 입력해 주세요."); + List winningNumbers = parseInputNumbers(Console.readLine()); + new Lotto(winningNumbers); + return winningNumbers; +} +``` +여기서 Lotto 객체를 생성할 때 List로 받는게 아니라 List로 받는 이유
+ +3. +``` +// 범위 검증 메서드를 static으로 변경 (단일 숫자 검증) +public static void validateRange(int number) { + if (number < 1 || number > 45) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); + } +} +``` +단일 숫자 검증 메소드에서 +for (int number : numbers)를 사용할 수 없는 이유
+ +4. +``` +private static void printResults(List results, int purchaseAmount) { + int[] rankCount = countRanks(results); + printRankResults(rankCount); + double yield = LottoCalculator.calculateYield(results, purchaseAmount); + System.out.println("총 수익률은 " + yield + "%입니다."); +} +``` +이 부분에서 printf와 println의 차이
+ +5. 각 클래스에서 따로 상수 선언을 해줬는데
+이거를 따로 constant 같은 클래스를 만들어서 빼주는게 나은지
+아니면 그냥 각 클래스에서 지정해서 써주는게 나은지 + +--- + +## 그 외 이것저것 + + +과제 하면서 나란 사람이 참 부족함이 많다는 걸 느꼈다.
+단순히 자바 관련 지식 뿐만 아니라 자세나 태도 관련해서도 게을르다는 생각을 느꼈다.
+사실 어찌어찌 코드는 작성해서 제출했지만 미루다 미루다 급박하게 작성한거라 메소드에 따라 클래스를 더 나누려고 했는데 그것도 못했고 코드 구조도 작성도 못했다.
+물론 목요일 전까지는 어찌어찌 해가겠지만... 일요일까지 제출하라고 하셨을 때 딱 제출하지 못한다는게 내가 어영부영 했다는 생각이 들었다.
+또 내가 과제 하면서 궁금했던 점들을 당연히 생길 때 마다 찾아봤지만 남에게 설명할 수 있을 정도로 명확하게 이해했다기엔 어렵다는 점? 정도가 많이 아쉬웠다
+목요일 전까지 코드도 지속적으로 수정하고 구조도도 만들고 개념 이해도 하고 열심히 해야할 것 같다.
\ No newline at end of file