오전 1,2시간 피그마를 배우고 그 후론 자바를 이어나간다.

 

피그마에서 유용한 검색어들

  • google material design icon
  • font awesome icons
  • feather icon
  • iconduck
  • open iconic

일단 피그마페이지에서 과부하로 아무것도 안뜨길래 그냥 아래 일들을 하기로 함.

자바2에 들어가면 스프링과 스프링부트를 사용한다고 해 맥을 쓰는 나는 또 설치방법에서 해맬게 분명하기 때문에 미리 설치하기로 함..

오전에 할 것

  • IntelliJ 설치 (완료)
  • JetBrains 학생인증 (완료)
  • 스프링부트까지 설치 (완료)

오후에 할 것 (일단 자습)

  • 노마드코더 강의 듣기 (완료)
  • 오늘 배운 자바 내용 복습 - 로또번호생성기 (완료)

 


약간의 딴짓을 하며 했던 것..

 

와 이제 스프링부트를 사용할 수 있다!

 

근데 이클립스에서는 어떻게 사용하지..

스프링부트는 이클립스에서 사용하는 법, 비주얼스튜디오코드에서 사용하는 법이 다 각각 있었다..!

각자 편한 곳에 설치해서 사용하면 될 듯한데 일단 해봤으니 어떤 툴에 사용할지는 강사님의 이야기를 들어보고 따라가야겠다.

 

vs코드 스프링부트 설치

 

[Spring Boot] vscode 개발 환경 구축하기 (MAC)

1. 배경 오늘은 스프링부트 개발환경 구축하기에 대해서 포스팅하겠습니다.

codingjalhaja.com

 

아마 나도 vs코드에 설치할듯해서 일단 참고 블로그 링크를 저장해둔다.

지금까지는 연습이었던 걸로..

 

추가로 깃에 대해 알아봤다. 


✨ Git, Github 사용방법

 

Git : 로컬에서 관리하는 버전관리시스템, 다른 사람이 나의 작업내용을 볼 수 없음

Github : 클라우드서비스로 다른 사람과 협업 시 소스코드 공유 가능

CLU : 명령어 인터페이스, 터미널을 통해 컴퓨터와 상호작용

GLU : 입출력 등의 기능을 아이콘으로 나타낸 것

local : 우리가 사용하고 있는 컴퓨터

remot : 원격저장소

repository (repo, 저장소) : 프로젝트가 존재하는 공간

branch : 저장소의 공간에서 독립적으로 작업하는 공간

commit : 소스코드의 업데이트가 확정된 순간 git repo에 저장, push 해주면 반응

pull : 원격저장소의 내용을 로컬장소에 끌어오는 것

push : commit한 내용을 원격저장소에 업로드



 

여기까지 하고 이렇게 딴 짓을 하다 피그마 놓친 부분이 좀 있지만..

비록 하필 오늘 결과물을 제출하는 날이었지만..

그냥 내 진도를 나가기로 한다.

주말 하루 반나절 정도 잡아서 지금까지 배운 거 복습할 겸 유튜브 강의 찾아보면 될 듯하다.

사실 그전에 시험을 볼 수도 있다; 이번 주에 볼 듯;;

시험 볼 때는 이모티콘 비슷한거라도 성실하게 넣기 + 디테일 챙기기

 

피그마를 하면서 어려웠던 부분 기록)

피그마에서 이미지 자동으로 넘기기

 

한참 헤맸는데 이렇게 하면 되는 거 였다.

참고)

 

무한 캐러셀(Carousel) 만들기

slide1부터 slide까지는 이런식으로바꿔준다.하늘색 부분을 slide1은 slide2로, slide2는 slide3으로, slide3은 slide4로slide4는 slide1로 Navigete to 해주고 시간은 100ms, Smart animate가 아닌 in

velog.io

 

감사합니다.. 늘 은인이 있구나!

 


드디어 다시 자바로 넘어갔다!

자바2

 

→ 객체지향

class 클래스명 {

-속성(변수)

-생성자(기본생성자)

-기능(메소드)

}

객체 → 속성 + 기능

 

collection framework (데이터 저장 방식)

컬렉션 프레임 워크 → 변수 (자료구조)

‘프레임워크’가 붙으면 사용방법이 구조화되어 있다는 뜻.

= 형태와 사용방법이 정해져있다.

  • List : 대표적인 클래스 ) ArrayList → 순서를 지켜 들어간다, 중복허용 O
  • Set : 대표적인 클래스 ) HashSet → 순서를 지키지 않는다, 중복허용 X
  • set - 로또번호생성기 같은 프로그램 만들때 좋음
  • Map : 대표적인 클래스 ) HashMap → 순서를 지키지 않는다,map - 데이터 관리할 때 좋다 (학생, 회원 등)
  • key와 value가 한쌍, key/value값 key → 중복허용 X value → 중복허용 O

위 세가지 자료구조를 기본적으로 자바에서 제공한다.

실제 존재하는 인터페이스 → 사용방식을 표준화 , 데이터를 관리하는 방식의 표준화

list 와 set 은 묶일 수 있음. → collection

상속 구조 정의가 이뤄진다.

공통의 특징 :

모든 collection framework 는 크기가 의미가 없다, object 타입이다.

 

ArrayList

: 배열에서 10개 이상의 값을 입력하면 알아서 늘려준다. 그렇기 때문에 크기는 큰 의미가 없어 지정하지 않는다.

데이터 관리의 핵심 - 읽고 쓰고 수정하고 삭제하기

package come.list;

import java.util.ArrayList;

public class ArraylistTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 읽고, 쓰고, 수정하고, 삭제하기
		
		ArrayList list = new ArrayList(); // 배열로 저장공간이 만들어진다.
		
		// 값 넣기
		list.add(new String("5"));
		list.add("1");
		list.add("4");
		list.add("2");
		list.add("3");
		list.add("3");
		
		// 읽기, 쓰기
		//list.get(0); // get 메소드 반환 타입은 object, 하지만 받는 타입은 String 때문에 형변환을 해야한다.
		String s1 = (String)list.get(0);
		String s2 = (String)list.get(4);
		String s3 = (String)list.get(5);
		
		System.out.println(s1); // 5  -> toString() 오버라이딩 되어 있음.
		System.out.println(s2); // 3
		System.out.println(s3); // 3  -> 중복 허용 
		
		// 수정하기
		list.set(3, "AA");
		String s4 = (String) list.get(3);
		System.out.println(s4); // AA 
		
		
		// 배열의 크기 알아보기
		System.out.println(list.size()); // 6 사이즈 크기를 반환해준다.
		
		// 삭제하기
		list.remove(5);
		System.out.println(list.size()); // 5 
		
		// 중간데이터 삭제
		list.remove(2);
		
		System.out.println(list.get(2)); // AA
		System.out.println(list.get(3)); // 3
		//System.out.println(list.get(4)); // 에러남. 값이 없다. 


	}

}

 

 

Linked List 연결리스트

주소값을 사용

클래스의 데이터를 관리하는 방식

(순서대로 데이터를 처리할때는 ArrayList , 데이터를 차례로 처리한다.

때문에 중간에서 데이터를 처리하는 것은 굉장히 느리다.)

Linked List는 주소값을 바로 찾는다.

바로 연결 → 중간 데이터 처리 빠름

package come.list;

import java.util.ArrayList;

public class ArraylistTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 읽고, 쓰고, 수정하고, 삭제하기
		
		ArrayList list = new ArrayList(); // 배열로 저장공간이 만들어진다.
		
		// 값 넣기
		list.add(new String("5"));
		list.add("1");
		list.add("4");
		list.add("2");
		list.add("3");
		list.add("3");
		
		//linked List
		
		for (int i = 0; i <list.size(); i++) {
			String s = (String)list.get(i);
			System.out.println(s); // 5 1 3 4 2 3 3 들어간 순서 그대로 출력되는 것을 알 수 있다.
		}

 

나머지는 api 에서 찾아서 써보기

 

 

기본형을 참조형으로 바꾸는 방법 :

래퍼 클래스(Wrapper Class)를 사용 → auto boxing

package come.list;

import java.util.ArrayList;

public class ArraylistTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 읽고, 쓰고, 수정하고, 삭제하기
		
		ArrayList list = new ArrayList(); // 배열로 저장공간이 만들어진다.
		
		
		// auto boxing
		// 1,2,3,4,5
		// Integer(1) -> 박싱
		// Integer i = 3 -> 자동캐스팅으로 가능
		// Object obj = 3 -> Object obj = new Integer(3); 같은 뜻		
		
		list.add(new Integer(1));  // new Integer 생략 가능
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		list.add(6);
		list.add(7);
		list.add(8);
		list.add(9);
		list.add(10);
		
		int sum = 0;
		
		for (int i = 0; i < list.size(); i++) {
			int num = (Integer)list.get(i);
			sum += num; 
		}
		
		System.out.println(sum); // 55

 

향상된 for문은 데이터를 읽을 때 사용

// 향상된 for문
		for (Object obj : list) {
			int i = (Integer)obj;
			sum += i;
		}
		
		System.out.println(sum); // 55

 

 

 

리스트의 특성을 따르는 자료구조, 스택과 큐

Stack 에 대해 알아본다.

 

Stack 구조

들어 오는 곳 나가는 곳이 한 곳, LIFO : 가장 늦게 들어온 것이 가장 먼저 사용된다

(class 제공이 됨)

 

Queue 구조

들어오는 곳, 나가는 곳 따로 있음, FIFO : 먼저 들어온 것이 먼저 나온다

(인터페이스)

peek() 가장 최근의 값 읽어오기

pop() 삭제하며 읽어오기, 데이터가 없는데 pop()을 하면 오류가 발생한다!

→ 오류를 방지하기 위해 데이터가 있는지 없는지 체크하거나

→ 예외처리를 사용

 

 

pop()과 empty() 사용

package come.list;

import java.util.Stack;

public class StackTest {

	public static <E> void main(String[] args) {
		// TODO Auto-generated method stub
		
		Stack st = new Stack();
		
		st.push("0");
		st.push("1");
		st.push("2");
		
		while(!st.empty()) {
			System.out.println(st.pop()); // 2 1 0 반대로 읽어온다
		}
		
		
	}

}

 

peek()과 search() 사용

package come.list;

import java.util.Stack;

public class StackTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Stack st = new Stack();
		
		st.push("0");
		st.push("1");
		st.push("2");
		
//		while(!st.empty()) {
//			System.out.println(st.pop()); // 2 1 0 반대로 읽어온다
//		}
		
		if (!st.empty()) {
			System.out.println(st.peek()); // 2 가장 최근에 추가된 값
			System.out.println(st.search("0")); // 3  
			// search는 인덱스를 반환하는 것이 아니라 순번을 반환한다. 
			// search의 인자 값으로 받은 값이 스택구조에서 몇번째 있는지 반환
			// 스택구조 -> LIFO : 가장 늦게 들어온 것이 가장 먼저 사용된다
			// 가장 먼저 들어간 것이 가장 아래부터 쌓이면 위에서부터 순번 부여
		}
		
	}

}

 

System.out.println(st.search(0)); 을 넣었을 때 없는 값인데 -1 이 나온 이유

→ 퐁규의 답변 :

코드에서 System.out.println(st.search(0));**를 실행했을 때 -1이 나오는 이유는 search 메서드가 0이라는 정수 값을 찾기 때문입니다. 하지만 스택에는 문자열 "0"이 들어있기 때문에 일치하는 값을 찾지 못해서 -1을 반환합니다.

Stack 클래스의 search 메서드는 객체를 찾을 때 해당 객체가 스택에 존재하면 1부터 시작하는 위치를 반환하고, 존재하지 않으면 -1을 반환합니다. 따라서, "0"이라는 문자열을 찾아야 합니다.

잘못넣었는데 값이 나와서 뭔지 궁금해서 gpt한테 물어봄.

 

결과적으로 search()는 값이 없으면 -1 를 반환한다.

 

 

오늘 배운 것을 복습하며 로또번호 생성 프로그램을 만들어보자

 

(팀원이 내준 숙제)

// 정수형 배열리스트 al

// 1~45까지 리스트에 추가

// 랜덤으로 6개를 삭제하며

// 또 따른 배열리스트 lotto에 추가

// lotto 출력

 

초기 코드 :

package come.list;

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

public class LottoNum {

	public static void main(String[] args) {
		// 정수형 배열리스트 al
		// 1~45까지 리스트에 추가
		// 랜덤으로 6개 삭제하며
		// 또 따른 배열리스트 lotto에 추가
		// lotto 출력
		
		// 정수형 배열리스트 al 
		ArrayList<Integer> al = new ArrayList<Integer>();
		// 배열리스트 lotto 6개의 값을 받는 곳
		ArrayList<Integer> lotto = new ArrayList<Integer>();
		
		// 랜덤클래스 생성
		Random rand = new Random();
		
		// 45개의 로또번호 al에 넣기
		for (int i = 1; i <= 45; i++) {
			 al.add(i);
		}
		
		//System.out.println(al);
		
		// 로또번호 6개의 값이 들어갈 공간
		for (int i = 0; i <= 5; i++) {
			lotto.add(i);	
		}
		
		lotto.set(0, rand.nextInt(45));
		lotto.set(1, rand.nextInt(45));
		lotto.set(2, rand.nextInt(45));
		lotto.set(3, rand.nextInt(45));
		lotto.set(4, rand.nextInt(45));
		lotto.set(5, rand.nextInt(45));
		
		
		System.out.println("lotto 번호: " + lotto);
		

	}

}

처음에 하다가 저 삭제한다는게 어디서 왜 삭제를 한다는건지 문제를 이해 못하고 그냥 로또번호 생성이면 금방인데 오늘 배운 걸 쓰려니까 어떻게 하는 건지도 모르겠고.. 꼬이고 꼬여 그냥 값만 나오게 만들었던 코드다.

al를 사용하지 않았고, set 도 for문으로 처리할 수 있는데 사용을 안한 그냥 성의가 없는 상태..

이걸 다시 정신차리고 바꿔보자.

하면서 생각해보니, 문제에서 ‘랜덤으로 6개를 삭제하며’라는 게 중복제거를 위한 거라는 걸 알게됐다! ㅋ

 

완성된 코드 :

package come.list;

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

public class LottoNum {

	public static void main(String[] args) {
		// 정수형 배열리스트 al
		// 1~45까지 리스트에 추가
		// 랜덤으로 6개 삭제하며
		// 또 따른 배열리스트 lotto에 추가
		// lotto 출력
		
		// 정수형 배열리스트 al 
		ArrayList<Integer> al = new ArrayList<Integer>();
		// 배열리스트 lotto 6개의 값을 받는 곳
		ArrayList<Integer> lotto = new ArrayList<Integer>();
		
		// 랜덤클래스 생성
		Random rand = new Random();
		
		// 45개의 로또번호 al에 넣기
		for (int i = 1; i <= 45; i++) {
			 al.add(i);
		}
		
		// 로또번호 6개의 값이 들어갈 공간만들기
		// 공간에 al의 크기 범위 안 랜덤값 6개 받기 (al의 크기 = 길이 = 45까지 들어간 값) 
		for (int i = 0; i < 6; i++) {
			int index = rand.nextInt(al.size());
			// al에서 중복값 제거를 위해 lotto에 넣어진 index는 삭제
			lotto.add(al.remove(index));
		}
		
		System.out.println("lotto 번호: " + lotto);

	}

}

 

문제를 잘 이해하고 모르면 출제자에게 정확하게 물어보는게 시간을 아끼는 법.. 이다!

+ Recent posts