Apache에서 나온 ant다음의 자바용 프로젝트 관리도구로Spring 프로젝트 뿐만 아니라 Java의 대다수의 프로젝트는 Maven이라는 빌드(Build) 도구를 통해 개발되고 있다.
프로젝트에 쓰이는 라이브러리는 만약 여러 개발자들과 협력해서 만들어야할 시동일한 라이브러리가 공유되어야 한다.그때 각자 매번 수동으로 jar파일을 전달하는 방식은 혼선이 올 수 있고 누락이 될 수도 있다.
그래서 만들어진게Maven 이다.maven은 pom.xml에 정의 해놓으면 네트워크를 통해 라이브러리르 자동으로 다운받아준다.그러므로 jar파일을 수동으로 복사할 필요가 없어진다.
주로 라이브러리 의존성 관리를 위해 사용되며, 프로젝트에서 필요한 라이브러리들을POM(Project ObjectModel)에 정의해주면, Maven이 네트워크를 통해 자동으로 다운로드하여 프로젝트에 주입해준다.
Dependent(의존관계)는 Libray가 관리한다. 여러 프로젝트에서 사용하는 jar는 공유한다. 모든 프로젝트 빌드 프로세스를 일관되게 가져갈 수 있다.
편집기가 없기 때문에 어떤 IDE에도 붙여서 쓸 수 있다. (이클립스, IntelliJ, STS ...)
Build Tool로서 프로젝트 설계를 도와준다.
메이븐의 특징으로는
프로젝트를 모델링 - 다양한 목적을 가지고 있는 플러그인은 POM(Project Object Model)으로 정의된다. 프로젝트에 의존되는 라이브러리들은 pom.xml에서 의존관계를 정의한다.
Maven 플러그인을 통한 전역적인 재사용 - Maven은 빌드에 대한 대부분의 책임을 각 플러그인에 위임한다. 이러한 플러그인들은 Maven 저장소(Repository)에 저장되어 진다.
공통 인터페이스 - Maven 이전에는 각 개발환경에 대한 빌드 프로세스를 파악하는데 시간이 꽤나 소요되었는데 빌드에 필요한 프로세스를 정의하고 이를 인터페이스로 제공함으로써 문제를 해결하였다고 한다.
Maven에서 제공하는 이러한 특징을 이용해서 개발자는 프로젝트에 필요한 다양한 플러그인을 효율적으로 관리하고 개발자의 IDE가 아닌 별도의 빌드 머신에서 빌드하고 결과물을 운영서버에 배포하는 과정을 자동화 할 수 있게 된다.
STS를 통해 새로운 Maven Project를 생성하게 되면 아래와 같은 프로젝트 구조를 가진다.
pom.xml
POM(Project Object Model)은 Maven의 근간이 되는 개념으로 현재 프로젝트의 구성과 프로젝트에서 사용하고 있는 외부 플러그인 그리고 각 플러그인들 간의 의존 관계를 pom.xml에 정의 할 수가 있다.
이클립스의 Dynamic Web Project 구조는 웹 애플리케이션 프로젝트에 기반이 되는 Spring Framework, Database Connnection을 위한 기반 라이브러리, Freemarker와 같은 Template 엔진 등을 사용하기 위해서는 /WEB-INF/lib에 필요한 라이브러리을 개발자가 직접 복사해 사용했지만, Maven을 활용하면 pom.xml를 이용해 프로젝트에 필요한 라이브러리를 정의하고 Version도 효율적으로 관리 할 수 있다. 뿐만 아니라 pom.xml 정의한 다양한 플러그인은 Maven Repositoriy를 통해 Remote로 자동으로 Download하여 Local에서 관리 할 수 있다.
package loop;
public class ForTest {
public static void main(String[] args) {
int i;
for(i='A'; i<='Z'; i++) {
System.out.print((char)i+" ");
}
}
}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
2. 구구단 system.read를 이용해서 원하는 단 구하기
package loop;
import java.io.IOException;
public class ForTest02 {
public static void main(String[] args) throws IOException {
System.out.print("원하는 단을 입력 : ");
int dan = System.in.read()-48;
for (int i=1; i<10; i++) {
System.out.println(dan+"*"+i+"="+dan*i);
}
}
}
system.read를 이용하면 '한' 글자만 입력, 인식이 가능하고 숫자가 아니라 문자로 인식해 아스키 코드로 인식한다. 그래서 0의 아스키코드 값인 48을 빼준다.
3. 난수 대문자(A~Z)를 100개 출력하세요
package loop;
public class ForTest03 {
public static void main(String[] args) {
for(int i=1;i<=100;i++) {
System.out.println((char)((Math.random()*26)+65)+" "+i);
}
}
}
다른방법
package loop;
public class ForTest03 {
public static void main(String[] args) {
int num;
for(int i=1;i<=100;i++) {
num = (int)(Math.random()*26)+65;
//System.out.printf("%2c",(char)num); //앞으로 정렬
System.out.printf("%-2c",(char)num); //뒤로정렬
}
}
}
T K N S F ~ J C L F W V M W (총100개)
4. 난수 알파벳을 10x10으로 출력하기
package loop;
public class ForTest03 {
public static void main(String[] args) {
int num;
for (int i = 1; i <= 100; i++) {
num = (int) (Math.random() * 26) + 65;
System.out.printf("%-2c", (char) num);
if(i%10==0)System.out.println();
}
}
}
for 중첩으로 풀기(printf사용)
package loop;
public class ForTest03 {
public static void main(String[] args) {
int num;
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
num = (int) (Math.random() * 26) + 65;
System.out.printf("%-2c", (char) num);
}
System.out.println();
}
}
}
T A Y N R Q B Q N R F Q P X C Y D P H K J J K M P J R H D F W M J X J R R N S G O F J X Q J H L F S R Z U B L O G H L B M H N J B S T D N Y G S H B G X F W D F M Y F S R X F I H R I M B R N N D D Y W
5. 알파벳 10x10으로 출력하고 A가 몇개인지 구하기
package loop;
public class ForTest04 {
public static void main(String[] args) {
int num, count=0;
for (int i = 1; i <= 100; i++) {
num = (int) (Math.random() * 26) + 65;
System.out.printf("%-2c", (char) num);
if('A'==num) {
count++;
}
if(i%10==0)System.out.println();
}
System.out.println("A의 개수 = "+count);
}
}
T A Y N R Q B Q N R F Q P X C Y D P H K J J K M P J R H D F W M J X J R R N S G O F J X Q J H L F S R Z U B L O G H L B M H N J B S T D N Y G S H B G X F W D F M Y F S R X F I H R I M B R N N D D Y W A의 개수 = 1