조건문

if문과 switch문의 차이점

  1. if문은 ()안에 복수의 조건을 지정할 수 있지만 switch는 하나의 조건만 지정가능하다.
  2. 딱 보기엔 switch문이 가독성이 더 좋아 코드를 파악하기 쉽다.

 

반복문

향상된 for문

        int[] numbers = {3, 6, 9, 12, 15};

        for(int number:numbers){
            System.out.println(number + " 향상된 for문");
        }

 

위 코드를 일반적인 for문으로 구현하면 다음과 같다.

      int[] numbers = {3, 6, 9, 12, 15};

        for(int i=0; i < numbers.length; i++){
            System.out.println(numbers[i] + " ");
        }

 

향상된 for문은 자바스크립트의 forEach 메서드와 유사한 기능을 하는 듯하다.

 

 

break 명령

break 명령은 표시되는 가장 가까운 바깥쪽 루프 또는 조건문의 실행을 종료한다. 즉, 자기가 속해있는 루프에서 한겹 바깥 껍질을 탈출한다.

 for(int i=0; i<10; i++){
            System.out.println("i : " + i);
            if(i == 2){
                break; // for(int i=0; i<10; i++)를 탈출
            }
            for(int j=0; j<10; j++){
                System.out.println("j : " + j);
                if(j == 2){
                    break; // for(int j=0; j<10; j++)를 탈출
                }
            }
        }
i : 0
j : 0
j : 1
j : 2
i : 1
j : 0
j : 1
j : 2
i : 2

 

 

continue 명령

continue 아래쪽 로직을 건너뛰고 위로 올라간다.

        int num = 0;
        while(num < 3){
            num++;
            if(num == 2){
                continue; // 아래 println을 실행하지 않고 while(num < 3)으로 간다.
            }
            System.out.println("num : " + num);
        }
num : 1
num : 3

 

 

연습

구구단에서 선택한 단만 출력하기

        Scanner sc = new Scanner(System.in);
        int passNum = sc.nextInt(); // 출력할 구구단 입력받기
        for (int i = 2; i <= 9; i++) {
            if (i != passNum) {
                continue;
            }
            for (int j = 2; j <= 9; j++) {
                System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
            }
        }
5 // 출력할 단 입력
5곱하기2는10입니다.
5곱하기3는15입니다.
5곱하기4는20입니다.
5곱하기5는25입니다.
5곱하기6는30입니다.
5곱하기7는35입니다.
5곱하기8는40입니다.
5곱하기9는45입니다.

 

 

 

'TIL > WEEK2' 카테고리의 다른 글

JAVA3 객체지향 프로그래밍2  (0) 2023.05.26
JAVA3 객체지향 프로그래밍1  (0) 2023.05.25
JAVA 2주차 배열과 컬렉션  (0) 2023.05.24
JAVA 1주차  (0) 2023.05.22

JVM(Java Virtual Machine )

여러가지의 기기위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는것

 

ava 컴파일러

Java 코드(.java 파일)를 운영체제가 읽을 수 있는 바이트 코드(.class 파일)로 변환

 

인터프리터

운영체제가 읽은 바이트 코드를 기계어로 번역

 

JIT 컴파일러

인터프리터의 효율을 높여주는 서포터 해석기

 

클래스 로더

JVM으로 바이트 코드를 불러와서 메모리에 저장

 

가비지 컬렉터

메모리 영역에서 안쓰는 데이터를 주기적으로 흡수해가는 청소기

JRE의 기능

Java Runtime Environment 자바 실행 환경

  • .class 파일만 실행 가능

 

JDK의 기능

  • JRE(JVM)의 기능 : .class  파일 실행
  • Java Compiler(javac) 기능 : .java 파일을 .class 파일로 컴파일
  • JDB 기능 : 디버깅

 

 

 

 

기본형 변수

  • 모두 소문자로 시작된다
  • 비객체 타입이므로 null 값을 가질 수 없다. (기본값이 정해져 있음)
  • 변수의 선언과 동시에 메모리 생성
  • 모든 값 타입은 메모리의 스택(stack)에 저장
  • 저장공간에 실제 자료 값을 가진다.

 

참조형 변수

  • 기본형 과는 달리 실제 값이 저장되지 않고, 자료가 저장된 공간의 주소를 저장한다.
  • 즉, 실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져온다.
  • 메모리의 (heap)에 실제 값을 저장하고, 그 참조값(주소값)을 갖는 변수는 스택에 저장
  • 참조형 변수는 null로 초기화 시킬 수 있다.

String, 객체, 배열, 리스트 등등

 

 

Stack 영역 vs Heap 영역

  • Stack의 경우에는 정적으로 할당된 메모리 영역
    • 크기가 정해져 있는 변수를 저장
    • 크기가 정해져 있는 참조형 변수의 주소 값도 저장
  • Heap의 경우에는 동적으로 할당된 메모리 영역
    • 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장

 

 

 

ASCII 코드 형변환

  • 입력한 정수를 문자로 바꿔서 출력하는 메서드
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int asciiNumber = sc.nextInt();

        char ch = (char)asciiNumber;

        System.out.println(ch);  // 입력한 글자를 출력합니다.

    }
}

 

 

  • 입력한 문자의 제일 첫 글자를 숫자로 출력하는 메서드
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int letter = sc.nextLine().charAt(0); // charAt(0) :첫번쨰 문자를 받아온다.

        int asciiNumber = (int)letter;

        System.out.println(asciiNumber);  // 입력한 글자를 출력합니다.

    }
}

 

'TIL > WEEK2' 카테고리의 다른 글

JAVA3 객체지향 프로그래밍2  (0) 2023.05.26
JAVA3 객체지향 프로그래밍1  (0) 2023.05.25
JAVA 2주차 배열과 컬렉션  (0) 2023.05.24
JAVA 2주차 조건문과 반복문  (0) 2023.05.23

프로젝트 발표

발표할 때 각자 자신의 각오를 준비하라고 하셔서 좀 부담스럽기도 하고 어색했는데 막상 끝나고 보니 발표 내용보다 각오가 더 기억에 남는다. 나와 같은 고민과 걱정을 가지신 분들이 많았어서 다른 분들의 각오를 듣는 게 생각보다 큰 위로와 용기가 됐다. '아는 게 없는데 잘 따라갈 수 있을까?', '내가 팀에서 한 사람의 몫을 제대로 할 수 있을까?'와 같은 고민들 말이다. 혼자서는 자신 없어도 팀을 이뤄 협동하면 어떻게든 해낼 수 있을 거란 생각이 들었다.

그리고 팀 프로젝트를 할 때 용건만 간단히 말하는 게 가장 효율적인 방법이라 생각했는데 다른 팀들을 보니 팀의 분위기를 재밌게 만드는 것 또한 아주 중요하다는 것을 깨달았다. 분위기가 어느정도 편하고 즐거워야 의견을 쉽게 내고 그래야 원활한 의사통이 이루어지는 것 같다. 막히는 부분이 생기면 검색을 통해 혼자 해결하려고 했는데 다음부터는 좀 더 팀원들에게 질문도 하고 적극적으로 의사소통해보고 싶다.

 

 

 

'TIL > WEEK1' 카테고리의 다른 글

WEEK1. POST와 PUT의 차이점  (0) 2023.05.18
WEEK1. PUT방식으로 수정기능 구현  (0) 2023.05.17
WEEK1. REST API  (0) 2023.05.16
WEEK1. Git  (0) 2023.05.15

GET

GET 메서드는 특정한 리소스를 가져오도록 요청한다. GET 요청은 데이터를 가져올 때만 사용해야 한다.

 

 

POST

POST 메서드는 서버로 데이터를 전송하여 리소스를 추가하거나 생성하기 위해 사용하는 메서드이다. GET 메서드와 반대로 요청 Header의 Content-Type에 컨텐츠 타입을 명시하며, HTTP 패킷의 Body에는 데이터를 담아 서버로 전송한다. 

 

 

PUT

PUT 메서드는 요청 페이로드를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체한다. 즉 PUT 메소드는 문서 전체의 완전한 교체만을 허용한다. PUT과 POST의 차이는 멱등성으로, PUT 메서드는 멱등성을 가진다. 이는 한 번을 보내도, 여러 번을 연속으로 보내도 같은 효과를 보인다는 뜻이다.

 

 

PATCH

PATCH 메소드는 리소스의 부분적인 수정을 할 때 사용된다. PATCH 메서드는 멱등성을 가지지 않는데, 이는 동일한 patch 요청이 다른 결과를 야기할 수도 있음을 뜻한다. 하지만 PATCH를 PUT과 같은 방식으로 사용함으로써 멱등성을 가지게 할 수도 있다.

 

 

* 멱등성이란, 수학에서 사용하는 용어에서 유래한 것으로. 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 뜻한다. 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 한다. 다른 말로는, 멱등성 메서드에는 통계 기록 등을 제외하면 어떠한 부수 효과(side effect)도 존재해서는 안된다는 뜻이다.

GETHEADPUTDELETE 메서드는 멱등성을 가지며, POST 메서드는 그렇지 않다.

 

 

 

 

'TIL > WEEK1' 카테고리의 다른 글

WEEK 1. 드디어 첫 프로젝트 끝!  (0) 2023.05.19
WEEK1. PUT방식으로 수정기능 구현  (0) 2023.05.17
WEEK1. REST API  (0) 2023.05.16
WEEK1. Git  (0) 2023.05.15

팀프로젝트 진행사항

    <script>
        function update_profile() {
            let name = $('#name').val()
            let blog = $('#blog').val()
            let mbti = $('#mbti').val()
            let desc = $('#desc').val()
            let img = $('#img').val()
            let merit = $('#merit').val()

            var data = {
                "name": name,
                "blog":blog,
                "mbti":mbti,
                "desc":desc,
                "img":img,
                "merit":merit
            }
            
            var jsonData = JSON.stringify(data);

            fetch("/update/{{ member_id['_id'] }}", {
                method:'PUT',
                headers:{'content-type':'application/json'},
                body:jsonData
            }).then((res) => res.json()).then((data) => {
                alert(data['msg'])
                location.reload()
            })
            
        }
    </script>
    
    <body>
    <div class="container">
        <div class>
            <div class="input-group mb-3">
                <label class="input-group-text" for="size">사진</label>
                <input id="img" type="url" class="form-control" />
            </div>
            <div class="input-group mb-3">
                <span class="input-group-text">이름</span>
                <input id="name" value="{{ member['name']}}" class="form-control" />
            </div>
            <div class="input-group mb-3">
                <span class="input-group-text">블로그 주소</span>
                <input id="blog" value="{{ member['blog']}}" class="form-control" />
            </div>
            <div class="input-group mb-3">
                <label class="input-group-text" for="size">MBTI</label>
                <input id="mbti" value="{{ member['mbti']}}" type="text" class="form-control" />
            </div>
            <div class="input-group mb-3">
                <label class="input-group-text" for="size">장점</label>
                <input id="merit" value="{{ member['merit']}}" type="text" class="form-control" />
            </div>
            <div class="input-group mb-3">
                <label class="input-group-text" for="size">자기소개</label>
                <input id="desc" value="{{ member['desc']}}" type="text" class="form-control" />
            </div>
        </div>
        <div class="d-flex justify-content-around">
            <button type="button" onClick="update_profile()" class="btn btn-light">수정</button>
            <a href="/view/{{ member_id['_id'] }}"><button class="btn btn-light">취소</button></a>
        </div>
    </div>

</body>
@app.route("/update/<id>", methods=["PUT"])
def update_post(id):
    receive = request.get_json()
    name_receive = receive['name']
    blog_receive = receive['blog']
    mbti_receive = receive['mbti']
    img_receive = receive['img']
    desc_receive = receive['desc']
    merit_receive = receive['merit']
    
    doc = {
        'name':name_receive,
        'blog':blog_receive,
        'mbti':mbti_receive,
        'img':img_receive,
        'merit':merit_receive,
        'desc':desc_receive
    }

    db.members.update_one({'_id': ObjectId(id)},{'$set':doc})
    return jsonify({'msg':'수정완료!'})

어제 FormData로 시도했다가 실패해서 데이터를 JSON으로 변환해서 시도해봤더니 잘 작동했다.

 

  • JSON.stringify(): JavaScript 객체를 JSON 문자열로 변환해준다.
  • request.get_json() : JSON 형식으로 전달된 요청 본문은 flask에서 request.get_json() 함수로 받을 수 있다.

 

 

 

 

 

'TIL > WEEK1' 카테고리의 다른 글

WEEK 1. 드디어 첫 프로젝트 끝!  (0) 2023.05.19
WEEK1. POST와 PUT의 차이점  (0) 2023.05.18
WEEK1. REST API  (0) 2023.05.16
WEEK1. Git  (0) 2023.05.15

1. 리소스

리소스는 URI로 식별한다.

Collection : 복수의 element

Element : 하나하나의 데이터

 

2. REST 

Representational State Transfer

  • 자원(Resource): URI
  • 행위(Verb): HTTP Method
  • 표현(Representations)

 

3. HTTP Method

REST를 지키면서 행위를 전달하는 방법

 

patch는 부분 수정이 가능하지만 put은 전체 데이터를 입력받아 덮어쓰므로  전송하지 않은 데이터는 삭제한다.


팀프로젝트 진행사항

프로필 수정기능을 구현해봤다.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
        crossorigin="anonymous"></script>
    <title>수정하기</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
    </script>
    <style>
        .container {
            justify-content: center;
            margin: auto;
            width: 50%;
            padding: 4rem;
        }
    </style>
</head>

<body>
    <div class="container">
        <form action="/update/{{ member['_id'] }}" method="post">
            <div class>
                <div class="input-group mb-3">
                    <label class="input-group-text" for="size">사진</label>
                    <input name="img_give" type="url" class="form-control" />
                </div>
                <div class="input-group mb-3">
                    <span class="input-group-text">이름</span>
                    <input name="name_give" value="{{ member['name']}}" class="form-control" />
                </div>
                <div class="input-group mb-3">
                    <span class="input-group-text">블로그 주소</span>
                    <input name="blog_give" value="{{ member['blog']}}" class="form-control" />
                </div>
                <div class="input-group mb-3">
                    <label class="input-group-text" for="size">MBTI</label>
                    <input name="mbti_give" value="{{ member['mbti']}}" type="text" class="form-control" />
                </div>
                <div class="input-group mb-3">
                    <label class="input-group-text" for="size">장점</label>
                    <input name="merit_give" value="{{ member['merit']}}" type="text" class="form-control" />
                </div>
                <div class="input-group mb-3">
                    <label class="input-group-text" for="size">자기소개</label>
                    <input name="desc_give" value="{{ member['desc']}}" type="text" class="form-control" />
                </div>
            </div>
            <div class="d-flex justify-content-around">
                <button type="submit" class="btn btn-light">수정</button>
                <a href="/view/{{ member_id['_id'] }}"><button class="btn btn-light">취소</button></a>
            </div>

        </form>
    </div>

</body>

</html>
#수정
@app.route("/update/<id>", methods=["GET"])
def update_get(id):
    find_member = db.members.find_one({"_id": ObjectId(id)})
    find_member['_id'] = str(find_member['_id'])
    find_id = db.members.find_one({'_id' : ObjectId(id)},{'id':True})
    return render_template('update.html', member=find_member, member_id=find_id)

@app.route("/update/<id>", methods=["POST"])
def update_post(id):
    name_receive = request.form['name_give']
    blog_receive = request.form['blog_give']
    mbti_receive = request.form['mbti_give']
    img_receive = request.form['img_give']
    desc_receive = request.form['desc_give']
    merit_receive = request.form['merit_give']

    find_member = db.members.find_one({"_id": ObjectId(id)})
    find_member['_id'] = str(find_member['_id'])

    db.members.update_one({'_id': ObjectId(id)},{'$set':{'name':name_receive}})
    db.members.update_one({'_id': ObjectId(id)},{'$set':{'blog':blog_receive}})
    db.members.update_one({'_id': ObjectId(id)},{'$set':{'mbti':mbti_receive}})
    db.members.update_one({'_id': ObjectId(id)},{'$set':{'img':img_receive}})
    db.members.update_one({'_id': ObjectId(id)},{'$set':{'desc':desc_receive}})
    db.members.update_one({'_id': ObjectId(id)},{'$set':{'merit':merit_receive}})

    return redirect('/view/'+id)

put 방식을 이용해 업데이트 기능을 구현해보고 싶었는데 form에서는 put을 지원하지 않아 post방식으로 구현했다. 다른 방법을 생각해봐야 될 것 같다.

'TIL > WEEK1' 카테고리의 다른 글

WEEK 1. 드디어 첫 프로젝트 끝!  (0) 2023.05.19
WEEK1. POST와 PUT의 차이점  (0) 2023.05.18
WEEK1. PUT방식으로 수정기능 구현  (0) 2023.05.17
WEEK1. Git  (0) 2023.05.15

1. CLI 명령어

pwd 현재 경로 확인
ls
ls -al
현재 경로의 파일 및 폴더 조회
숨김 파일 및 폴더까지 조회
cd
cd ..
cd ~

디렉토리 이동

상위 디렉토리로 이동
홈 디렉토리로 이동

touch 비어있는 파일 생성
cat 파일 내용 확인
vi
a 또는 i
ESC
:w
:q
(:wq로 한번에 써도 됨)
파일 편집
입력모드
빠져나가기
저장
닫기
rm
rm -rf
비어있는 디렉토리 및 파일 삭제
비어있지 않은 디렉토리 삭제
mkdir 디렉토리 생성

 

2. commit

유의미한 변화가 결과물로 나온 것

ex) 새 기능 추가, 버그 삭제, 버그 수정

 

3.  깃이 관리하는 세개의 공간

  • 작업 디렉토리 : 버전 관리 대상이 위치하는 공간 ( .git이 있는 디렉토리)
  • 스테이지 : 다음 버전이 될 후보가 올라가는 공간
  • 저장소 : 버전이 만들어지고 관리되는 공간

 

4. 브랜치

브랜치로 문제 해결하기

브랜치로 문제 해결하기

빨리감기 병합 : 기존의 branch에서 수정/추가 사항이 추가된 branch를 병합하는 과정

빨리감기 병합

 

5. HEAD

현재 작업중인 브랜치의 커밋을 가리킨다.

일반적으로 현재 작업 중인 브랜치의 최신 커밋을 가리킨다.

한 마디로 '내가 지금 어디에서 작업중인가'를 가리킨다.

 

6. git 명령어

[기본]

git init
  - 현재 디렉토리를 git local repository[Working Directory]로 지정(생성)
  - ls -al 명령어로 .git 숨김파일 생성 확인
  - rm -rf .git 명령어로 local repository 삭제
git status
  - 파일 상태 확인(staged, untracked, ..)
git add 파일명
  - 해당 파일을 [Staging Area]로 이동(tracking)
git add .
  -현재 폴더의 전체 파일을 이동
git commit
  - [Staging Area]에 있는 파일을 원격저장소[Repository]로 커밋
  - 옵션없이 해당 명령어만 입력할 경우 editor 호출
git commit -m "커밋메세지"
  - editor 호출없이 바로 커밋
git commit -am "커밋메세지"
  - [Staging Area]에 올림과 동시에 커밋(= git add .+ git commit -m "커밋메세지")

  - 단, 1번이라도 커밋된 대상만 사용 가능
git diff
  - local repository[Working Directory]와 [Staging Area]의 차이를 보여줌
git log
  - commit 로그 확인

 

[브랜치]

git branch
  - 브랜치 목록 조회(현재 속한 브랜치는 앞에 *가 붙음)
git branch 브랜치명
  - 브랜치명으로 브랜치 생성
  - 단, main 브랜치에 1번 이상 commit 해야함
git branch checkout 브랜치명
  - 해당 브랜치로 local repository[Working Directory] 변경
git branch -b 브랜치명
  - 브랜치 생성 후 checkout(= git branch 브랜치명 + git branch checkout 브랜치명)
git branch -d 브랜치명
  - 브랜치명 브랜치 삭제
git branch merge 브랜치명

 

'TIL > WEEK1' 카테고리의 다른 글

WEEK 1. 드디어 첫 프로젝트 끝!  (0) 2023.05.19
WEEK1. POST와 PUT의 차이점  (0) 2023.05.18
WEEK1. PUT방식으로 수정기능 구현  (0) 2023.05.17
WEEK1. REST API  (0) 2023.05.16

+ Recent posts