Flaming Soccer ball
JAVA

25일차 22.10.26

leo lee 2022. 10. 26.
반응형

**Git Hub에 프로젝트 소스코드 업로드
1.용어
-> repository : 저장소, 가장 큰 개념의 저장소 
-> branch: 저장소 안에 변경 내용을 저장하는 저장점
-> merge: branch를 통합 - pull request라고 함
-> commit: 변경 내용을 로컬 git에 반영
-> push: 변경 내용을 웹의 git에 반영
-> pull: 서버에서 변경 내용을 받아옴

2. git hub에서 토큰을 생성
-> 최근에는 아이디와 비밀번호로 계속해서 로그인하지 않고 처음 한 번만 아이디와 비밀번호를 이용해서 로그인하고 
token을 발급 받아서 token을 이용해서 로그인 여부를 판단하는 방식을 많이 사용(**매우 중요)
-> Git Hub 사이트에 로그인
-> 오른쪽 상단의 이미지 부분을 클릭해서 [settings 메뉴 실행]
-> 다음 화면에서 왼쪽 하단의 [Developer settings 메뉴를 실행] OAuth(방법?)
-> personal access tokens 클릭해서 classic token 클릭
-> generated tokens를 클릭한 후 옵션을 설정한 후 나오는 토큰을 확인 - 한 번만 보여주므로 어딘가에 복사해서 사용
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 

3. eclipse의 경우에는 github에서 repository를 먼저 생성한 후 업로드 하므로 repository 생성하고 URL 복사
-> main 페이지 에서 new를 누르고 repository 이름을 작성
https://github.com/srlee3637/20221025.git

4. 프로젝트 업로드
1) eclipse에서 [window] - [show view] - others 선택하고  [git] 에서 git repository를 선택

2) git repository 창에서 clone a git repository 나 녹색 화살표가 있는 아이콘을 클릭 후 url 붙이기 

3) 프로젝트에 git을 연결
프로젝트를 선택하고 마우스 오른쪽을 누른후  [Team] - [Share Project] - repository 선택

4)변경 내용을 서버에 전송
프로젝트를 선택하고 마우스 오른쪽 누른 후 [Team] - commit을 누르고 적용할 파일들을 아래로 드래그 하고 메세지를 입력한 후 
commit and puch 누르고 아이디와 토큰 번호 입력

5)웹 서버 확인

5. eclipse에서 생성한 프로젝트 가져오기
1) 가져올 repository를 확인 
https://github.com/srlee3637/20221025.git

2) Eclipse에서 [File] - [Import]를 누른 후 [Git]에서 [Projects from Git]을 선택한 후 [clone URL]을 누르고 repsitory를 입력 next를 한다.

 

-> 에러가 발생하는 경우가 있는데 이 경우는 대부분 동일한 이름의 프로젝트나 로컬 git이 존재해서이다.

6. Branch 만들어서 저장
-> 프로젝트에서 마우스 오른쪽 누르고 [Team] - [Switch to] - [New Branch] 생성
-> 새로운 Branch에 Commit and push를 하면 새로운 Branch에 저장

package naming -> 최소 3단 -> com.회사이름.들어가는 프로젝트명
개인은 이메일주소.이메일아이디.프로젝트명


10/26 수업
1.List
1)Stack : List 구조


데이터 삽입: push
데이터 가져오기: pop - top의 위치의 데이터를 삭제하고 가져옴
만약 데이터가 없는데 pop을 하면 Underflow
더이상 저장할 공간이 없는데 push하면 Overflow
용도: 함수의 데이터를 저장 

Stack은 함수, 메서드, { } 자기 역역이 끝나면 소멸 - local이라고함 
Heap은 개발자가 사용하는 영역(Instance) & Static영역(Class, 상수 : 프로그램 끝날 때까지 안 사라짐)으로
개발자가 사용하는 영역은 직접 접근할 수 없기 때문에 Stack을 사용해서 접근한다. ex) String str = new String( ), str.length( ) 등등
String str -> Stack 영역 
new String( ) -> 개발자가 사용하는 영역

 

=>실습을 위한 VO 클래스 생성

package naver.srlee3637.stack;

import java.util.Date;

//여러 개의 값을 묶어서 표현하기 위한 클래스 - Value Object(VO)
//getter 와 constructor는 만들지만 setter는 만들지 않는 경우가 많음
public class PersonVO {
	//번호, 이름, 생일, 전화번호 저장
	private long num;
	private String name;
	private Date birthday;
	private String phone;
	
	//매개변수가 없는 생성자 - default constructor
	//NoArgsConstructor
	public PersonVO() {
		super();
	}

	//AllArgsConstructor
	public PersonVO(long num, String name, Date birthday, String phone) {
		super();
		this.num = num;
		this.name = name;
		this.birthday = birthday;
		this.phone = phone;
	}

	//오직 getter - 읽기용 
	public long getNum() {
		return num;
	}

	public String getName() {
		return name;
	}

	public Date getBirthday() {
		return birthday;
	}

	public String getPhone() {
		return phone;
	}

	//값을 빠르게 확인하기 위한 메서드
	//디버깅을 위한 메서드 - 개발 과정 중 값을 확인 하기 위한 목적(개발이 끝나면 필요없어짐)
	@Override
	public String toString() {
		return "PersonVO [num=" + num + ", name=" + name + ", birthday=" + birthday + ", phone=" + phone + "]";
	}

	
	
	
	
	
	

}

=>실행을 위한 Main 클래스 생성하고 main 메서드를 작성한 후 실행

package naver.srlee3637.stack;

import java.util.Date;
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		//PersonVO 클래스의 인스턴스를 저장할 수 있는 Stack을 생성
		Stack<PersonVO> stack = new Stack<>();
		//stack에 데이터를 저장 -push
		stack.push(new PersonVO(1, "카리나", new Date(100, 3, 11), "01011112222"));
		stack.push(new PersonVO(2, "민지", new Date(104, 5, 7), "01033334444"));
		
		
		//Stack에서 데이터 꺼내기 - pop
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		//데이터가 2개 존재해서 2번 pop을 하면 모두 제거된 상태인데
		//pop을 수행해서 Underflow 발생 - 프로그램에서는 예외 발생 
		//System.out.println(stack.pop());
	}

}



2) Queue
-> First In First Out(선입 선출): 먼저 삽입한 데이타가 먼저 출력된다.
-> 삽입되는 위치와 삭제되는 위치가 반대
이 위치를 rear와 front라고 함
-> 스케줄링에 주로 이용
-> java에서는 인터페이스 형태로 제공
List가 존재하기 때문에 ArrayList나 LinkedList로 Queue 역할 수행 
-> Queue 인터페이스를 implements한 priorityQueue 클래스 제공
이 클래스는 데이터를 정렬해서 순서대로 찾아갈 수 있도록 해주는 클래스 
정렬해서 저장하기 때문에 삽입되는 객체는 비교할 수 있는 메서드가 존재하거나 비교 방법을 제공을 해줘야함

 

=>실습

package naver.srlee3637.queue;

import java.util.Comparator;
import java.util.Date;
import java.util.PriorityQueue;

import naver.srlee3637.stack.PersonVO;

public class Main {

	public static void main(String[] args) {
		//PriorityQueue는 데이터를 정렬된 순서대로 꺼낼 수 있도록 해주는 클래스
		//PriorityQueue 실제로는 Tree구조이다
		//검색: 순차검색, 제어 검색, 해싱검색
		
		//정수를 저장하는 PriorityQueue를 만들어서 출력
		PriorityQueue<Integer> intQueue = 
				new PriorityQueue<>();
		
		//데이터 저장
		intQueue.offer(100);
		intQueue.offer(70);
		intQueue.offer(90);
		
		System.out.println(intQueue);
		//데이터 꺼내기 - 크기 순서대로 나온다
		System.out.println(intQueue.poll());
		System.out.println(intQueue.poll());
		System.out.println(intQueue.poll());
		System.out.println(intQueue.poll());
		
		//PersonVO 클래스를 저장하는 우선순위 큐
		//이 상태에서 만들면 PersonVO의 크기 비교를 할 수 없기 때문에 예외 발생
		//PriorityQueue<PersonVO> persons = new PriorityQueue<>();
		
		//PersonVO 클래스에 Comparable 인터페이스를 implements하고 
		//compareTo라는 메서드를 재정의해서 해결할 수 있고,
		
		//Comparator 인터페이스를 대입받을 수 있는 경우에는 Comparator인터페이스를 
		//구현한 클래스의 인스턴스를 이용해서 생성해도 됩니다.(이 방법을 더 권장함) 
		//기존의 것들을 손대는 건 위험하기 때문에 이걸 건들여야한다.
		//★★★★★★★★★★★★★★★★정렬을 할 때는 무조건 크기 비교를 할 수 있어야 한다★★★★★★★★★★★★★★★★★
		PriorityQueue<PersonVO> persons = new PriorityQueue<>(new Comparator<PersonVO>() {

			@Override
			public int compare(PersonVO o1, PersonVO o2) {
				return o1.getBirthday().compareTo(o2.getBirthday());
			}
			
		});
		
		persons.offer(new PersonVO(
				1, "강진축구", new Date(100, 9, 10), "01011112222"));
		persons.offer(new PersonVO(
				2, "프리스톤테일", new Date(102, 5, 1), "01033334444"));
		persons.offer(new PersonVO(
				3, "아담", new Date(97, 1, 3), "01055556666"));
		
		System.out.println(persons.poll());
		System.out.println(persons.poll());
		System.out.println(persons.poll());
		System.out.println(persons.poll());
		//tree 구조 이기 때문에 tree는 마지막에 nil을 저장해서 끝인 걸 표현해줌
		//따라서 값이 없을 경우에 Underflow가 나는 것이 아니라 null을 반환
	}

}



3) List 구조들의 정렬
-> List 구조에 저장되는 데이터가 정렬을 수행하기 위해서는 비교할 수 잇는 방법이 제공 되어야함

=> 실습

public class Main {

	public static void main(String[] args) {
		//PriorityQueue는 데이터를 정렬된 순서대로 꺼낼 수 있도록 해주는 클래스
		
		//정수를 저장하는 PriorityQueue를 만들어서 출력
		PriorityQueue<Integer> intQueue = 
				new PriorityQueue<>();
		//데이터 저장
		intQueue.offer(100);
		intQueue.offer(70);
		intQueue.offer(90);
		
		//데이터 꺼내기
		System.out.println(intQueue.poll());
		System.out.println(intQueue.poll());
		
		//PersonVO 클래스를 저장하는 우선순위 큐
		//이상태에서 만들면 PersonVO의 크기 비교를 할 수 없기 때문에 예외 발생
		//PriorityQueue<PersonVO> persons = new PriorityQueue<>();
		
		
		//PersonVO 클래스에 Comparable 인터페이스를 implements 하고 
		//compareTo 라는 메서드를 재정의해서 해결할 수 있고
		
		//Comparator 인터페이스를 대입받을 수 있는 경우에는 Comparator 인터페이스를
		//구현한 클래스의 인스턴스를 이용해서 생성해도 됩니다.
		PriorityQueue<PersonVO> persons = 
				new PriorityQueue<>(new Comparator<PersonVO>() {

					@Override
					public int compare(PersonVO o1, PersonVO o2) {
						return o2.getBirthday().compareTo(o1.getBirthday());
					}
					
				});
		
		persons.offer(new PersonVO(
				1, "강진축구", new Date(100, 9, 10), "01011112222"));
		persons.offer(new PersonVO(
				2, "프리스톤테일", new Date(102, 5, 1), "01033334444"));
		persons.offer(new PersonVO(
				3, "아담", new Date(97, 1, 3), "01033334444"));
		
		System.out.println(persons.poll());
		System.out.println(persons.poll());
		System.out.println(persons.poll());
		
	}

}



4) Deque
-> 양쪽에서 삽입과 삭제가 가능한 자료구조
-> 스크롤이 가능한 뷰들이 이 Deque를 이용해서 구현이 되어 있음
-> java에서는 인터페이스로 제공하고 ArrayDeque라고 하는 클래스에서 구현을 해둠


2. Set
-> 데이터를 중복없이 저장하는 자료구조 인터페이스
-> 해싱을 이용하기 때문에 데이터의 저장 순서도 기본적으로는 알 수 없음
-> 저장 순서를 알 수 없기 때문에 하나의 요소를 가져오는 메서드를 제공하지 않음

1) 구현된 메서드
-> Iterator가 있어서 데이터를 하나씩 가져오지는 못하지만 순서대로 하나씩 접근하는 것은 가능
-> 추가, 삭제 등을 위한 메서드도 제공

2) 구현된 클래스
-> HashSet: 기본이 되는 Set을 구현한 클래스, 보통의 경우 Set이라고 하면 HashSet을 의미
-> LinkedHashSet: 데이터가 저장된 순서를 기억하는 Set
-> TreeSet: 오름차순 정렬한 순서를 기억하는 Set, 크기 비교하는 방법을 제공하는 클래스의 데이터만 저장 가능
Tree라는 말이 나오면 크기 비교라는 것을 기억해야함(크기 순서를 저장하는게 아니라 크기를 기억하는 것이다) 

3) Set 클래스 비교
=> 실습 

public class SetClassCompare {

	public static void main(String[] args) {
		//문자열을 저장하는 Set 인스턴스를 3개 생성
		Set<String> hashSet = new HashSet<>();
		Set<String> linkedHashSet = new LinkedHashSet<>();
		Set<String> treeSet = new TreeSet<>();

		//샘플 데이터 삽입
		hashSet.add("LG EDS");
		linkedHashSet.add("LG EDS");
		treeSet.add("LG EDS");

		hashSet.add("adamsoft");
		linkedHashSet.add("adamsoft");
		treeSet.add("adamsoft");

		hashSet.add("39");
		linkedHashSet.add("39");
		treeSet.add("39");

		hashSet.add("Triglows");
		linkedHashSet.add("Triglows");
		treeSet.add("Triglows");

		hashSet.add("SM");
		linkedHashSet.add("SM");
		treeSet.add("SM");

		hashSet.add("Choongang");
		linkedHashSet.add("Choongang");
		treeSet.add("Choongang");

		hashSet.add("KB");
		linkedHashSet.add("KB");
		treeSet.add("KB");

		hashSet.add("Kakao");
		linkedHashSet.add("Kakao");
		treeSet.add("Kakao");

		//데이터 출력
		//HashSet : 어떤 순서로 출력될 지 예측할 수 없음
		for(String company : hashSet) {
			System.out.print(company + "\t");
		}
		System.out.println();
		//LinkedHashSet : add 한 순서대로 출력됨
		for(String company : linkedHashSet) {
			System.out.print(company + "\t");
		}
		System.out.println();
		//TreeSet : 정렬한 순서대로 출력되는데 숫자가 영문자보다 작고 대문자가 소문자보다 작음
		for(String company : treeSet) {
			System.out.print(company + "\t");
		}
		System.out.println();


	}

}



4)1-45까지의 랜덤한 숫자를 중복없이 6개를 저장하고 순서대로 출력하기
-> ArrayList와 HashSet을 사용했을 때의 차이

package naver.srlee3637.set;

import java.util.ArrayList;
import java.util.Random;
import java.util.TreeSet;

public class Lotto {

	public static void main(String[] args) {
		//랜덤한 숫자를 추출하기 위한 인스턴스 생성
		Random r = new Random();	
		//ArryList 활용
		ArrayList <Integer> al = new ArrayList<>();	
		//ArrayList 의 size 가 6보다 작을 때 까지
		while(al.size() < 6) {
			//1-45 까지의 숫자를 랜덤하게 추출
			int su = r.nextInt(45) + 1;
			//중복 검사를 해서 통과하면 add 하고 통과하지 못하면 add 수행하지 않음
			if(al.contains(su)) {
				continue;
			}
			al.add(su);
		}
		//출력하기 전에 정렬
		al.sort(null);
		
		System.out.println(al);
		
		//TreeSet: 중복된 데이터를 저장하지 않고 저장된 순서를 기억합니다.
		TreeSet<Integer> treeSet = new TreeSet<>();
		while(treeSet.size() < 6) {
			//1-45 까지의 숫자를 랜덤하게 추출
			int su = r.nextInt(45) + 1;
			//TreeSet은 중복된 데이터를 저장하지 않기 때문에 검사할 필요가 없음
			treeSet.add(su);
		}
		for(Integer i : treeSet) {
			System.out.printf(i+"\t");
		}
		
		

	}

}




3. Map = HashTable = Dictionary
-> Key와 Value를 한꺼번에 저장하는 자료구조 인터페이스
-> 인스턴스를 생성할 때 Key와 Value의 자료형 2개를 설정해야 함
특별한 경우가 아니면 Key의 자료형은 String
Value의 자료형은 모든 종류의 데이터를 저장하고자 하는 경우는 Object로 하고 그렇지 않은 경우는 저장하고자하는 데이터의 자료형을 설정하면 된다
Map<Key 자료형, Value 자료형> 변수명 =

1) 메서드
-> Value put(key, value): Map에 데이터를 저장하는 메서드인데 이미 존재하는 key를 사용하면 추가 되는 것이 아니고 수정됨
-> Value get(key): key에 해당하는 value 리턴, java에서는 없는 key를 사용하면 null 리턴
-> Value remove(key): key에 해당하는 데이터 삭제 
-> Set<Key> keySet( ): key들을 Set으로 리턴, Map에 저장된 모든 데이터를 순회하고자 하는 경우 이용

2) Map을 구현한 클래스
-> HashMap: key를 HashSet 형태로 보관
-> LinkedHashMap: key를 LinkedHashSet 형태로 보관
-> TreeMap: key를 TreeSet형태로 보관

3) 용도
-> 여러 데이터를 하나로 묶어서 표현하기 위한 용도로 사용
-> 최근에는 되도록이면 Map 대신에 VO(DTO 나 Entity) 클래스를 만들어서 사용하는 것을 권장

4) Map을 이용한 데이터 저장과 읽어오기


=>실습

package naver.srlee3637.map;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Main {

	public static void main(String[] args) {
		//HashMap 인스턴스 생성
		Map<String, Object> map = new HashMap<>();
		
		//Map에 데이터 저장 - put
		map.put("num", 1);
		map.put("name", "아담");
		map.put("job", "Singer");
		map.put("my", new Date(100, 10, 3));
		
		//동일한 Key에 데이터를 저장하면 이전 데이터가 삭제되고 수정됨
		map.put("job", "Cyber Singer");
		
		//전체 데이터 확인
		System.out.println(map);
		
		//key값의 데이터 확인 - map.get(key)
		System.out.println(map.get("name"));
		
		//존재하지 않는 key를 사용하면 java는 null을 리턴, javascript에서는 undefined가 나옴, python은 error발생 
		System.out.println(map.get("age"));
		
		//Map을 이용하면 key의 이름을 몰라도 모든 데이터를 접근하는 것이 가능
		
		//모든 key에 접근할 수 있는 set을 가져오기
		Set<String> keys = map.keySet();
		//Set을 순회
		for(String key: keys) {
			//key를 순회하면서 key에 저장된 value를 확인
			System.out.println(key + ":" + map.get(key));
		}
		
	}

}



5) Map 학습 방법
-> 응용 프로그램 개발자가 될 거라면 Map을 만들어서 데이터를 저장하고 가져오는 것만 할 수 있으면 됨
가져올 때는 없는 key를 사용했을 때 어떤 데이터가 리턴되는지 또는 에러가 발생하는지 확인할 수 있어야함

-> 프레임 워크나 솔루션을 만드는 개발자가 되려고 하면 Map의 많은 메서드를 사용해보고 이를 활용할 수 있어야함

6) properties
-> Map과 유사한데 Key의 자료형과 Value의 자료형이 String만 가능
-> 환경 설정을 할 때 사용
예전에는 환경 설정을 할 때 대부분 텍스트 파일에 key와 value형태로 작성을 해두고 이를 읽어서 사용하는 경우가 많았음
그 시절에 사용하던 클래스임
최근에는 XML이나 YAML을 많이 사용하기 때문에 사용빈도는 많이 줄어들었지만, 아직도 이 형태로 설정하는 경우가 있음 
Spring의 지역화나 Spring Boot Project의 기본 환경 설정(최근에는 YAML로도 가능)이 대표적임
-> 메서드
String getProperty(String key)
String setProperty(String key, String value)
void store(OutputStream out, String comment): 파일이나 외부 서버에 저장
void storeToXML(OutputStream out, String comment): 파일이나 외부 서버에 저장

 

=>실습

package naver.srlee3637.properties;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class Main {

	public static void main(String[] args)  {
		//프로퍼티스 인스턴스 생성
		Properties properties = new Properties();
		//없는 키를 사용하면 null이 리턴
		System.out.println(properties.getProperty("name"));
		
		//프로퍼티스에 프로퍼티를 저장
		properties.setProperty("아담", "한국 최초의 사이버 가수");
		properties.setProperty("강진축구", "세계 최초의 온라인 축구 게임");
		properties.setProperty("프리스톤테일", "한국 최초의 자체 3D 엔진 MMOR");
		
		//텍스트 파일로 저장
		try {
			properties.store(new FileOutputStream("./myproject.properties"), "텍스트로 저장");
		}catch(Exception e){
			System.out.println(e.getMessage());
		}
		//예외처리를 해야함 - 자바가 만든게 아닌거를 사용할 때는 예외처리 
		//(file handling, 외부 서버와 네트워크 작업할 때, 데이터베이스 작업할 때) 이 3가지는 무조건 예외처리를 해야함
		System.out.println(properties);
	}

}

이게 properties로 생성된 경우

XML로 생성된 경우



★절대로 잊어버리지 말고 기억해두어야 할 것★
환경 설정을 다른 파일에 하는 이유? Source Code를 변경하면 후에 문제가 발생할 여지가 다분함. 
-> 이 문제를 해결하기 위해서 Resource에 적는게 properties이고 최근에는 YML에 작성
- 데이터 베이스를 사용하는 이유

Code - Source Code(.java) 와 Resources(.java를 제외한 모든 파일)로 나뉨   
모든 Source Code는 compile(번역)을 거침 -> .class가 만들어짐 
.class 와 Resources가 합쳐저서 Build를 하고 실행 코드 생성 -> 실행 코드 실행
Source Code는 배포되는게 아님 .class가 배포되는 거임

개발 환경 - Source코드를 만들고 있는 환경(개발하고)

운영 환경 - data가 있는 환경(운영하고)

개발환경과 운영환경의 차이를 극복하기 위해서는?
- 개발 == 운영이라면 방금 같은 문제가 안생긴다. 이게 Cloud, 가상화(Docker + kubernetes(쿠버네티스))
Linux 필수로 사용, 젠킨스, 지라

★★★
.properties
.xml
.json
.yml
.gradle
spring boot에 react 붙여서 만들기! 
Cloud, Docker, 쿠버네티스 하기!

**project를 3개정도 하는 경우
-> Spring Legacy Project?
-> Spring Boot + JPA를 이용해서 REST API Server를 구축하고 reat나 vue를 이용해서 Client Application을 구축
-> Google의 Firebase나 AWS의 람다를 이용한 SeverLess나 AWS의 S3를 이용한 별도의 파일 업로드 서버를 구축
 
사용법을 알아두면 좋은 것들
-> Git Hub: 필수
-> Linux
-> Docker & Kubernetes
-> Jenkins
-> JIRA




























 

반응형

'JAVA' 카테고리의 다른 글

27일차 22.10.28  (0) 2022.10.28
26일차 22.10.27  (0) 2022.10.27
24일차 22.10.25  (0) 2022.10.25
23일차 22.10.24  (0) 2022.10.24
19일차 22.10.18  (0) 2022.10.18

댓글