19일차 내용 정리

채공부·2025년 6월 19일

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 요소가 그대로 유지

⚠️ 문제 상황 발생‼️
커밋을 안 한 상태에서 브랜치 이동하면 변경 사항이 같이 넘어간다.
브랜치끼리 작업 내용이 섞여 의도치 않은 커밋이 발생 가능
브랜치 독립성 보장이 불가능하고 협업할 경우 혼란을 유발

🔴 해결방법

  1. 임시 커밋 후 브랜치 전환
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~
  1. 임시저장
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

Class

생성

파일명 : 클래스명.java ➝ 파일명은 클래스명과 동일하게 작성

public class 클래스명{

}

접근지정자

  • class 선언 시 접근 지정자에 따라 import 가능 여부에 영향을 준다
  • 필드와 메소드의 접근 지정자는 참조, 호출 가능 여부에 영향을 준다
지정자의미사용 가능 범위
public공용모든 곳
protected일부 제한된 접근같은 패키지나 상속 관계
default패키지 전용같은 패키지 내부
private비공개클래스 내부

역할

  1. 데이터 type 역할
Car c1 = null;
  • Car는 참조형 data type으로 동작
  1. 객체의 설계도 역할
  • 객체 : 기능을 수행하는 물건
    Field + Method 로 구성
    ➝ 객체를 사용하려면 반드시 new 로 생성
    ➝ 단 일부는 이미 생성된 객체를 가져다 쓰는 경우가 존재
public class 클래스명{
	public 데이터 type 필드명;
    public 데이터 type2 필드명2;
    public 리턴_type 메소드명(){
    	// 기능 수행 코드
    }
}

🟡 객체 생성 방법

  • 객체를 생성할 때마다 heap 영역에 독립된 저장소 생성
  • 생성된 객체는 heap 영역에 저장, 변수는 stack 영역에 참조값(주소)만 저장
클래스명 변수명 = new 클래스명();
  1. static 필드와 메소드를 포함하는 역할
public static void main(String[] args) {
						  타입  매개변수명
}

🟡 만일 static 이라면❓

  • static 키워드가 붙은 필드, 메서드는 클래스에 소속
  • 프로그램 시작 시 static 영역에 올라간다
  • 객체를 여러 개 생성해도 딱 하나만 존재
  • 모든 객체가 공유해서 사용
    ➝ static 멤버는 객체마다 따로 생성되지 않는다

🟡 만일 non-static 이라면❓

  • 객체를 생성할 때마다 각각의 heap 영역에 따로 생성
    객체마다 개별적으로 값이 다를 수 있다

🟡 메모리 구조

영역설명
stack지역 변수나 매개변수가 저장되는 영역
heap객체가 저장되는 영역
static클래스 로딩 시 메모리에 올라가는 영역

실습 예제

구조

  • test.main 패키지에 MainClass05 클래스 생성
    test.util package 생성 후 그 안에 MyUtil class 생성

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.
	}
}

🟡 변수명과 클래스명 접근 차이

  1. 변수명
  • 객체를 참조하는 참조값
  • 객체 내부의 필드나 메소드에 접근할 때 사용
MyUtil u1 = new MyUtil();
u1.owner = "김구라";
  1. 클래스명
  • 클래스 자체에 접근
  • 객체를 생성하지 않아도 직접 접근 가능
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() 이해하기

  1. Syetem
  • 자바에서 미리 만들어준 클래스명
public class System {
    public static PrintStream out;
}

➝ 해당 클래스 안에 out 이라는 static field가 존재

  1. System.out
  • System 이라는 클래스 안에 out 이라는 PrintStream type의 static 변수
    ⤷ static 변수란?
      객체를 생성하지 않아도 클래스 이름으로 바로 사용할 수 있는 변수
  1. System.out.println()
  • out이 참조되어 있는 PrintStream 객체의 println() 메소드 호출

코드 실습

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가 실행되는 이유는?

  • MemberInfo 객체 안에 정의된 printData() 메소드를 호출했기 때문에

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 영역에 올라가는 객체는 총 몇 개?

  • 객체는 new 할 때 생성
    ∴ Post 객체는 하나만 생성되고, 변수는 총 3개 생성함 (p1, p2, p3)
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.format()

  • 서식 문자열을 기반으로 값들을 채워 문자열 생성 가능

🟡 자주 사용하는 서식 코드

  • %d : 정수(int)
  • %s : 문자열(String)
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();
	}
}
profile
학원 공부 내용 정리

0개의 댓글