1) 알고리즘 - 타입변환, 반복문, 조건문, 배열 등
2) 객체지향 - OOP, 상속(inheritance)
3) Spring - MVC
- 타입변환
- 조건문(if/if-else/if-else if-else문, switch-case문)
- 반복문(for문, while문)
- 배열
위에 명시한 부분에 대해서 기존에 모르고 있지는 않았다.
하지만 정확하게 알고있는 상태가 아니였고, 이번 주 동안 알고리즘 테스트를 준비하면서 이해가 되지않는 부분을 찾아보고 헷갈리던 부분을 바로잡았다.
타입변환은 크게 두 가지로
<1>자동 타입변환 과 <2>강제타입변환으로 나누어 볼 수 있다.
<1> 자동 타입 변환
자동 타입 변환은 말 그대로 자동으로 타입 변환이 일어나는 것을 의미한다.
자동 타입 변환은 값의 허용 범위가 작은타입이 허용 범위가 큰 타입으로 저장될 때 발생한다.
<타입허용 범위 크기순>
byte < short < int < long < float < double
예제)
byte byteValue = 10;
int intValue = byteValue; //자동 타입 변환
<2> 강제 타입 변환
큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환될 수 없다.
이는 큰 그릇에 가득찬 물을 작은 그릇으로 옮겨 담을수 없는 것과 같다.
하지만 큰 그릇에 있는 물의 일부분을 작은 그릇으로 옮겨 담을 수는 있다.
이와 같이 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠 저장하는 것을 강제 타입 변환이라고 한다.
예제)
double doubleValue = 3.14;
int intValue = (int) doubleValue; // '3'만 저장. (강제 타입 변환)
조건문에는 크게 if문과 switch-case문이 존재한다.
내가 이해하고 간과하고 있던 조건문에 대해서 이야기하겠다.
<1> if문
if문에 대해서는 원래 잘 알고 있었고 잘 사용하고 있었다고 생각했다.
근데 너무 습관적으로 if문을 사용하면 else문이 무조건적으로 따라와야 한다고 착각을 하고 있었다.
if문은 아래와 같은 특징을 갖고 있다.
if(조건식){수행문} ==> 처럼 사용을 하는데 조건식안에는 boolean 타입의 결과값이 나와야하고
조건식이 true 이면 수행문을 실행.
false이면 수행문을 무시한다.
if문은 else 없이도, else-if 문이 없어도 사용할 수 있다.
if문의 조건에 맞지 않는다면 그 다음 코드로 넘어가기 때문이다.
이를 나는 간과하고 있었고, 알고리즘 테스트를 풀면서 다시 한번 되짚을수 있었다.
<2> switch-case문
솔직히 switch-case문은 이해를 못했었다. 그러다보니 자연스럽게 조건문은 if문만 사용했었다. 하지만 알고리즘 테스트를 풀면서 더 효율적인 것을 찾다보니 switch -case문을 찾아보고 if문 만큼은 아니지만 어느정도 사용할 수 있게 되었다.
switch-case문은 아래와 같은 특징을 갖고 있다.
switch(변수){
case 타입에맞는 값:
}
이런식으로 사용하는데, 지금 설명하기엔 코드가 예뻐보이지 않아 이건 나중에 다시 정리하겠다.
알게된 점은 case 바로뒤에 "타입에 맞는 값" 이라 해놓은 곳에 여러 타입들을 사용할 수 있고 아직 말로는 설명을 못하지만 사용할 수 있게 되었다.
반복문은 for문과 while문, do-while문으로 구분되어 있다.
여기서는 내가 이해하고 사용할 수 있는 for문과 while문에 대해 몰랐던점과 새로 알게된점에 대해 이야기하겠다.
<1> for문
for문에 대해서도 if문 만큼 꽤 알고있다고 생각했다.
그런데 여러 알고리즘 문제를 풀면서 습관적으로 "for(int i=0; i<변수.length; i++)" 을 먼저 적고 있다는 사실을 알게되었다.
이는 for문을 잘 알고 있는것이 아니라 내가 자주 사용하다보니 그냥 손에 코드가 익숙해진 것 이였다.
for문은
for(타입 초기값, 조건식, 증감) 으로 구성되어있다.
여기서 초기값, 조건식, 증감을 잘만 이용한다면 여러 경우의 수를 만들어 낼 수 있다. 이를 나는 알고있었지만 for문의 구조를 완벽하게 이해하지못해 사용하던 위에 식만 주구장창 사용했던 것 같다.
문제를 풀고 다른 사람들의 여러풀이를 보면서 for문의 초기값,조건식,증감을 얼마나 자유자재로 활용하느냐에 따라 간결해질수있는 코드를 접하였고, 이로 인해 for문에 대해 다시한번 공부하게 된 계기가 되었다.
<2> while문
while문은 무한루프로 돌아가는 반복문이라고 만 기억하고 조건문 switch와 비슷하게 거의 사용하지않았다. 명확하게는 사용하는법을 알려고 하지않고 for문만 사용하고 있던 것이였다.
while문은
while(조건식){내용}
과 같이 사용된다.
그런데 위와같은 내용 안에 내용을 어떻게 조건식을 바꿔사용할지 감을 잡지 못해 나는 사용하지 않았었다.
그리고 이번에 공부를 하면서 내용안에 증감연산자를 사용하여 조건식 안에 변수를 증감시켜주면 조건에 해당하지 않을때까지 반복문을 사용할 수 있다는 것을 새로 알게 되었고, 알고리즘 테스트를 연습하는 문제에 사용할 수 있었다.
알고리즘을 풀면서 제일 어려웠던 놈이다.
배열에 대해 다시 하나하나 알게되면서 위에 타입변환, 조건문, 반복문 모든걸 다시 공부하게 해준 파트다.
배열은 아래와 같이 사용한다.
타입[] 배열이름 = new 타입[크기];
배열은 타입 별로 존재하고, 각 타입별 배열을 바꿔주기 위해서는 위에서 배운 것과 약간 다르지만 결과론적으로는 같은 타입변환을 해주면 가능하다.
배열은 초기값을 아래와 같이 지정할 수 있다.
타입[] 배열이름 = {};
추가적으로는 이중배열도 배웠는데 이는 나중에 다뤄보도록 하겠다.
많은 알고리즘 문제들을 풀면서 내가 꽤 괜찮다고 생각한 부분들이 빠른시간내에 배운 탓일 진 몰라도 많이 허술하다는 것을 알 수 있었고, 책과 여러 블로그 자료들을 찾아보며 내가 갖고있던 지식을 재정비 할 수 있었다.
테스트를 준비하면서 생각보다 많은 문제를 짧은시간내에 접하고 푼 거 같다.
알고리즘 테스트의 답은 정해져있지 않다. 답은 무수히 많고 각각의 다른 코드들이 존재한다. 그 코드들엔 짧은코드도 존재하고, 길고 긴 코드도 존재한다.
어떤 코드가 더 좋은 코드라고 확언을 할 수는 없다고 생각한다.
왜냐하면 개인적으로 나는 알고리즘 테스트란, 출제자의 의도에 따라 출제자의 요구 사항을 맞춰 푸는 거라고 생각했기 때문이다.
이게 무슨 말인지는 쓴이가 너무 거지같은 필력을 갖고있기에 이해해주길 바란다.
P.S 더 나은 필력을 위해 열심히 써봐야지..
1) OOP
2) 상속(inheritance)
1) OOP(Object Oriented Programming)
OOP는 객체지향적 프로그래밍을 뜻한다.
내가 공부하고 있는 JAVA는 객체지향 프로그래밍 언어다.
간략하게 객체지향 프로그래밍에 대해 설명하자면,
붕어빵 틀(Class)과 붕어빵(객체)로 설명하겠다.
붕어빵은 붕어빵 틀에서 만들어진 각자 다른 붕어빵들이다.
이는 즉, 붕어빵1과 붕어빵2은 얼핏보면 같지만 결과적으론 다르다는 이야기다.
이렇게 같지만 서로 다른 객체로 인정하는 것이 객체지향적인 프로그래밍이다.
--> 맞는 말인지는 모르겠다. 시간날때 수정해야지.
2) 상속
상속이란 자식은 부모에게 상속되어 있는 것과 같은 의미다.
다음주 까지 추상클래스를 포함해서 다시 정리하여 올리겠다.
--> 매우 중요하다. 이녀석때문에 이번주 SA과제 골아팠다.
Spring 주특기 하기전에 Java가 먼저 되어야한다.
SpringBoot는 Java에서 웹을 만들기 위해 만들어진 도구에 불과하다.
결국에 Java의 객체지향적인 프로그래밍을 이해하지 못한다면, Spring은 배울수 없다.
Java를 할줄 알아야 Spring을 할 수 있다.
나는 그렇게 생각한다.
과제도 중요하지만, 객체지향적인 사고를 먼저 이해하고 Java를 사용할 줄 아는 것이 더 중요하다고 생각한다.
이 생각이 엇나가지 않도록 다시 되새긴다.
MVC(Model-View-Controller)
1) Controller/Service/Repository의 역할 및 이해
2) Dto의 역할
1) Controller
Controller는 Client와 가장 가까이 위치하고 있으며, Client에서 들어오는 Request를 받아 Service에 전달하여주고, Service로 부터 그에 맞는 Reponse를 되돌려주는 역할을 한다.
2) Service
Service는 Client의 Request를 처리 ('비즈니스 로직') 하는 메인이다.
DB정보가 필요할 시에는 Repository에 Request한다.
3) Repository
Repository는 DB와 가장 근접하고, DB에 있는 정보를 JPA Repository를 통해 쿼리문 없이 자바코드로 명령하여 사용할 수 있다.
Repository는 실질적으로 DB를 관리(연결,해제,자원관리)하고 DB의 CRUD 작업을 처리해준다.
JPA에 대해서는 다음주에 자세히 다뤄보겠다.
4) Dto
Dto는 Controller에서 Service , Service에서 Repo, Repo에서 Service, Service에서 Controller로 데이터가 오고갈때!!
옮기는 중 데이터가 직접적으로 손상되지 않게 한번더 감싸서 이동시켜주는 수단이라고 보면된다.
D - 85
주특기 시작했다.
생각보다 이게맞는건가 싶은게 더 크다.
솔직히 관두고 싶은 마음은 없는데 이게 맞나 싶은 생각만 든다.
이번주 부터 시작해서 3주간은 진짜 열심히 해야겠다.
코린이 드가자.~.~
다음주도 화이팅.