자바풀스택 과정/자바 풀 스택 : 수업내용정리

자바 풀 스택 12/19 오전 기록 021-1

파티피플지선 2024. 12. 19. 13:03

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 작성법 공부하기