이번에 삼성 SDS 알고리즘 특강을 신청하고 

입과테스트를 보는과정에서 나의 부족함을 인지하고 처음부터 차근차근

기초를 다지려고 공부를 시작해본다! 자바를 주력언어로 웹 백엔드 개발자가 되기위해

자바에 깊이있게 들어가기 위한 첫걸음! 

입과테스트에서 주어진 txt파일을 읽어와서 처리하는 부분부터 약간 멍하게 있어버린

현실에 큰일남을 느껴서 파일 입출력 부분부터 시작해본다!!

 

package test;

import java.io.*;
import java.util.Scanner;

public class testt {
	public static void main(String[] args) {
		
		String[] name = new String[100];
		String[] number = new String[100];
		int n = 0;
		
		try {
			Scanner infile = new Scanner(new File("input.txt"));
			
			while(infile.hasNext()) { //파일 끝에 도달했는가?
				name[n] = infile.next();
				number[n] = infile.next();
				n++;
			}
			infile.close();
		} catch (FileNotFoundException e) {
			System.out.println("No file");
			System.exit(9);
		}
		
		for(int i =0; i<n; i++) {
			System.out.println(name[i] + " : "+ number[i]);
		}
	
}
}

출력결과

 

같은 디렉터리 안에 파일을 하나 만들고 

그파일을 읽어서 사람이름과 휴대폰번호를 각각 다른 변수에 하나씩 저장하는 코드이다!

 

 

package test;

import java.io.*;
import java.util.Scanner;

public class code20 {
	
	static String[] name = new String[100];
	static String[] number = new String[100];
	static int n = 0;
	
	public static void main(String[] args) {

		
		try {
			Scanner infile = new Scanner(new File("input.txt"));
			
			while(infile.hasNext()) { //파일 끝에 도달했는가?
				name[n] = infile.next();
				number[n] = infile.next();
				n++;
			}
			infile.close();
		} catch (FileNotFoundException e) {
			System.out.println("No file");
			System.exit(9);
		}
		
		bubbleSort();
		
		for(int i =0; i<n; i++) {
			System.out.println(name[i] + " : "+ number[i]);
		}
	
}
	static void bubbleSort(){
		for (int i = n-1; i>0; i--) {
			for(int j=0; j<i; j++) {
				if(name[j].compareTo(name[j+1]) >0) {
					String tmp = name[j];
					name[j] = name[j+1];
					name[j+1] = tmp;
					
					tmp = number[j];
					number[j] = number[j+1];
					number[j+1] = tmp;
				}
			}
		}
	}
}

이번에는 이름순으로 정렬을 한 뒤 보여주는 코드이다. 

변수들을 스태틱으로 정의하고 함수를 만들어서 보여준다!

출력결과

 

compareTo 의 동작방식에 의문이 생겨

첫알파벳만 비교하는지 궁금하여

James 와 Jamet을 넣어주고 비교해보니

처음알파벳 부터 비교를 시작하여 끝에까지 비교 후 우위를 걸러내는것을 확인할 수 있었다!

'알고리즘 with 자바 > 자료구조' 카테고리의 다른 글

클래스, 객체, 참조변수 3  (0) 2021.06.22
클래스, 객체, 참조변수 2  (0) 2021.06.21
클래스 , 객체, 참조변수 1  (0) 2021.06.21
문자열 다루기 2  (0) 2021.06.19
문자열 다루기  (0) 2021.06.19

domain 패키지 생성

package hello.hellospring.domain;

public class Member {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

id는 임의의 값! 고객이 정하는 id가 아닌 시스템이 저장하는 id

name은 이름!

그리고 getter setter를 만들어줌


repositoy 패키지 생성

하고 인터페이스 생성!

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

1.save 회원을 저장하면 저장된 회원이 반환된

2.findById id로 회원을 찾는 기능

  여기서 optional이란? 자바8의 기능으로

  널이 있을경우에 널을 그대로 반환하는 방법 대신에 

  optional로 감싸서 반환하기 위해사용!

3.findByname 이름으로 회원을 찾는기능

4.모든 회원을 반환해줌


구현체를 만들어줌

클래스 생성!

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();
    private static Long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(),member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
}

 

 

저장을 어딘가에 하기위해 Map 사용 

키 : Long 

값 : Member

store라고 이름지음

 

sequence는 키값을 생성해주는 기능!

0L 의미는 Long형 0이란 의미!

 

save : id 세팅 후 스토어에 저장하는 기능 구현!

findById : null값이 반환될 가능성이 있기때문에 Optional.ofNullable로 감싸서 반환!!

findByname : store에서 루프로 돌리면서  member.getName()과 파라미터로 넘어온 값이 같을때

                      필터링되고 찾으면 optional로반환!(람다식 사용) 

findAll : Map이지만 반환은 List로 하기때문에 store.values()가 멤버들이기때문에 ArrayList에 넣어주고 반환!

 

 

'웹프로그래밍 > Spring 입문' 카테고리의 다른 글

8. 회원 서비스 개발  (0) 2021.06.19
7. 회원 리포지토리 테스트 케이스 작성  (0) 2021.06.19
5. 비즈니스 요구사항 정리  (0) 2021.06.17
4. API  (0) 2021.06.17
3. MVC와 템플릿 엔진  (0) 2021.06.16

단순한 비즈니스 요구사항을 구현!

1. 데이터 : 회원ID,이름

2. 기능 : 회원등록, 조회

3. 아직 데이터 저장소가 선정되지 않음(가상의 시나리오)

 

일반적인 웹 어플리케이션 계층 구조

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/lecture/49580

서비스: 핵심 비즈니스 로직이 들어가있음! 

리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리

도메인 : 비즈니스 도메인 객체 예) 회원 ,주문, 쿠폰 등등 주로 DB에 저장하고 관리

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/lecture/49580

클래스 의존관계

 

회원 비즈니스 로직에는 회원 서비스!

회원리포지토리는 인터페이스로! (DB가 정해지지 않았기 때문)

구현체는 메모리 구현체로 만든다! 

'웹프로그래밍 > Spring 입문' 카테고리의 다른 글

7. 회원 리포지토리 테스트 케이스 작성  (0) 2021.06.19
6. 회원 도메인과 리포지토리 만들기  (0) 2021.06.17
4. API  (0) 2021.06.17
3. MVC와 템플릿 엔진  (0) 2021.06.16
2. 정적 컨텐츠  (0) 2021.06.16
    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name){
        return "hello " + name;
    }

@ResponseBody

Html body태그를 이야기하는 것이 아니라

HTTP에서의 바디부의 이 데이터를 직접 넣어주겠다는 뜻!

템플릿 엔진과의 차이는 뷰는 없이 문자가 그대로 내려감

 

진짜는 여기서부터!!

   @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }


    static class Hello{
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

Hello 라는 객체를 만든다!

그 안에 getter setter 를 만들어준 뒤

 

Hello객체를 반환하는 메서드를 만들어주고 

파라미터로 넘어오는 name을 setName 함수를 이용하여 넣어주는 구성을 만듬!

그러고 객체를 넘기면~~?

 

두둥! 이것은.. JSON

 

과거에는 XML이 많이 쓰였다고 한다 이것은 되게 무겁고 태그를 열고 닫고 해야함!

JSON은 심플하다는 장점이 있음 최근엔 거의  JSON방식으로 거의 변화하였다

 

스프링에서 객체를 반환하고 ResponseBody애노테이션을 주면

JSON을 반환하는것이 기본이다!


RespnoseBody 사용 원리

 

웹 브라우저에서 localhost:8080/hello-api 를 입력!

톰캣 내장서버에서 스프링에 요청을 넘긴다

스프링은 hello-api를 찾고 @ResponseBody를 확인한다 

@ResponseBody가 없다면 이전에 템플릿은 view resolver 한테 던졌지만

그대로 데이터를 넘겨야겠다고 동작을 함! 하지만 문자가 아닌 객체이다 

그렇다면 스프링입장에서 한번더 생각을 해야한다 

객체가 오면 JSON방식으로 데이터를 만들어서 HTTP응답에 반환하겟다고 기본정책으로 되어있다.

HttpMessageConverter가 동작! 

기본 문자처리 라면 StringHttpMessageConverter가 동작

기본 객체처리 라면 MappingJackson2HttpMessageConverter가 동작

 


1. 정적 컨텐츠

그냥 파일을 그대로 내려주는 방식

 

2.MVC 와 템플릿엔진

템플릿엔진을 MVC 방식으로 쪼개서

View를 템플릿 엔진으로 랜더링하여

랜더링이 된  html을 전달함

 

3.API

객체를 반환 해주는것!(일반적)

 

'웹프로그래밍 > Spring 입문' 카테고리의 다른 글

6. 회원 도메인과 리포지토리 만들기  (0) 2021.06.17
5. 비즈니스 요구사항 정리  (0) 2021.06.17
3. MVC와 템플릿 엔진  (0) 2021.06.16
2. 정적 컨텐츠  (0) 2021.06.16
1. View 환경설정  (0) 2021.06.15

MVC = Model, View, Controller

 

과거에는 컨트롤러와 뷰가 분리되어 있지 않았다! (JSP)(Model1 방식)

 

컨트롤러와 모델은 비즈니스로직과 관련되거나 내부적인 로직을 처리하는데 집중!

뷰는 화면에 보여주는 것에 집중! 

그렇게하여 MVC 방식이 도입됨!

 

컨트롤러를 하나 생성한 후

<html xmlns:th="http://www.thymeleaf.org">
 <body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

templates / hello-template 를 만든다! 

localhost:8080/hello-mvc?name=spring 이렇게 ?뒤에 직접 변수에 대한 값을 넣어주면 

값을 출력한다!

내장 톰캣서버는 스프링에게 요청을 넘기고

컨트롤러는 매핑되있는 메서드를 호출해준다! 

return: hello-spring

model(name:spring)

이것을 스프링에게 넘기고 스프링은 viewResolver 화면과 관련된 해결자!

뷰를 찾아주고 템플릿엔진과 연결해주는 기능을 가짐 

templates / hello-template.html 를 찾아서 타임리프 템플릿엔진에게 넘기고

변환을 한 html를 넘겨준다!

 

'웹프로그래밍 > Spring 입문' 카테고리의 다른 글

6. 회원 도메인과 리포지토리 만들기  (0) 2021.06.17
5. 비즈니스 요구사항 정리  (0) 2021.06.17
4. API  (0) 2021.06.17
2. 정적 컨텐츠  (0) 2021.06.16
1. View 환경설정  (0) 2021.06.15
<!DOCTYPE HTML>
<html>
<head>
    <title>static content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>
<body>
정적 컨텐츠 입니다.
</body>
</html>

resouces/static/hello-static.html 로 이 코드를 작성한 후

http://localhost:8080/hello-static.html 직접 접근을 하였다.

이렇게 나오는 것을 확인할 수 있었다.

 

원리는 간단하게

웹 브라우저에서 http://localhost:8080/hello-static.html 이렇게 요청을 보내면 

내장 톰캣 서버에서 요청을 받고 스프링에게 넘긴다.

스프링은 컨트롤러에서 우선 hello-spring이 있는지 찾는다.

없다면 resouces/static/에서 찾아서 응답을 보낸다!

 

 

 

'웹프로그래밍 > Spring 입문' 카테고리의 다른 글

6. 회원 도메인과 리포지토리 만들기  (0) 2021.06.17
5. 비즈니스 요구사항 정리  (0) 2021.06.17
4. API  (0) 2021.06.17
3. MVC와 템플릿 엔진  (0) 2021.06.16
1. View 환경설정  (0) 2021.06.15

김영한 님의 스프링 입문 과정을 윈도우에서 모두 수강하고 

이번엔 mac os로 다시 복습하는 시간을 가져봅니다!

<!DOCTYPE HTML>
<html>
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8"/>
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>

resources/static/index.html

경로에 index.html이라는 파일을 생성한다.

스프링 부트가 Welcome page 기능으로 index.html을 불러온 모습이다.

a href 태그로 만든 hello를 누르면 /hello를 불러오게 되는 기능을 구현해보았다.

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data","hello!!");
        return "hello";
    }
}

main/java/hello-spring/controller/HelloController

controller 라는 폴더를 만든 후 그 밑에 HelloController 라는 자바클래스파일을 만들었다.

웹 브라우저에localhost:8080/hello 라는 url을 입력하면,

스프링 부트의 내장 톰캣 서버가 컨트롤러 안에서 hello라는 이름에 GET 방식으로 매핑 되어있는 메서드를 찾아 호출한다

 

컨트롤러에서는 화면에 전달할 속성들을 model 이라는 객체에 담을 수 있다. model에는 속성의 이름과 그에 해당하는 속성의 값을

data , hello!!로 정했다

그러고 hello를 리턴!

 

ViewResolver의 도움으로 resources > template > hello.html 파일이 화면에 랜더링 된다

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>

Thymeleaf를 이용하여   ${data} 로 속성값을 가져오게 되었다!

"'안녕하세요. ' + {data}" 에 내가 입력한 hello!! 가 속성값으로 들어온 것을 확인할 수 있었다.!

'웹프로그래밍 > Spring 입문' 카테고리의 다른 글

6. 회원 도메인과 리포지토리 만들기  (0) 2021.06.17
5. 비즈니스 요구사항 정리  (0) 2021.06.17
4. API  (0) 2021.06.17
3. MVC와 템플릿 엔진  (0) 2021.06.16
2. 정적 컨텐츠  (0) 2021.06.16

1번만에 붙어서 다행ㅠㅠ

이제 알고리즘, 스프링공부 집중!

'자격증 > 정보처리기사' 카테고리의 다른 글

정보처리기사 필기 합격!  (0) 2021.03.10
정보처리기사 37일차  (0) 2021.02.19
정보처리기사 36일차  (0) 2021.02.18
정보처리기사 35일차  (0) 2021.02.13
정보처리기사 34일차  (0) 2021.02.12

www.acmicpc.net/problem/4796

 

4796번: 캠핑

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

www.acmicpc.net

이 문제를 처음보면 무슨말인지 이해가 잘 가지 않았다.

그래서 문제를 또읽고 읽어보니 어떻게 풀면 되겠구나 하는 포인트를 잡았다.

캠핑장은 20일 중 10일만 사용할 수 있다.

 

10일 사용 10일 미사용 (총20일) 이때 휴가는 28일 이니 8일을 더 쓸 수 있다.

총 18일 사용가능하다.

 

식으로 해보면 28/20*10 == V/P*L 만큼의 일수가 사용가능하고

28%20 = 8 만큼의 일수를 더 사용할 수 있다.

그렇게 코딩을 하였더니 문제가 생겼다.

 

나머지 값이 L값보다 큰 경우의 수를 놓쳤다.

5일만 사용가능, 연속하는 8일 휴가는 15일 이라고 생각해보자

15/8*5 = 5일

15%8 = 7일 

5+7 =12일? 

아니다!

5일사용 3일미사용 5일사용 3일미사용(16일) 이미 휴가 리미트를 넘어버린상황에서 10일을 사용가능하다.

삼항 연산자를 이용하여 나머지값보다 큰 경우 L값만 더해주는 식으로 코딩했다!

package test;

import java.util.Scanner;
public class test {

	public static void main(String[] args) {
	       Scanner sc = new Scanner(System.in);
	        
	       int testc = 1;
	       int L,P,V;
	       while(true) {
	    	  L = sc.nextInt();
	    	  P = sc.nextInt();
	    	  V = sc.nextInt();
	    	  
	    	  if(L==0&&P==0) {
	    		 break;
	    	  }
	    	  int ex = (V%P) > L ? L : V%P;
	          int day = (V / P)*L + ex;
	    	  System.out.println("Case "+testc+": "+ day);
	    	  testc++;
	       }
	        
	        
	}
}

www.acmicpc.net/problem/10162

 

10162번: 전자레인지

3개의 시간조절용 버튼 A B C가 달린 전자레인지가 있다. 각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작시간에 더해진다. 버튼 A, B, C에 지정된 시간은

www.acmicpc.net

이 문제를 보니 대표적인 그리디 문제라고 판단되어졌다. 많은 연습끝에 이 문제가 쉬워보였다.

결국 동전 대신 5분 1분 10초 가 있는것! 

1.입력 값은 초 단위니까 단위를 맞춰주기위해 5분을 300초로 1분을 60초로 변환 후 3칸짜리 배열에 넣어준다.

2. 각 버튼이 몇번 사용됬는지를 체크하기위해 배열을 하나 더 사용하였더니 쉬웠다!

 

package test;

import java.util.Scanner;
public class test {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int[] abc = new int[] {300,60,10};
        //초단위 변환 후 배열 초기화
		int[] tmp = new int[3];
        //횟수를 저장하기위한 배열
		int t = sc.nextInt();
		int na = t;
		
		for(int i=0;i<abc.length;i++) {
			if((na%abc[2])!=0) {
				System.out.println("-1");
				break;
                //10으로 나누었을때 나머지가 0이아니라면 나눠지지 않는다는 뜻이니까 -1
			}
			else {
				tmp[i] = na/abc[i];
                //몫=횟수를 저장
				na %= abc[i];
				System.out.print(tmp[i]+" ");
			}
		}
}
}

열심히 달려봅시다!!~

'알고리즘 with 자바 > 그리디' 카테고리의 다른 글

백준 4796 : 캠핑 - JAVA  (0) 2021.03.18
백준 2217 : 로프 - JAVA  (0) 2021.03.17
백준 1541 : 잃어버린 괄호 - JAVA  (0) 2021.03.16
백준 5585 : 거스름돈 - JAVA  (0) 2021.03.16
백준 11047 : 동전 0 - JAVA  (0) 2021.02.16

+ Recent posts