관리 메뉴

제뉴어리의 모든것

[Section1] section1 회고 본문

코드스테이츠/정리 블로깅

[Section1] section1 회고

제뉴어리맨 2022. 10. 17. 21:42

회고의 내용

섹션1 내용을 다시한번 들여다 보면서 놓쳤던 부분들을 상기하거나 부족한 부분을 다시 정리하는 내용이 되겠다.

 

전체 항목

  • 협업시 git의 전반적인 흐름의 이해
  • Java의 메모리 영역에 대한 이해
  • 제네릭에 대한 이해



 

협업시 git의 전반적인 흐름의 이해

현재 2명의 개발자가 협업을 하는 상황이라고 가정한다.

2명의 개발자는 A, B 개발자라고 지칭한다.

  1. 두명의 개발자 중 누군가가 메인이 되는 리모트 중앙 저장소 (Remote) 를 생성한다. (A가 생성했다고 가정)
  2. B개발자는 중앙 저장소를 Fork 한다
  3. A개발자는 자신이 생성한 중앙 저장소를 자신읜 Local에 클론받는다
  4. B개발자 또한 자신이 Fork 한 저장소를 Local에 클론 받는다.
  5. ----- 현재 여기까지 진행이라면 A , B 개발자 모두 중앙 저장소를 기반한 레포지토리를 자신의 Local에 가진 상태다.
  6. A가 개발을 마치고 자신의 Local, Remote 에 차례로 commit push 를 한다. (중앙 저장소에 변경이 이루어진 상태)
  7. B가 개발을 마치고 자신의 수정 내용을 Local에 commit 하고 중앙 저장소를 Fork한 자신의 Remote 저장소에도 push 한다
  8. 그리고 B는 Pull Request를 신청한다. (자신의 소스 내용 반영 요청)
  9. A가 코드 내용을 검토하고 Pull Request를 받아들이고, 중앙 저장소에 B의 코드가 반영된다.

 

위에 내용은 중앙 저장소를 B라는 개발자가 자신의 Remote 저장소에 Fork를 한 상황으로 가정을 했지만,

협업의 방법은 다양한것 같다.

 

다른 상황을 설명해 보자면 아래와 같다.

 

위에 내용과는 다른 상황의 협업 상황

  • 리모트인 중앙 저장소는 관리자가 생성을 해두고, 해당 저장소를 이용하는 모든 직원이 해당 리모트 중앙 저장소를 자신의 PC로 바로 clone 받아 작업하는 상황.
    중앙저장소로 push를 할때 conflct가 발생하면 pull을 하고 자신의 local에서 변경 내용들을 검토하여 소스를 잘 조합하여 다시 push를 하여야한다. 

 

 

 

 

 

Java의 메모리 영역에 대한 이해

 

아래는 자바 프로그램이 런타임 상황일때의 메모리 영역을 보여준다.


아래의 내용은 대표적인 메소드영역, 힙영역, 스택영역에 저장되는 대표적인 것들이다.

  • Method (Static) 영역 :

    - static 변수
    - 클래스의 바이트 코드(정보)
    - Constant Pool
    리터럴 값을 의미한다.
    만약 아래와 같은 코드가 있다면,
    String str2 = "madplay";
    madplay 라는 상수 값을 만들어서 해당 Pool에 저장하는 것이다.
    String 객체가 생성되는것이 아니다.


  • Heap 영역 :
    메소드 안에서 new 로 생성된 객체들이 저장 된다.

    - 객체
    객체 안에서 선언된 인스턴스 멤버 변수들도 같이 저장된다.

    - 배열


  • Stack 영역 :

    - 지역변수
    - 참조변수안에 저장된 주소값
    - 리턴값
    - 파라미터


제네릭에 대한 이해

참조타입인 변수의 선언과 함께 해당 클래스내에서 쓰일 데이터타입을 지정하는것.

 

제네릭의 장점

  • 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다
  • 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없어 관리하기가 편하다
  • 비슷한 기능을 지원하는 경우 코드의 재사용성을 높일 수 있다

제네릭의 특징

  • static 변수에는 사용 불가
    제네릭의 사용목적은 제네릭이 사용되는 생성되는 객체마다 필요에 따라 내부 데이터의 변화를 주기 위해서인데
    static에 주는것은 무의미하기 때문이다.

 

 

클래스, 인터페이스에서의 제네릭 선언 예

public class ClassName <T> { ... }

// 인터페이스
public Interface InterfaceName <T> { ... }

// 제네릭 타입을 두 개 이상 사용하는 경우
public class MultiGeneric <K, V> { ... }

 

 

클래스에서의 제네릭의 사용 예

public class Box<T> {

    private T object;

    public void set(T object) {
        this.object = object;
    }
    public T get() {
        return object;
    }
}

 

 

 

메소드에서의 제네릭 선언 예

public <T> T genericMethod(T object) {	
		...
}
 
[접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) {
		...	
}

 

 

메소드에서의 제네릭의 사용 예

public static <T extends CharSequence> void printFirstChar(T param) {
    System.out.println(param.charAt(0));
}

 

 

 

 

 

 

 


참조

 

협업시 git의 전반적인 흐름의 이해

 https://blog.appkr.dev/learn-n-think/comparing-workflows/

 

 

Java의 메모리 영역에 대한 이해
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=writer0713&logNo=221137837754https://simostory.tistory.com/m/26

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=writer0713&logNo=221137837754

 

제네릭의 대한 이해

https://wildeveloperetrain.tistory.com/m/103