이클립스로 git을 실행해서 git hub에 작업 파일을 올릴 때까지는 괜찮았는데, 같은 컴퓨터에서 다른 버전으로 이클립스를 실행하고 git hub의 내용을 repository로 만들었더니 원래 있던 로컬 파일에서 origin/master 브랜치가 사라졌어. 원래 있던 로컬 파일에서 origin/master 브랜치가 다시 보이게 하려면 어떻게 해야해?

 

 

 

이클립스에서 다른 버전의 Git을 실행하고 GitHub에서 새로운 레포지토리를 클론한 후, 원래 있던 로컬 파일에서 origin/master 브랜치가 사라졌다면, 이는 Git 저장소와 원격 저장소 간의 연결 문제일 가능성이 큽니다. origin/master 브랜치를 다시 보이게 하기 위해 몇 가지 방법을 시도할 수 있습니다.

1. git fetch 명령어로 원격 브랜치 업데이트

먼저 GitHub에 있는 원격 브랜치 목록을 로컬로 가져와야 합니다. 이를 위해 git fetch 명령어를 사용합니다.

  1. 이클립스에서 Git Repositories 뷰 열기
    • Window > Show View > Other > Git > Git Repositories를 선택해 Git Repositories 뷰를 엽니다.
  2. 원격 저장소로부터 정보를 가져오기
    • 해당 로컬 저장소에서 우클릭 후 Fetch from Upstream을 선택하여 원격 저장소의 최신 정보를 가져옵니다.
    • 또는, 터미널에서 해당 레포지토리 폴더로 이동 후, 아래 명령어를 실행하여 원격 브랜치를 업데이트할 수 있습니다.
    git fetch origin
    
  3. 브랜치 확인
    • git branch -r 명령어로 원격 브랜치 목록을 확인해 보세요. 원격 origin/master가 보이면, 다시 체크아웃할 수 있습니다.
    git branch -r
    

2. 원격 브랜치로 체크아웃

origin/master가 원격 저장소에 여전히 존재한다면, 이를 로컬에서 다시 체크아웃할 수 있습니다.

  1. 로컬 브랜치 생성
    • git checkout -b master origin/master 명령어로 원격 저장소의 master 브랜치를 로컬에 다시 가져올 수 있습니다.
    git checkout -b master origin/master
    
    이 명령은 origin/master에서 새로운 master 브랜치를 로컬에서 생성합니다.
  2. 브랜치 확인
    • 다시 git branch 명령어로 로컬 브랜치를 확인해 보세요. 이제 master 브랜치가 로컬에 있을 것입니다.

3. 이클립스에서 새 브랜치로 전환하기

이클립스에서는 Git Repositories 뷰에서 origin/master 브랜치를 찾아 Checkout을 선택하면 로컬에 새 브랜치가 생성됩니다. 그 후, master 브랜치로 작업을 계속할 수 있습니다.

4. git pull로 최신 상태 반영

만약 origin/master 브랜치에서 변경 사항이 있다면, 로컬에 해당 내용을 반영하려면 git pull을 실행할 수 있습니다.

git pull origin master

이 명령어는 origin/master 브랜치의 최신 커밋을 로컬 브랜치에 병합합니다.


위의 방법을 통해 원격 저장소와 로컬 저장소를 동기화하고, origin/master 브랜치를 다시 사용할 수 있을 것입니다.

9:15경 학원 도착.

어제 밤에는 9시반인가부터 졸립기 시작해서 꿈 엄청 꾸면서 자다가 새벽 2시에 깼다가 다시 꿈 엄청 꾸면서 자다가 6시 반쯤 일어남. 피곤했었나봐 공명이 코고는 것도 안시끄러워하면서 잤으니까.

 

학원에 오면 같이 듣는 수강생(프리스쿨 멤버) 3명이 너무 귀여워서 힐링된다.

귀여운거, 귀여운 사람들 최고.

 

 

 

 

<9:30 1교시>

git 환경을 여는 방법 두 가지

1. 자바 작업 환경에서 우클릭 > Team에 있는 내용들

2. 자바 작업 환경 창의 우측 상단에 GIT 작업환경으로 변경

 

내가 작업하고 푸쉬했는데 푸쉬가 안 되는 경우가 있다. 그건 다른 사람이 작업하고 올린 내용이 있어서 그런데, 

그래서 내가 작업한거 푸쉬를 하려면 일단 깃허브에 있는걸 pull(fetch 해서 merge) 해놓고 내거랑 충돌한거 해결해서 다시 푸쉬하면 됨.

 

내거 로컬 이클립스 git 환경에 origin/master 브랜치가 삭제되어 있더라?! 그래서 지금 챗지피티한테 물어보느라 수업 내용 못따라가고 있어서 일단 물어봐놓고 여기다 텍스트만으로라도 메모해놓고 따라가야지

 

정신차려!

 

빈 폴더는 커밋의 대상이 아니기 때문에 아직 아무것도 작성되지 않은 로컬의 Step10의 test.main 패키지는 커밋되지 않아서 집 환경 Step 10에 반영되지 않았다.

 

 

 

study 브랜치에서 작업하기

 

인터페이스

클래스는 상속받는데, 인터페이스는 구현된다(implements)

상속은 단일 상속이지만, 인터페이스는 여러개를 구현할 수 있다.

추상메소드의 사용과 비슷하다.

package test.main;

import test.mypac.MyRemocon;
import test.mypac.Remocon;

//zmff
public class MainClass01 {
	public static void main(String[] args) {
		/*
		 * 리모콘 인터페이스는 데이터타입의 역할을 할 수 있는데
		 * 해당 타입의 참조값을 얻어내기 위해서는 
		 * 인터페이스를 구현한 클래스로 객체 생성을 하면 된다. 
		 */
		// 이 식은 성립하지 않는다. Remocon r1 = new Remocon();
		Remocon r1 = new MyRemocon();
		r1.up();
		r1.down();
        
        
        
        //리모콘 인터페이스에 정의된 static final 상수 참조
		String result=Remocon.COMPANY;// LG
		
		
		//Remocon.COMPANY = "SAMSUNG"; //final은 상수이기 때문에 수정 불가
	}
}

 

방금 작업한 내용이 study 브랜치에 추가되었는데, add도 commit도 하지 않은 상태에서 다른 브랜치로 이동(체크아웃, 스위치)하면 워킹트리가 지저분한 상태에서 이동하는거라 문제 발생할 가능성이 생김.

꼭 다른 브랜치로 이동하기 전에는 일단 커밋 저장해서 워킹 트리 클린하게 하고 브랜치 이동하기.

근데 내가 막 갑자기 이 시점에 갑자기 커밋하기는 애매한데 다른 브랜치로 이동해야하는 상황이라면, 커밋을 하지 않고도 변경사항을 없애면서 임시저장하는 git의 stash기능이 있다!!!!

 

일단 방금 작업하던거 커밋하기, 인데 나는 지금 꼬여서 여기 블로그에다 텍스트로 그냥 써야지ㅠㅠ

Step 10에 MainClass01 추가 ,라는 제목으로 커밋하고 마스터로 체크아웃하기 -> 그럼 방금 study 브랜치에서 작업하던게 사라짐.

git 환경에서 head가 master에 있는 상태에서 study로 merge 하면 fast-forward 병합됨.

git 환경에 origin/master 위에  master 브랜치가 올라가 있는 상태임. 여기서 master 브랜치 푸쉬하면 origin/master와 병합됨.

push 하면 git hub에 올라가 있음

이걸 집 환경에서 받으려면 마우스 우클릭으로 pull 하면 됨

 

 

<10:30 2교시>

2교시 시작 전에 내꺼 문제 생긴거 해결해보려고 했는데, 뭔가 이상한 상황이라 상황을 해결하기 위한 방법을 고민하다가 결국 지우고 다시 시작하라는 방법을 제시해주셨는데... 음.. 혼자해볼려니까 잘 모르겠다.

 

 

결국 선생님 파일 복사해서... 다시 하는 ... ㅎ... 

아 메모 했던거 다 백업 제대로 했겠지 나...

 

하하... ㅠㅠㅠㅠ

package test.main;

import test.mypac.MyRemocon;
import test.mypac.Remocon;

public class MainClass02 {
	public static void main(String[] args) {
		//다형성 확인
		MyRemocon r1=new MyRemocon();
		Remocon r2=r1;
		Object r3=r1;
		
		useRemocon(r1);
		useRemocon(r2);
		//useRemocon(r3); 이건 에러남 부모는 자식을 받아주지만 자식은 부모를 잘 받아주지 않음
		useRemocon((Remocon)r3);
	}
	public static void useRemocon(Remocon r) {
		r.up();
		r.down();
	}
}

 

 

<11:30 3교시>

메소드는 반드시 객체 안에 존재해야 한다.

메소드는 자바스크립트의 함수가 데이터 타입인 것과 달리, 자바에서는 객체에 담겨 동작을 전달하여 메소드 안에서 해당 동작을 사용할 수 있다.

 

지역 변수를 굳이 만들지 않고 직접 리모콘 타입을 만들어서 동작을 전달할 수도 있다.

package test.main;

import test.mypac.Remocon;

public class MainClass03 {
	public static void main(String[] args) {
		//인터페이스도 익명 클래스를 활용해서 구현 후 참조값을 얻어낼 수 있다
		Remocon r1= new Remocon() {
			
			@Override
			
			public void up() {
				System.out.println("채널 올려");
			}
			
			@Override
			public void down() {
				System.out.println("채널 내려");
				
			}//리모콘 타입 객체는 동작을 2개 가지고 있다.
			//2개의 동작을 객체에 담아서 전달하고,메소드 안에서는 해당 동작을 사용한다
		}; 
        //Remocon만 입력하고 Ctrl Space하면 알아서 생성해줌
		//메소드를 호출하면서 지역변수에 담긴 리모콘 타입의 참조값을 전달
        useRemocon(r1);
        //메소드를 호출하면서 즉석에서 리모콘 타입 참조값을 얻어내서 전달
		useRemocon(new Remocon() {
			
			@Override
			public void up() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void down() {
				// TODO Auto-generated method stub
				
			}
		});
	}

	public static void useRemocon(Remocon r1) {
		r.up();
        r.down();
	}//리모콘 인터페이스도 이미 만들어져 있고, 그 type을 사용하는 메소드도 이미 만들어져 있는 상황
}

 

우리 개발자는 이미 만들어진 인터페이스(설계도, 표준)와 메소드를 사용해서

리모콘 인터페이스를 구현한 클래스를 만들고

메소드를 재정의해서

우리가 하고 싶은 동작을 메소드 안에 코딩한다.

비유하자면 표준(인터페이스)을 통해 설계도 바탕의 물품을 만들고 납품하는 거라고 함.

우리가 만든 서버는 어느정도 차체는 완성되어 있고, 우리는 헤드라이트 같은 부품만 몇 개 만들어서 끝내면 된다고 함...(이럴거면 왜 배우고 있는거지....?는 222222차 현타왔는데 배우는 의미가 있나)

 

 

자바가 자바스크립트를 부러워해서 이상한 문법들을 만들어낸대 ㅋㅋ

더보기
package test.main;

import test.mypac.Drill;

public class MainClass04 {
	public static void main(String[] args) {
		Drill d1 = new Drill() {
			
			@Override
			public void hole() {
				System.err.println("책상에 구멍뚫기");
			}
		};//객체에 동작이 하나 포장되어 있다.
		useDrill(d1);
		
		Drill d2= ()->{
			System.out.println("의자에 구멍뚫기");
			
		};//자바스크립트에서 화살표 함수랑 비슷하게 생겼는데 -를 = 대신 쓴 드릴 타입의 메소드, 단 메소드에 동작이 1개여야 한다
		useDrill(d2);
		useDrill(()->{
			System.out.println("지면 뚫기");
		});//즉석에서 드릴 타입 객체 만드는 방법, 모양은 메소드지만 드릴 타입의 객체임(단, 인터페이스의 메소드가 오직 1개일때만)
	}
	
	public static void useDrill(Drill d) {//그 동작이 포함된 객체를 메소드를 호출하면서 전달한다
		d.hole();
		d.hole();//메소드 안에서는 객체에 포장된 1개의 동작을 사용한다 //언어의 한계 -> 이걸 해결하려고 만들어진 이상한 문법 ()->{};
	}
}

 

 

 

 

<12:30 4교시>

인터페이스를 객체로 생성하기 :인터페이스 이름만 만들고 Ctrl + Space

 

package test.main;

import test.mypac.Calc;

public class MainClass05 {
	public static void main(String[] args) {
		Calc c1 =new Calc() {
			
			@Override
			public double execute(double num1, double num2) {
				// TODO Auto-generated method stub
				return 0;//더블 타입을 리턴해주기로 했는데 안 해주면 오류남
			}
		};
		//Calc c2 = ()->{};이렇게 쓰면 오류나는게 매개변수랑 리턴값이 없어서 오류남
		Calc c2 = (double a, double b)->{
			return 0;
		};
		//매개변수의 타입은 생략 가능하다
		Calc c3= (a, b)->{
			//return 예약어 이전에 coding 된 내용이 없음
			return 0;
		};
		//return 예약어 이전에 coding 된 내용이 없으면 {}생략 가능
		Calc c4=(a, b)->0;// 리턴할 값만 명시하면 되기 때문에 return 예약어도 사용하지 않음
		
		//매개변수에 전달된 두 숫자를 더한 값을 리턴하는 동작
		Calc plus = (a, b)->a+b;//이런 한줄짜리 간단한 코드를 람다 함수라고 얘기함
	}
}

 

내거 USB에 백업하고... 그러고 점심 시간오지 않을까 싶다..

는 백업 엄청 빨리 끝나서 블로그 작성 마저 하러 옴..

 

 

 

 

 

 

<14:30 5교시>

추상클래스를 상속받은 클래스를 클래스의 이너클래스, 메소드의 이너클래스 로 만들어보기

 

 

 

내 삽질

더보기

 

package test.main;

import test.mypac.Weapon;

public class MainClass04 {
	public static void main(String[] args) {
		//아래의 useWeapon() 메소드를 호출하려면 Weapon type의 참조값이 필요함
		//아래의 메소드를 호출했을 때 "바다에 있는 적들을 공격"하려면 여기에서 어떻게 코딩해야 할까
	
		Weapon w1 = new useWeapon();
		MainClass04.useWeapon(w1);
		}
	public static void useWeapon(Weapon w) {
		w.prepare();
		w.attack();
	}
	public static class useWeapon extends Weapon {
		@Override
		public void attack() {
			System.out.println("바다에 있는 적 공격");
		}
	}
}

 

 

package test.main;

import test.mypac.Weapon;

public class MainClass04 {
	
	static class useWeapon extends Weapon {
		@Override
		public void attack() {
			System.out.println("바다에 있는 적 공격");
		}
	}
	public static void main(String[] args) {
		//아래의 useWeapon() 메소드를 호출하려면 Weapon type의 참조값이 필요함
		//아래의 메소드를 호출했을 때 "바다에 있는 적들을 공격"하려면 여기에서 어떻게 코딩해야 할까
	
		Weapon w1 = new useWeapon();
		MainClass04.useWeapon(w1);
		class SpaceWeapon extends Weapon{

			@Override
			public void attack() {
				System.out.println("우주에 있는 적 공격");				
			}	
		}
		
		useWeapon(new SpaceWeapon());
		}
		
	public static void useWeapon(Weapon w) {
		w.prepare();
		w.attack();
	}

}

이번 시간 너무 졸렸다. 살쪄서 그런가!! 낼부턴 좀 적게 먹을까.

 

 

<15:30 6교시>

쉬는 시간에 눈이랑 관자놀이 목이랑 턱 마사지 해서 좀 깼다. 운동을 하긴 해야겠다 정말

 

 

패스워드에 입력할 토큰 만들러 가는 길(토큰은 한 번 받으면 잊어먹으면 안된다)

프로필> Settings >Developer Settings > Personal access Tokens 들어와서 Generate new Token하면 됨.

 

 

 

 

집에서 클론 파일 내려받기 : 내려받을 폴더에서 Shift 마우스 우클릭 > Git Bash 실행

acorn@BOOK-2B7PDQ538V MINGW64 ~/Desktop/MyHome/playground
$ git clone https://github.com/CrystalJiSeon/javapractice.git
Cloning into 'javapractice'...
remote: Enumerating objects: 155, done.
remote: Counting objects: 100% (155/155), done.
remote: Compressing objects: 100% (114/114), done.
remote: Total 155 (delta 16), reused 155 (delta 16), pack-reused 0 (from 0)
Receiving objects: 100% (155/155), 41.79 KiB | 6.96 MiB/s, done.
Resolving deltas: 100% (16/16), done.

acorn@BOOK-2B7PDQ538V MINGW64 ~/Desktop/MyHome/playground
$

 

 

 

집에서 한 컴퓨터에서 두개의 이클립스 실행하기 : 버전이 다른 두개를 받는다

 

학원에서 두 개의 이클립스를 돌리면서 하나는 학원에서 학습하는 환경 용도로,

다른 하나는 집 환경에서 하는 흉내를 내는 용도로 사용하고자 함.

 

 

<16:30 7교시>

Git환경에서 add existing Git folder인가 이거 눌러서 아까 Git Bash로 만들어 놓은 클론을 가져올 수도 있고,

Git Bash로 클론을 만들지 않았다면 이클립스 Git 환경에서 바로 추가해서 인식까지 할 수 있다.

마우스 우클릭 눌러서 import projects 누르면 .gitignore로 안 가져오는 바람에 기능을 못해서 자바환경에서 안 보이던 폴더들이 보인다.

 

개별 폴더를 import 할 필요 없이 일괄 import도 가능하더라.

import with existing project 어쩌구는 모르겠어서 일단 import with general 어쩌구를 선택했다.

앞으로 기능에 이상이 없기를 바라며 봤는데 일단 Github와 연동도 잘 돼 있는거 같고 큰 문제는 없어보인다.

 

 

아무튼 이제 아까 5교시때 하던걸로 돌아옴

package test.main;

import test.mypac.Weapon;

public class MainClass05 {
	public static void main(String[] args) {
		//익명의 inner class를 이용해서 Weapon type의 참조값을 얻어내서 변수에 담은 다음
		Weapon w1 = new Weapon() {
			@Override
			public void attack() {
				System.out.println("아무 곳이나 공격");
			}
		};
		//중괄호는 Class이지만 이름은 없는 익명의 클래스가 생성된다.
		//Weapon w1=new Weapon() Weapon{}클래스를 상속 받은 익명의 Class라고 할 수 있다.
		
		//메소드 호출하면서 전달하기
		useWeapon(w1);
		//메소드 호출하면서 즉석에서 Weapon type의 참조값을 얻어서 전달하기
		useWeapon(new Weapon() {
			@Override
			public void attack() {
				// TODO Auto-generated method stub
			}
		});
		
	}
	
	public static void useWeapon(Weapon w) {
		w.prepare();
		w.attack();

	}
	
}

아 내가 아까 했던게 오류가 이제 들통났다.

히스토리 다 사라진줄알아서 망했네 했는데

???

히스토리 다 들어옴

음 뭐지 merge도 해냈음

신기하네

몇 번 더 해봐야겠네

 

근데 오류가 하나 있던데 이건 아마 버전이 달라서 그런가보네.

 

 

 

Interface 시작만 하고 끝남.

package test.mypac;
/*
 * [interface]
 * - 생성자가 없다(단독 객체 생성불가)
 * - 추상메소드 혹은 디폴트 메소드를 가질 수 있다
 * - 필드는 static final 상수만 가질 수 있다
 * - 데이터타입의 역할을 할 수 있다
 * - interface type의 참조값이 필요하면 구현(implements) 클래스를 만들어서 객체를 생성해야 한다
 * - 클래스 상속은 단일 상속이지만, 인터페이스는 다중 구현이 가능하다
 */
public interface Remocon {
/* 
 * 필드도 가질수 있지만 스태틱 파이널만 가능하다
 * static : static 영역에 리모콘 인터페이스와 같이 만들어진다
 * final: 값이 결정된 이후에 변경 불가능(상수화 시킨다)
 * 생략 가능
 */
	public static final String COMPANY="LG";// final 상수는 관례상 필드명을 모두 대문자로

	//미완성의 추상 메소드를 멤버로 가질 수 있다.
	public void up();
	public void down();
}
package test.mypac;
//인터페이스는 implements 해야 한다
public class MyRemocon implements Remocon {

	@Override
	public void up() {
		System.out.println("볼륨을 올려");
		
	}

	@Override
	public void down() {
		System.out.println("볼륨을 내려");
	
	}

}

 

<17:30 8교시>

오늘 배운거 각자 실습

나는 교재 보면서 놓친 부분 있나 확인하려고 함

2024.12.15. 19:10 무렵,
 
너무 배고파서 저녁을 먹고 오는 바람에 (근데 막 엄청 죄송하지도 후회하지도 않아 진짜 정말 너무 맛있었다) 세 번째 레슨 시간을 조금 넘겨 연습실에 도착했다. 

처음에는 늘 그렇듯 지난 레슨 시점부터 있었던 일에 대해 근황을 나누는 시간을 가졌다.

내겐 그 사람이 늘 그랬듯 나의 감정과 생각의 큰 부분들을 차지하고 있었고, 뭐 본의 아니게 썸띵도 있었고, 그래서 그 얘기도 했고, 대학원도 됐다는 얘기도 하고... 그리고 선생님 얘기도 듣고 그랬다.

그리고 내가 소개해준 친구도 레슨을 받으러 왔다는 이야기를 하면서 그 친구는 수업 때 영상을 찍어 감정 연기를 했다며 그걸 나도 해보자고 하셨다.

시작이 발성 연습이었는지 책읽기였는지 기억이 헷갈려서.. 일단 기억 나는대로 작성해보기로 한다..

처음은, 기억이 맞다면 오랜만의 발성 연습이었는데, 첫시간에 했던 것들이나 알려주셨던 것들이 다 기억나지는 않아서 대답을 잘 못했었다. 나는 과거 어느 시점부터 목소리에 컴플렉스가 있어서 주목받는 상황에서 소리를 낼때 목에 힘이 바짝 들어가는데, 그렇게 하면 목이 아플 것이다라는 말씀과 단전에 힘을 주는 느낌으로 소리를 길게 던진다고 생각하라는 지도에 약간은 내가 노래방에서 고음으로 악을 지를때의 발성을 되새기며 소리를 냈더니 아주 좋다고 하시면서 노래한다 생각하며 발성을 해보라고 지도해주셨다. 약간 어이없고 웃겼는데 재밌었다.


다음은 지난 번에도 했던 강연하듯 책읽기였다. 이번에도 어쩔 수 없이 유니티 책을 읽어야 했다. 지난번의 기억을 떠올리며, 나는 선생님께 설명하듯 게임을 기획하는 단계를 읽었다. 저번보다 편하게 느껴졌던 것은, 아 그냥 자연스럽게 내용을 전달하면 되는 구나, 라고 느꼈었던 부분을 기억하며 더욱 더 내 마음대로 책의 내용을 전하되 어미나 문장은 편하게 마음 가는대로 읽어서 가능했던 것 같다.
그렇게 나는 선생님께 게임 기획을 설명해드리다가, 선생님이 내게 일어나서 한 40명 쯤 사람들이 앉아서 듣고 있는 상황을 상상해보며 진행하라고 지도하셔서 그걸 했다.
내가 지난 시간보다는, 실제로는 아무도 없는 상황에서 누군가 있는 것처럼 시선 처리를 한 다는 느낌은 들었는데, 선생님 피드백에 의하면 강연장을 왔다갔다 걷는 폼이 더 편해보인다는 평도 있었다. 어쨋든 또 왕창 칭찬을 들었다, 히히.
 

다음으로 했던 것은 대본 읽기였다. 두 가지 대본을 읽었는데 첫 번째 대본은 "하 개빡치네"라는 생각이 떠오르는 상황의 감정선을 가진 장면이었고, 대본은 다음과 같다.
 
 


 
처음 읽을 때는 혀가 막 꼬였다. 특히 '제발 듣고 싶은 말만 골라 듣지 말라고' 이부분이 혀가 막 꼬불텅거리면서 꼬였는데, 이 부분에서 선생님이 내 마음대로 끊어읽어도 된다고 말하셨을 때 나는 자유로워진 기분으로 내가 읽고 싶은대로, "빡쳐 있는" 상태로 보다 또박또박 읽을 수 있었고, 게다가 감정선 너무 좋다고! 칭찬도 들었다 ㅎㅎㅎ
 
다음 대본도 바로 이어서 읽었다. 이번 대본에서는 핵심 문장, 핵심 단어에 대한 개념의 복습이 있었다. 그리고 읽은 대본은 다음과 같다.
 
 


 
대본 읽기는 "헤어진 연인에게, 토로하는 듯, 또 한편으론 비난하는" 기분으로 읽는 방향으로 감정선을 잡으라는 가이드를 받은 뒤 읽었다. 처음 읽을 때도 감정선이 나쁘지 않았는데 한 번 더 해보자고 하셨을 때, 나는 내 생각을 이야기 했다.
 

마음 같아서는 앞에 선생님 안 계신다 생각하고 확 몰입한대로 막 하고 싶은데,
선생님 계신다고 생각하니까 너무 쑥스럽습니다.

 
그랬더니 선생님께선 흔쾌히
 

그래야 한다면 그래도 상관없습니다. 막 하세요. 그냥 되는대로 하세요. 그게 연기입니다.

 
라고 하셨다.
 
그래서 나는 내 멋대로 마음껏, 읽은 대본을 소리내어 내질렀다. 그리고 선생님께서는 당신이 울컥하시는 기분이었다고 할 정도로 감정선이 좋았다고 잔뜩 칭찬해주셨다.
 
나는....ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 머릿속에서 유명한 배우가 된 상상을 했던 거 같다.... ㅋㅋㅋㅋㅋㅋㅋ
김칫국 그만 마셔야 하는데!!!! 아니 그렇게 열심히 칭찬해주시면 제가!!! 예?!!....ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

휴. 진정하자. 연기는 어디까지나 취미, 는 나 재능있는거 같아,로 하자.
 
그리고 잠시 쉬는 시간 뒤에 나는 내 자신에게 보내는 영상 편지를 촬영하게 되었다. 민낯으로 영상에 찍히는건 쑥스러워서 목폴라티에 얼굴을 숨기려고 했더니 마스크를 쓰고 찍어도 좋다고 하셔서 냉큼 마스크를 올렸다.

첫번째 영상 편지는 내가 나에게 할 말로, 그 내용은 현재 내가 겪고 있는 것들에 대해 상황을 설명하고, 설명한 내용에 대해서 미래에 나아갈 방향을 제시해보거나 다짐하는 것이었다. 

나는 차근차근 생각하면서 말을 이어나갔다. 카메라를 보고 말을 해야하는데 카메라를 제대로 못 보고 하는 것이 티가 났는지, 선생님께서 중간부터 개입하셔서 일대일로 질문을 하고 눈을 마주치거나 카메라를 보는 것이 가능해졌다...ㅋㅋㅋㅋ

 

그리고 다음으로 찍은 영상의 주제는 미처 하지 못 한 말이었다. 나는 그사람, 땡땡이(ㅋㅋ)에게 미처하지 못 한 그말을 꺼냈다. 그리고 선생님은 정말 감정 표현이 너무 좋았다고 하시면서 울컥하는 감정, 아련함, 쑥스러움이 너무 있는 그대로 느껴지는 게 좋았다는 말씀과 그리고 나의 그런 사랑을 받는 그 사람이 아주 약간, 아주 잠깐 부럽게 느껴졌다는 이야기를 할정도라고 하셨다.(제가 이렇게나 투명하고 진심인 사람입니다 하하)

 

연달아 계속 받은 칭찬에 나는 그만 스타이즈본을 보면서 생각했던, '배우 해보고 싶다'라는 생각의 행복회로를 태우며 선생님께 저도 연기 해볼까요?라고 물어봤었다. 선생님께서는 나같은 경우는 본업 있으면 얼마든지 시도해봐도 좋다고 하셨는데, 아직 마음을 정한 것은 아니지만 일단 지금 듣는 취성패 잘 들어서 취뽀하고 생각하기로 했다 ㅎㅎ

 

칭찬 받으니까 엄청 기분 좋더라 ㅎㅎ

 
 

'취미의 기록 > 연기 스피치' 카테고리의 다른 글

연기 스피치 수업 - 두 번째  (1) 2024.11.19
연기 스피치 수업 - 첫 번째  (1) 2024.11.04

Markdown 언어를 사용하려면 간단한 텍스트 형식으로 문서를 작성할 수 있습니다. Markdown은 주로 HTML을 작성할 때 사용되며, 텍스트를 쉽게 포매팅할 수 있는 간단한 규칙을 제공합니다. 기본적인 문법을 아래에 설명드리겠습니다.

1. 제목 (Headings)

제목을 만들 때는 #을 사용합니다. #의 개수에 따라 제목의 수준이 달라집니다.

# 제목 1
## 제목 2
### 제목 3
#### 제목 4
##### 제목 5
###### 제목 6

2. 강조 (Bold, Italic)

  • 굵은 글씨: ** 또는 __를 사용합니다.
  • 기울임 글씨: * 또는 _을 사용합니다.
**굵은 글씨**
*기울임 글씨*

3. 목록 (Lists)

  • 순서 없는 목록은 -, *, 또는 +로 시작합니다.
  • 순서 있는 목록은 숫자 뒤에 점을 붙여서 만듭니다.

순서 없는 목록:

- 아이템 1
- 아이템 2
- 아이템 3

순서 있는 목록:

1. 첫 번째 항목
2. 두 번째 항목
3. 세 번째 항목

4. 링크 (Links)

링크는 [텍스트](URL) 형식으로 작성합니다.

[Google](https://www.google.com)

5. 이미지 (Images)

이미지는 링크와 유사하게 작성되지만, 앞에 !를 붙입니다.

![이미지 설명](이미지 URL)

6. 코드 (Code)

  • 인라인 코드: 텍스트 사이에 백틱(`)을 사용합니다.
`코드`
  • 코드 블록: 코드 블록은 세 개의 백틱(```)을 사용합니다.

코드 블록


7. 인용 (Blockquote)

인용문은 >를 사용합니다.

> 이것은 인용문입니다.

8. 수평선 (Horizontal Rule)

수평선은 ---, ***, ___ 등으로 생성할 수 있습니다.

---

위의 문법을 활용하면 Markdown을 이용해 다양한 방식으로 문서를 작성할 수 있습니다.

9:10 경 학원 도착
아침에 잘 자고 나오는거 괜찮은듯? 새벽에는 깨서 스트레칭하다 잠! 운동을 시작해보고 싶은 생각이 든다! 튼튼해진걸까.
 
<9:30 1교시>
오전에는 또 (지옥에서 온) git
 
git 명령어

cd ..  상위 폴더로 올라감
ls -al 현재 폴더의 파일들을 숨김 파일까지 모두 보여줌
cd 폴더명 하위 폴더로 내려감(폴더명 다 치기 귀찮으면 앞에 몇글자 치고 tab 누르면 됨)
git restore stage에 올린 파일들을 모두 unstaging 하는 명령어
git branch 브랜치이름 가지 만들기
git branch 만들어진 가지 보기
git switch 브랜치이름 브랜치를 이동
git checkout 브랜치이름 커서를 이동하거나 브랜치를 이동
git status 현재 git이 관리하는 폴더의 변경 상태를 확인, 변경 상태 없으면 working tree clean
git add 파일이름 파일을 stage에 올리기
git commit -m "스냅샷이름" 스냅샷 만들기
git log commit된 내용들을 볼 수 있음
git remote -v 원격 저장된 공간을 볼 수 있음

   
git hub : git에서 관리한 내용을 공유하는 온라인 저장공간
 
 
 

친구가 내가 수정처럼 크리스탈 클리어하대서 크리스탈지선이라고 함..ㅋㅋㅋ

 
 
내 첫 깃허브 저장소!!! ㅎㅎ

 
 

저장소에 올리게 될 내용은 commit한 스냅샷들을 올리는 것.
 

git remote add origin https://github.com/CrystalJiSeon/MyFirstRepo.git

 
이걸 git 입력하면 

 
 
master 브랜치의 이력을 github에 올린것.

 

 
 
<10:30 2교시>
원격 저장소에 git의 내용을 올리면 origin이라는 저장공간에 올라가고,
컴퓨터 로컬 저장소에서 작업하던 깃에는 origin/master라는 브랜치가 자동으로 생성된다.

 
원격 저장소의 commit을 내려받는 방법
fetch와 merge 
로컬 저장소에서 별도의 작업을 진행하지 않은 상태에서 원격저장소의 commit을 내려받는 다면 fast-forward 방식으로 merge된다.
하지만 로컬 저장소에서 별도의 작업을 진행한 상태라면 원격저장소의 commit을 내려 받을 때 가지가 갈라져 있을 수 있다. 갈라진 가지에 대한 merge 작업이 이루어진다.


 
git log --all을 하면 아래와 같이 commit의 로그가 나온다.

 
git log --all --graph를 하면 아래처럼 허접하지만 로그가 그림 모양으로 나온다

 
README가 잘 불러내려와졌는지 확인하기 위해 체크아웃해봄

 
 
마스터 브랜치로 옮겨가서 origin/master와 합치기
->마스터 브랜치에서도 README가 존재하게 됨

 
 
어제 배운 내용 요약 : 하나의 객체는 여러 개의 데이터 타입일 수 있다(다형성, polymorphism)
데이터 타입은 그 지역변수나 필드에 들어있는 값의 사용 설명서이다.
 
보통 부모 객체와 자식 객체는 단어가 포함된 경우가 많고, 자식 객체의 경우가 이름이 더 긴 게 대다수이다.
 
부모 객체 타입의 값을 참조해야할 때 자식 타입의 값을 전달해도 읽힌다.
 
 
 
<11:30 3교시>

 
 
추상메소드

package test.mypac;

//미완성된 추상메소드를 멤버로 가지고 있는 클래스는 abstract예약어를 붙여서 정의해야 한다.
public abstract class Weapon {
	//무기 작동을 준비하는 메소드
	public void prepare() {
		System.out.println("무기 작동 준비");
	}
	
	//공격을 하는 메소드의 모양만 정의하고 실제 구현은 하지 않기
	// 미완성된 추상메소드를 만들때는 abstract 예약어가 필요하다
	public abstract void attack();
}

 

package test.main;
/*
 * [추상클래스(Abstract Class)]
 * -class예약어 앞에 abstract를 명시해서 클래스를 정의함
 * -형태만 정의되고 실제 구현은 되지 않은 메소드가 존재할 수 있음
 * -형태만 정의된 메소드를 만들때는 abstract예약어를 붙여서 메소드를 정의함
 * -생성자는 존재하지만 단독으로 객체 생성은 불가
 * -추상클래스타입의 참조값이 필요할 땐, 추상클래스를 상속받은 자식 클래스를 정의한 다음 객체를 생성함
 * -추상클래스를 상속받은 자식클래스는 부모의 추상메소드를 모두 오버라이드(재정의)해서 사용해야 함
 */
import test.mypac.MyWeapon;
import test.mypac.Weapon;

public class MainClass01 {
	public static void main(String[] args) {

		//추상 클래스로 객체를 생성할 수 있을까?
		//Weapon w1=new Weapon(); //추상 클래스 단독으론 객체 생성 불가
		
		//단지 data type의 역할은 할 수 있을까?
		Weapon w1=null; //데이터 타입의 역할은 할 수 있다.
		//w1.prepare();// 하지만 NullPointerException 에러가 발생한다(왜냠 w1에 참조값이 없으므로)
		
		//Weapon 추상클래스를 상속받은 MyWeapon 클래스로 객체를 생성해서 Weapon type 의 참조값 얻어내기
		Weapon w2 = new MyWeapon();
		w2.prepare();
		w2.attack();
	}
}

 
 
 

package test.mypac;

public class MyWeapon extends Weapon {
	//부모 클래스의 추상메소드를 반드시(강제로) 오버라이드 해야 한다.
	@Override
	public void attack() {
		// TODO Auto-generated method stub
		
		
	//Weapon이라는 추상 클래스는 미리 만들어져 있는 클래스로 특별한 기능을 제공하는 역할을 할 뿐,
	//상속받은 자식객체가 프로젝트 상황에 맞게 구현하는 식으로 마음대로 활용할 수 있다.
	//그러면 우리가 만든 클래스로 생성된 객체가 아주 특별한 기능을 수행할 수 있다
	}
	
}
더보기
package test.main;

import test.mypac.MyWeapon;
import test.mypac.Weapon;

public class MainClass01 {
	public static void main(String[] args) {
		
		//Weapon w1=new Weapon();은 Weapon()에서 에러가 난다.
		//w1.attack();의 코드가 없어서 객체가 생성되었다 해도 사용 불가
		
		Weapon w1=new MyWeapon();
		//미완성된 추상메소드를 가진 상위 클래스의 하위 클래스를 이용해서 무기 클래스의 참조값을 얻는 방법
	
		Weapon w1=null;
		//미완성된 추상메소드이지만 데이터 타입 역할은 가능
			
		//w1.prepare();
		//w1에 값이 null인데 어떻게 호출함 = 오류남 nullpointerexception
		w1.attack();
	}
}

 
 
기존에 우리는 클래스 안에
1. 생성자
2. 필드
3. 메소드
를 작성해 왔는데
4. Inner Class
도 작성할 수 있다.

더보기
package test.mypac;
//클래스 안에 내부 클래스를 정의해보기
public class Zoo {
	
	public class Monkey{
		public void monk() {
			System.out.println("우끼끼");
		}
	}
	
	//내부클래스(Inner Class)
	public class Tiger{
		public void roar() {
			System.out.println("어흥");
		}
	}
	//Zoo 클래스의 멤버 메소드
	public Monkey getMonkey() {
		//내부 클래스로 객체를 생성해서 리턴해줄 수도 있다
		return new Monkey();
	}
	public Tiger getTiger() {
		return new Tiger();
	}

}

 

package test.main;

import test.mypac.Zoo;
import test.mypac.Zoo.Tiger;

public class MainClass02 {
	public static void main(String[] args) {
		Zoo z1=new Zoo();
		
		
		Zoo.Monkey m1= z1.getMonkey();//import test.mypac.Zoo; 때문에 Zoo.으로 시작하면 된다
		test.mypac.Zoo.Monkey m2=z1.getMonkey();//패키지 이름을 다 적으면 import 할 필요는 없다
		m1.monk();
		
		Tiger t1=z1.getTiger();//import 된 정도에 따라 시작하는 위치가 다를 수 있다.
		t1.roar();
	}
}

 

 
 
 
<12:30 4교시>
클래스 안에도 클래스(이너클래스)를 정의할 수 있고 메소드 안에도 클래스(로컬 이너 클래스)를 정의할 수 있다
static 메소드 안에서 클래스를 불러오려면 static 메소드를 사용해야 한다.
 

package test.main;

public class MainClass03 {
	public static class Aloha{
		public void words() {
			System.out.println("샤카샤카");
		}
	}
	static int num1=10;
	public static void test1() {}
	int num =10;
	public void test() {}
	public static void main(String[] args) {
		/*
		//static 메소드 안에서는 static만 쓸 수 있다.
		Aloha alo=new Aloha(); //public class일땐 오류남
		test(); //오류남
		System.out.println(num);//오류남
		*/
		
		test1();
		System.out.println(num1);
		Aloha alo= new Aloha(); //public static class라고 해야 오류가 안남
		alo.words();
		
		//메소드 안에도 클래스를 정의할 수 있다.
		//여기서 정의한 클래스는 메소드 안쪽 영역에서만 사용할 수 있다.
		//메소드 안에 정의한 클래스는 Local Inner Class라고 한다
		class Cat{
			public void say() {
				System.out.println("야옹");
			}
		}
		//Local Inner Class 를 이용해서 객체 생성하고 사용해보기
		Cat c = new Cat();
		c.say();
		
	}
}

 
 
 
 
ToDo : markdown 작성법 공부하기

<14:30 5교시>

객체가 하나가 생기면 참조값이 하나가 부여된다. 같은 참조값을 여러 개의 지역 변수가 담고 있을 수 있다.

더보기
package test.main;

import test.mypac.MobilePhone;
import test.mypac.Phone;

public class MainClass03 {
	public static void main(String[] args) {
		//아래 3줄을 실행하면 참조값이 몇 개가 나올까?(객체가 몇 개 생성될까?) 
		//답 : new 한것만 참조값이 있음1개 -> 참조값이 담기는 공간의 타입만 여러개
		MobilePhone p1 = new MobilePhone();
		//휴대전화 타입 안에 있는 값을 전화 타입(부모 타입) 변수에 대입 가능!
		Phone p2= p1;
		//휴대전화 타입 안에 있는 값을 오브젝트 타입(부모 타입) 변수에 대입 가능!
		Object p3=p1;
		MobilePhone p4 = (MobilePhone)p3;//캐스팅으로 담기는거
	}
}

 

부모 객체를 강제로 자식 데이터 타입으로 캐스팅해서 자식 데이터 지역변수에 넣는다고 컴파일러가 인식하는 에러는 나타나지 않지만 실행 시켰을 때 에러가 나게 된다.

 

 

 

캐스팅 연산자 연습 (앞으로 쓸 일이 많을것이라고 하심)

더보기
package test.main;

import test.mypac.MobilePhone;
import test.mypac.Phone;

public class MainClass04 {
	public static void main(String[] args) {
		//휴대전화 객체를 생성해서 나온 참조값을 오브젝트 타입 p3이라는 지역 변수에 담기
		Object p3= new MobilePhone();
		//casting 연산자를 이용해서 대입 연산자의 우측을 전화 타입으로 인식되도록 하기
		Phone p2= (Phone)p3;
		//casting 연산자를 이용해서 대입 연산자의 우측을 휴대전화 타입으로 인식되도록 하기
		MobilePhone p1= (MobilePhone)p3;
	}
}

 

 

새로운 클래스 : 안드로이드 폰 클래스

더보기
package test.mypac;

public class AndroidPhone extends MobilePhone {
	//생성자
	public AndroidPhone() {
		System.out.println("안드로이드폰 생성자 호출됨");
	}
	//메소드
	public void doInternet() {
		System.out.println("인터넷 된당");
	}
}

상속을 받으면 상속을 하는 부모 객체들까지 다 일괄 생성돼서 부모 객체의 기능을 사용할 수 있다.

 

 

Override : 부모 객체의 메서드 재정의하기

더보기
package test.mypac;

public class AndroidPhone extends MobilePhone {
	//생성자
	public AndroidPhone() {
		System.out.println("안드로이드폰 생성자 호출됨");
	}
	//메소드
	public void doInternet() {
		System.out.println("인터넷 된당");
	}
	@Override//부모 메서드를 재정의했다는 기호일 뿐, 이 행이 무슨 기능을 하는 건 아님
	public void takePicture() {
		// TODO Auto-generated method stub
		//super.takePicture();
		//부모의 메서드를 호출할 수 있도록 가져오긴 하는데 지워도 무관
		System.out.println("1000만 화소의 사진을 찍어요!");
	}
}

 

 

<15:30 6교시>

 

더보기
package test.main;

import test.mypac.AndroidPhone;
import test.mypac.MobilePhone;

public class MainClass05 {
	public static void main(String[] args) {
		//안드로이드폰 객체를 생성해서 참조값을 안드로이드 폰 타입 p1이라는 지역변수에 담기
		AndroidPhone p1 = new AndroidPhone();
		p1.call();
		p1.mobileCall();
		p1.takePicture();
		p1.doInternet();
		
		System.out.println("------------");
		//안드로이드폰 객체를 생성해서 참조값을 모바일폰 타입 p2 라는 지역 변수에 담기
		MobilePhone p2= new AndroidPhone();
		p2.takePicture();//Override 된 메소드가 호출됨
		
		System.out.println("---------");
		MobilePhone p3 = new MobilePhone();
		p3.takePicture();//부모 객체인 MobilePhone 객체의 원래 메서드가 호출됨
	}
}

내마음대로 IosPhone 객체를 만들고 그걸 활용해보기

더보기
package test.mypac;

public class IosPhone extends MobilePhone{
	public IosPhone(){
		System.out.println("아이폰입니다.");
	}
	public void apple(){
		System.out.println("이것은 사과입니다. 농담입니다. 앱등입니다");
	}
	@Override
	public void mobileCall(){
		// TODO Auto-generated method stub
		//super.mobileCall();
		System.out.println("사과는 애아뽈, 애아뽈");
	}
}

 

 

package test.main;

import test.mypac.AndroidPhone;
import test.mypac.IosPhone;
import test.mypac.MobilePhone;

public class MainClass05 {
	public static void main(String[] args) {
		System.out.println("---------");
		MobilePhone p4= new IosPhone();
		p4.mobileCall();
	}
}

 

 

 

 

부모 객체를 생성하기 위해 다른 객체가 필요할 때, 자녀 객체가 super()를 통해 부모 객체 생성자를 전달하는 방법

package test.auto;
//SportsCar 객체를 생성하기 위해서는 Car 객체도 생성이 되어야 하는데 Car객체는 Engine 객체가 있어야만 생성되는데 엔진이 없이 에러일 수 밖에 없다
public class SportsCar extends Car{

}

 

package test.auto;
//SportsCar 객체를 생성하기 위해서는 Car 객체도 생성이 되어야 하는데 Car객체는 Engine 객체가 있어야만 생성되는데 엔진이 없이 에러일 수 밖에 없다
public class SportsCar extends Car{

	//빨간 밑줄에 에러 해결하기 하면 성립이 됨
	public SportsCar(Engine engine) {
		super(engine);//자식생성자에서 ()에 받아서 부모 생성자를 호출하면서 Engine을 전달해줌
		//super.은 호출하는거
		//super() :부모생성자 호출
		// TODO Auto-generated constructor stub
	}

}

 

 

MainClass06.java

package test.auto;
//SportsCar 객체를 생성하기 위해서는 Car 객체도 생성이 되어야 하는데 Car객체는 Engine 객체가 있어야만 생성되는데 엔진이 없이 에러일 수 밖에 없다
public class SportsCar extends Car{

	//빨간 밑줄에 에러 해결하기 하면 성립이 됨
	public SportsCar(Engine engine) {
		super(engine);//자식생성자에서 ()에 받아서 부모 생성자를 호출하면서 Engine을 전달해줌
		//super.은 호출하는거
		//super() :부모생성자(Car클래스의 생성자)를 의미한다.
		//부모 생성자에 필요한 값을 자식 생성자에서 받아서 전달한다
		//super() 코드 실행전에 다른 코드가 있으면 안된다.
	}
	//메소드
	public void openDrive() {
		if(this.engine==null) {//접근 지정자가 private으로 지정되어 있어서 오류가 나는 상황
        //Car class의 Engine의 접근 지정자를 protected로만 바꿔줘도 오류가 해결됨
			System.out.println("엔진읎다");
			return;
		}
		System.out.println("오픈카로 달려");
	}

}

 

 

 

접근지정자 메모가 들어간 Car 객체

package test.auto;
/*
 *  - 접근 지정자 접근범위
 *  
 *  public : 어디에서나 접근 가능 
 *  protected : 동일한 package 혹은 상속관계에서 자식에서 접근 가능(default보다 넓은 범위)
 *  default(작성 안한 경우) : 동일한 package 안에서만 접근 가능
 *  private : 동일한 클래스 혹은 동일한 객체 안에서만 접근가능(static 영역에서냐 heap 영역에서냐의 차이)
 *  
 *  - 접근 지정자를 붙이는 위치
 *  
 *  1. 클래스를 선언 할때 (import 가능여부를 결정한다) public class /    class
 *  2. 생성자 (객체 생성 가능여부를 결정한다) new 여부를 결정
 *  3. 필드 (필드 참조 가능 여부를 결정한다) 필드에 붙은거
 *  4. 메소드 (메소드 호출 가능 여부를 결정한다) 메소드에 붙은거
 *  
 *  클래스는 default 와 public 두가지의 접근 지정자만 지정 가능하다
 *  접근 지정자를 생략한것이 default 접근 지정자다 
 */
public class Car {
	//필드(protected는 패키지가 달라도 상속관계 자식이면 참조 가능)
	protected Engine engine;
	//엔진 객체를 생성자의 인자로 전달받는 생성자(이 생성자를 정의하면 default 생성자는 사라진다)
	public Car(Engine engine) {
		this.engine=engine;
	}
	//메소드
	public void drive() {
		if(this.engine==null) {
			System.out.println("엔진이 없어서 달릴 수 없어요!");
			return; // 메소드를 여기서 리턴시키기(종료시키기)
		}
		System.out.println("달려~");
	}
}

java의 모든 데이터 타입을 다 담을 수 있는 Object 객체

 

 

다른 예제

package test.main;

import test.mypac.AndroidPhone;
import test.mypac.Phone;

public class MainClass08 {
	public static void main(String[] args) {
		//여기서 아래의 usePhone()메소드를 호출하는 code를 작성하고 run 해서 결과를 확인해보세요
		
		
		MainClass08.usePhone(new Phone());
		//usePhone(new Phone()); 내가 한거 이거는 틀린거인줄 알았는데! 아니었어!!
        //스태틱 메소드는 클래스명. 찍어서 메소드를 호출해야 하는데,
		//지금 같은 경우는 같은 스태틱 영역 안에 있는거라서 MainClass08. 부분을 생략 가능
		
		//Phone p1 = new Phone();
		//MainClass08.usePhone(p1);
		
		usePhone(new AndroidPhone());//도 가능하다
		
	}
	//static 메소드 추가(이 메소드 호출을 위해 Phone 타입 참조값이 필요)
	public static void usePhone(Phone p) {
		//a매개변수에 전달된 값을 이용해서 메소드를 호출하는 code
		p.call();
	}
}

<17:30 8교시>

교재로 개념 정리 해봄

9:10 경 학원 도착.

날이 춥기도 하고 늦잠도 잔 겸 겸사겸사 느즈막히 나왔는데 생각보다 편하게 와서 생각보다 좋다고 느끼는 중

일찍 왔으면 어제 상담한 내용 정리하려고 했는데, 5분밖에 없어서 대충 요약하자면 블로그에 내 생각이나 왜 그런 이유로 코딩 했는지 같은 것을 좀 더 많이 풀어써보라는 가이드 받은거, 정보처리기사 한 번 해보라는거

 

<9:30 1교시>

리눅스 명령어

ls : 디렉토리의 파일 이름만 나옴

cat 텍스트 파일 이름.확장자 : 텍스트 문서의  내용을 다 보여줌

git commit을 입력하면 vi(vim) editor가 열린다

아 이미지 설명 잘 못 적혓따 git command 아니고 git commit

 

vi 명령어와 변경을 하고자 하는 html 페이지의 이름을 입력하면 vi 에디터로 html을 편집할 수 있다 (댕신기)

근데 기능 자체는 직접 다 입력해야 해서 약간 귀찮긴 한데 더 프로그래머 같다.

vi editor에서 변경한 내용이 반영되어 있음 ㄷㄷ

 

 

블로그 글 쓰다가 놓친 부분들 걍 여기다 작성

git branch lab1 (master)

git checkout lab1   (master)     (cf. git checkout -b lab1은 git branch lab1과 git checkout lab1을 동시에 작성한 것.)

vi index.html  (lab1) 

i눌러서 html 내용 수정하기 (game.html을 만들어줌)

esc누르고 :wq입력해서 저장하고 빠져나오기(:q는 저장하지 않고 바로 빠져나오기)

(화면이 지저분하면 clear)

cat index.html         (작성한 텍스트 파일의 내용을 보여줌)

touch game.html (새로운 텍스트 파일을 만들어줌)

ls -al (디렉토리의 내용들을 보여줌)

vi game.html (lab1)

i 눌러서 game.html 내용 수정하고

esc 누르고 :wq 눌러서 저장하고 나오기

cat game.html 눌러서 제대로 작성했는지 확인해보기

git add . 

git commit -m "game.html added" (즉석에서 메시지 작성)

git checkout master (lab1) (체크아웃 할 때는 워킹 트리가 깨끗한지 확인하고 넘어가기)

(master 브랜치에 와 있는데 game.html이 사라져있음)

(master 브랜치를 수정함)

git add . 

git commit -m "p2 added" (이렇게 하면 수업 시간에 한 내용으로 봤을 때 동일한 위치에 서로 다른 내용이 있거든, 그래서 GIT이 보기에 merge 한다고 했을 때 정리가 안 돼서 충돌이 일어남 -> 이상한 기호는 전부 다 지우고 정말 원하는 코드만 남겨서 add commit 하면 됨)

git checkout lab1

git checkout master

git merge lab1 (master) (마스터에서 lab1으로 merge 하겠다 ->여기서 위에서 말한 충돌이 일어나는데 원하는것만 남기면 됨)

git add .

git commit -m "lab1 merged" (이러면 충돌 해결되고 merge도 됨)

git reset --hard HEAD~ (merge를 잘못했다 했을 때, HEAD를 한 칸 뒤로 물리면 Merge가 취소됨)

git reflog (스냅샷과 브랜치를 옮겨다닌 모든 역사가 있는데, git reset --hard 다음에 reflog에서 보이는 아이디를 타이핑하거나 HEAD@{1}, HEAD@{7}이런 기호를 타이핑하면 된다는데, 아마 이게 옆에 숫자가 HEAD~ 물결을 하는 횟수 써놓은거 같아서 그게 가능한듯)

 

 

 

 

 

<10:30 2교시>

Github에 저장하는 방법 local Git repository : init을 눌러서 워크스페이스를 찾으면 됨.

요즘엔 Master 브랜치 대신에 Main 브랜치라고 한다고 함

 

 

소스코드만 추적할 수 있게 해주는 gitignore 들을 모아놓은 사이트

.classpath와 .project도 같이 없애준다.

java에서 수정한 내용을 git 에 commit 하는 시점은 내 마음대로 해야 하지만, 브랜치를 체크아웃 할 때라면 add와 commit 한 상태에서 진행해야 한다.

 

 

어제 8교시에 예제로 나온 코드 다시 살펴봄

더보기
package test.main;

import test.mypac.Bike;

public class MainClass05 {
	public static void main(String[] args) {
		/*
		 * 1. Bike 객체를 담을 수 있는 방 3개짜리 배열객체를 생성해서 참조값을 bikes라는 지역변수에 담기
		 * 2. 배열의 각각의 방(0,1,2방) 에 Bike 객체를 생성해서 담기
		 * 3. 반복문 for를 이용해서 순서대로 배열의 각 방에 있는 Bike 객체의 ride()메소드를 호출하기
		 */
		//1.
		Bike[] bikes = new Bike[3];
		//2.
		for (int i=0; i<3; i++) {
			Bike b= new Bike();
			bikes[i]= b;
			//bikes[i].ride(); 이걸 여기다 쓰면 3번을 무시하고 2번의 문제를 담고 바로 호출하기 형태로 바뀐거
		
		}
		//3. 이런 작업을 할 일이 많다 ->줄여 쓰는 for문이 있다.
		for (int i=0; i<3; i++) {
			Bike tmp=bikes[i];
			tmp.ride();
		}
		//위의 for문을 줄여 쓴 확장 for문
		for(Bike tmp:bikes) {
			tmp.ride();
		}
				
		
	}
}

 

 

 

 

<11:30 3교시>

확장 for문
for(배열에 저장된 데이터 type   tmp : 배열[]){
}

 

변경된 내용 Git에 커밋하기

 

.gitignore 는 애초에 비어 있는 폴더를 인식하지 않고, 얘 때문에 새로 만든 project의 변경된 내용이 아무것도 인식되지 않는 상태인데, 앞으로 프로젝트하다 보면 빈 폴더가 필요할 때가 있다. 이럴 때는 빈 폴더에 아무 의미 없는 .gitignore를 걍 만들어 놓는다.

 

 

Extends 기능 살펴 보기

- Phone 클래스(Object를 상속받음)

더보기
package test.mypac;

//가상의 옛날 가정용 전화기 객체를 생성할 설계도 라고 가정
//어떤 클래스도 상속받지 않으면 java.lang의 Object 패키지의 내용을 자동으로 extends 상속받음 (extends Object는 생략 가능하다는 의미)
public class Phone extends Object {
	//생성자
	public Phone() {
		System.out.println("Phone 생성자 호출");
	}
	//전화 거는 메소드
	public void call() {
		System.out.println("전화를 걸어요");
	}
}

- MobilePhone 클래스(Phone과 Object를 상속 받음)

더보기
package test.mypac;

/*
 * 이미 존재하는 부모 클래스인 Phone 클래스를 extends(상속) 받아서 자식 클래스인 MobilePhone 클래스 정의하기
 * 확장해서 가져오는것을 상속이라고 부름
 * 부모의 기능을 모두 사용할 수 있을 뿐더러, 
 * 부모가 가진 메소드를 가져와서 내 상황에 맞게 재정의하여 수정할 수가 있음 -> 상속을 사용하는 주된 이유
 */
public class MobilePhone extends Phone {
	//생성자
	public MobilePhone() {
		System.out.println("MobilePhone 생성자 호출");
	}
	//이동중에 전화를 걸어요
	public void mobileCall() {
		System.out.println("이동중에 전화를 걸어요");
	}
	//사진 찍는 메소드
	public void takePicture() {
		System.out.println("30만 화소의 사진을 찍어요");
	}
	
}

상속의 확인

더보기
package test.main;

import test.mypac.MobilePhone;

public class MainClass01 {
	public static void main(String[] args) {
		/*
		 * Phone 클래스를 상속받은 MobilePhone 클래스로 객체를 생성해서 그 참조값을 p1이라는 이름의 지역변수에 담기
		 */
		MobilePhone p1 = new MobilePhone();
		//부모 클래스에 정의된 메소드도 사용 가능하다
		p1.call();
		p1.mobileCall();
		p1.takePicture();
	}
}

 

데이터 타입의 다형성

더보기
package test.main;

import test.mypac.MobilePhone;
import test.mypac.Phone;

/*
 * [다형성(type이 많은 성질)]
 * - java 에서 객체는 여러개의 type을 가질 수 있다.
 * - 참치 김밥은 김밥이기도 하다, 김밥은 음식이기도 하다
 * - 부모 타입으로 다형성을 활용할 때 유연성이 부여된다.
 * - 집에 들어올 때 음식 좀 사와랑 집에 들어올 때 참치김밥 사와랑 유연성이 다름
 * - 다만 부모 타입으로 받으면 자식 객체의 메소드를 쓸 수 없다
 *  *  지역변수나 필드앞에 선언하는 data type 은 (참조 데이터 type)
	 *  
	 *  그 안에 들어있는 참조값의 사용 설명서 라고 생각하면 된다.
	 *  
	 *  그렇기 때문에 그 지역변수나 필드에 . 을 찍으면 사용 설명서에 명시된 기능만 사용 할수 있다.
	 *  
	 *  java 의 모든 객체는 다형성을 가질수 있다.
	 *  
	 *  다형성은 type 이 여러개라는 의미이다. 
 */
public class MainClass02 {
	public static void main(String[] args) {
		MobilePhone p1=new MobilePhone();
		//휴대전화 객체를 생성해서 나온 참조값을 휴대전화 타입 지역변수 p1에 담기
		//p1. -> p1 지역변수는 휴대전화, 전화, 오브젝트의 기능을 모두 사용할 수 있음
	
		Phone p2=new MobilePhone(); //참치 김밥은 김밥이기도 하다
		//휴대전화 객체를 생성해서 나온 참조값을 전화 타입 지역변수 p2에 담기
		//p2. -> p2 지역변수는 전화와 오브젝트의 기능만 사용 가능 
		
		Object p3 = new MobilePhone();//김밥은 음식이기도 하다
		//휴대전화 객체를 생성해서 나온 참조값을 오브젝트 타입 지역변수 p3에 담기
		//p3. -> p3 지역변수는 오브젝트 기능만 사용 가능
		//즉, 지역변수.어쩌구 할 때 지역변수의 타입은 그 지역변수의 사용 설명서 역할을 한다.
		
	}
}

 

 

<12:30 4교시> 오후 예고 + 각자 실습

오후 예고(더보기)

더보기
package test.main;

import test.mypac.MobilePhone;
import test.mypac.Phone;

public class MainClass03 {
	public static void main(String[] args) {
		//아래 3줄을 실행하면 참조값이 몇 개가 나올까?(객체가 몇 개 생성될까?) 
		//답 : new 한것만 참조값이 있음1개 -> 참조값이 담기는 공간의 타입만 여러개
		MobilePhone p1 = new MobilePhone();
		//휴대전화 타입 안에 있는 값을 전화 타입(부모 타입) 변수에 대입 가능!
		Phone p2= p1;
		//휴대전화 타입 안에 있는 값을 오브젝트 타입(부모 타입) 변수에 대입 가능!
		Object p3=p1;
		MobilePhone p4 = (MobilePhone)p3;//캐스팅으로 담기는거
	}
}

 

 

<14:30 5교시>

Intger.parseInt() 는 소괄호 안의 문자열 형태의 숫자를 숫자로 반환해준다.

더보기
package test.main;

public class MainClass03 {
	public static void main(String[] args) {
		//문자열을 실제 숫자로 바꾸기
		int num1 = Integer.parseInt("200");
		//문자열을 실제 숫자(실수)로 바꾸기
		double num2= Double.parseDouble("10.1");
	}
}

 

 

더보기
package test.main;

import java.util.Scanner;

public class MainClass04 {
	public static void main(String[] args) {
		//콘솔창으로부터 입력받을 수 있는 Scanner 객체 생성
		Scanner scan = new Scanner(System.in);
		
		//.print()메소드는 개행 기호를 출력하지 않는다.
		System.out.print("첫번째 숫자:");
		String a = scan.nextLine();
		System.out.println();
		System.out.print("두번째 숫자:");
		String b=scan.nextLine();
		double result = Double.parseDouble(a)+Double.parseDouble(b);
		System.out.print("두 수의 합은:"+result);
	}
}

JAVA에서의 배열

더보기
package test.main;

public class MainClass01 {
	//자바에서의 배열은 크기가 정해지면 자바스크립트에서 그랬던것과 달리 개수를 더 늘릴 수 없다.
	public static void main(String[] args) {
		//int type 5개를 저장하고 있는 배열 객체를 생성해서 참조값을 nums 라는 지역 변수에 담기
		int[] nums = {10,20,30,40,50};
		//double type 5개를 저장하고 있는 배열 객체를 생성해서 참조값을 num2라는 지역변수에 담기
		double[] nums2 = {10.1, 10.2, 10.3, 10.4, 10.5};
 		//boolean type 5개를 저장하고 있는 배열
		boolean[] truth = {true, false, false, false, true};
		//String type (참조 데이터타입) 5개를 저장하고 있는 배열
		String[] names = {"이름1","이름2","이름3","이름4","이름5"};
		
		//배열 객체의 복제본 얻어내기
		int[] result = nums.clone();
		//복제본이 아닌 참조값만 복사하기
		int[] result2=nums;
		
		//배열의 크기 얻어내기
		int size=nums.length;
		//배열은 순서가 있는 데이터이다. 특정 index의 item을 참조하는 방법
		int first=nums[0];
		int second=nums[1];
		int third=nums[2];
	}
}

 

 

<15:30 6교시>

배열을 만드는 방법

더보기
package test.main;

public class MainClass01 {
	//자바에서의 배열은 크기가 정해지면 자바스크립트에서 그랬던것과 달리 개수를 더 늘릴 수 없다.
	public static void main(String[] args) {
		//int type 5개를 저장하고 있는 배열 객체를 생성해서 참조값을 nums 라는 지역 변수에 담기
		int[] nums = {10,20,30,40,50};
		//double type 5개를 저장하고 있는 배열 객체를 생성해서 참조값을 num2라는 지역변수에 담기
		double[] nums2 = {10.1, 10.2, 10.3, 10.4, 10.5};
 		//boolean type 5개를 저장하고 있는 배열
		boolean[] truth = {true, false, false, false, true};
		//String type (참조 데이터타입) 5개를 저장하고 있는 배열
		String[] names = {"이름1","이름2","이름3","이름4","이름5"};
		
		//배열 객체의 복제본 얻어내기
		int[] result = nums.clone();
		//복제본이 아닌 참조값만 복사하기
		int[] result2=nums;
		
		//배열의 크기 얻어내기
		int size=nums.length;
		//배열은 순서가 있는 데이터이다. 특정 index의 item을 참조하는 방법
		int first=nums[0];
		int second=nums[1];
		int third=nums[2];
	}
}

 

배열을 만드는 또다른 방법

더보기
package test.main;

public class MainClass02 {
	public static void main(String[] args) {
		//0으로 초기화된 방 3개짜리 int[]객체를 만들어서 참조값을 지역변수 nums 에 담기
		int[] nums = {0,0,0};
		//0번 방에ㅔ 10, 1번 방에 20, 2번 방에 30을 저장하기
		nums[0]= 10;
		nums[1]= 20;
		nums[2]= 30;
		//0으로 초기화된 방 500개짜리 int[]객체를 만들어서 참조값을 지역변수 nums2에 담기
		int[] nums2 = new int[500];
		/*
		 * 0 번 방에 1, 1번 방에 2, ...,499번 방에 500 저장하기
		 */
		
		
		for(int i=0; i<nums2.length; i++) {
			nums2[i]= i+1;
		}
	}
}

 

 

입력받은 값을 배열에 저장하고 순서대로 출력하기

package test.main;

import java.util.Scanner;

public class MainClass03 {
	public static void main(String[] args) {
		//1. String type을 담을 수 있는 방 3개짜리 빈 배열 객체를 만들어서 참조값을 names라는 지역변수에 담아 보셈
		String[] names = new String[3]; //또는 String[] names = {null,null,null}
		//2. 콘솔창으로부터 문자열을 입력받을 수 있는 Scanner 객체를 생성해서 참조값을 scan이라는 지역변수에 담아 보셈
		Scanner scan = new Scanner(System.in);
		//String a = scan.nextLine();
		//3. 반복문을 돌면서 Scanner 객체를 이용해서 이름을 입력 받고 입력받은 이름을 배열에 순서대로 저장해보셈
		for (int i=0; i<3; i++) {
			System.out.println("이름 입력:");
			names[i]= scan.nextLine();
			/*
			Scanner scan = new Scanner(System.in);
			String a = scan.nextLine();
			names[i]= a;
			*/
		}

		//4. 반복문 돌면서 배열에 저장된 이름을 순서대로 콘솔창에 출력해보셈
		for(int i=0; i<names.length; i++) {
			System.out.println(names[i]);
		}
	}
}

 

 

<16:30 7교시>

랜덤하게 뽑기 예제 내가 한거

더보기
package test.main;

import java.util.Random;

public class MainClass04 {
	public static void main(String[] args) {
		//String type이 저장된 배열
		String[] data = {"cherry","apple","banana","melon","7"};
		//배열에 저장된 문자열 중에 1개가 랜덤하게 콘솔창에 출력되도록 프로그래밍 해보세요.
		Random ran = new Random();
		//String fruit= data[ran.nextInt(5)];
		//System.out.println(fruit);
		int ranNum=ran.nextInt(5);
		int ranNum1=ran.nextInt(5);
		int ranNum2=ran.nextInt(5);
	
			System.out.print(data[ranNum]);
			System.out.print(data[ranNum1]);
			System.out.print(data[ranNum2]);
		
	
	}
}

랜덤하게 뽑기 샘이랑 한거

더보기
package test.main;

import java.util.Random;

public class MainClass04 {
	public static void main(String[] args) {
		//String type이 저장된 배열
		String[] data = {"cherry","apple","banana","melon","7"};
		//배열에 저장된 문자열 중에 1개가 랜덤하게 콘솔창에 출력되도록 프로그래밍 해보세요.
		Random ran = new Random();
		//String fruit= data[ran.nextInt(5)];
		//System.out.println(fruit);
		
		for(int i=0; i<3; i++) {
			int ranNum=ran.nextInt(5);
			System.out.print(data[ranNum]+"  ");
		}
	
	
	}
}

업그레이드 예제 내가 한 삽질

더보기
package test.main;

import java.util.Random;

public class MainClass04 {
	public static void main(String[] args) {
		//String type이 저장된 배열
		String[] data = {"cherry","apple","banana","melon","7"};
		//배열에 저장된 문자열 중에 1개가 랜덤하게 콘솔창에 출력되도록 프로그래밍 해보세요.
		Random ran = new Random();
		//String fruit= data[ran.nextInt(5)];
		//System.out.println(fruit);
	
		
		for(int i=0; i<3; i++) {
			int ranNum = ran.nextInt(5);
			int[] ranNums= new int[3];
			ranNums[i]=ranNum;
			System.out.print(data[ranNum]+"  ");
		}
		//나왔던 랜덤한 정수가 모두 같으면 100점, 하나라도 다르면 0점을 출력해보세요
		
		
		
	}
}

 

업그레이드 예제 선생님이랑 한것

더보기
package test.main;

import java.util.Random;

public class MainClass04 {
	public static void main(String[] args) {
		//String type이 저장된 배열
		String[] data = {"cherry","apple","banana","melon","7"};
		//배열에 저장된 문자열 중에 1개가 랜덤하게 콘솔창에 출력되도록 프로그래밍 해보세요.
		Random ran = new Random();
		//String fruit= data[ran.nextInt(5)];
		//System.out.println(fruit);
		//나왔던 숫자를 저장할 배열 객체 생성
		int[] nums=new int[3];
		
		for(int i=0; i<3; i++){
			//0~4 사이의 랜덤한 정수가 얻어내진다.
			int ranNum = ran.nextInt(5);
		
			System.out.print(data[ranNum]+"  ");
			
			//나왔던 숫자를 배열에 순서대로 저장한다.
			nums[i]=ranNum;
		
		}
		System.out.println();
		//나왔던 랜덤한 정수가 모두 같으면 100점, 하나라도 다르면 0점을 출력해보세요
		if(nums[0]==nums[1]&&nums[1]==nums[2]) {
			System.out.println("획득한 점수 100");
		}else {
			System.out.println("획득한 점수 : 0");
		}
		
		
	}
}

 

 

또 더 업그레이드 버전

더보기
package test.main;

import java.util.Random;
import java.util.Scanner;

public class MainClass04 {
	public static void main(String[] args) {
		//String type이 저장된 배열
		String[] data = {"cherry","apple","banana","melon","7"};
		//배열에 저장된 문자열 중에 1개가 랜덤하게 콘솔창에 출력되도록 프로그래밍 해보세요.
		Random ran = new Random();
		//String fruit= data[ran.nextInt(5)];
		//System.out.println(fruit);
		//나왔던 숫자를 저장할 배열 객체 생성
		int[] nums=new int[3];
		Scanner scan=new Scanner(System.in);
		//기본 점수
		int score=1000;
		
		while(true) {
			System.out.println("진행하려면 Enter를 치세요");
			scan.nextLine();
			//score를 10씩 감소 시키기
			score -= 100;
			
			for(int i=0; i<3; i++){
				//0~4 사이의 랜덤한 정수가 얻어내진다.
				int ranNum = ran.nextInt(5);
				System.out.print(data[ranNum]+"  ");
				//나왔던 숫자를 배열에 순서대로 저장한다.
				nums[i]=ranNum;
			}
			System.out.println();
			//나왔던 랜덤한 정수가 모두 같으면 100점, 하나라도 다르면 0점을 출력해보세요
			if(nums[0]==nums[1]&&nums[1]==nums[2]) {
				System.out.println("획득한 점수 100");
				score+=100;
			}else {
				System.out.println("획득한 점수 : 0");
			}
			System.out.println("score: "+score);
			if(score <=0) {
				break;
			}
		}
		
		
	}
}

 

<17:30 8교시>

위에서 만들었던 게임을 진짜 사행성 게임 처럼 보이게 만들수 있는 엄청 귀여운 유니코드

String[] data = {"🍒", "🍎", "🍌", "🍈", "7"};

 

 

자전거 클래스 예제

더보기
package test.main;

import test.mypac.Bike;

public class MainClass05 {
	public static void main(String[] args) {
		/*
		 * 1. Bike 객체를 담을 수 있는 방 3개짜리 배열객체를 생성해서 참조값을 bikes라는 지역변수에 담기
		 * 2. 배열의 각각의 방(0,1,2방) 에 Bike 객체를 생성해서 담기
		 * 3. 반복문 for를 이용해서 순서대로 배열의 각 방에 있는 Bike 객체의 ride()메소드를 호출하기
		 */
		
		Bike[] bikes = new Bike[3];

		for (int i=0; i<3; i++) {
			Bike b= new Bike();
			bikes[i]= b;
			bikes[i].ride();
		}
				
	}
}

 

또 7교시에 한 것보다 더 개선된 업그레이드 버전 각자 만들어보기

 

 

Git은 분산형 버전 관리 시스템으로, 코드의 버전 관리, 협업, 변경 사항 추적 등을 효율적으로 처리하는 도구입니다. Git에서 자주 사용하는 명령어를 정리해보았습니다.

1. 기본 설정

  • git config --global user.name "사용자 이름"
    Git에 사용할 사용자 이름을 설정합니다.
  • git config --global user.email "사용자 이메일"
    Git에 사용할 이메일을 설정합니다.
  • git config --global core.editor "편집기"
    Git에서 사용하는 기본 텍스트 편집기를 설정합니다 (예: vim, nano).

2. 저장소 생성 및 클론

  • git init
    현재 디렉토리를 Git 저장소로 초기화합니다.
  • git clone <저장소 URL>
    원격 저장소를 로컬에 복제합니다.

3. 변경 사항 추적

  • git status
    현재 작업 디렉토리의 상태를 확인합니다. (추적되지 않은 파일, 변경된 파일 등)
  • git add <파일>
    특정 파일을 스테이징 영역에 추가합니다.
  • git add .
    모든 변경 사항을 스테이징 영역에 추가합니다.
  • git diff
    변경된 내용을 비교합니다.

4. 커밋과 히스토리

  • git commit -m "커밋 메시지"
    스테이징 영역에 있는 파일을 커밋합니다.
  • git commit -a -m "커밋 메시지"
    수정된 모든 파일을 자동으로 스테이징하고 커밋합니다.
  • git log
    커밋 히스토리를 확인합니다.
  • git log --oneline
    간단한 형식으로 커밋 히스토리를 확인합니다.

5. 브랜치 관리

  • git branch
    현재 로컬 브랜치 목록을 확인합니다.
  • git branch <브랜치 이름>
    새 브랜치를 생성합니다.
  • git checkout <브랜치 이름>
    다른 브랜치로 전환합니다.
  • git checkout -b <브랜치 이름>
    새 브랜치를 생성하고 바로 전환합니다.
  • git merge <브랜치 이름>
    다른 브랜치의 변경 사항을 현재 브랜치에 병합합니다.
  • git branch -d <브랜치 이름>
    브랜치를 삭제합니다.

6. 원격 저장소 관리

  • git remote -v
    연결된 원격 저장소 URL을 확인합니다.
  • git remote add <원격 이름> <저장소 URL>
    원격 저장소를 추가합니다.
  • git fetch
    원격 저장소의 변경 사항을 가져옵니다.
  • git pull
    원격 저장소에서 변경 사항을 가져오고 병합합니다.
  • git push
    로컬 브랜치의 변경 사항을 원격 저장소에 업로드합니다.
  • git push origin <브랜치 이름>
    특정 브랜치를 원격 저장소에 푸시합니다.

7. 협업 및 분기 작업

  • git rebase <브랜치 이름>
    다른 브랜치의 커밋을 현재 브랜치에 재적용합니다. (병합 대신)
  • git cherry-pick <커밋 해시>
    특정 커밋을 현재 브랜치로 가져옵니다.

8. 리셋 및 되돌리기

  • git reset <파일>
    스테이징 영역에서 파일을 제거합니다.
  • git reset --hard
    작업 디렉토리 및 스테이징 영역을 마지막 커밋 상태로 되돌립니다.
  • git revert <커밋 해시>
    특정 커밋을 되돌리는 새로운 커밋을 생성합니다.

9. 태그 관리

  • git tag
    현재 브랜치의 태그 목록을 확인합니다.
  • git tag <태그 이름>
    특정 커밋에 태그를 추가합니다.
  • git push origin <태그 이름>
    태그를 원격 저장소에 푸시합니다.
  • git tag -d <태그 이름>
    태그를 로컬에서 삭제합니다.

10. 기타 유용한 명령어

  • git stash
    현재 변경 사항을 임시로 저장하고, 작업 디렉토리를 깨끗하게 만듭니다.
  • git stash pop
    마지막으로 저장된 stash를 적용합니다.
  • git clean -fd
    Git이 추적하지 않는 파일들을 삭제합니다.

이 외에도 다양한 Git 명령어들이 존재하지만, 이 명령어들은 대부분의 Git 작업을 수행하는 데 유용하게 사용됩니다.

+ Recent posts