| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- github
- 게시판 리뷰 만들기
- Algorism study
- 클래스 상속
- MVC 패턴
- Java
- Sts
- crud
- 패스트캠퍼스
- Interface
- MegabyteSchool
- 메가바이트스쿨
- 개발자취업부트캠프
- 게시판 만들기
- #javaStudy
- 국비지원교육
- 내일배움카드
- AWS
- side project
- Entity
- MVC
- 클래스 class
- #패스트캠퍼스 #국비지원교육 #메가바이트스쿨 #MegabyteSchool #개발자취업부트캠프 #내일배움카드
- tomcat
- Spring
- GIT
- View
- array
- group study
- spring boot
- Today
- Total
tuter77
2022.12.20 TIL 본문
<java 온라인 강의>
저번 강의 까지는 조건문에 대해 알아보았고, 오늘은 반복문을 공부했다.
● 반복문
반복문은 대부분의 언어에서 종류가 비슷하다고 하는데 while, do-while, for 문의 종류가 있다.
▷while문
조건이 참(true)인 동안 반복수행하는 기능.
조건에 맞지 않으면 수행중지.
조건은 주로 반복횟수나 값의 비교의 결과에 따라 true, false가 판단 된다.
while문은 아래와 같이 작성한다.
while (조건식) {
수행문1;
...
}수행문2
위의 예시처럼 조건이 true라면 안의 수행문1을 수행하고, 수행 중 조건이 false가 되면 반복문을 빠져나와 수행문2를 수행하게 된다.
▷do-while문
while문이 조건을 먼저 체크한 후 반복수행을 하게 된다면, do-while문은 조건과 상관없이 수행을 한 번하고 나서 조건을 체크하고 반복수행한다.
do{
수행문1;
...
} while (조건식);
수행문2;
....
위의 형태와 같이 수행문1이 먼저 한 번 수행되고 난 후 조건을 확인해 수행문1을 반복수행한다.
이후 조건이 false라면, 수행문2를 수행하게 된다.
▷for문
가장 많이 사용하는 반복문으로
for (초기화식; 조건식; 증감식)
{
수행문1;
.....
}
의 형태를 가진다.
간단한 예제로 알아보겠다.
예제)
int num;
for (num = 1; num <= 5; num++)
{
System.out.println(num);
}
위의 예제에서 작동순서는 초기화식(num = 1) > 조건식(num <= 5) > 조건이 true라면 아래의 수행문(System.out.println(num);) > 증감식( num++) > 조건식(num <= 5) > 반복 > 조건이 false라면 for문을 탈출하게 된다.
*첨언으로 위의 형태에서 각 식들은 하나의 문장으로 " ; " 세미콜론을 붙여줘야한다.
또한 초기화식, 증감식은 복수로 작성도 가능하며, 이미 선언되었다면 비워두는 것도 가능하다.
(예. int num = 1; 로 선언된경우 for( ; num <= 5; num++) 또는 증감식이 길다면 아래 수행문 다음구문에 추가해줄 수 도있다.)
▷ 각 반복문의 쓰임
do-while문은 제어방식이 다른 두 반복문과 다르기 때문에 수행문이 선실행될 필요가 있을때 사용한다.
while문은 조건식의 결과나 변수가 true, false의 경우일 때 주로 사용한다.
for문은 특정수의 범위, 횟수와 관련하여 반복되는 경우 주로 사용한다.(배열과 함께 많이 사용된다.)
▷ for문의 문장 생략
앞서 말했듯 for문에서는 이미 선언되어있는 변수의 경우 생략이 가능하다.
추가적으로 break문을 사용하게 되면 조건식도 생략할 수 있다.
예제로 보면 아래와 같다.
int i = 0;
for ( ; i < 5; i++)
{
...
}
- 조건식 생략
위에서 말했듯 break문이 들어가면 조건식 생략이 가능하다.
예제)
for (i = 0; ; i++){
sum += i;
if(sum > 200) break;
}
위의 예제처럼 for문안에 조건과 break문이 기술되면 조건식 생략이 가능하다.
- 증감식 생략
for(i=0; i<5; ) {
...
i = (++i) % 10;
}
증감식이 복잡한 경우 for문 하단에 기재해 생략할 수 있다.
*무한반복의 경우
for( ; ; ){
}
while(true){
}
위 두 경우는 무한 반복되는 경우이다.
▷ 중첩반복문
반복문 내의 또다른 반복문의 형태를 띈다.
여러겹으로 구현 가능하나, 수행시간의 문제가 발생할 수 있다.(일반적으로 많아도 3겹 정도 쓴다.)
외부 반복문과 내부 반복문간의 변수값 변화에 유의하며 구현해야한다.
* while 반복문에서는 변수를 밖에서 초기화 해야하는 경우가 있다.
예시) 구구단 만들기
package ch20;
public class NestedLoopTest {
public static void main(String[] args) {
int dan = 2;
int count = 1;
// for ( ; dan <=9; dan++) {
//
// for(count = 1; count <=9; count++) {
//
// System.out.println(dan + "X" + count + "=" + dan*count);
// }
// System.out.println();
// }
dan = 2;
count = 1;
while( dan <= 9) {
count = 1;
while(count <= 9) {
System.out.println(dan + "X" + count + "=" + dan*count);
count++;
}
dan++;
System.out.println();
}
}
}
위의 예시는 반복문의 형태를 가장 잘 보여주는 구구단 만들기 이다.
변수 dan과 카운트가 각 항이되어 A*B = C의 형태를 띄게 된다.
주석처리된 for문을 보면, 변수 dan을 조건으로 하는 for 문 안에 변수 count를 조건으로 하는 for문이 중첩되어있다.
내부 for문에서 A*B = C의 형태를 출력하게 되고, 수행을 반복한다.(외부 for문의 System.out.println()은 각 단마다 줄을 띄워서 콘솔에 출력하기 위함이다.)
2X1=2
2X2=4
...
위 for문을 구동하면 이와같은 결과물이 나오게된다.
다음으로 while문을 살펴보면, dan을 변수로하는 while문 안에 count변수가 한번더 선언되고(count =1;) count를 조건으로 하는 while문이 중첩되어있음을 알 수 있다.
이와 같이 하는 이유는 while문에는 초기화식이 없기 때문이다.
때문에 count의 값이 9까지 수행된 후 초기화 되지않아 2단까지 밖에 반복수행되지않는다.
위 처럼 초기화 선언을 다시 해주면 그제야 9단까지 구구단이 콘솔에 출력된다.
● Break / Continue 문
▷ Break문
감싸고 있는 제어문의 블록을 빠져나오는 기능으로 switch문에서 사용했었다. 여기에선 반복문에서 주로 조건문(if)와 같이 사용하여 조건에 해당되는 경우, 반복수행을 멈추고 반복문 외부로 이동하는 기능을 본다.여러 반복 중첩시엔, break문이 포함된 반복문만 빠져나온다.예시)
package ch21;
public class BreakTest {
public static void main(String[] args) {
// 몇 번째 숫자까지 더해야 100이 넘는지 확인해보기 구현. 일반적인 for문과 break문 비교
int sum = 0;
int num;
for (num = 1; sum <= 100; num++) {
sum += num;
}
// for(num = 1; ; num++) {
//
// sum += num;
// if (sum >= 100)
// break;
// }
System.out.println(sum);
System.out.println(num);
}
}
위에서 볼 수 있듯 반복문은 주석처리된 부분처럼 조건과 함께 기재해, 조건식을 생략하고 탈출할 수 있는 구문이다.
▷ Continue문
반복문 내에서 조건문(if)과 같이 사용하며 true의 경우 이후 반복문 내부블럭의 다른 수행문을 수행하지 않는 기능이다.
예시)
package ch21;
public class ContinueTest {
public static void main(String[] args) {
// 3의 배수가 아니면 아래 수행문 건너 띄기. 3의 배수만 수행하기.
int num;
for(num = 1; num <= 100; num++) {
if ( (num % 3) != 0) continue;
System.out.println(num);
}
}
}
위의 예시처럼 3의 배수에 해당하는 조건이라면 수행문을 건너띄고 다음 수행문을 수행한다.
오늘로써 온라인자바 기초강의 21강이 끝났다. 내일부턴 자바 객체지향입문으로 공부하려한다.
<spring>
그룹스터디 과제로 spring과 spring부트를 공부했는데 해당 내용을 좀더 덧붙이려고한다.
스프링은 자바를 이용해 어플리케이션을 만들려고 활용하는 여러 툴이 활용된 프레임워크, 스프링 부트는 스프링을 모두 비슷하게 활용하자 더 편리하게 사용하려고 만든 상위 프레임 워크다.(사용자에게 가까운)
비유하자면 스프링은 스틱기어고, 스프링부트는 오토기어쯤 된다고 한다.
스프링에서 웹 서버와 소통하기 위해선 아파치 서버, 톰캣등의 웹 어플리케이션이 필요했는데 이 톰캣 세팅이 워낙 어렵다보니 스프링 부트에서는 톰캣을 자동으로 설정해주게끔 서버에 내장을 해버렸다.
때문에 컴퓨터 부팅하는 것과 같다고 해서 스프링 부트로 이름을 지었다고 한다.
핵심기능으로는 DI(Dependency Injection), Ioc(Inversion of Contorol), AOP(Aspect Oriented Programming) 등 이 있다.
각 기능들은 스프링, 스프링 부트의 장점으로 이어진다.
●스프링의 장점은 다양하게 있다.
먼저 모든 기능에서 다양한 모듈을 사용가능한 자유도를 자랑한다.(심지어 외부 모듈까지 가능하다고 한다.)
계속해서 개발중이며, 이전 버전들과 높은 호환성을 가졌다.
또한 API디자인을 섬세하게 하려고 노력해, 스프링 오픈소스 자체가 좋은 참고가 된다.
앞서 말한것의 파생으로 높은 코드 품질을 유지하려한다.
오픈소스를 통해 기능개선을 꾀하면서 스프링 창시자인 로드 존슨을 주축으로 한 스프링소스가 스프링 개발의 주축을 맡음으로서 안정성까지 잡고 있다.
이어 핵심기능으로 살펴보면,
● DI는 객체간의 의존성을 느슨하게 하는 것인데, 변경에 의해 영향을 받는 관계가 Dependency, 여기서 의존하는 객체 사이에 의존 객체를 넣어 의존성을 해소해주는 것이다.
간단한 예시로 보겠다.
A, B 두 객체가 있다면,
B = A + 1처럼 B가 A에 의존성을 가지는 경우에
A, A2, B로
A2 = A
B = A2 + 1 과 같은 형태로 의존성을 해소해주는 역할을 한다.
이를 통해 코드의 재사용성이 증가하고, 단위 테스트가 용이해진다.
이러한 DI를 통해 클래스를 작성했더라도 그 객체를 main 메서드에서 주입하는 것보다 의존 객체를 주입하기위한 클래스를 따로 작성하는 것이 효율적인 관리가 된다.
이 때 의존 객체를 주입하기 위한 클래스를 Assembler(조립기)라고 한다.
● IoC는 Bean, Servlet 같은 코드를 개발자가 아닌 프레임 워크가 대신 수행하는 기능을 의미한다.
첨하자면 기존에는 자바 코드를 작성할 때 객체의 생성, 의존관계 설정 등을 개발자가 해줘야 했지만, 프레임워크가 대신해준다는 의미.
● AOP는 핵심기능을 제외한 부수적인 기능을 프레임워크가 제공하는 특징이다.
AOP는 Filter, Interceptor 와 함께 공통적으로 처리해야할 업무들을 따로 빼서 관리할 수 있도록 해주는 기능을 가졌다.
공통적으로 처리해야할 일들은 로그인 관련처리, 권한체크, XSS방어, pc와 모바일웹의 분기처리, 로그, 페이지 인코딩 변환 등이 있다.
위 세가지 기능은 무슨 행동을 하기전에 먼저 실행 혹은 실행한 후 추가적인 행동을 할 때 사용된다.
차이점을 알아보자면, Interceptor와 Filter는 Servlet 단위에서 실행되는 반면, AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.
따라서 요청이 들어오면 Filter > Interceptor > AOP > Interceptor > Filter 순으로 거치게 된다.
Filter는 요청과 응답을 거른뒤 정제하는 역할을 한다. 서블릿 이전에 필터가 동작하도록 지원된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.
또 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.
보통 web.xml에 등록하고, 일반적으로 인코딩 변환처리, xss방어 등의 요청에 대한 처리로 사용된다.
Interceptor는 요청에 대한 작업 전 후로 끼어들어 스프링 컨텍스트 내부에서 컨트롤러에 관한 요청과 응답에 대해 처리한다.
스프링의 모든 빈 객체에 접근할 수 있고, 여러개의 인터셉터를 사용할 수도 있다.
기능은 로그인 체크, 권한체크, 프로그램 실행시간 계산작업, 로그확인 등이다.
AOP는 OOP를 보완하기 위한 개념으로 중복을 줄일 수 없는 부분을 줄이기 위해, 종단면 관점(Aspect)에서 바라보고 처리한다.
주로 로깅, 트랜잭션, 에러처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.
AOP는 인터셉터 필터와 달리 메소드 전후의 지점에 자유롭게 설정이 가능하고, 인터셉터/필터는 주소로 대상을 구분해서 걸러내야하는 반면, 주소/파라미터/애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
서블릿 종료 시 destroy가 실행된다
또한 중복되는 코드를 제거해주는 기능도 있다.
반면, 단점은 장점들에서 찾을 수 있다.
높은 자유도 때문에 좋은 툴을 선택하기 힘든 상황이 발생한다.
이전 버전과의 높은 호환성은 레거시(낡은 기술)가 많이 남아있다는 말과 같은데, 이는 코드의 복잡성이 높아지기도 한다.
스프링 부트는 스프링의 장점을 다 가지면서 단점을 최소화 하기 위해 내놓은 서브 프로젝트라고 한다.
때문에 스프링 부트의 장점은 스프링과 겹치고, 스프링과의 차이점이기도 하다.
●스프링 스프링부트 차이점
첫번째로 dependency(의존성) 설정과 버전관리가 수월해졌다고 한다.
스프링에서는 dependency를 추가하기위해 긴 설정을 거쳐야하는데, 스프링 부트에서는 버전관리를 자동으로 해준다.
구체적으로 기존 spring은 bean.xml 설정파일을 통해 일일히 Bean을 지정하는 방식이라면, spring boot는 @Configuration, @ComponentScan 등의 어노테이션 방식으로 Bean을 등록해서 더 편리하게 사용하는 것이다.
다른 예로 들면, Gradle 빌드 툴을 사용하는 경우 build.gradle파일에 dependency를 추가해주면, 모든 dependency를 자동으로 추가하고 관리해주는 것도 있다.
두번째로 스프링의 어려운 모든 어노테이션(주석) 및 빈 등록 등의 설정을 다 해야한다는 단점을 개선해 자동 Configuration이 있다.
@SpringBootApplication 이라는 어노테이션 덕에 많은 외부 라이브러리, 내장된 WAS 중 톰캣 서버등이 실행될 수 있다고 한다.
이 어노테이션은 @ComponentScan을 통해 Component가 붙은 Class를 Bean으로 자동 등록해주는 기능이 있다.
(※Bean은 자료를 저장하는 객체로서, 스프링 Bean은 자바 Bean과 다르게 New Object로 생성하는게 아닌 Class를 생성하면 컨테이너인 ApplicationContext 인터페이스에 의해 등록되는 형태다.
이 과정에서 스프링 설정값이 씌워진다고 함.
참고로 ApplicationContext 안에 앞서 나온 어노테이션들 @ComponentScan등이 포함되어 있다.)
세번째로 배포가 편리하다.
스프링으로 개발한 애플리케이션은 war파일을 WAS(Wep Application Server)에 담아 배포했는데, 스프링 부트에선 내장된 WAS(Tomcat, Jetty, Undertow, Netty)가 있기때문에 jar파일로 따로 설정을 하지않고도 간편히 배포할 수 있다고 한다.
전반적으로 모르는 개념들이 쌓여있어 깊게 이해한게 없다.
대략적인 spring의 형체만 훑고 지나간 느낌이다.
자세한 내용들은 spring강의에서 이해해야겠다.
'TIL' 카테고리의 다른 글
| 2022.12.22 TIL (0) | 2022.12.22 |
|---|---|
| 2022.12.21 TIL (0) | 2022.12.21 |
| 2022.12.19 TIL (0) | 2022.12.19 |
| 2022.12.18 TIL (0) | 2022.12.18 |
| 2022.12.16 TIL (0) | 2022.12.16 |