25일차 내용 정리

채공부·2025년 6월 27일

Git

GitHub : 원격 저장소

🔴 다른 사람 저장소 사용하기

<Teacher's computer>  <Teacher's GitHub>  <Local Computer>      <My GitHub>
							             (Desktop or Labtop)									
		 							 <clone>
		repo1		➜		repo1	    ➜		repo1       ➜   empty repo	
	     					repo2		                    ⭡
                                        <원격저장소를 추가로 등록 저장소 이름(마음대로)>

🔴 clone 특징

  • git clone : 원격 저장소 전체를 복제 ➜ 로컬 저장소 생성
    ➜ 압출파일 다운로드는 단순 파일 복사만 가능
  • clone 하면 origin 이라는 이름으로 자동 원격 저장소가 등록
  • 이후 add commit push 순서로 작업하면서 원격 저장소와 연결

🔴 원격 저장소 추가

git remote add origin http://...git : 기본 저장소 등록
git remote add myOrigin http://...git : 원본 저장소 따로 등록 가능
  • 원격 저장소는 여러 개 등록 가능
    origin : 기본 저장소 (보통 내 GitHub)
    myOrigin, upstream 등 원하는 이름으로 지정 가능

🔴 주요 명령어

git pull origin master : origin 저장솔부터 master 브랜치 이력 내려받기
git push origin master : 내 master 브랜치를 origin에 업로드 ➜ 내 저장소여야 가능

git pull myOrigin master : myOrigin에서 master 브랜치 이력 내려받기
git push myOrigin master : myOrigin으로 push ➜ 본인 저장소만 가능

➜ 다른 사람의 GitHub 저장소에는 직접 push 불가능
원격 저장소는 같은 "혈통"(fork 또는 같은 기반)이어야 pull 이 가능

🔴 fork : 원격 저장소를 더 쉽게 연결하는 방법

<Teacher Computer>    <Teacher's GitHub>     <My GitHub>      <My Computer>
       repo1	   ⭢        repo1	      ⭢ 	 repo1     ⭢       repo1
      <new commit push   있다>  <최초 한번 fork> <최초 한번만 clone><origin 원격 저장소>
                                          ⭠-----------------
                      				     <upStream 원격 저장소>
                                         

🔺 흐름

  • 다른 사람의 저장소를 한 번만 fork 하면 내 GitHub에 복제본이 생긴다
    ➜ 이 시점부터 내 저장소
  • 그 후 내 저장소를 한 번만 clone 하면 로컬에도 복제
    ➜ 자동으로 origin 으로 등록

🔴 원본 저장소를 따로 연결하고 싶다면?

git remote add upstream https://github.com/....git

🔴 오픈 소스 & 프로젝트 협업 흐름
fork + clone + pull request 기반의 협업 형식

🔺 협업 순서

1. 팀장(또는 선생님 또는 오픈소스 프로젝트) 저장소를 fork
2. 내 GitHub 에서 clone ➜ 로컬에서 작업
3. 새로운 브랜치 생성 (master은 readonly 용도로 둔다)
4. 기능 개발 후 내 브랜치에 커밋하고 push
5. GitHub 에서 팀장 저장소에 pull request 생성
6. 팀장과 팀원들이 pr을 확인 후 master 브랜치에 merge
7. merge가 완료되면 작업한 브랜치 삭제
8. 최신 master 브랜치 이력을 다시 로컬로 pull

➜ pr이 승인되면 merged, 거절되면 rejected

Java

Generic 클래스

  • 객체를 생성할 때 데이터 타입을 유연하게 저장할 수 있는 클래스
  • 타입의 수에 제한이 없다
  • 전달받은 타입의 이름은 자유롭게 지정 가능
// Pair 클래스

public class Pair<K,V> {}
  • Generic 타입 지정
// main 클래스

import test.mypac.Pair;

public class MainClass03 {
	public static void main(String[] args) {
		Pair<String, Object> p1 = null;
		Pair<Integer, String> p2 = null;		
	}
}
  • 필드, 생성자, 메소드 구현
//Pair 클래스

public class Pair<K,V> {
	// 필드
	private K key;
	private V value;
	
	// 생성자
	public Pair(K key, V value) {
		this.key = key;
		this.value = value;
	}

	// 메소드
	public K getKey() {
		return key;
	}

	public V getValue() {
		return value;
	}
}

⚠️ 기본형 타입 사용 주의

Pair<int, String> p3 = null; // error 발생

➜ 기본 데이터 타입은 사용 불가, 참조 데이터 타입을 사용

  • 객체 생성 시 Generic 생략 가능
Pair<String, Apple> p3 = new Pair<>("my", new Apple());
String a = p3.getKey();
Apple b = p3.getValue();

배열

  • 고정 크기의 공간, 크기 조절 불가
String[] names = new String[5];
names[0] = "유재석";
names[1] = "박명수";
names[2] = "정준하";

ArrayList

  • 크기 제약없이 요소 추가, 삭제 가능
  • 내부적으로 배열을 사용하지만 동적으로 크기 관리
new ArrayList<E>();
  • < > 안에는 배열에 저장할 data type 이 들어간다
ArrayList<String> freiends = new ArrayList<>();
  • 기능 수행
    Overloading : 다중 정의
// 유재석, 박명수, 정준하 를 순서대로 담아 보세요 (3줄 코딩)
friends.add("유재석");
friends.add("박명수");
friends.add("정준하");

// 2번방의 item 을 "정형돈" 으로 수정
friends.set(2, "정형돈");
		
// 0번 방의 아이템을 불러와서 item 이라는 변수에 담기
String item = friends.get(0);
		
// 1번 방의 아이템을 삭제
friends.remove(1);
		
// 저장된 아이템의 갯수(size) 를 size 라는 지역 변수에 담기
int size = friends.size();
		
// 0번 방에 "노홍철" 을 끼워넣기
friends.add(0, "노홍철");
		
// 저장된 모든 아이템 전체 삭제
friends.clear();

for문

  • 향상된 for문
//main 클래스

public class MainClass02 {
	public static void main(String[] args) {
		ArrayList<Integer> nums = new ArrayList<>();
		
		nums.add(10);
		nums.add(20);
		nums.add(30);

		for (int num : nums) {
			System.out.println(num);
		}
	}
}
  • 출력 결과
10
20
30

✏️ 문자열 입력 예제

1. 위에서 생성한 `Scanner` 객체로 반복문 돌면서 문자열 5번 입력받기
2. 입력할 때마다` ArraayList<String>` 객체에 `add()`
3. 다 입력받으면 다시 한 번 반복문 돌면서 `ArrayList<String>` 객체에 저장
4. 저장된 문자열 5개를 순서대로 콘솔창에 출력하는 프로그래밍을 해 보세요
// main 클래스

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

public class MainClass03 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		ArrayList<String> list = new ArrayList<>();
		
		for(int i=0; i<5; i++) {
			System.out.print("문자열 입력 : ");
			String line = scan.nextLine();
			
			list.add(line);
		}

		System.out.println("----------출력 결과----------");
		for (String item : list) {
			System.out.println(item);
		}	
	}
}

forEach

  • 메소드 하나짜리 인터페이스는 함수 모양으로 사용 가능
  • Consumer 인터페이스 활용
//main 클래스

import java.util.ArrayList;
import java.util.function.Consumer;

public class MainClass04 {
	public static void main(String[] args) {
		ArrayList<String> greets = new ArrayList<>();
		
		greets.add("hello");
		greets.add("bye");
		greets.add("good night");
		
		Consumer<String> con1 = new Consumer<String>() {
			@Override
			public void accept(String t) {
				System.out.println(t);	
			}
		};
		greets.forEach(con1);
		
		System.out.println("--------------");
		
		Consumer<String> con2 = (t)->{
			// t 는 String type
			System.out.println(t);
		};
		greets.forEach(con2);

		greets.forEach(t -> System.out.println(t))'		
		System.out.println("--------------");
		
		greets.forEach(new Consumer<String>() {
			@Override
			public void accept(String t) {
				System.out.println(t);	
			}
		});
	}
}

for문 & forEach()

public class MemberDto {
	// 필드
	private int num;
	private String name;
	private String addr;
	
	// No Args Constructor
	public MemberDto() { }
	
	// All Args Constructor
	public MemberDto(int num, String name, String addr) {
		super();
		this.num = num;
		this.name = name;
		this.addr = addr;
	}
	// setter, getter 메소드
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

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

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}
}
  • ArrayList에 객체 담기
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

import test.mypac.MemberDto;

public class MainClass05 {
	public static void main(String[] args) {
		List<MemberDto> list = new ArrayList<>();

		MemberDto dto = new MemberDto();
        
		dto.setNum(1);
		dto.setName("유재석");
		dto.setAddr("압구정");
		
		MemberDto dto2 = new MemberDto(2, "박명수", "이태원");
		MemberDto dto3 = new MemberDto(3, "정준하", "서래마을");
		
		list.add(dto);
		list.add(dto2);
		list.add(dto3);
		
        // 향상된 for문
		for(MemberDto tmp : list) {
			String info = String.format("번호:%d 이름:%s 주소:%s", tmp.getNum(), tmp.getName(), tmp.getAddr());
			System.out.println(info);
		}
		
		// forEach()
		list.forEach(t->{
			String info = String.format("번호:%d 이름:%s 주소:%s", t.getNum(), t.getName(), t.getAddr());
			System.out.println(info);
			
		});
	}
}

함수형 Interface

@FunctionalInterface
public interface MyFunction {
	public void execute(); // 추상 메소드
	// default 메소드
	public default void log() {
		System.out.println("실행 로그 출력");
	}
	// static 메소드
	public static void help() {
		System.out.println("도움말");
	}
}
  • 람다식 활용
import test.mypac.MyFunction;

public class MainClass06 {
	public static void main(String[] args) {
		MyFunction f1 = ()->{
			System.out.println("실행합니다");
		};
		// 구현 메소드 호출
		f1.exxcute();
		// default 메소드 호출
		f1.log();
		// static 메소드 호출
		MyFunction.help();
	}

List.of

  • 읽기 전용 List
List<String> names = List.of("kim", "lee", "park");
  • 기존 방식
List<String> names = new ArrayLis<>();
names.add("kim");
names.add("lee");
names.add("park");
  • 수정 삭제 변경 시 ➜ error 발생
names.add("choi");
		names.remove(0);
		names.set(0, "유재석");

HashMap

HashMap<key type, value type>
  • key type : 일반적으로 String type 을 가장 많이 사용
  • value type : 담고 싶은 데이터의 type을 고려해 지정
                    Object로 지정하면 어떤 data type 이던지 담을 수 있다

  • 순서가 없는 데이터를 다룰 때 사용
// main 클래스

import java.util.HashMap;

public class MainClass08 {
	public static void main(String[] args) {
		HashMap<String, Object> map = new HashMap<>();

		map.put("num", 1);
		map.put("name", "유재석");
		map.put("isMan", true);
	}
}
  • 기능 구현
// 동일한 key 값으로 다시 담으면 수정
		map.put("name", "박명수");
		// 특정 key 값으로 담긴 내용 삭제
		map.remove("inMan");
		// 모두 삭제
		map.clear();
  • Map 인터페이스 type으로 구현 가능
Map<String, Object> map = new HashMap<>();
  • of( ) 메소드로 객체 생성 가능
Map<String, Object> map2 = Map.of(
	"num", 2 , 
	"name","정준하", 
	"isMan", false
);
profile
학원 공부 내용 정리

0개의 댓글