검색 키워드 

링크는 붙여넣기 하니 적용이 안되어서 볼꺼면 코드업에 가서 확인하자

#2023년 x월 x일 x회 차 수업 
## 유용한 개념
## 수업 내용
## 참고링크
## 오늘 꼭 기억해야 할 것

 

 

 

 

# 수업 시작 전 준비

```
구글,깃허브,리플,알고리즘 로그인,띄워놓기
```

# 2023년 2월 28일 1회 차 수업

- 목록 1
  - 목록 1-1
- 목록 2

## 유용한 개념

```
 - 문제 해결(내가 뭘 모르지?) -아예 모름(구글링) -내가 배운것(머리쓰기)
 - 알고리즘 해결 -예측,가정,코드파악,run 해보기
 - 공부시간 수업5시간 + 3시간 자습 + @ 1.에러나면 에러 메세지 필수 체크(구글링) 2.에러 고치기. 3.다시 실행 해보기.

 - 자바에서의 =는 '넣겠다'다. '같음'의 의미는 == (비교연산자 검색)
변수 안에는 값을 오직 1개만 넣을 수 있다 (x=10 -> x=15는 변수 2개가 아닌 덮어쓰기가 되어 15가 되며 10은 비활성화 된다.자바는 위에서 아래 순서로 읽기 때문이다.)
```

## 수업 내용

```
 - int 변수명에 숫자로 시작,숫자 자체는 안된다(중간에 들어가는 ab12af 등은 된다.)
 - value 스위칭,스왑 (값 뒤바꾸기) 중요
```

## 참고링크

```


## 꿀팁

```
- 위키는 이력서 제작에 용이하다.
- 1일차 ~~ 56일차 - 자소서 공부 첫 날부터 끝까지 기록의 근거다.
- Spring -> 포트폴리오 -> 취업
 (블로그,깃허브,유트브) -> 추가 + @ 사항들.
```

---

### 블록

```

블록
```

# 2023년 3월 2일 2회 차 수업

## 유용한 개념

```
연산자 우선순위는 그때마다 찾아본다.
정수 비교연산자는 그림판에 x축을 그려서 부등식으로 검산.
자바 서식지정자, 데이터의 기본형 참조형 외우기.

반복문의 3가지 구성요소
초기(값)
(종료)조건
step(보폭)
3가지 중 1개라도 없으면 반복문은 실행되지 않는다.
```

## 수업 내용

```
반복문은 조건문을 기본으로 한다.
프로그래밍 언어의 발전은 불편함에서 발전한다.

```

## 참고링크



## 꿀팁

```

```

# 2023년 3월 3일 3회 차 수업

## 유용한 개념

```

이중 반복문에서

안쪽은 분침 바깥쪽은 시침에 비유 할 수 있다.

안쪽이 완전하게 다 돌아야 바깥쪽으로 돌고

조건이 거짓인 경우에 빠져 나온다.

int[] arr = new int[3]; // int들 만 들어갈 수 있는 객체랑
연결 될 예정인 arr
int 3개 들어갈 수 있는 객체를 new 키워드를 통해 하나 만들겠다
객체 내부의 리모컨을 복사해서 arr변수에 넣겠다



. -> ~~의 의미 // arr의 길이 ->arr.lenth


```

## 수업 내용

런타임에러 vs 컴파일 타임 에러
(읽어야 앎) (문법적 오류 실행하나 마나)



자바 에러 vs 자바 익셉션
에러:실행하기 전 문제발생
익셉션 : 실행하고 후 문제발생

## 참고링크



## 꿀팁

```
객체에 대한 비유

객체(object)란?
객체(object)란 실생활에서 우리가 인식할 수 있는 사물로 이해할 수 있습니다.

객체 지향 프로그래밍(OOP, Object-Oriented Programming)
객체 지향 프로그래밍에서는 모든 데이터를 객체(object)로 취급하며, 이러한 객체가 바로 프로그래밍의 중심이 됩니다.



객체(object)란 간단히 이야기하자면 실생활에서 우리가 인식할 수 있는 사물로 설명할 수 있습니다.

이러한 객체의 상태(state)와 행동(behavior)을 구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍입니다.

이때 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스(class)라고 합니다.

 # 클래스(class)
자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.

자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 됩니다.



클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.

즉, 필드(field)란 클래스에 포함된 변수(variable)를 의미합니다.

또한, 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있습니다.

 # 인스턴스(instance)
자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체(object)를 선언해야 합니다.

이렇게 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스 화라고 합니다.

또한, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 합니다.

즉, 인스턴스란 메모리에 할당된 객체를 의미합니다.



자바에서는 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있습니다.

이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있습니다.

하지만 해당 클래스의 모든 메소드(method)는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 됩니다.

클래스의 예
클래스(class)

- 차(Car) : 설계도

스포츠카



필드(field)

- car.modelName = "람보르기니"

- car.modelYear = 2016

- car.color = "주황색"

- car.maxSpeed = 350



메소드(method)

- car.accelerate()

- car.brake()



 #인스턴스(instance)

- 내 차(myCar) : 설계도에 의해 생산된 차량

- 친구 차(friendCar) : 설계도에 의해 생산된 또 다른 차량



즉, 자동차 인스턴스는 모두 위와 같은 필드와 메소드를 가지게 될 것입니다.

하지만 각 인스턴스마다 가지고 있는 프로퍼티의 값은 전부 다를 것입니다.

 #메소드(method)
자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가집니다.

그중에서 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있습니다.



자바에서 메소드를 정의하는 방법은 다음과 같습니다.

문법
접근제어자 반환타입 메소드이름(매개변수목록) { // 선언부

    // 구현부

}



1. 접근 제어자 : 해당 메소드에 접근할 수 있는 범위를 명시합니다.

2. 반환 타입(return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시합니다.

3. 메소드 이름 : 메소드를 호출하기 위한 이름을 명시합니다.

4. 매개변수 목록(parameters) : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시합니다.

5. 구현부 : 메소드의 고유 기능을 수행하는 명령문의 집합입니다.



자바에서는 하나의 클래스에 같은 이름의 메소드를 둘 이상 정의할 수 없습니다.

하지만 메소드 오버로딩(overloading)을 이용하면, 같은 이름의 메소드를 중복하여 정의할 수 있습니다.

메소드 오버로딩이란 매개변수의 개수나 타입을 다르게 하여 같은 이름의 또 다른 메소드를 작성하는 것입니다.



이러한 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있습니다.

또한, 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있게 됩니다.


```

# 2023년 3월 6일 4회 차 수업

## 유용한 개념

```
객체 => 폴더
클래스 => 설계도 (객체와 설계도는 별개)
필드 =>클래스 안의 전역변수 attribute
this => 리모콘

[접근제어자(public, private 등)] [static, final 등] 자료형 변수명 [= 초기값] ;

필드는 위와 같이 선언한다.

1. 필드는 메소드 및 생성자 밖에서 선언되고, 값을 할당하지 않으면 초기값이 자동으로 할당된다.
2. 필드를 선언하면 클래스 전역에서 사용이 가능하다. 다르게 말하면 프로그램의 시작부터 종료까지 메모리상에 남아 공간을 차지한다. 따라서 메소드에서 공통으로 필요한 필드만 선언하여 사용하는게 좋다.
3. 메소드에서 필드와 동일한 변수를 정의하면 메소드의 변수가 우선순위가 높다. 이때 필드의 값을 출력하려면 this.을 이용하면 된다.

속성(단순 데이터) - attribute 저장 데이터 명사형 특징
property
기능(실행 데이터) - method   실행 데이터 동사형 특징
function

```

## 수업 내용

```
new 한개당 객체 1개 생성
class 는 설계도 일 뿐이다.

ex
class main{

}

class 김철수{
    int age;
    boolean isMarried;
    String name;

}
이건 객체 0개 설계도만 2개

new 김철수(); <- 틀린코드 아님 리모컨 연결을 안했을 뿐
김철수 a = new 김철수(); => 읽는 방법
1.설계도와 a(리모컨을)변수를 new(객체) 김철수와 연결하겠다.
2.김철수 a 까지만 => a라는 변수를 김철수 닮은 객체와 나중에 연결할꺼다.


설계도에 있는 능력을 뽑아쓰고 싶으면(객체화를 안하고)

메서드에 static을 붙여준다.

선택지
1.객체화를 해서 쓸것인지
2.static을 붙여서 설계도를 끌어와 쓸것인지
-->static은 정적 메서드라고 한다. 앞으로 배울 것.
-->비교되는 개념은 인스턴스.
-->남발하면 쓰레기 값이 생긴다.

인자(아규먼트)-매개변수(파라미터) 는 타입과 갯수가 같아야한다.
(자동 형 변환이 가능하거나)
둘이 이동 공간은 같아야한다 자바로치면 소괄호 안쪽.
매개변수는 함수의 안과 밖을 연결해주는 매개체다.
->class 와 class
```

## 참고링크


## 오늘 꼭 기억해야 할 것

```
static은 static끼리 통신이 가능하다.

메인 클래스 vs 메인 클래스가 아닌 것
->사용처가 다르다
전역변수 : 전역공간 (함수 -method 외부)에서 생성,수명이 더 길다
프로그램 시작- 끝
지역변수 : 지역공간 (함수 내부)에서 생성,수명이 더 짧다
함수 시작 - 끝
매개변수 : 지역변수의 일종, 함수의 내부와 외부를 연결해주는 매개체
인자 : args,인수,매개변수로 전달되는 데이터

키워드:변수의 생명주기,변수의 스코프와 변수의 라이프타임,변수의 라이프 싸이클 -> 다 같은 말 구글링하기

매개변수의 개수와 인자의 개수는 일치 해야한다.
매개변수의 타입과 인자의 타입은 일치 해야한다.

클래스 변수와 인스턴스 변수
클래스 영역에 위치한 변수 중에서 static 키워드를 가지는 변수를 클래스 변수(static variable)라고 합니다.

그리고 클래스 영역에 위치한 변수 중 static 키워드를 가지지 않는 변수는 인스턴스 변수(instance variable)라고 합니다.
또한, 메소드나 생성자, 초기화 블록 내에 위치한 변수를 지역 변수(local variable)라고 합니다.

알아두면 좋은- 동적할당(c언어,변수의 생명주기 내가 조절가능 메모리 활용의 극한) vs 정적할당(자바, 알아서 해준다)

```

# 2023년 3월 7일 5회 차 수업

## 유용한 개념

```
#클래스는 '객체를 생성하기 위한 틀 '이며 '클래스는 속성과 기능으로 정의 되어있다' ->객체 지향론적 관점

#프로그래밍적인 관점에서의 클래스
1.변수 하나의 데이터를 저장할 수 있는 공간
2.배열 같은 종류의 여러 데이터를 하나의 집합으로 저장 할 수 있는 공간
3.구조체 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
4.클래스 데이터와 함수의 결합(구조체+함수)


개념, 배열과 ArrayList, 제너릭
개념, ArrayList 내부작동원리
```

## 수업 내용

```
void - return x

나머지 - return o

함수당 1번만 가능

-키워드-
다형성

메소드 오버로딩 (클래스 내에 같은 이름의 메소드를 여러개 생성)

오버라이드(상속에서 메소드 덮어쓰기)
---

상속(extends) 형변환 과정(캐스팅)에서 기능 소실이 될 수 있다.

그래서 쓰는게 추상(abstract)

추상 메소드가 하나라도 들어가 있으면 추상 클래스로 만들어야함
추상 메소드는 바디를 가질 수 없다.

추상클래스 -> 객체화 x

부모가 추상 메소드를 갖고 있으면 받는 자식 클래스는 오버라이드(덮어쓰기)를 해야 한다.


인터페이스(interface) -> 순도 100퍼센트 추상 클래스
안에있는 메소드 abstract 안붙여도 자동 추상 메서드들임
(붙여도 상관은 x)
-> 바디를 가질 수 없다.


인터페이스 상속(100퍼센트 추상클래스)을 받는 자식 클래스는 extends가 아닌
implements를 쓴다
-> 자식 메소드 앞에는 모두 퍼블릭을 붙여줘야 한다

extends의
다중 구현,다중 상속은 자바에서 불가능하다
무슨 데이터를 골라야 하는지 모르기 때문이다.

implements의 다중 상속은 가능
모두 추상이라(깡통취급) 오버라이드 시키면 끝이기 때문
안 헷갈려도 되는 상황


생성자(constructor)
생성자는 자동실행 함수(자동실행 메서드)
class 이름과 같은것이어야 한다
리턴타입 x void x

ex)

class 사람{
   사람(){

   }
}
생성자의 실행시점은 객체가 생성되면서 자동 실행
->new 마다 실행
->객체가 생성이 안된다면 실행이 안된다.

상속을 받았으면 부모의 생성자를 먼저 실행한다 규칙.

git
64-bit Git for Windows Setup.
git 입문
작업 1, 프로젝트 준비 및 git 업로드
작업 2, 명령어 입력
작업 3, 게시물 작성 기능 추가
```

## 참고링크

## 오늘 꼭 기억해야 할 것



한계가 없는 배열 다루기.

추상 수업 페이지 가서 복습하기.
->상속,추상,인터페이스,생성자 개념 잇기.

주의)oop특징의 추상화와 문법 추상은 다른것!

<a href="https://mozi.tistory.com/466" target="_blank"> set,get 메서드 사용 방법과 이유</a>

# 2023년 3월 8일 6회 차 수업

## 유용한 개념

```
생성자는 시작하자마자 실행 되었으면 했을 때 쓰는 것.

```

## 수업 내용

```
static 값은 클래스 하나에서만 존재
-> new 붙인 객체들에게는 없다

static 생성자는 static{} 로 써주면 된다 (f11로 바로 실행가능)


이미 만들어진 클래스 도구들은 import를 사용해서 당겨오자.
->안그러면 패키지에 클래스를 일일히 만들어야 하는 번거로움이 생김


작업 4, 게시글의 유무 판별
작업 5, 게시물 목록 기능 구현
작업 6, 게시물 상세보기 구현중
작업 7, 게시글 상세보기 글의 유무 판단
작업 8, 게시물 상세보기 기능 구현
작업 9, 게시물 작성시 날짜와 시간 정보 저장
작업 10, 게시물 삭제 기능 추가(index 활용)

```

## 참고링크

## 오늘 꼭 기억해야 할 것



깃허브 사용법
깃배쉬 사용법

# 2023년 3월 9일 7회 차 수업

## 유용한 개념

```


```

## 수업 내용

```
작업 11, 게시글 수정 기능 및 조회수 구현
작업 12, 게시글 테스트데이터 생성
작업 13, ArrayList 내에서 특정 게시물을 찾는 메서드 구현, 중복제거
작업 14, 게시글 검색 기능 추가(제목만)
작업 15, 회원가입 기능 구현중, 아이디 중복체크

```

## 참고링크

## 오늘 꼭 기억해야 할 것

```
split ,startWith 검색
'자바 현재 날짜' 검색
자바 'Arraylist 요소 삭제' 검색

자바'startWith'
자바 'split'
자바 '문자열을 숫자로 변환'

CRUD 검색 자바에 대한 개념에 대입해서
문제 해결 나눠서 하기
TODO list 나누기
equals 랑 연산자 == 비교
```

글 작성
글 리스트
글 상세보기
글 수정
글 삭제

테스트 데이터

깃허브 업로드

시험문제

# 2023년 3월 13일 8회 차 수업

## 유용한 개념

## 수업 내용

기능이 늘어나면 리펙토링(구조개선)

Main
App
-articleController
-memberController

-ArticleService
-MemberService

-ArticleDao
-MemberDao
DB(자바에선 어레이 리스트)

...하위 폴더로 세세히 나눠버림(Model View Controller)

작업 16, 회원가입 기능 구현, 비밀번호 확인
작업 17, 리팩토링,구조개선,패키지분리
작업 18, MemberController 추가
작업 19, ArticleController 추가
작업 20, App 클래스 내부에서 하던 기능실행을 각각의 컨트롤러 내부로 이전,App 의 간소화

## 참고링크

## 오늘 꼭 기억해야 할 것

소프트 웨어 디자인 패턴 검색
MVC 모델 뷰 컨트롤러 검색
상속 개념 심화

# 2023년 3월 14일 9회 차 수업

## 유용한 개념

## 수업 내용

세선-사용자 정보를 저장
작업 21, articles,members를 각 컨트롤러로 이전
작업 22, 로그인 기능 구현, 중복로그인 허용
작업 23, member profile, 로그아웃,로그인 상태 체크
작업 24, loginedMember, isLogined를 Controller로 이전, Ac,Mc 둘 다 사용 가능 하도록
작업 25, 게시물 작성시 작성자에 관한 정보를 함께 저장,memberId
작업 26, 로그인, 로그아웃 체크가드를 App 클래스에 추가, 컨트롤러 내부에서 삭제

## 참고링크

## 오늘 꼭 기억해야 할 것

TODO
오늘 결과물에서
article list에 작성자의 이름이 노출 되도록 만들기

# 2023년 3월 15일 10회 차 수업

## 유용한 개념

## 수업 내용

작업 27, 게시물 리스트에 작성자 이름이 나오도록 처리
작업 28, 한번 사용된 게시물의 번호가 재사용 되지 않도록 처리
작업 29, 로그인시 필수정보 입력하도록 처리
작업 30, 게시물 서비스 도입

## 참고링크

## 오늘 꼭 기억해야 할 것

게시글
게시글 작성 article write
게시글 목록 article list
게시글 상세보기 article detail
게시글 삭제 article delete
게시글 수정 article modify

회원
회원가입 member join
로그인 member login
로그아웃 member logout
profile member profile
회원정보수정
회원탈퇴

MVC
리팩토링
최적화

# 2023년 3월 16일 11회 차 수업 -> DBMS랑 섞어서감

## 유용한 개념

## 수업 내용

## 참고링크

## 오늘 꼭 기억해야 할 것

# 2023년 3월 17일 12회 차 수업

스프링 시작

'java > java필요한 지식' 카테고리의 다른 글

자바 예외처리 Try Catch 문  (0) 2023.04.10
디자인 패턴이란 뭘까?  (1) 2023.03.14
MVC,Model-View-Controller 란 뭘까?  (0) 2023.03.14
package Main;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		System.out.println("==프로그램 시작==");
		Scanner sc = new Scanner(System.in);
		int lastArticleId = 0;
		List<Article> articles = new ArrayList<>();
		while (true) {
			System.out.print("명령어 > ");
			String command = sc.nextLine().trim();
			if (command.length() == 0) {
				System.out.println("명령어를 입력해주세요");
				continue;
			}
			if (command.equals("exit")) {
				break;
			}
			if (command.equals("article list")) {
				if (articles.size() == 0) {
					System.out.println("게시글이 없습니다");
				} else {
					System.out.println(" 번호  //  제목  ");
					for (int i = articles.size() - 1; i >= 0; i--) {
						Article article = articles.get(i);
						System.out.printf("  %d   //   %s  \n", article.id, article.title);
					}
				}
			} else if (command.equals("article write")) {
				int id = lastArticleId + 1;
				System.out.print("제목 : ");
				String title = sc.nextLine();
				System.out.print("내용 : ");
				String body = sc.nextLine();
				Article article = new Article(id, title, body);
				articles.add(article);
				System.out.printf("%d번글이 생성되었습니다\n", id);
				lastArticleId++;

			} else if (command.startsWith("article detail ")) {

				String[] cmdDiv = command.split(" ");

				int id = Integer.parseInt(cmdDiv[2]);

				boolean found = false;

				for (int i = 0; i < articles.size(); i++) {
					Article article = articles.get(i);
					if (article.id == id) {
						found = true;
						break;
					}
				}

				if (found == false) {
					System.out.printf("%d번 게시물은 존재하지 않습니다\n", id);
				} else {
					System.out.printf("%d번 게시물 있던데?\n", id);
				}

			} else {
				System.out.println("존재하지 않는 명령어입니다");

			}
		}
		System.out.println("==프로그램 끝==");
		sc.close();
	}
}

class Article {
	int id;
	String title;
	String body;

	Article(int id, String title, String body) {
		this.id = id;
		this.title = title;
		this.body = body;
	}
}

article detail 의 명령어에 기능을 제대로 구현해보자.

startWith과 split Integer.parseInt 를 이용해 명령어 실행과 배열의 구분까지 가능해졌다

그럼 글이 존재하는지 안하는지 배열을 뒤져볼 필요가 있다 그 코드로는

for(int i = 0 ; i < articles.size(); i++) { // i 변수가 0부터 "articles.size()-1 까지 1씩 증가하며 Article객체들중에 id가 일치하는걸 찾는것

boolean found = false; // ㅊfound 변수를 false 라는 것을 기본값으로 넣어준다 boolean의 기본값으로 설정해 준것

    Article article = articles.get(i); //각 반복마다 "articles" 리스트에서 "i"번째 인덱스에 해당하는 "Article" 객체를 가져와 "article" 변수에 저장한다다.

    if(article.id == id) { //만약에 id값이 맞다 찾았다면

      found = true;  // found 에 true 값을 저장하고

      break;   // 반복문을 빠져나간다
    }

}

if (found == false) {   //못찾았으면

     System.out.printf("%d번 게시물은 존재하지 않습니다\n",id);  //못찾았다는 출력문을 보내고

}else{  //찾았다면

    System.out.printf("%d번 게시물 있던데요?\n",id);  // 찾았다는 출력을 보낸다

}
} else{   // 엉뚱한 명령어를 입력 했을 경우.

     System.out.println("존재하지 않는 명령어 입니다");

}

 

위의 기능에서 핵심이 되는건 반복문의 추가다

"articles"라는 ArrayList(리스트)에 저장된 "Article" 객체들 중에서 "id"값이 일치하는 객체를 찾는 작업을 수행한다.

for문에서는 "i"변수가 0부터 "articles.size()-1"까지 1씩 증가하며 반복 실행된다. 각 반복마다 "articles" 리스트에서 "i"번째 인덱스에 해당하는 "Article" 객체를 가져와 "article" 변수에 저장한다.

그리고 if문에서는 현재 가져온 "article" 객체의 "id"값과 찾으려는 "id"값이 일치하는지 비교한다. 만약 일치한다면 "found"라는 변수에 true 값을 저장하고 반복문을 빠져나온다.

즉, 위 코드는 "articles" 리스트에서 "id"값이 일치하는 "Article" 객체를 찾고, 해당 객체가 존재하는지 여부를 "found" 변수에 저장하는 것이다.

package Main;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		System.out.println("==프로그램 시작==");
		Scanner sc = new Scanner(System.in);
		int lastArticleId = 0;
		List<Article> articles = new ArrayList<>();
		while (true) {

			System.out.print("명령어 > ");
			String command = sc.nextLine().trim();

			if (command.length() == 0) {
				System.out.println("명령어를 입력해주세요");

				continue;
			}
			if (command.equals("exit")) {
				break;
			}
			if (command.equals("article list")) {
				if (articles.size() == 0) {
					System.out.println("게시글이 없습니다");
				} else {
					System.out.println(" 번호  //  제목  ");
					for (int i = articles.size() - 1; i >= 0; i--) {
						Article article = articles.get(i);
						System.out.printf("  %d   //   %s  \n", article.id, article.title);
					}
				}
			} else if (command.equals("article write")) {
				int id = lastArticleId + 1;
				System.out.print("제목 : ");
				String title = sc.nextLine();
				System.out.print("내용 : ");
				String body = sc.nextLine();
				Article article = new Article(id, title, body);
				articles.add(article);
				System.out.printf("%d번글이 생성되었습니다\n", id);
				lastArticleId++;

			} else if (command.startsWith("article detail ")) {

				String[] cmdDiv = command.split(" "); // article detail 1

//				System.out.println(cmdDiv[0]);
//				System.out.println(cmdDiv[1]);
//				System.out.println(cmdDiv[2]);

				int id = Integer.parseInt(cmdDiv[2]);

				// article detail 1 => "1" => 1

				System.out.printf("%d번 게시물은 존재하지 않습니다\n", id);

			} else {
				System.out.println("존재하지 않는 명령어입니다");
			}

		}
		System.out.println("==프로그램 끝==");
		sc.close();
	}
}

class Article {
	int id;
	String title;
	String body;

	Article(int id, String title, String body) {
		this.id = id;
		this.title = title;
		this.body = body;
	}
}

게시물 상세보기를 구현해보자 명령어는 article detail이라 한다

스캐너 옆에 String command = sc.nextLine().trim();     trim();이라는 명령어가 하나 붙었다 문자열 command 변수에 공백이 있으면 알아서 잘라주겠단 얘기다

 

추가 된 건 명령어이므로 else if 로 틀을 비슷하게 구현해준다

 

else if(command.startWtih("article detail")){

      String[] cmdDiv = command.split(" ");

      int id = Interger.parseInt(cmdDiv[2]);

     System.out.prinf("%d번 게시물은 존재하지 않습니다\n",id);

} else {

     system.out.prtinln("존재하지 않는 명령어 입니다");

}

몇개의 키워드가 추가 되었다 'startWith' ,'split' , 'Integer.parseInt();'

사용 의도는 다음과 같다

```

-startWith ~~로 시작되는 단어가 입력 된다면?

  String[] cmdDiv = command.split(" "); << 을 이용해서 article detail ~ 을 공백을 기준 ㅁ ㅁ ㅁ 세 덩이로 나누겠단 의미다

문자열 command를 " "(공백)을 기준으로 나누어 문자열 배열(String[]) cmdDiv에 저장하는 코드입니다.

split() 메소드는 문자열을 특정 구분자(delimiter)를 기준으로 나누어 문자열 배열로 반환하는 메소드이다. 위 코드에서는 " "(공백)을 구분자로 사용하였다. 따라서, command 문자열이 " "(공백)을 포함하는 경우, split() 메소드는 해당 공백을 기준으로 문자열을 나누어 문자열 배열로 반환하게 된다.

반환된 문자열 배열은 String[] cmdDiv 변수에 저장된다. 이후 코드에서 cmdDiv 배열을 이용하여 다양한 작업을 수행할 수 있다. 예를 들어, cmdDiv[0]은 나누어진 문자열 중 첫 번째 단어를 나타내며, cmdDiv[1]은 두 번째 단어를 나타낸다다.

```

그리고 int id = Interger.parseInt(cmdDiv[2]);

```

해당 코드는 문자열 배열 cmdDiv의 세 번째 요소(cmdDiv[2])를 정수형(int)으로 변환한 후, 그 값을 변수 id에 할당하는 코드다.

Integer.parseInt() 메소드는 문자열을 정수형으로 변환하는 메소드다. 위 코드에서는 cmdDiv[2]에 저장된 문자열을 정수형으로 변환하여 id 변수에 할당한다.

예를 들어, cmdDiv[2]가 "123"과 같은 문자열을 포함하고 있다면, Integer.parseInt() 메소드는 해당 문자열을 정수형으로 변환한 후, id 변수에 123의 값이 할당된다. 만약 cmdDiv[2]가 정수로 변환할 수 없는 문자열이 포함되어 있다면, parseInt() 메소드는 NumberFormatException 예외를 발생시킨다. 이 예외는 try-catch 문을 사용하여 처리해야 한다.

```

결론은 article detail이란 코드를 사용하면 article detail로 시작하는 명령어를 공백의 기준에 따라 실행하게 되고

글 번호는 숫자로 시작할테니 ㅁ ㅁ 'ㅁ '<- 세번째에 할당되는 문자열을 숫자로 바꿔서 입력하겠단 소리다

세번째인데 cmdDiv[2] 인 이유는 배열을 생성할 땐 0,1,2,3,4,..... 으로 시작하기에 3번째 단어라면 [2]에 저장되기 때문이다.

 

마지막으로 else를 이용해 잘못 된 명령어를 고치라는 출력을 한다.

package com.KoreaIT.java.AM;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		System.out.println("==프로그램 시작==");
		Scanner sc = new Scanner(System.in);
		int lastArticleId = 0;
		List<Article> articles = new ArrayList<>();
		while (true) {
			System.out.print("명령어 > ");
			String command = sc.nextLine();
			if (command.length() == 0) {
				System.out.println("명령어를 입력해주세요");
				continue;
			}
			if (command.equals("exit")) {
				break;
			}
			if (command.equals("article list")) {
				if (articles.size() == 0) {
					System.out.println("게시글이 없습니다");
				} else {
					System.out.println(" 번호  //  제목  ");
					for (int i = articles.size() - 1; i >= 0; i--) {
						Article article = articles.get(i);
						System.out.printf("  %d   //   %s  \n", article.id, article.title);
					}
				}

			} else if (command.equals("article write")) {

    
          
            
    

          
    
    
  
				int id = lastArticleId + 1;
				System.out.print("제목 : ");
				String title = sc.nextLine();
				System.out.print("내용 : ");
				String body = sc.nextLine();
				Article article = new Article(id, title, body);
				articles.add(article);
				System.out.printf("%d번글이 생성되었습니다\n", id);
				lastArticleId++;
			} else {
				System.out.println("존재하지 않는 명령어입니다");
			}
		}
		System.out.println("==프로그램 끝==");
		sc.close();
	}
}
class Article {
	int id;
	String title;
	String body;
	Article(int id, String title, String body) {
		this.id = id;
		this.title = title;
		this.body = body;
	}
}

 

aritle list 기능이 완성 되어간다

글이  없으면 없다하고 있으면 있던데? 보다는 코드적으로 글의 목록을 표현 하고싶다

else{

System.out.println("번호  //  제목");

for (int i = articles.size() - 1 ; i>= 0 ; i --);

   Aricle article = aricles.get(i);

   System.out.print("   %d    //   %s    \n ",article.id, article.title);

 

코드를 추가한다

 

위 코드는 리스트 articles에 저장된 게시물 정보를 출력하는 코드로 먼저 "번호 // 제목"을 출력하고, 리스트의 뒤에서부터 순회하면서 각 게시물의 id와 title을 출력한다 (명령어) article list를 입력했을 때 일어나는 일이다)

for 루프는 리스트 articles의 끝에서부터 시작하여 i 변수를 1씩 감소시키면서 반복한다. 각 반복에서 articles.get(i)를 통해 현재 위치의 게시물 정보를 가져와 article 변수에 저장한다

articles.size() - 1을 하는 이유는 리스트의 인덱스가 0부터 시작하기 때문. articles.size()는 리스트의 원소 개수를 반환하므로, 인덱스가 0부터 시작하면 마지막 원소의 인덱스는 size() - 1가 된다.

마지막으로 System.out.print()를 통해 " %d // %s \n" 형식의 문자열을 출력. %d는 정수를, %s는 문자열을 대체할 수 있는 포맷 문자열이다. 이 때, 포맷 문자열 내에 %d와 %s가 있음에도 불구하고, System.out.print() 메소드는 두 번째 인자부터 포맷 문자열에 포함될 값을 차례로 전달해야 함. 따라서 위 코드에서는 article.id와 article.title을 각각 %d와 %s에 대입하여 보여준다. 그럼 번호 , 제목이 나오겠지 

최종적으로 위 코드는 리스트 articles의 모든 게시물 정보를 역순으로 출력

실행결과? 내 의도대로 나온다

package com.KoreaIT.java.AM;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TestMain {

	public static void main(String[] args) {
		System.out.println("==프로그램 시작==");
		Scanner sc = new Scanner(System.in);

		int lastArticleId = 0;
		List<Article> articles = new ArrayList<>();

		while (true) {

			System.out.print("명령어 > ");
			String command = sc.nextLine();

			if (command.length() == 0) { //아무것도 입력 x 
				System.out.println("명령어를 입력해주세요"); // 이게 출력된다
				continue; // while문 초기로 돌려보냄!
			}
			if (command.equals("exit")) {
				break;
			}

			if (command.equals("article list")) { // 이 명령어를 이제 유의미하게 만들었다
				if (articles.size() == 0) { // 게시글이 없다면
					System.out.println("게시글이 없습니다"); // 출력
				} else {                                       //있다면?
					System.out.println("있던데???");            //출력
				}

			} else if (command.equals("article write")) {
				int id = lastArticleId + 1;
				System.out.print("제목 : ");
				String title = sc.nextLine();
				System.out.print("내용 : ");
				String body = sc.nextLine();

				Article article = new Article(id, title, body); //객체 생성자 호출
				articles.add(article);  //생성된 객체를 articles 변수 리스트에 추가!

				System.out.printf("%d번글이 생성되었습니다\n", id);
				lastArticleId++;

			} else {
				System.out.println("존재하지 않는 명령어입니다");
			}
		}
		System.out.println("==프로그램 끝==");

		sc.close();
	}
}

class Article {
	int id;
	String title;
	String body;

	Article(int id, String title, String body) {
		this.id = id;
		this.title = title;
		this.body = body;
	}
}

 

 

나는 article list 명령어를 입력했을때 이제 유의미한 프로그램 가동을 하고싶다

 

List<Article> articles = new ArrayList<>(); 으로 배열 객체를 만들어주고

List와 ArrayList라는 자바에 있는 기능을 썼으므로 각각 import를 해준다

그리고 변수 articles에 그 값을 저장할 것이고

new로 객체를 지정해주었으므로 Article 클래스를 하나 만들어준다

Article은 게시글이란 뜻인데 개발자들이 통상 쓰는듯하다

일단 간단하게 몇번글인지,제목,내용만 나오는 명령어로 만들고 싶어서

변수를 Int id; , String title , String body 로 3개 지정해준다

실행 시키자마자 저 값을 입력 시키고 싶으니 생성자 Article을 만들어준다

int lastArticleId = 0;

List<Article> articles = new ArrayList<>(); 을 while문 바깥에다 쓰는 이유는 전에도 말했다 싶이

반복문안에 놓으면 무한적으로 초기화 되기 때문에 바깥에다가 값을 저장해놔야 글1,글2,글3 이런식으로 순서대로 저장이 될 것이다

 

클래스와 객체 생성자를 만들어 줬으니 써먹어야 한다.

// Article 객체 생성자 호출


Article article = new Article(id, title, body);

// 생성된 Article 객체를 articles 리스트에 추가


articles.add(article);

 

코드를  실행해보니 잘 되는 것 같다

 

 

Goal
디자인 패턴의 개념을 이해한다.
디자인 패턴의 구조를 이해한다.
디자인 패턴의 분류를 이해한다.
디자인 패턴의 종류를 이해한다.
디자인 패턴이란
소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 할 수있는 훌륭한 해결책
“바퀴를 다시 발명하지 마라(Don’t reinvent the wheel)”
이미 만들어져서 잘 되는 것을 처음부터 다시 만들 필요가 없다는 의미이다.
패턴이란
각기 다른 소프트웨어 모듈이나 기능을 가진 다양한 응용 소프트웨어 시스템들을 개발할 때도 서로 간에 공통되는 설계 문제가 존재하며 이를 처리하는 해결책 사이에도 공통점이 있다. 이러한 유사점을 패턴이라 한다.
패턴은 공통의 언어를 만들어주며 팀원 사이의 의사 소통을 원활하게 해주는 아주 중요한 역할을 한다.
디자인 패턴 구조
콘텍스트(context)
문제가 발생하는 여어 상황을 기술한다. 즉, 패턴이 적용될 수 있는 상황을 나타낸다.
경우에 따라서는 패턴이 유용하지 못한 상황을 나타내기도 한다.
문제(problem)
패턴이 적용되어 해결될 필요가 있는 여러 디자인 이슈들을 기술한다.
이때 여러 제약 사항과 영향력도 문제 해결을 위해 고려해야 한다.
해결(solution)
문제를 해결하도록 설계를 구성하는 요소들과 그 요소들 사이의 관계, 책임, 협력 관계를 기술한다.
해결은 반드시 구체적인 구현 방법이나 언어에 의존적이지 않으며 다양한 상황에 적용할 수 있는 일종의 템플릿이다.
디자인 패턴의 종류
GoF 디자인 패턴
GoF(Gang of Fout)라 불리는 사람들
에리히 감마(Erich Gamma), 리차드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시디스(John Vissides)
소프트웨어 개발 영역에서 디자인 패턴을 구체화하고 체계화한 사람들
23가지의 디자인 패턴을 정리하고 각각의 디자인 패턴을 생성(Creational), 구조(Structural), 행위(Behavioral) 3가지로 분류했다.
GoF

1.생성(Creational) 패턴
객체 생성에 관련된 패턴
객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을  제공한다.
2.구조(Structural) 패턴
클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.
3.행위(Behavioral)
객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.

 


    1. GoF 디자인 패턴의 종류
      1.생성(Creational) 패턴
        추상 팩토리(Abstract Factory)
           구제적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패             턴
         팩토리 메서드(Factory Method)
             객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴
         싱글턴(Singleton)
                 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록               하는 패 패턴
      2.구조(Structural) 패턴
         컴퍼지트(Composite)
                여러 개의 객체들로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별 없이 다루게 해주는 패턴
         데커레이터(Decorator)
    2. 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴
      3.행위(Behavioral) 패턴
         옵서버(Observer)
      한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성하는 패턴
         스테이트(State)
      객체의 상태에 따라 객체의 행위 내용을 변경해주는 패턴
         스트래티지(Strategy)
      행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
         템플릿 메서드(Template Method)
      어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
         커맨드(Command)
      실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴
      관련된 Post

  • https://gmlwjd9405.github.io/2018/07/06/design-pattern.html 인용

MVC 란 Model-View-Controller 의 약자로 관계를 정리하면 저렇게 할 수 있다고 한다.

게시판 만들기를 하던 중 개념을 알아야 할 필요가 있어서 찾아 보게 되었다

 

💡 MVC 패턴이란?

MVC란 Model-View-Controller의 약자로 애플리케이션을 세 가지 역할로 구분한 개발 방법론입니다. 아래의 그림처럼 사용자가 Controller를 조작하면 Controller는 Model을 통해 데이터를 가져오고 그 데이터를 바탕으로 View를 통해 시각적 표현을 제어하여 사용자에게 전달하게 됩니다.

이러한 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시작적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있게 됩니다.

✔️ 위의 개념을 WEB에 적용 시!

  1. 사용자가 웹사이트에 접속 (Users)
  2. Controller는 사용자가 요청한 웹페이지를 서비스하기 위해서 모델을 호출 (Manipulates)
  3. Model은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후 그 결과를 Return
  4. Controller는 Model이 리턴한 결과를 View에 반영 (Updates)
  5. 데이터가 반영된 View는 사용자에게 보여짐 (Sees)

 

🌈MVC패턴 방식 

MVC 패턴에는 모델 1 방식과 모델 2 방식이 있는데

  • 모델 1 방식: JSP에서 출력과 로직을 전부 처리
  • 모델 2 방식: JSP에서 출력만 처리

로 분류할 수 있습니다.

📌 Model 1

모델 1 방식은 Controller 영역에 View 영역을 같이 구현하는 방식이며, 사용자의 요청을 JSP가 전부 처리합니다. 요청을 받은 JSP는 JavaBean Service Class를 사용하여 웹브라우저 사용자가 요청한 작업을 처리하고 그 결과를 출력합니다.

 

📌 Model 2

모델 2 방식은 웹브라우저 사용자의 요청을 서블릿이 받고 서블릿은 해당 요청으로 View로 보여줄 것인지 Model로 보낼 것인지를 판단하여 전송합니다. 또한 모델 2 방식의 경우 HTML 소스와 JAVA소스를 분리해놓았기 때문에 모델 1 방식에 비해 확장시키기도 쉽고 유지보수 또한 쉽습니다.

📲 모델 (Model)

데이터를 가진 객체를 모델이라고 지칭합니다. 데이터는 내부의 상태에 대한 정보를 가질 수도 있고, 모델을 표현하는 이름 속성으로 가질 수 있습니다. 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보합니다. 이와 같은 통보를 통해 뷰는 최신의 결과를 보여줄 수 있고, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가, 제거, 수정할 수 있습니다.

모델의 규칙

  • 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야만 함
  • 뷰나 컨트롤러에 대해서 어떠한 정보도 알지 말아야 함
  • 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야 함

 

🖥️ 뷰 (View)

View는 클라이언트 측 기술은 HTML/CSS/Javascript들을 모와둔 컨테이너입니다. 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어옵니다.

뷰의 규칙

  • 모델이 가지고 있는 정보를 따로 저장해서는 안됨
  • 모델이나 컨트롤러와 같이 다른 구성 요소를 몰라야 함
  • 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야 함

 

🕹️ 컨트롤러 (Controller)

사용자가 접근한 URL에 따라 사용자의 요청사항을 파악한 후에 그 요청에 맞는 데이터를 Model을 의뢰하고, 데이터를 View에 반영해서 사용자에게 알려줍니다.

모델에 명령을 보냄으로써 뷰의 상태를 변경할 수 있음 => (워드에서 문서 편집)
컨트롤러가 관련된 모델에 명령을 보냄으로써 뷰의 표시 방법을 바꿀 수 있음 => (문서를 스크롤하는 것)

컨트롤러의 규칙

  • 모델이냐 뷰에 대해서 알고 있어야 함
  • 모델이나 뷰의 변경을 모니터링해야 함

 

 

👨🏻‍💻 MVC 패턴을 사용해야 하는 이유

  • 비즈니스 로직과 UI로직을 분리하여 유지보수를 독립적으로 수행가능
  • Model과 View가 다른 컴포넌트들에 종속되지 않아 애플리케이션의 확장성, 유연성에 유리함
  • 중복 코딩의 문제점 제거

 

 

😰 MVC 패턴의 한계

MVC패턴에서 View는 Controller에 연결되어 화면을 구성하는 단위 요소이므로 다수의 View를 가질 수 있습니다. 그리고 Model은 Controller를 통해서 View와 연결되지만, Controller에 의해서 하나의 View에 연결될 수 있는 Model도 여러 개가 될 수 있어 View와 Model이 서로 의존성을 띄게 됩니다. 즉, Controller에 다수의 Model과 View가 복잡하게 연결되어 있는 상황이 발생할 수 도 있습니다.

📗 MVC 패턴 요약

Model - 백그라운드에서 동작하는 비즈니스 로직(데이터) 처리

View - 정보를 화면으로 보여주는 역할.

Controller - 사용자의 입력 처리와 흐름 제어 담당. 화면과 Model과 View를 연결시켜주는 역할

 

 

https://cocoon1787.tistory.com/733 여기 글을 그대로 인용했다

정리를 잘 해놓으셔서 무슨 말 인지 비교가 잘 된다.

 

package com.KoreaIT.java.AM;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

System.out.println("==프로그램 시작==");

Scanner sc = new Scanner(System.in);

int lastArticleId = 0;

while (true) {

System.out.print("명령어 > ");

String command = sc.nextLine();

if (command.length() == 0) {

System.out.println("명령어를 입력해주세요");

continue;

}

if (command.equals("exit")) {

break;

}

if (command.equals("article list")) {

System.out.println("게시글이 없습니다");

} else if (command.equals("article write")) {

int id = lastArticleId + 1;

System.out.print("제목 : ");

String title = sc.nextLine();

System.out.print("내용 : ");

String body = sc.nextLine();

System.out.printf("%d번글이 생성되었습니다\n", id);

lastArticleId++;

} else {

System.out.println("존재하지 않는 명령어입니다");

}

}

System.out.println("==프로그램 끝==");

sc.close();

}

}

 

 

뭔가 늘어났다. 하지만 틀은 비슷하다 여전히 명령어 입력 프로그램을 실행중이고

아까는 명령어에 아무리 무엇을 쳐도 의미가 없었다면 지금은 "article list"와 "article write" 기능을 추가 해놓은 것이다

 

if (command.length() == 0) {

System.out.println("명령어를 입력해주세요");

continue;

명령어를 아무것도 입력하지 않았을 경우 "명령어를 입력해주세요" 를 출력한 뒤

continue로 다시 처음 반복문으로 돌아가는것이다

 

if (command.equals("article list")) {    //만약에 article list라는 명령어를 쳤을경우

System.out.println("게시글이 없습니다");  //일단은 이게 출력되게 해본다. 아직 나의 목적은 무언가가 실행 되기만 하면 된다

} else if (command.equals("article write")) { //그게아닌 article write 명령어를 썼다면

int id = lastArticleId + 1;  //오직 정수만 들어갈 수 있는 변수 id를 lastArticleId에 1을 더하여 해나가겠단 뜻이다

System.out.print("제목 : ");  //print 로 println과 다르게 일렬 출력이 아닌 줄바꿈 출력을 하게 될것이고

String title = sc.nextLine(); //스캐너 타입은 String이라 sc.nextLine();으로 받고있다

System.out.print("내용 : "); //제목과 같다

String body = sc.nextLine(); //제목과 같다

System.out.printf("%d번글이 생성되었습니다\n", id); // printf %d를 하게되면 저장해놓은 변수값이 출력 된다 

lastArticleId++; //그리고 그건 반복문을 실행해 나갈 때 마다 1씩 증가할것이다 ex)1번글이 생성 되었습니다,2번글이...

 

그리고 중요한 점은 반복문 밖에 변수를 선언해야 한다.

int lastArticleId = 0; 를 저장해둬야 반복문을 시행 할 때 마다 초기화 되는 걸 방지 할 수 있다

안그러면 1번째 글만 생성된다는 메세지만 나올것이다

 

 

 

 

package com.KoreaIT.java.AM;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

System.out.println("==프로그램 시작==");

Scanner sc = new Scanner(System.in);

while (true) {

System.out.print("명령어 > ");

String command = sc.nextLine();

if(command.equals("exit")) {

break;

}

}

System.out.println("==프로그램 끝==");

sc.close();

 }

}

명령어 입력을 해보자

while 문으로 무한 루프문을 만들어준다.

프로그램을 시작하면 "==프로그램 시작=="이라는 문구와 함께

명령어 > 

무엇을 입력하든지 명령어만 나오는 프로그램이 작동된다.

여기서 프로그램 종료를 시키기 위한 명령어는

if(command.equals("exit")) {

break;

exit << 를 치면 된다 if문을 중첩시켜서 만약에 커맨드가 exit와 같다면

break를 해 while문을 빠져나와 ==프로그램 끝==  

을 출력 하게 되는 것.

 

자바 백엔드 양성과정에서 오로지 자바로만 게시판 만들기 작업이 시작 되었다.

그 동안의 반복문~객체 지향에 대한 개념까지 반복 숙달할 시간이 충분히 필요하면 좋겠지만

나에게 주어진 시간은 그리 많지 않으니 효율적으로 써야한다.

일단 깃허브에 그날 그날 한 작업물을 올려 일명 잔디 꾸미기를 시작했다.

git bash 프로그램을 깔고 이클립스에서 현재 작업중인 프로젝트에 커서를 올린 뒤 오른쪽 마우스 클릭,Properties에 들어가

Location 주소가 있는 (나같은 경우 C:\Users\PC\eclipse-workspace\2023_03_AM) 곳에 폴더 표시를 클릭하면 내가 하고있는 프로젝트들이 있는 자바 주소가 뜬다.

내가 현재 올리고 싶은 프로젝트 폴더 2023_03_AM에 들어가

이러한 폴더들이 뜬다 자세히는 모르겠다

여기 화면에서 우클릭,git bash 프로그램을 실행 시킨다

먼저, 내 컴퓨터에 있는 git bash와 git hub 계정을 연동 시켜야 한다.

 

git init

git config --global user.name "깃 허브 계정 이름"

git config --global user.email "깃 허브 로그인하는 이메일 계정"

git config --global user.password "깃 허브 로그인하는 이메일 계정의 비밀번호"

 

를 입력하고 

 

git config --list 

로 제대로 입력했는지 확인.

git remote add origin 내가 연동하고픈 깃허브 작업주소

git remote rm origin master(잘못 입력했을 때 삭제!!!! 주의)

 

그런다음 vim .gitignore 를 쳐서 연동에서 제외하고픈 파일을 넣어준다

수업중엔

.settings

.classpath

.project

bin

src

build 정도를 제외했으며 저장하고 나가는건 리눅스와 동일하게esc로 명령어 입력모드 후 wq! 하면 된다

 

 

git add .    ( 리눅스에서도 그렇지만 . 은 현재 폴더를 의미한다)

git commit -m "깃 허브에 저장 될 메시지 입력 한글도 가능"

git push origin master 깃 허브에 푸쉬

 

이런 식으로 연동이 되는 걸 볼 수 있다

 

 

package com.KoreaIT.java.AM;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

System.out.println("==프로그램 시작==");

Scanner sc = new Scanner(System.in);

String command = sc.nextLine();

System.out.printf("입력된 명령어 : %s\n", command);

int command2 = sc.nextInt();

System.out.printf("입력된 명령어 : %d\n", command2);

System.out.println("==프로그램 끝==");

sc.close();

}

}

-명령어 입력 테스트-

명령어 프로그램 확인 차 쓰인 간단한 코드다

import 로 스캐너 기능을 가져와 쓰고있고

간단한 출력을 통해 쓰여있는게 제대로 출력되는지 확인 중이다.

스캐너 기능을 쓴 뒤엔 sc.close();로 닫아준다

+ Recent posts