멋사 Backend 5일차 🦁

신재원·2023년 4월 21일

🐱‍🚀 Git

📍 로컬(Local)저장소와 원격(Remote) 저장소

git저장소는 자신의 컴퓨터인 로컬 저장소와 서버에 있는 원격 저장소로 나뉩니다.
✔ 로컬 저장소에서 푸쉬를 해줘야 변경사항이 원격저장소에 반영됩니다.

  • 원격저장소에서 CI/CD(배포하는기능) ▶ CI/CD에 대해서는 나중에 더 자세하게 다루겠습니다.
    (java build, docker build)

👀 Git Conflict (충돌)

  • branch (브랜치)를 나누어서 작업할때 많이 발생합니다.
    (팀 프로젝트.. 등)
  • 두개의 브랜치에서 같은 라인의 코드를 수정후 커밋한뒤에 main에 수정 사항들을 merge(병합) 합니다. ▶ 그러면 이때 conflict가 발생합니다.
    ✔ 이유
    : main의 입장에서는 두 개의 브랜치가 동일한 라인의 코드를 수정하여서 어떤 코드를 경정해야될지 모르기 때문입니다.
    ▶ confilt가 발생하였으면 수동으로 개발자가 결정해 줘야됩니다.

🐱‍👤 Git Pull과 Fetch의 차이 ft (인텔리제이)

  • Pull : 최신 내용(로직)을 로컬 저장소로 가져오면서 병합합니다.
  • Fetch : 원격 저장소의 변경사항이 있는지만 체크 합니다. pull과 다르게 자동으로 병합해주지 않습니다.

📌 Update Project

  • merge(병합)을 할것인지 Reabase 할것인지 물어봅니다.
  • merge를 해야하는 상황이 있으면 인텔리제이가 Fetch를 해보고 pull 할게 있는지 비교 및 확인하여 merge를 해줍니다.

✔ 번외
pull을 하게되면 개발자가 작성하고 있던 코드는 남아있나요? 다시 작성해야하나요?

  • 개발자가 작성하고있는 코드는 남아있습니다.
  • 하지만 개발자가 작성하고 있는 코드에 업데이트할 부분이 있다면 Merge화면이 뜨게됩니다.

🍣 Java

변수와 상수

✔ 변수
(변하는수)
(덮어쓴다고 생각하면 될것입니다.)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int number = 10; // 변수 선언
        System.out.println(number); // 10을 출력합니다.
        
        number = 20;
        System.out.println(number); // 20을 출력합니다.
    }
}
  • 위의 코드와 같이 변수는 변할수 있는 수 입니다.

✔ 상수

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        final int number = 10; // 상수 선언
        System.out.println(number); // 10을 출력합니다.
        
        number = 20; // 에러 발생
        System.out.println(number);
    }
}
  • 위의 코드와 같이 타입의 앞에 final 이 붙게되면 변하지 않는 수 즉 상수로 만들겠다는 것입니다.
  • 값을 재할당 하지 못합니다.

private static final 타입

public class Main {
    private static final int USER_AGE = 25; // 멤버 상수 선언
    
    public static void main(String[] args) {

        System.out.println(USER_AGE); // 25 출력
    }
}

✔ 상수로 사용할때 주로 private final static을 붙여 사용합니다.

  • 이유는 ?
    private static final을 선언한 변수를 사용하면 재할당하지 못하며, 메모리에 한 번 올라갑니다.
    static이 붙어있어 객체의 생성없이 사용이 가능하며, 같은 값을 클래스 내부의 전체 필드, 메서드에서 공유할수 있습니다.

멤버 변수와 지역 변수

📌 변수는 크게 2가지로 나눌수 있습니다.

  1. 멤버 변수 (인스턴스 변수 + 클래스 변수)
    ➡ 인스턴스 변수
    ➡ 클래스 변수
public class Main {
    int limit = 1; // 멤버변수 - 인스턴스 변수
    int age; // 멤버변수 - 인스턴스 변수
    static String name = "신재원"; // 멤버변수 - 클래스 변수

    public static void main(String[] args) {

        Main main = new Main(); // 인스턴스화
        System.out.println(main.limit); // 1 출력
        System.out.println(main.age); // 0 출력

        System.out.println(name); // 신재원 출력
    }
}
  • 인스턴스 변수는 객체를 생성 (인스턴스화)을 해야 사용이 가능합니다.
  • 클래스 변수는 static을 붙여서 만들고, 객체의 생성없이 사용이 가능합니다.
    • 클래스 변수는 왜 사용 ?
      1. 인스턴스를 생성이 필요없는 값을 원하는경우,
      2. 변경사항을 모든 인스턴스가 공유해야되는경우 사용합니다.
  1. 지역 변수
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // int age; 초기화를 하지 않을시 오류
        
        int number = 10; // 변수 선언 (지역 변수)
        System.out.println(number); // 10을 출력합니다.
        
        number = 20;
        System.out.println(number); // 20을 출력합니다.
    }
}

메소드 안에서 선언되고, 해당 메서드 안에서만 사용 가능하다.
(초기화를 꼭 해줘야 합니다.)

public class Main {
    private void moveLeft() {
        int location = 0;
        location = location - 1;
        System.out.printf("%d\n", location);
    }

    private void moveRight() {
        int location = 0;
        location = location + 1;
        System.out.printf("%d\n", location);
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.moveLeft(); // -1 출력
        main.moveLeft(); // -1 출력
        main.moveLeft(); // -1 출력
        main.moveRight(); // 1 출력
        main.moveRight(); // 1 출력
    }
}
  • 값이 누적되지않고, 메소드가 실행될때마다 스택에 등록되어 사용하며,
    -1, 1 만 출력됩니다.
  • 메소드는 스택 영역에 등록되며, 메소드가 종료될때 마다 같이 소멸되어 없어집니다.

상수는 GC (가비지 컬렉션)의 대상 유무

Heap (힙) 영역을 비우는 것 입니다.

private static final int userName = "신재원"; // GC의 대상이 아닙니다.
private final int userAge = 25; // GC의 대상입니다.
  • static 이 붙으면 JVM과 Life Cycle을 같이 하게됩니다.
  • static 이 안 붙으면 Class와 Life Cycle을 같이 하게됩니다.

Stack (스택) 과 Heap (힙)

Stack

  • 먼저 들어간 데이터가 나중에 나옵니다, LIFO (후입선출) 구조입니다.
  • 알고리즘에서 그래프의 깊이 우선 탐색 (BFS)에 주로 사용 됩니다.

Heap

  • 이진 트리 구조이며 추후에 자세하게 다룰 예정입니다.

접근 제어자

✔ 접근 제어자 란 ?

변수와 함수, 클래스에 대한 접근을 제어하는 문법입니다.

  • 접근을 제한하는 이유 ?
    외부에서의 잘못된 변경을 막기위해서 제한하는 것입니다.

➡ 오른쪽 순서로 접근범위가 작아지게됩니다.
public > protected > default > private

  • public
    : 접근을 제한하지 않습니다.
    (모든 클래스에서 접근 가능, 패키지 상관 X)
  • protected
    : 같은 패키지 클래스와, 다른 패키지의 자식클래스에서 접근 가능합니다.
  • default (생략)
    : 같은 패키지안의 클래스에서 접근 가능합니다.
  • private
    : 같은 클래스에 있는 멤버들만 접근 가능합니다.

0개의 댓글