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 : 원격 저장소 전체를 복제 ➜ 로컬 저장소 생성origin 이라는 이름으로 자동 원격 저장소가 등록🔴 원격 저장소 추가
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 원격 저장소>
🔺 흐름
🔴 원본 저장소를 따로 연결하고 싶다면?
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
// Pair 클래스
public class Pair<K,V> {}
// 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 발생
➜ 기본 데이터 타입은 사용 불가, 참조 데이터 타입을 사용
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] = "정준하";
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();
//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);
}
}
}
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);
}
});
}
}
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;
}
}
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);
});
}
}
@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<String> names = List.of("kim", "lee", "park");
List<String> names = new ArrayLis<>();
names.add("kim");
names.add("lee");
names.add("park");
names.add("choi");
names.remove(0);
names.set(0, "유재석");
HashMap<key type, value type>
key type : 일반적으로 String type 을 가장 많이 사용value type : 담고 싶은 데이터의 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<String, Object> map = new HashMap<>();
Map<String, Object> map2 = Map.of(
"num", 2 ,
"name","정준하",
"isMan", false
);