Git
복습 시작
🔴폴더 & 파일 생성
test09 폴더 생성 후 그 안에 index.html 파일 생성
Terminal 실행하여 `cd test09`로 이동
git init
git add .
git commit -m "index.html added"
🔴브랜치 작업
git branch lab1 : lab1 브랜치 생성
git branch : 브랜치 목록 확인
🔴 작업 추가 후 상태 확인
h1 요소 추가 후
git status
🔴 스테이징 영역에 올린 걸 취소하고 싶다면?
= git add . 한 거 취소하고 싶다면?
git restore --staged index.html : 해당 파일만 스테이징 취소
git restore --staged . : 전체 스테이징 취소
🔴 커밋 편집기 사용
git add .
git commit : 편집기 시작
i: insert mode
esc : 편집 종료
:wq : 저장하고 종료
🔴로그 확인
git log --all
🔴 브랜치 간의 이동
git checkout lab1 : lab1 브랜치로 이동 ➝ h 요소 사라짐
git checkout master : master 브랜치로 이동 ➝ h 요소 다시 생김
➝ 브랜치를 바꾸면 HEAD가 가리키는 커밋 기준으로 워킹트리가 바뀐다
🔴 병합
git checkout lab1
git log --all : 로그 확인
git merge master : lab1에서 master 브랜치를 merge
⤷ fast-forward 방식으로 merge
🔴 브랜치 이동 전 수정 작업
git branch : lab1에서 작업중 인걸 확인
<style>로 h1의 color:red 추가
<add와 commit을 안 한 상태로>
git switch master : 변경사항을 그대로 유지 ➝ style 요소가 master에서도 보인다
<다시 돌아가서>
git switch lab1 : 수정 중인 style 요소가 그대로 유지
⚠️ 문제 상황 발생‼️
커밋을 안 한 상태에서 브랜치 이동하면 변경 사항이 같이 넘어간다.
브랜치끼리 작업 내용이 섞여 의도치 않은 커밋이 발생 가능
브랜치 독립성 보장이 불가능하고 협업할 경우 혼란을 유발
🔴 해결방법
git branch : 현재 브랜치는 lab1 상태인 걸 확인
git add .
git commit -m "임시 commit"
git switch master
master에서 p 요소 추가 작업
git add .
git commit -m"p1 added"
git switch lab1
git log : 로그 확인
git reset --mixed HEAD~ : 마지막 커밋만 취소, 워킹 디렉토리는 그대로 유지
브랜치를 전환하거나 pull 등 외부 작업 전 워킹트리를 클린한 상태로 유지하는 것이 좋다
커밋 안 한 변경사항이 있는 상태라면 브랜치 이동은 예기치 못한 결과를 보여준다
같은 작업 반복
git add .
git commit -m "임시저장"
git switch master
p2추가
git add .
git commit -m "p2 added"
git switch lab1
git reset --mixed HEAD~
git stash
git switch master
master에서 급한 작업 후
git add .
git commit -m "xxx"
git switch lab1
git stash pop
수정사항 확인
git status : 수정사항 확인
git stash : 변경사항 임시 저장 ➝ 워킹트리가 클린
⤷ 워킹 디렉토리 뿐만 아니라 스테이징 영역에 있는 내용도 함께 저장
⤷ 브랜치를 전환하거나 pull 하기 전에 안전하게 변경사항 보관 가능
stash 복원하기
git stash pop : 저장된 변경사항 복원 & stash에서 제거
stash 목록 확인
git stash list
git branch : 현재 브랜치는 lab1 상태인 걸 확인
git stash : style 요소 등 임시 저장
git switch master : 워킹트리가 클린하기에 브랜치 이동 안전
master에서 p 요소 추가 작업
git add .
git commit -m "p3 added"
git switch lab1
git stash pop : style 요소 복원
Eclipes
파일명 : 클래스명.java ➝ 파일명은 클래스명과 동일하게 작성
public class 클래스명{
}
| 지정자 | 의미 | 사용 가능 범위 |
|---|---|---|
| public | 공용 | 모든 곳 |
| protected | 일부 제한된 접근 | 같은 패키지나 상속 관계 |
| default | 패키지 전용 | 같은 패키지 내부 |
| private | 비공개 | 클래스 내부 |
Car c1 = null;
Field + Method 로 구성new 로 생성public class 클래스명{
public 데이터 type 필드명;
public 데이터 type2 필드명2;
public 리턴_type 메소드명(){
// 기능 수행 코드
}
}
🟡 객체 생성 방법
클래스명 변수명 = new 클래스명();
public static void main(String[] args) {
타입 매개변수명
}
🟡 만일 static 이라면❓
🟡 만일 non-static 이라면❓
🟡 메모리 구조
| 영역 | 설명 |
|---|---|
| stack | 지역 변수나 매개변수가 저장되는 영역 |
| heap | 객체가 저장되는 영역 |
| static | 클래스 로딩 시 메모리에 올라가는 영역 |
실습 예제
구조
MyUtil.java
package test.util;
public class MyUtil {
// non static 필드
public String owner;
// data type 앞에 static 예약어를 붙여서 static 필드를 만들 수 있다.
// 필드는 선언 시에 초기값을 넣어줄 수도 있다.
public static String version = "1.0";
// method 의 return type 앞에 static 예약어를 붙여서 static 메소드를 만들 수 있다.
public static void send() {
System.out.println("전송합니다.");
}
}
MainClass05.java
package test.main;
import test.util.MyUtil;
public class MainClass05 {
public static void main(String[] args) {
MyUtil.
}
}
🟡 변수명과 클래스명 접근 차이
MyUtil u1 = new MyUtil();
u1.owner = "김구라";
String a = MyUtil.version;
MyUtil.send();

package test.main;
import test.util.MyUtil;
public class MainClass05 {
public static void main(String[] args) {
// static 필드 참조
String a = MyUtil.version;
// static 메소드 호출
MyUtil.send();
MyUtil u1 = new MyUtil();
u1.owner = "김구라";
MyUtil u2 = new MyUtil();
u2.owner = "해골";
}
}
🔍 System.out.println() 이해하기

public class System {
public static PrintStream out;
}
➝ 해당 클래스 안에 out 이라는 static field가 존재
MemberInfo.java
package test.mypac;
public class MemberInfo {
// 회원의 번호를 저장할 필드
public int num;
// 회원의 이름을 저장할 필드
public String name;
// 회원의 주소를 저장할 필드
public String addr;
// 필드에 저장된 정보를 콘솔창에 이쁘게 출력해주는 메소드
public void printData() {
String data = "번호:"+this.num+" 이름:"+this.name+" 주소:"+this.addr;
System.out.println(data);
}
}
MainClass09.java
package test.main;
import test.mypac.MemberInfo;
public class MainClass09 {
public static void main(String[] args) {
/*
* 1. 한 명의 회원정보를 MemberInfo 객체에 담아 보세요
* ( 번호, 이름, 주소 는 본인 마음대로 설정)
*
* */
MemberInfo mem = new MemberInfo();
mem.num = 7;
mem.name = "박명수";
mem.addr = "이태원";
// 2. 위에서 생성한 객체(MemberInfo) 의 prinData() 메소드를 호출해 보세요.
mem.printData();
}
}
➝ 객체 내부의 this 는 자기자신의 참조값을 가리킨다
💡 객체를 생성하는 목적?
📌 mem.prinData가 실행되는 이유는?
MainClass10.java
package test.main;
import test.mypac.MemberInfo;
public class MainClass10 {
public static void main(String[] args) {
/*
* 1. MemberInfo 객체를 3개 생성해서 m1, m2, m3 라는 변수에 각각 담아 보세요.
*
* 2. m1, m2, m3 에 들어있는 참조값을 이용해서 3명의 회원정보를 각각의 객체에 담아 보세요.
*
* 3. 각각의 객체가 가지고 있는 printData() 메소드를 호출해 보세요.
* */
MemberInfo m1 = new MemberInfo();
MemberInfo m2 = new MemberInfo();
MemberInfo m3 = new MemberInfo();
m1.num = 1;
m1.name = "유재석";
m1.addr = "압구정";
m2.num = 2;
m2.name = "박명수";
m2.addr = "이태원";
m3.num = 3;
m3.name = "정준하";
m3.addr = "서래마을";
m1.printData();
m2.printData();
m3.printData();
}
}
⚠️ heap 영역에 올라가는 객체는 총 몇 개?
package test.main;
import test.mypac.Post;
public class MainClass11 {
public static void main(String[] args) {
Post p1 = null;
Post p2 = new Post();
Post p3 = p2;
System.out.println(p3.content);
// p1에는 null 이 들어 있기 때문에 (비어있기 때문에)
// NullPointerException error 발생
System.out.println(p1.content);
}
}
➝ Post는 p1이라는 사물함 공간에 뭐가 있는지 알려준다 = 어떤 물건을 담을 수 있을지만 알려주는 상황

🟡 자주 사용하는 서식 코드
String data = String.format("번호:%d 내용:%s 작성자:%s ", this.id, this.content, this.author);
System.out.println(data);

Post.java
package test.mypac;
public class Post {
// 글 번호를 저장할 필드
public int id;
// 글 내용을 저장할 필드
public String content;
// 글 작성자를 저장할 필드
public String author;
// 객체가 필드에 있는 정보를 이쁘게 출력해주는 메소드
public void printData() {
/*
* 숫자(정수)는 %d
* 문자는 %s
* % % % 의 순서대로 들어간다.
* */
String data = String.format("번호:%d 내용:%s 작성자:%s ", this.id, this.content, this.author);
System.out.println(data);
}
}
MainClass12.java
package test.main;
import test.mypac.Post;
public class MainClass12 {
public static void main(String[] args) {
Post p1 = new Post();
p1.id = 1;
p1.content = "hello";
p1.author = "kim";
p1.printData();
}
}