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 작성법 공부하기
'자바풀스택 과정 > 자바 풀 스택 : 수업내용정리' 카테고리의 다른 글
자바 풀 스택 12/20 오전 기록 022-1 (1) | 2024.12.20 |
---|---|
자바 풀 스택 12/19 오후 기록 021-2 (1) | 2024.12.19 |
자바 풀 스택 12/18 오후 기록 020-2 (1) | 2024.12.18 |
자바 풀 스택 12/18 오전 기록 020-1 (1) | 2024.12.18 |
자바 풀 스택 12/17 오후 기록 019-2 (1) | 2024.12.17 |