<14:30 5교시>

package test.main;

import test.mypac.Apple;
import test.mypac.FruitBox;
import test.mypac.Melon;
import test.mypac.Orange;

public class MainClass01 {
	public static void main(String[] args) {
		
		//Generic 클래스를 Apple 로 지정해서 객체 사용하기
		FruitBox<Apple> box1 =new FruitBox<Apple>();
		box1.pack(new Apple());
		Apple a1=box1.unPack();
		
		//Generic 클래스를 Orange로 지정해서 객체 사용하기
		FruitBox<Orange> box2 =new FruitBox<Orange>();
		box2.pack(new Orange());
		Orange o1=box2.unPack();
		
		//Generic 클래스를 Melon으로 지정해서 객체 사용하기
		//객체 생성시에 Generic은 생략 가능하다
		FruitBox<Melon> box3=new FruitBox<>();
		box3.pack(new Melon());
		Melon m1=box3.unPack();		
	}
}

 

 

<15:30 6교시>

package test.main;

import test.mypac.Apple;
import test.mypac.Pear;

public class MainClass02 {
	public static void main(String[] args) {
		
		
		/*
		 * key 값을 어떤 타입으로 설정할지?
		 * value값을 어떤 타입으로 설정할지?
		 * 위 두개를 결정해서 2가지 generic 클래스를 지정해야 함.
		 */
		//우리가 직접 generic 클래스를 쓸 일은 없지만 이미 만들어진걸 적절하게 사용할줄 알아야 한다.
		//Integer라는 포장을 씌워줘야지 int를 쓰면 int가 기본 데이터 타입이라서 에러가 난다.
		Pear<String, Integer> p1= new Pear<>("one", 100);
		String k1=p1.getKey();
		Integer v1=p1.getValue();
		
		Pear<String, Apple> p2= new Pear<>("two", new Apple());
		String k2=p2.getKey();
		Apple v2= p2.getValue();
		
	}
}

 

학원에서 작업한 내용은 바로 github에 등록되는데, 집에서 작업한 내용은 집 환경에도 있지만 깃허브에는 반영되도록 관리되지 않을 수 있는 것은 우클릭에서 Team 메뉴에서 Apply Fetch랑 Share Project 기능 밖에 없는데 Share Project를 눌러서 저장소를 새로 만들거나 해서 git hub에서도 관리될 수 있도록 할 수 있다. 학원에서도 이 폴더를 관리되게 하고 싶다면 폴더를 선택하고 finish 하면 git 저장소로 그 프로젝트가 납치(?)되어 옮겨 간다. 그 폴더는 집에서 만들어졌지만 학원에서 만든것처럼 실행가능하게 되는 것이다.

학원에 있는 git 저장소에서 pull 하면 내가 집에서 작업해서 옮겨간 폴더도 Working Tree로 들어와 있다. 내용을 볼려면 import projects를 진행해야 한다.

 

 

예제 풀어보기

package test.main;

import java.util.ArrayList;

public class MainClass01 {
	public static void main(String[] args) {
		//java에서 배열은 용도가 한정되어 있다. item을 담을 수 있는 공간을 늘리거나 줄일 수 없다.
		
		//문자열(String) type을 담을 수 있는 방 5개 짜리 배열 객체 생성
		String[] names =new String[5];
		names[0]= "name1";
		names[1]= "name2";
		names[2]="name3";
		
		ArrayList<String> friends = new ArrayList<>();
		//이름 3개를 순서대로 담아 보기
		friends.add(0, "name1");
		friends.add(1, "name2");
		friends.add(2, "name3");
		
		//0번방의 아이템을 불러와서 item이라는 변수에 담기
		String item = friends.get(0);
		
		//1번 방의 아이템을 삭제
		friends.remove(1);
		
		//0번 방에 "acorn" 끼워넣기
		friends.add(0, "acorn");
		
		//저장된 아이템의 갯수(size)를 size라는 지역 변수에 담기
		int size = friends.size();
		
		//저장된 모든 아이템 전체 삭제
		friends.removeAll(friends);
		
	}
}

 

 

<16:30 7교시>

객체는 필드와 메소드로 이루어져 있다. 객체를 생성한 이유는?

객체의 기능을 이용해 목적을 달성하기 위해서 객체를 생성한다.

어레이리스트라는 객체를 생성하면 재너릭을 지정하고 객체를 만들어서 배열 리스트를 활용할 수 있다.

 

전시간에 풀은 거거 답 풀이 중인데, 일단 거의 다 맞은거 같은데 흠.

 

아 마지막 하나 틀렸네.

//저장된 모든 아이템 전체 삭제

//friends.removeAll(friends);

friends.clear();

 

이거래.

 

 

 

다음 예제 혼자 풀어본거 : 일단 다 맞았음. 근데 확장  for문의 존재를 잊고 있었음.

package test.main;

import java.util.ArrayList;

public class MainClass02 {
	public static void main(String[] args) {
		//정수를 저장할 수 있는 ArrayList<Integer> 객체를 생성해서 참조값을 지역변수 nums에 담기
		ArrayList<Integer> nums = new ArrayList();
		
		//ArrayList 객체에 10, 20, 30 숫자 3개를 담기
		nums.add(0, 10);
		nums.add(1, 20);
		nums.add(2, 30);
				
		//ArrayList 객체에 저장된 숫자를 for 문을 이용해서 순서대로 콘솔창에 출력하기
		for (int i=0; i<nums.size(); i++) {
			System.out.println(nums.get(i));
		}
		
	}
}

 

 

선생님이랑 한거

저런거 보면 for문 마려워야함 + 확장 for 문 잊지 말기

package test.main;

import java.util.ArrayList;

public class MainClass02 {
	public static void main(String[] args) {
		//정수를 저장할 수 있는 ArrayList<Integer> 객체를 생성해서 참조값을 지역변수 nums에 담기
		ArrayList<Integer> nums = new ArrayList();
		
		//ArrayList 객체에 10, 20, 30 숫자 3개를 담기
		nums.add(10);
		nums.add(20);
		nums.add(30);
				
		//ArrayList 객체에 저장된 숫자를 for 문을 이용해서 순서대로 콘솔창에 출력하기
		for (int i=0; i<nums.size(); i++) { // 자바 스크립트에서 nums.length
			System.out.println(nums.get(i));
		}
		System.out.println("----확장 for 문을 이용하면 ----");
		for (int tmp: nums) {
			System.out.println(tmp);
		}
	}
}

 

 

예제 풀어보기 - 틀림 ㅎ 

for 확장문 안에 int  타입만 써야하는 줄 알고 헛짓거리 하고 있었음..ㅎㅎ

package test.main;

import java.util.ArrayList;

public class MainClass03 {
	public static void main(String[] args) {
		//인삿말을 담을 ArrayList 객체를 생성해서 참조값을 greets라는 지역변수에 대입하기
		ArrayList<String> greets = new ArrayList();
		
		//greets에 들어 있는 참조값을 이용해서 인사말 3개를 임의로 담기
		greets.add(0, "안녕");
		greets.add(1, "반가워");
		greets.add("Hello");
		//확장 for 문을 이용해서 모든 인사말을 콘솔창에 순서대로 출력해보세요
		for (int tmp: greets.get(tmp)) {
			;
			System.out.println(tmp);
		}
		
	}
}

 

 

<17:30 8교시>

예제 답

package test.main;

import java.util.ArrayList;

public class MainClass03 {
	public static void main(String[] args) {
		//인삿말을 담을 ArrayList 객체를 생성해서 참조값을 greets라는 지역변수에 대입하기
		ArrayList<String> greets = new ArrayList<>();
		
		//greets에 들어 있는 참조값을 이용해서 인사말 3개를 임의로 담기
		greets.add(0, "안녕");
		greets.add(1, "반가워");
		greets.add("Hello");
		//확장 for 문을 이용해서 모든 인사말을 콘솔창에 순서대로 출력해보세요
		for (String tmp: greets) {
			System.out.println(tmp);
		}
		
		
	}
}

 

 

 

방금 확장형  for 문으로 호출한 내용과 동일한 결과를 얻을 수 있는 새로운 형태

관련해서 염두에 둘 내용 : 오호라,  Consumer 라는 인터페이스로 객체를 생성해서 보니까 accept 라는 메소드를 하나만 갖고 있네? 그러니까 객체를 생성하는 방법으로 Consumer<String> con = ()->{};  방식으로 생성해도 되겠네? 를 염두에 두고 가자 다음에 계속해주신댔으니. 

package test.main;

import java.util.ArrayList;
import java.util.function.Consumer;

public class MainClass03 {
	public static void main(String[] args) {
		//인삿말을 담을 ArrayList 객체를 생성해서 참조값을 greets라는 지역변수에 대입하기
		ArrayList<String> greets = new ArrayList<>();
		
		//greets에 들어 있는 참조값을 이용해서 인사말 3개를 임의로 담기
		greets.add(0, "안녕");
		greets.add(1, "반가워");
		greets.add("Hello");
		//확장 for 문을 이용해서 모든 인사말을 콘솔창에 순서대로 출력해보세요
		for (String tmp: greets) {
			System.out.println(tmp);
		}
	
		System.out.println("------------");
		
		Consumer<String> con = new Consumer<String>() {
			
			@Override
			public void accept(String t) {
				// TODO Auto-generated method stub
				System.out.println(t);
			}
		};
		greets.forEach(con);
	
	}
}

 

 

이클립스로 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에 백업하고... 그러고 점심 시간오지 않을까 싶다..

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

 

 

 

 

 

 

+ Recent posts