Confusing things:

개념화된 데이터를 사용하는것

 

코드의 집중화 및 재사용

  • 집중화 : 함수를 생성한 곳만 수정하면 호출한 부분에서는 자동으로 업데이트 된다. (print()메소드를 Program 클래스에서 한번만 적고, 수정하면 호출했던 main클래스의 내역도 자동으로 반영된다. (코드를 줄일 수있다)
  • 재사용: 다양한 프로그램개발에 따른 코드 재사용이 가능하다. 로또 프로그램을 콘솔,웹,앱 등에 맞게 다시 만들 필요없이 Lotto class를 통해 재사용을 할 수있다. (첫번째 사진의 오른쪽)

 

데이터입력과 출력의 분리. 클래스분리

데이터를 만들어내는 부분은 재사용이 가능

다른클래스에있는 함수호출

lotto = Lotto.gen();  Lotto클래스의 gen()함수를 불러와서 lotto에 대입.

성을 붙여서 부르듯이 Lotto.get()로 불러줘야한다.

같은울타리(같은 클래스)에있는 메소드는 메소드이름만으로 호출가능

 

 


실행코드 재사용

새로운 프로젝트 생성 -> Program 클래스생성

함수를 재사용한다는 두가지로 볼 수 있다.

1. 소스코드 재사용 : 소스코드가 모두 오픈되어야 한다.

2. 실행코드 재사용 :컴파일된 결과물을 재사용.(바이너리코드

자바 실행파일 재사용/ jar파일 생성/ 외부 jar파일 추가하기

(소스코드를 컴파일한 결과물.class을 압축하고 재사용 할 예정)

 

jar파일을 libraries에 반영하면 lotto = Lotto.get();하면 정상반영된다.

만약 에러가 뜬다면 기존 jar파일의 메소드가 public으로 설정되어있는지 확인한다. 

gen(), sort()를 직접만들지않고, 컴파일된 압축파일을 이용해 출력이 가능하다.

접근제한자가 걸린메소드를 반영하면 에러가뜬다.
컴파일된 결과물 재사용했을때 정상작동 되는 모습

불러온 gen(), sort()메소드는 소스코드를 확인할 수없다.


구조체 / class 생성 / 데이터를 묶어서 관리

배열을 바로출력 vs 변수로 출력 (구조체)

추가 문제점이 발생한다. int[] 정수배열이 lotto인가 ?

기본형식을 가지는것보다 데이터는 개념화된 데이터가 코드안에 묻어나야한다.

ex, 학생,주문,사원,발주 등 정수배열, 문자배열이겠지만 단위를 묶어서 의미가있는 단위로 쓰는게 바람직하다. (유지보수에도 이점)

개념단위데이터로 표현

Lotto lotto ; 로 자료형을 정의한다.

 

더큰 단위의 개념적인 것을 정의해서 써왔다. (데이터를 묶는것)

다양한 데이터를 Covid로묶은것과 같다

int[] lotto를 Lotto 자료형으로 이용하기위해 main()메소드에서 Lotto lotto; 변수선언한다.

Lotto 클래스안에 담긴것들을 Lotto. 으로 사용할 수 있게된다. 

정수배열 int[]를 담고있는 Lotto라는 개념으로 데이터 단위를 만들어서 한번에 관리한다. 

int[] lotto보다는 Lotto가 바람직하다. 데이터안에 int[]이 다양할 수 있게때문에 혼란이 생길 수있다. 

 

Lotto클래스에 멤버변수가 여러 정수가 있을때 예시

 

객체를 생성해서 호출

 

 

데이터를 묶어서 관리하는 이유

의미를 분명히 할 수있는 자료형으로 해야한다.

각각 String, int를 부르는것보다 stu1식으로 해야 학생데이터인지, 선생님 데이터인지 구분할 수있다.

 

Lotto클래스의 int[]배열을 각각 관리했다면 나중에 유지보수하기 어렵다. 나중에 시간이 지났을때 무슨데이터였는지 기억해내기 힘들다.

Lotto lotto;로 묶어서 사용할것

Lotto라는 자료형을만들어써서 기존의 다른 정수배열과 구분한다. 코드정리

사용자가 원하는 자료형을 명시해서 쓸 수 있다.

하지만 불편함이 두가지 발생한다.

1. 정의하는데 추가 코드발생

2. 계층이 생긴다 lotto.nums[i]로 불러서  써야한다.

 


계층을 두고있는 구조체 사용시 

함수를 흔히 자판기, 블랙박스라고 한다.

우리는 자판기안쪽 구현방식을 알 필요가 없다.

함수구현이 나에게는 몰라도되지만 원하는 기능만 실행하면 된다.

 

함수의 매개변수 이름은 외부에서 사용하는 변수명에 영향을 받지않는다. (지역화,고립화)

계층을 두고있는 구조체를 쓸때 lotto.nums[i]는 지역화가 아니다. Lotto클래스에서 int[] nums;명이 변경된다면 오류가 생긴다.

이름변경에 영향을 받는다
Lotto클래스의 이름을 변경 후 에러발생

외부의 변화에 취약해졌다. 어떻게 해결해야할까 ? -> 캡슐화의 시발점 

minmax(min, max);

min보다 크거나 같고, max보다 작거나 같다. 하나는 고정시킬것.

 

repeat(auto-fill, minmax(100px,auto));

고정크기의 개수는 미정, 너비가 허락되는 한 모두 트랙을 만든다. 상자가 여백을 다 채운다.

grid-template-columns:repeat(auto-fill, 100px);

너비가 허락되는 한 모두 트랙이 만들어진다.

grid-template-columns: max-content;

콘텐트크기에 영향

repeat(auto-fill, minmax(100px,auto));

고정크기의 개수는 미정, 너비가 허락되는 한 모두 트랙을 만든다. 상자가 여백을 다 채운다.

<div>태그 (아이템)을 활성화시켜야 적용된다. 

아이템에 따라서 적용된다. 아이템이 없으면 아예 적용 안된다. 

auto fill : 아이템과 상관없이 자동으로 트랙을 채운다(여백이 없어진다,여백에 선긋기)

auto fit : 아이템에 영향받음, 아이템에 맞춰서 그리드를 그린다.

 

간단한 버전: 속성은 똑같다. 아이템이 없으면 적용이 안된다.

 

grid-template-columns:repeat(auto-fill, 100px);

여백까지 꽉채워진다.

grid-template-columns:repeat(auto-fit, 100px);

아이템의 크기만큼 갯수가 정해지며, 고정크기가 적용된다.

 

 grid-template-columns: max-content;

콘텐트크기에 영향

grid-template-columns: min-content;

스페이스바단위로 끊어짐

grid-template-columns: minmax(500px, 700px);

500보다 작아지면 그대로이다. (웹브라우저를 축소시키면 스크롤바가 생긴다)

 

 

gap: 양쪽적용가능 / gap : 10px; / gap : 20px 10px;

row-gap:

column-gap:

grid-auto-flow : 기본값은 row


 


grid-template-areas & grid-auto-columns :1fr; 

area에 채워진만큼 자동으로채워진다. 

갯수는 div에맞춰지고 컬럼격차는 css에 맞춰진다. 

네이밍은 안되었지만 아이템에 맞게 배치된다. (네이밍은 열3, 행2)

grid-auto-columns : 크기넣기 ; 

grid-auto-columns : 100px ;  모두 동일적용됨. 각각은 불가

함수를 사용 하는 이유 ?

코드를 나눠서 만들기 위해. 코드의 재사용, 집중화, 인터페이스역할(간접적 사용)

 

참조변수사용시 null 발생

변수가 값을 가지고 있는 상태에서 써야한다.

 

 

코드를 작성한 후에 함수로 코드를 나누는 작업 : Bottom -> up

함수로 코드를 작성하고 그것을 구현하는 작업 Top->Dowon

Top : 업무적인 내용, down (알고리즘, 오픈소스)

 

 

데이터를 얻는부분과 출력하는것의 분리

분리전

print메소드는 콘솔출력을 위한것.

데이터를 얻는것과 출력을 함께 두면 콘솔출력으로만 써야한다. ->재사용률이 떨어진다.

결합도를 낮추기 위해 분리시킨다.

 

최대값을 얻는 메소드와 출력하는 메소드를 분리

분리후


load함수 만들기

메소드호출

load안에서 공간을(new String[count][])를 만들어서 rows값을 전달.

메소드의 결과값을 반환해야하므로 rows의 자료형인 String[][]를 메소드상단에 적어준다.

 

함수가 끝나면 함수 안에있는 변수들은 다 사라진다. (지역화된 변수가 사라진다)

사라지면서 반환하기 위해 rows = load(rows,count); rows에 담아준다.

package ex5.fnc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class Program3MultiArray4 {


public static void main(String[] args) throws IOException {
      
	int count = 0;
	String[][] rows = null;
	// ---------------------------------------------------------
	// 레코드 개수를 알아내는 코드
	count = getCount();	
	
	// --------------------------------------------------------
	//	rows = new String[count][];
	// 레코드를 로드하는 코드
	rows = load(rows, count); //rows:참조변수 / count:값변수
	
	// ---------------------------------------------------------
	// 레코드를 출력하는 코드
	printCovid19List(rows, count);

	// ---------------------------------------------------------
	// 검사진행자 누적수를 얻는 코드
	int total = getTotal(rows, count);// f3누르면 메소드로이동
	System.out.println(total);
	System.out.println();
	// ---------------------------------------------------------
	// 1.일별 가장 많은 검사진행수는? 몇입니꽈~
	printMax(rows, count);

	// 2.감사진행수가 가장 많았던 날짜는?
	printB(rows, count);
	// ---------------------------------------------------------
	// 확진자 수가 늘어난 일자와 수를 출력하시오.
	printA(rows, count);

	// 확진자 수가 늘어난 일자와 수를 다음 배열에 담아주시오.
	String[][] results;
	int resultCount = 0;
	
	{
		// 확진자 수가 달라질 때마다 resultCount를 증가시킴으로써 증가되는 일자 수를 구하는 코드
		int old = 0; // 현재 확진자 수

		for (int i = 0; i < count; i++) {

			// i 번째 행의 확진자 수
			int current = Integer.parseInt(rows[i][1]);

			// i 번재 확진자(current)와 이전 확진자수(old)가 다르다면
			if (old != current) {
				// 확진자 수가 달라지는 일자의 수를 증가
				resultCount++;

				old = current;
			}
		}

		System.out.println(resultCount);

		results = new String[resultCount][];

		String date = "";
		int diff = 0;

		old = 0; // 현재 확진자 수

		int index = 0;
		for (int i = 0; i < count; i++) {
			int current = Integer.parseInt(rows[i][1]);

			if (old != current) {
				diff = current - old;
				date = rows[i][0];
				// 코로나19 데이터 행을 저장하기 위한 배열
				String[] row = new String[2];
				row[0] = date; // date
				row[1] = String.valueOf(diff); // diff

				results[index++] = row;

				old = current;
			}
		}

		System.out.println("작업완료");

	}

}//main메소드 끝


static void printCovid19List(String[][] rows, int count) {
	System.out.println("// 레코드를 출력하는 코드------------------------");

	for (int j = 0; j < count; j++) {
		for (int i = 0; i < 10; i++) {
			System.out.printf("%s", rows[j][i]);

			if (i < 10 - 1)
				System.out.printf(",");
		}
		System.out.println();
	} // 큰for문끝
}// printCovid19List()끝
	// --------------------------------------------------------

static int getTotal(String[][] rows, int count) {
	int total = 0;

	for (int i = 0; i < count; i++)
		total += Integer.parseInt(rows[i][3]);

	return total;
}

// ---------------------------------------------------------
// 크로스방향으로 단순히 나누기만 한 코드
// 좀 더 개선해 볼 수 있는 여지가 있는가 ?
// 함수의 4가지 특징 중에서 재사용을 생각해보면 ?
static int getMax(String[][] rows, int count) {
	int max = 0;
	int current;

	for (int i = 0; i < count; i++) {
		current = Integer.parseInt(rows[i][3]);
		if (current > max)
			max = current;
	}
	return max;
}

// ---------------------------------------------------------
static void printMax(String[][] rows, int count) {

	int max = getMax(rows, count);// 메소드의 리턴값이 max에 담긴다.

	System.out.printf("max: %d\n", max); // <-콘솔출력을 위한것, 데이터얻는것과 출력을 함께두면 전체적으로 콘솔출력용으로만써야된다.
	System.out.println();

}

// ---------------------------------------------------------
// 확진자 수가 늘어난 일자와 수를 출력하시오.
static void printA(String[][] rows, int count) {

	String date = "";
	int diff = 0;

	int old = 0; // 현재 확진자 수
	int index = 0;
	for (int i = 0; i < count; i++) {
		int current = Integer.parseInt(rows[i][1]);

		if (old != current) {

			diff = current - old;
			date = rows[i][0];

			old = current;
			System.out.printf("일자와 수%d : %s, %d\n", index++ + 1, date, diff);
		}
	}
}

// ---------------------------------------------------------
// 레코드를 로드하는 코드
static String[][] load(String[][] rows, int count) throws IOException {
	rows = new String[count][];

	FileInputStream fis = new FileInputStream("res/corona.csv");
	Scanner fscan = new Scanner(fis);

	String line;

	fscan.nextLine();

	for (int i = 0; i < count; i++) {
		line = fscan.nextLine();
		rows[i] = line.split(",");
	}

	fscan.close();
	fis.close();

	return rows;
}

// ---------------------------------------------------------
// 2.검사진행수가 가장 많았던 날짜는?
static String getDate(String[][] rows, int count) {
	
	String date = "";
	int idx = 0;
	int max = getMax(rows, count);
	
	for (int i = 0; i < count; i++)
		if (max == Integer.parseInt(rows[i][3])) {
			idx = i;
			break;
		}
	date = rows[idx][0];
	return date;
}

// ---------------------------------------------------------
// 2.검사진행수가 가장 많았던 날짜는? 출력
static void printB(String[][] rows, int count) {

	String date = getDate(rows, count);

	System.out.printf("%s", date);
	System.out.println();
}
// ---------------------------------------------------------
static int getCount() throws IOException {
	int count = 0;
	FileInputStream fis = new FileInputStream("res/corona.csv");
	Scanner fscan = new Scanner(fis);

	// while 반복을 하면서 count++ 연산을 한다. 마지막 줄을 만날 때까지
	while (fscan.hasNextLine()) {
		fscan.nextLine();
		count++;
	}

	fscan.close();
	fis.close();

	count--;//반환값필요

	return count;
}

}//class끝

그리드: 균등분할시스템, 콘텐트 꾸밀때도 사용가능

 

grid-row / grid-column

grid-row / grid-column

 

#id>.class{ }

1fr vs 100px 차이

grid-template-colums : 1fr 1fr 1fr;

grid-template-colums : 100px 100px 100pxx;

 

auto 와 1fr차이

1fr은 콘텐트를 포함해서 여백이 있다면 그 여백을 균등분할 (컨텐트 크기에 영향x)

flex-grow : 여백이있으면 그 공백을 나눠가짐 (컨텐트 영향 ㅇ)

 

grid-template-columns:repeat(3,auto);

grid-template-columns: 1fr auto auto;

auto가 1fr에게 다 양보한다.

grid-template-columns:1fr auto 1fr;

auto가 1fr에게 다 양보한다.

가운데 auto때문에 들쭉날쭉해지므로 사용할때 유의할것

grid-template-columns : repeat(12, 1fr 2fr);

1:2로 나눈 영역을 12번반복한것 총 24개칸의 생긴다.

총 갯수가 24개의 칸, 1fr + 2fr ,1fr + 2fr, 1fr + 2fr,...,1fr + 2fr반복된다.

 

@media screen and (min-width:500px){}

@media screen and(min-width:800px){}

두개 다 공존한다. 덮어쓰기된다.

 

 

코드정리란 ?

방정리. 개발자를 위한것

물리적으로 다른파일에 둚. 메인함수에서 분리시킴. 재사용가능

 

코드 정리가 어려운 이유는 

필요성을 못느끼고 익숙치 않아서이다.

 

자바의 구조체

클래스, 캡슐화.

객체는 캡슐화된 데이터를 의미

 

구조체와 배열의 차이

1.큰방에 라벨링이 된것 같은 특징으로 가독성이 좋다.

2.다양한 형식을 담을 수있다.

 

함수 와 인터페이스

함수는 능력이 많다.

코드를 자를때도 함수사용.

인터페이스처럼 구현능력을 숨길때도 함수사용

인터페이스가 함수이지만, 함수가 인터페이스는 아니다.

 

함수를 이용하면

  • 코드의 직접사용을 차단, 간접적 사용
  • 코드를 작게 나누어서 만들 수 있다.
  • 코드를 집중화 할 수있다. ( 한 개만 수정하면 나머지 자동수정)
  • 코드를 재사용 할 수 있다.

 

함수 이용해서 코드정리

public class Program{

        메소드생성(자료형 매개변수){ }

 

        public static void main(String[] args){

        메소드호출(참조변수);

        }

 

}

 

 

 

메소드생성
메소드호출


 

메소드생성
메소드호출


메소드생성
메소드호출

 

메소드

static 자료형 메소드이름(매개변수 자료형 매개변수이름){ }

 

 

메소드안 return

 

생성할 메소드명();을 입력 하면 빨간줄이생기고 creat method알림이뜬다. 클릭하면 자동틀완성.

 

 

메소드호출시 순서,갯수,자료형 모두 일치시켜야한다.

 

문제

package ex5.fnc;

public class Program {

	static int power(int x) {
		return (x+3)*(x+3);
	}
	
	static int add(int x,int y) {
		return x+y; //return까지 실행한다.
	}
	static void print(int x) {
		System.out.println(x); 
		//반환하는게없다	
	}
	
	static void printSum(int x,int length) {
		int sum = 0;
		
		if(length <= 0) {
			System.out.println("length에 잘못된 값을 입력함");
			return ;
		}
		
		for(int i=0 ; i< length ; i++)//	
			sum += (x+i);
			
		for(int i=0 ; i< length ; i++) { //출력
			System.out.printf("%d",x+i);
			
			if(i<length-1)
				System.out.print("+");
			
		}
		System.out.print("=");
		System.out.printf("%d\n",sum);
	} 
	


	public static void main(String[] args) {
		
		// power(x) = (x+3)*(x+3)+x;
		//add(x,y) = x+y
		int c = add(3,4);
		
		System.out.println(c);
		System.out.println(add(5,6));
		
		//print(x) = output : x
		print(30);
		
		//printSum(x,length) //x:2 ,length:3->2+3+4

		printSum(3,3);

	}

}

 

 

2차원배열활용
구조체활용

동일한 결과값을 나타내지만 위의 코드보다 아래코드가 이해도가 높다.

배열로만 출력했을땐 어떤 자료들이 더해지는지 알 수 없다.(알기 힘들다)

이 데이터가 어떤 데이터인지, 의미가 더 살아있다.

 

구조체를 이용하는것이 바람직하다.

데이터를 담을때 데이터의 의미를 살리는 변수이름을 만들고,

관련데이터를 그룹핑해서 명명되어있는 이름을 쓰는것이 좋다.

 

변수타입이 서로 다 같더라도 구조체를 사용하는것이 좋다.

모두 정수라도 의미를 살려서 붙이는것이기때문이다.

 

 

 

Confusing things :

  • 객체생성의 기본원리
  • 참조형 배열생성과  객체생성의 차이
  • 객체생성과 초기화의 차이
  • 배열참조변수 list가 null인것과 list[0]이 null인것의 차이

객체생성

객체생성 (객체가 가진 속성을 사용하기위해)
클래스명 변수명; //참조변수선언
변수명 = new 클래스명(); //객체의 주소를 참조변수에 저장

객체사용방법 :
변수명.메서드명();
변수명을 이용해 점뒤에있는 메서드를 이용


배열참조변수 list가 null인것  vs  list[0]이 null인것의 차이

Covid19[] list = new Covid19[3];

list[0].date = "2020";

list는 배열객체가있음(3개짜리만들어짐), null이 아님.

list[0]은 null, NullpointerException발생

 

 

Covid19[] list = null;

list 자체가 null, 배열이아니다.

list사용시 NullpointerException 발생

 

Covid19[] list = new Covid19[10];

list[0].date = "hello";

list는 배열객체만가지고있다.

list[0] 는 가리키는곳이없다. (객체생성이 안되었다)

에러발생한다. 이름에 해당되는 list[0]에 객체생성이안되어있기때문이다.

list[0] = new Covid19(); (list[0]에 Covid19()객체를 대입 해줘야한다.)

list의 자료형이 Covid19()이기 때문이다.

 

 

int a = new int[3];

정수 변수가 3개 만들어짐.

정수를 담을 수있는 공간 3개 생성

a[0], a[1],a[2] 변수가 만들어진다.

 

 

배열의 자료형 : 기본형이 아닌 참조형이라면 ?

Covid19[] covid = new Covid19[3]; 의미

 

Covid19 a;

Covid19 b;

Covid19 c;

Covid19 변수 3개를 한번에 만들어서 사용하기위한것이 Covid19[3] 배열이다.

배열객체만 만들어지는것, Covid19()객체는 만들어지지않았다.

배열생성은 변수3개를 만들뿐 객체를 생성하지않았다.

확진자수, 격리자수 등 저장할 공간은 만들어지지않았다.

기본형이 아닌것들은 heap영역에 공간을 만들어야 값을 넣을 수 있다.

 

Covid19() 객체를 만들려면 new연산자를 통해 객체를 생성해야한다. (변수선언,생성과 비슷하다)

Covid19 a = new Covid19();

Covid19 b = new Covid19();

Covid19 c = new Covid19();

마찬가지로 Covid19 배열도 new연산자를 통해 객체를 생성해야한다.

covid = new Covid19();

 

 

객체생성 후 대입

list[i] = covid; // 담아서 쓰는것

list[i] = Covid19(); 도 되지만, 이미 윗 코드에서 Covid19 covid = new Covid19()를 통해 참조변수를 만들었으므로 참조변수를 사용한다.

초기화가 아니라 객체생성이다.

 

stack : 선언을 통한것만 저장

heap : new연산자를 통해만들어진 객체만

 

 

list[0].date 와 temp.date의 차이

임시변수선언없이 list[0]로 사용하면 매번 list[0].date , list[0].cases, ..로 계속써야한다.

Covid19()클래스에 있는 변수를 쓰기위해 list[0]와 temp모두 사용 할 수있지만 임시변수쓰는것이 복잡도를 낮출 수있다.

변수는 이름을 여러개 가질 수 있다.

 

 

 


 

배열생성후 객체생성을 하지않으면 null 오류가 발생한다.

맨 위의 상단에 Covid19[] list = null; 이라고 선언했기때문에

출력시 list자체가 null이라는 오류가 뜬다.

null 오류

package ex4.struct;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class prac1 {

	public static void main(String[] args) throws IOException {

		 int count = 0;
		 Covid19[] list = null;
	      //---------------------------------------------------------
	      // 레코드 개수를 알아내는 코드
	      {
	         FileInputStream fis = new FileInputStream("res/corona.csv");
	         Scanner fscan = new Scanner(fis);
	         
	         // while 반복을 하면서 count++ 연산을 한다. 마지막 줄을 만날 때까지
	         while(fscan.hasNextLine()) {
	            fscan.nextLine();
	            count++;
	         }
	         
	         fscan.close();
	         fis.close();
	         
	         count--;
	      }
	      //--------------------------------------------------------
	      // Covid19를 로드하는 코드
//	      Covid19[] list = new Covid19[count];
	      {
	         FileInputStream fis = new FileInputStream("res/corona.csv");
	         Scanner fscan = new Scanner(fis);
	         
	         String line;
	         
	         fscan.nextLine();
	   
	         for(int i=0; i<count; i++) {
	            line = fscan.nextLine();
	            String[] tokens = line.split(",");
	            Covid19 covid = new Covid19(); //covid는 지역화된 변수라 }만나면 사라지고 반복되면서 다시생긴다

	            covid.date = tokens[0];
	            covid.cases = Integer.parseInt(tokens[1]); //int = String
	            covid.deaths = Integer.parseInt(tokens[2]);
	            covid.tests = Integer.parseInt(tokens[3]);
	            covid.selfIsolation = Integer.parseInt(tokens[4]);
	            covid.release = Integer.parseInt(tokens[5]);
	            covid.recover = Integer.parseInt(tokens[6]);
	            covid.selfQuarantineDomestic = Integer.parseInt(tokens[7]);
	            covid.selfQuarantineImported = Integer.parseInt(tokens[8]);
	            covid.pubDate = tokens[9];
	            
	            list[i] = covid;        
	            
//	            list[i] = covid.date; //covid.date는 String 자료형불일치            
	         }      
	         
	         fscan.close();
	         fis.close();
	      	}

	}

}

 

count만큼 배열을 만들어준다.

Covid19[] list = new Covid19[count];

package ex4.struct;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class prac1 {

	public static void main(String[] args) throws IOException {

		 int count = 0;
	      //---------------------------------------------------------
	      // 레코드 개수를 알아내는 코드
	      {
	         FileInputStream fis = new FileInputStream("res/corona.csv");
	         Scanner fscan = new Scanner(fis);
	         
	         // while 반복을 하면서 count++ 연산을 한다. 마지막 줄을 만날 때까지
	         while(fscan.hasNextLine()) {
	            fscan.nextLine();
	            count++;
	         }
	         
	         fscan.close();
	         fis.close();
	         
	         count--;
	      }
	      //--------------------------------------------------------
	      // Covid19를 로드하는 코드
	      Covid19[] list = new Covid19[count];
	      {
	         FileInputStream fis = new FileInputStream("res/corona.csv");
	         Scanner fscan = new Scanner(fis);
	         
	         String line;
	         
	         fscan.nextLine();
	   
	         for(int i=0; i<count; i++) {
	            line = fscan.nextLine();
	            String[] tokens = line.split(",");
	            Covid19 covid = new Covid19(); //covid는 지역화된 변수라 }만나면 사라지고 반복되면서 다시생긴다

	            covid.date = tokens[0];
	            covid.cases = Integer.parseInt(tokens[1]); //int = String
	            covid.deaths = Integer.parseInt(tokens[2]);
	            covid.tests = Integer.parseInt(tokens[3]);
	            covid.selfIsolation = Integer.parseInt(tokens[4]);
	            covid.release = Integer.parseInt(tokens[5]);
	            covid.recover = Integer.parseInt(tokens[6]);
	            covid.selfQuarantineDomestic = Integer.parseInt(tokens[7]);
	            covid.selfQuarantineImported = Integer.parseInt(tokens[8]);
	            covid.pubDate = tokens[9];
	            
	            list[i] = covid;        
	            
//	            list[i] = covid.date; //covid.date는 String 자료형불일치            
	         }      
	         
	         fscan.close();
	         fis.close();
	      	}

	}

}

 

 

 

list 자체는 배열객체만 가리키고있어서 주소의 변화가없다.

list[i]는 Covid19()객체를 가리키고있어서 주소가 바뀐다. for문의 반복으로 객체가 계속 생성되기때문

covid도 Covid19()객체를 가리키기 때문에 list[i]와 주소가 동일하다.

 

 

grid-template-columns : repeat(칸수, 너비)

grid-template-columns : repeat(12, 1fr 2fr);

1:2로 나눈 영역을 12번반복한것 총 24개칸의 생긴다.

총 갯수가 24개의 칸, 1fr + 2fr ,1fr + 2fr, 1fr + 2fr,...,1fr + 2fr반복된다.

grid-template-columns : repeat(12, 1fr 2fr); 적용모습

grid-template-colums : repeat(12, [col-start] 1fr);

컬럼을 12칸으로 나누고 첫열을 col-start라고 명명한다. 1:1비율로 나눈다.

grid-template-colums : 상위태그에서 열을 몇개를 나눌지 정한다.

 

grid-column : col-start / span 12;

열을 1열부터 12칸으로 나눈다.

1대신 col-start를 적으면 1열의 의미를 한다.

grid-column : 하위태그가 몇개의 컬럼을 차지할것인지 정한다.

#root>* 루트안의 전체범위이기때문에 이것을 적용하지않으면 header, nav영역이 

 

@media screen and (mind-width:500px) and (max-width: 799px)

500px부터 799px까지만 반응

500px이상일때 반응하는화면

 

 

grid-column: colstart 5 / span 9 ;

5열부터 9칸 colstart 5(5열의 이름)

 

 

 

 

#root{
    display: grid;
    grid-template-columns: repeat(12,[col-start] 1fr);
    gap: 20px; /*박스사이 갭*/

}
#root>*{ /*root안에 있는것 모두적용*/
    background-color: rgb(245, 37, 37);
    grid-column: col-start /span 12;
}

@media screen and (min-width: 500px) {

    #root > .side,
    #root > .ad{
        grid-column: 1 /span 3; /*1열부터 3칸*/
    }
    #root > .content,
    #root > .main-footer{
        grid-column: 4 / span 9; /*4열부터 9칸*/
    }
    #root > .side,
    #root > .content{ 
        grid-row: 3; /*3번라인 1칸*/
    }
    #root >.ad,
    #root > .main-footer{
        grid-row: 4;
    
    }
    
}

같은이름의 영역이 나뉘어지면안됨.

@media screen and (min-width: 800px) {

    .container {

      margin: 1em 2em;

    }

  }

반응형 grid 

코드

1. 프로그래밍을 위한 코드 : 실행을 위한 코드

2. 함수지향 : 구조체 , 함수

3. 객체지향 : 캡슐화, 상속, 다형성

 

코드의 크기가 커지면 ?

가독성이 떨어지고, 코드의 중첩이 생긴다, 데이터수 증가

중복된 코드블럭이 생긴다.

 

다음에도 같은 코드를 또 사용 하고싶다면 ?

나누어서 다시 사용하고싶은 블록을 분리

 

자바는 가장 객체지향적인 언어, 통일감있는 코드가능

스크립트언어(ex, 파이선) 은 메인함수가 없고, 모듈화가없어 바로 사용가능

 

구조체란 ?

다양한 데이터를 담을 수 있는 도구

 

배열의 불편함 :

다 같은형식을 사용해야한다. 결과에 대한 의미가 묻어나지않는다 (ex: row[i][0])

의미론적으로 와닿지않는다.

->배열이 불편함을 구조체가 해결 할 수있다. 

 

메모리공간은 Heap 과 Stack 이있다.

Heap : 비예약석, 동적메모리할당, 연산자(new, = )에 의해서 마련되는 공간

Stack : 예약석, 선언으로 마련되는 공간

 

기본형은 선언만으로 공간할당 stack

참조형은 new연산자를 통해서만 공간할당, 실행 후 메모리가 할당된다 (heap)

String x = new String("hi");

x : main Stack에 공간생김

"hi" : heap 에 공간생김 , heap에 객체담김코드

 

1. 프로그래밍을 위한 코드 : 실행을 위한 코드

 

2. 함수지향 : 구조체 , 함수

 

3. 객체지향 : 캡슐화, 상속, 다형성

 

 

 

데이터를 묶어 그룹을정하는것 구조체 ->계층도만들어짐

 

 

{ String  y = new String("a")};

{}로 지역화처리되어있어서 괄호가 끝나면 사라진다.

y : stack에 블록이 마련된다.

"a" : heap영역에 메모리할당

{}괄호가 닫히면 stack block1이 사라지고, "a"를 가리키던 stack이 사라지면서 heap에있는 "a"는 가비지처리된다.

자바실행환경이 참조가 없는 것들을 찾아 자동으로 처리해준다. (처리시점은 실행상황에따라 달라진다)

 

{int y = 3;}

{}로 지역화되어 stack에 블록이 생긴다 -> 3이 y에 담긴다. ->{}끝나면 사라진다. -> main 스택도 사라진다.

 

 

 

구조체

구조체: Grouping, 의미도 분명히 할 수있고, 묶어서 사용.

자바의 클래스 : 데이터구조, 캡슐화

상: 배열 / 하:구조체


구조체 실습

1.Covid19 클래스생성 후 date, deaths, cases, tests 인스턴스생성한다.

2.Program 클래스에서 Covid19의 객체를 생성 후 Covid19의 인스턴스를 불러와 배열에 연결시킨다.

list[0] = new Covid();

list배열 0번째배열에 Covid19()클래스를 연결시킨것

이중배열은 다른배열을 참조한것 (ex list[][])

구조체는 list이 Covid()객체를 참조한것.

list[0].deaths =12; deaths에 12대입.

 

list[0] = new Covid();를 안한경우

list[0].는 null값이다.

디버깅했을때

list[0] = new Covid(); 객체생성해서 대입 하면

객체 주소값이 연결된다.

 

ctrl키를 누른상태에서 "layout.css"를 클릭하면

 

css가 연결이안됐다고 창이뜬다.

create file을 누르면 자동생성

 

자바는 나중에 참조를 계속 바꿀수있다. 이름표를 떼었다 붙였다하듯이 사용가능

참조형변수 이름표의 크기는 4바이트

배열의 선언

배열의 공간을 미리 선언할수도 new String[3][4]

나중에 공간을 채울수도있다. new String[3][]

예시는 String이지만, int 등 다양하다.

 

가변배열[n][]

사용자한테 입력을 받을때마다 또는 데이터를 읽을때 공간을 만든다.

공간을 나중에 만들었어서 참조를 나중에바꿔서 아예 다른배열을 가리킬수도있다.

 

자바의 배열

코드사용상 c언어와 똑같아보인다. 자바는 톱니형식. 겉으로보이기엔 그냥배열처럼보이지만 참조배열이라서

자바는 길이를 바꿀 수 있다.

 

 

 

grid-template-colums: 250px auto auto

grid-template-colums: 250px 1fr 1fr

auto 는 확장성까지 포함한다. (칸이 늘어날수있다)

fr 는 확장하지않는다. 칸을 유지한다.

1fr하는게 안전하다.

ex) grid-column-start : 1, grid-column-end : 4; 경우 컬럼을 3까지만들었어도 1개가 자동으로 더생긴다.

여백에 맞춰서 모눈종이가 채워짐

 

여백늘리기

여백을 확장해서 창크기에 맞게 모눈종이가 적용되게한다.

html,body{ height};

 

margin: 0 ; 마진을없애서 모눈종이와 창사이의 틈을 없앤다.

 

아이템배치 Grid Line 컬럼,로우 번호이용

Grid-area 가로 시작 / 세로 시작 / 가로 끝 / 세로 끝

 

아이템배치 : Grid line 이름

 

데이터결과물을 다른배열에 담기

1. 확진자수가 증가한 횟수 구하기

      // 확진자 수가 늘어난 일자와 수를 다음 배열에 담아주시오.
      String[][] results;   
      int resultCount = 0;
      
      {
         // 확진자 수가 달라질 때마다 resultCount를 증가시킴으로써 증가되는 일자 수를 구하는 코드
         int old = 0; // 현재 확진자 수
                  
         for(int i=0; i<count; i++) {
            
            // i 번째 행의 확진자 수
            int current = Integer.parseInt(rows[i][1]);
            
            // i 번재 확진자(current)와 이전 확진자수(old)가 다르다면
            if(old != current) {
               // 확진자 수가 달라지는 일자의 수를 증가
               resultCount++;
               
               old = current;   
            }
         }

String[][] results;

전역화해서 나중에 사용할 수 있게한다.

 

if( old != current )

이전확진자수와 i번째확진자 수를 비교한다. 숫자가 다르면 카운트를 더한다.

후에 old = current; i번째 숫자를 이전확진자 수에 대입한다.

 

 

2. 증가한 횟수를 이용해 새로운 2차배열 생성,

 [확진자 증가한 날짜, 증가수] 를 1차원 배열row[]에 넣기.

각 1차원배열을 2차원배열results[][]에 대입

results = new String[resultCount][];
         //이름표: 4바이트, 주소는 4바이트=32비트         
         String date = "";
         int diff = 0;
         
         old = 0; // 위에서 쓰였으므로 초기화시키기
         
         int index = 0;
         for(int i=0; i<count; i++) { //데이터 총 행인 76까지반복
            int current = Integer.parseInt(rows[i][1]); //제주 확진자
            
            if(old != current) {//기존확진자와 현재확진자비교
               
               diff = current - old;//차이 = 현재확진자-기존확진자
               date = rows[i][0]; //차이발생한 날
               old = current; //기존확진자->현재확진자
               
               String[] row = new String[2];
               row[0] = date;       // date
               row[1] = String.valueOf(diff); // 정수->문자열변환
               
               results[index] = row; //index++후 출력하면 인덱스1이 증가되어 다음인덱스가출력됨
               
               System.out.println(Arrays.toString(results[index]));
               
               index++;//results배열인덱스 증가
            }
         }         
         System.out.println("작업완료");

int index = 0;

변수를 쓰는곳 가까이에 선언한다.

 

String[] row = new String[2];

row[0] = date;

row[1] = String.valueof(diff);

if문의 조건이 성립되어 date, diff가 계산이 되고, 계산된 date와 diff를 1차원배열 row[]에 담아준다.

 

results[index++] = row;

1차원배열row[]를 2차원배열results[index]에 연결시킨다.

results[i]를 하게되면 ArrayIndexOutOfBoundsException발생한다. 이유는 i가 for문범위인 count(76)까지 돌게된다.

results[resultsCount][];로 선언했고 resultsCount는 20이므로 범위를 초과하게된다.

i과 상관없이 새로운 변수 index를 선언하고 반복문이 실행되는 동안 증가할수있게 index++를 한다.

자바의 2차원배열은 1차원배열이 여러개가 연결된것.

 

 

 // 확진자 수가 늘어난 일자와 수를 다음 배열에 담아주시오.
      String[][] results;   
      int resultCount = 0;
      
      {
         // 확진자 수가 달라질 때마다 resultCount를 증가시킴으로써 증가되는 일자 수를 구하는 코드
         int old = 0; // 현재 확진자 수
                  
         for(int i=0; i<count; i++) {
            
            // i 번째 행의 확진자 수
            int current = Integer.parseInt(rows[i][1]);
            
            // i 번재 확진자(current)와 이전 확진자수(old)가 다르다면
            if(old != current) {
               // 확진자 수가 달라지는 일자의 수를 증가
               resultCount++;
               
               old = current;   
            }
         }
         
         System.out.println(resultCount);
         
         results = new String[resultCount][];
         //이름표: 4바이트, 주소는 4바이트=32비트         
         String date = "";
         int diff = 0;
         
         old = 0; // 위에서 쓰였으므로 초기화시키기
         
         int index = 0;
         for(int i=0; i<count; i++) { //데이터 총 행인 76까지반복
            int current = Integer.parseInt(rows[i][1]); //제주 확진자
            
            if(old != current) {//기존확진자와 현재확진자비교
               
               diff = current - old;//차이 = 현재확진자-기존확진자
               date = rows[i][0]; //차이발생한 날
               old = current; //기존확진자->현재확진자
               
               String[] row = new String[2];
               row[0] = date;       // date
               row[1] = String.valueOf(diff); // 정수->문자열변환
               
               results[index] = row; //index++후 출력하면 인덱스1이 증가되어 다음인덱스가출력됨
               
               System.out.println(Arrays.toString(results[index]));
               
               index++;//results배열인덱스 증가
            }
         }         
         System.out.println("작업완료");
                  
      }

1. 일별 가장 많은 검사진행 수는 ?

열에서 최대값 찾기

		//일별 가장 많은 검사진행 수는 ? 
		{	
			int max = 0;
			int current;
					
			for(int i =0; i<count;i++) {
				current = Integer.parseInt(rows[i][3]);
				if(current > max) 
					max = current;
				}
			System.out.println(max);
			System.out.println();
		}

 

2.  검사 진행 수가 가장 많았던 날짜는 ? 

해당되는 열의 위치를 찾아 동일한 행,다른열에서 데이터찾기.

		//검사진행수가 가장 많았던 날짜는 ?
		
			String date ="";
			int idx = 0;

			for(int i=0;i<count;i++) {
				if(rows[i][3].equals(String.valueOf(max))) //세미콜론주의
				idx = i;
				}
			date = rows[idx][0];
			System.out.println(date);

 

3. 확진자 수가 늘어난 일자와 수를 출력하시오.

데이터값 변화가있는 열의 위치찾기→데이터변화차이구하기→ 동일한 행,다른열의 데이터찾기(날짜).

			//확진자 수가 늘어난 일자와 수를 출력하시오.		
		{
			String date="";
			int diff = 0;
			
			int current = Integer.parseInt(rows[0][1]);
			int index = 0;
			int next = 0;
			
			for(int i=0;i<count;i++) {
				next = Integer.parseInt(rows[i][1]); //변화할위치
				if(current!=next) {
					diff = next - current;
					date = rows[i][0];
					current = next;
					
					index++;
					
					System.out.printf("%d : %s, %d\n",index,date,diff);
				}
			}		

 

 

 

 

package ex3.array;

import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class Program3MultiArray3 {

	public static void main(String[] args) throws IOException {
		
		int count = 0;
		String[][] rows; 
		//--------------------------------------------------------------
		//레코드 개수를 알아 내는 코드
		{
			FileInputStream fis = new FileInputStream("res/corona.csv");
			Scanner scan = new Scanner(fis);
			
			//while반복을 하면서 count++연산을 한다. 마지막 줄을 만날때까지
			String line;
			while(scan.hasNextLine()) {
				line = scan.nextLine();
				count++;		
			}			
			
			scan.close();
			fis.close();
			count--;
			System.out.println("총 행의 갯수"+count);
		}//충돌방지
		//--------------------------------------------------------------
		//레코드를 로드하는 코드
		{
			rows = new String[count][];
			FileInputStream fis = new FileInputStream("res/corona.csv");
			Scanner scan = new Scanner(fis);
			/*
			 * 0번째방 : {"a", "b", "c"}
			 * 1번째방 : {"d", "e", "f"}
			 * 
			 * */
			String line;
			
			scan.nextLine(); // 담을필요없다.한줄버리기
			for (int i = 0; i < count; i++) { // 한줄 불러오고, 나눠서 배열에넣기
				line = scan.nextLine(); // 한줄불러오기
				rows[i] = line.split(","); // 불러온것 쉼표로 구분
			}
			scan.close();
			fis.close();
		}		
		//--------------------------------------------------------------
		//레코드 출력하는 코드
		for (int j = 0; j < count; j++) { // 행
			for (int i = 0; i < 10; i++) { // 열채우기
				System.out.printf("%s", rows[j][i]);
	
				if (i < 9)
						System.out.printf(",");
			}
			System.out.println();
		}
		//--------------------------------------------------------------	
		//검사진행자 누적수 얻는 코드
		{
			int total = 0;
				
			for(int i=0;i<count;i++)
			total += Integer.parseInt(rows[i][3]);	//문자열을 정수로 형변환
			System.out.println(total);
		} 
		
		//--------------------------------------------------------------	
		//일별 가장 많은 검사진행 수는 ? 
		{	
			int max = 0;
			int current;
					
			for(int i =0; i<count;i++) {
				current = Integer.parseInt(rows[i][3]);
				if(current > max) 
					max = current;
				}
			System.out.println(max);
			System.out.println();
		
		
		//검사진행수가 가장 많았던 날짜는 ?
		
			String date ="";
			int idx = 0;

			for(int i=0;i<count;i++) {
				if(rows[i][3].equals(String.valueOf(max))) //세미콜론주의
				idx = i;
				}
			date = rows[idx][0];
			System.out.println(date);
		}
		//확진자 수가 늘어난 일자와 수를 출력하시오.
		{
			String date = "";
			int diff = 0;
			
			int old = 0; //이전확진자수
			int current = 0; //현재확진자 수
			int index = 0;			
			
			for(int i=1;i<count;i++) {
				current = Integer.parseInt(rows[i][1]);
				
				if(old != current) {
					
					diff = current - old;
					date = rows[i][0];
			
					old = current;
					
					//년 월 일로 출력하기
					date = date.substring(0,4)+"년"+
							date.substring(5,7)+"월"+
							date.substring(8,10)+"일";
					System.out.printf("%d : %s, %d\n",index+++1,date,diff);
					}			
			}
			
		}
		
		
		
		
}
	}

border-radius : 50%; 이미지파일 둥글게

grid-column: 3/5; 열 3~5까지

 

1/ span2; 1에서부터 2칸더

span 2: 원래 위치에서 두칸

지정안하면 자동으로 지정

grid-column 순서

li1 : column 3부터4, row 2부터3

li2 : column 5부터 6, row 2부터 3

 

grid-template-columns :repeat(7, 1fr); 

열 7칸 갯수 고정, 비율에따라 크기맞춰짐.

grid-template-rows :repeat(auto-fill, 100px);

행 갯수 자동생성, 크기 100px고정

 

 

div태그 빨리 생성

.클래스명 엔터 : 클래스명이 들어간 div태그 생성

.name 엔터 :

#아이디명 엔터: 아이디명이 들어간 div태그 생성

#name 엔터:

 

1차원배열과 2차원배열 차이

1차원배열의 반복 -> 2차원

동일한 배열이름 사용(같은코드를 복사,붙여넣기 x)

1차원배열 2차원배열
이름을 각각 지었다.
String[] rows1;
String[] rows2;
이름하나 사용
String[][] rows = String[2][];
rows1 = line.splite();
rows2 = line.splite();
rows[0] = line.splite(); 
배열의 이름을 인덱스로 씀.
인덱스부분에 변수를 넣어 유연하게 쓸 수 있다.
  rows[1] = 3; 불가능
rows[1] = "asds"; 불가능
rows[1][0] = "asds";가능

좌 : 1차원배열                       / 우 : 2차원배열

왼쪽 :1차원을 낱개로 처리 rows1,rows2

오른쪽 :1차원배열의 반복을 일괄적으로 처리.

2차원배열은 대괄호가 두개 사용되어야 값을 넣을 수있다.

rows[0] 1차원배열을 이끄는 참조명 

String[2][]; 2개의 배열을 엮는다.

 

 

 

2차원배열 이용해 코로나 검사진행자 누적수 구하기

  1. FileInputStream, Scanner를 이용해 데이터를 불러온다
  2. 레코드갯수를 알아낸다.
  3. 레코드 로드(데이터불러와서 쉼표로 구분하고 배열에 넣기)
  4. 레코드출력해서 확인
  5. 검사진행자 누적수 얻는 코드작성

1~6 과정 코드

  1. FileInputStream, Scanner를 이용해 데이터를 불러온다
  2. 2. 레코드갯수를 알아낸다.
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner scan = new Scanner(fis);
			
//while반복을 하면서 count++연산을 한다. 마지막 줄을 만날때까지
String line;
while(scan.hasNextLine()) {
line = scan.nextLine();
count ++;		
}			
			
scan.close();
fis.close();
count--;
System.out.println("총 행의 갯수"+count);

 

3.레코드 로드(데이터불러와서 쉼표로 구분하고 배열에 넣기)

rows = new String[count][];
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner scan = new Scanner(fis);

String line;

scan.nextLine(); // 담을필요없다.한줄버리기

for (int i = 0; i < count; i++) { // 한줄 불러오고, 나눠서 배열에넣기
	line = scan.nextLine(); // 한줄불러오기
	rows[i] = line.split(","); // 불러온것 쉼표로 구분
	}
			
scan.close();
fis.close();

 

4.레코드출력해서 확인

 

for (int j = 0; j < count; j++) { // 행
	for (int i = 0; i < 10; i++) { // 열채우기
		System.out.printf("%s", rows[j][i]);
	
		if (i < count-1)
			System.out.printf(",");
		}
		System.out.println();
	}

 

5.검사진행자 누적수 얻는 코드작성

int total = 0;
				
for(int i=0;i<count;i++)
total += Integer.parseInt(rows[i][3]);	
System.out.println(total);

 

package ex3.array;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class Program3MultiArray3 {

	public static void main(String[] args) throws IOException {
		
		int count = 0;
		String[][] rows; // 배열의 배열 [2][10] 10개짜리2개 [행][열]
		//--------------------------------------------------------------
		//레코드 개수를 알아 내는 코드
		{
			FileInputStream fis = new FileInputStream("res/corona.csv");
			Scanner scan = new Scanner(fis);
			
			//while반복을 하면서 count++연산을 한다. 마지막 줄을 만날때까지
			String line;
			while(scan.hasNextLine()) {
				line = scan.nextLine();
				count ++;		
			}			
			
			scan.close();
			fis.close();
			count--;
			System.out.println("총 행의 갯수"+count);
		}//충돌방지
		//--------------------------------------------------------------
		//레코드를 로드하는 로드
		{
			rows = new String[count][];
			FileInputStream fis = new FileInputStream("res/corona.csv");
			Scanner scan = new Scanner(fis);

			String line;

			scan.nextLine(); // 담을필요없다.한줄버리기

			for (int i = 0; i < count; i++) { // 한줄 불러오고, 나눠서 배열에넣기
				line = scan.nextLine(); // 한줄불러오기
				rows[i] = line.split(","); // 불러온것 쉼표로 구분
			}
			
			scan.close();
			fis.close();
		}		
		//--------------------------------------------------------------
			//레코드 출력하는 코드
			for (int j = 0; j < count; j++) { // 행
				for (int i = 0; i < 10; i++) { // 열채우기
					System.out.printf("%s", rows[j][i]);
	
					if (i < count-1)
						System.out.printf(",");
				}
				System.out.println();
			}
		//--------------------------------------------------------------	
		//검사진행자 누적수 얻는 코드
			{
				int total = 0;
				
				for(int i=0;i<count;i++)
				total += Integer.parseInt(rows[i][3]);	
				System.out.println(total);
			} 
			
	}
}

grid-template-colums: 200px 200px

두칸생성 및 너비크기고정

 

 

 

grid-template-columns :1fr 1fr; 두칸 생성 및 너비 1:1 비율

 

repeat(갯수, 크기)둘중 하나 정확하게 정하기

repeat(auto-fill, 100px); 크기를 먼저 고정시키고 크기맞게 칸이 자동생성

 

repeat(auto-fit,100px); 크기를 먼저 고정시키고, 생성된 칸되에는 지워짐.

container(박스에 지정하는 속성값)

  • display
  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

 

item(박스안에 들어가는 아이템에 지정하는 속성값)

  • order
  • flex-grow
  • flex-shrink
  • flex
  • align-self

중심축을 수평이냐 수직으로 두냐에따라 반대축이바뀐다.

 

container의 부모(body) 100%

body의 부모(html) 100%

부모의 height에 상관없이 viewpoint에 적용하려면 100vh

 

Color tool

material.io/resources/color/#!/?view.left=0&view.right=0

 

display: flex; flex박스 시작

nowrap : 한줄에 아이템이 아무리많아도 랩핑을 안하겠다. (기본값)

flex-wrap : wrap ; 다음라인으로 넘어감

*flex-flow : column nowrap; 

 

방향,랩핑(다음줄로넘어갈건지)

 

 

justify-content 중심축에서 아이템들을 어떻게 배치할지

justify-content : flex-start ; (왼쪽축 배치)

justify-content : flex-end ; (오른쪽배치)

justify-content : center ; (오른쪽배치)

아이템들을 어떻게 배치할것인지

 

justify-content : space-around;

아이템사이에 공백(맨앞쪽공백+뒤쪽공백 이 사이사이들어감)

 

justify-content : space-evenly; 똑같은간격

 

justify-content : space-between; 첫아이템과 마지막아이템은 화면에맞게붙이고 간격일정

 

 

align-items 반대축에서 아이템배치

align-items :center; 수직적으로 중심에 배치

 

 

shrink :2 ; 2배 더 많이 줄어든다

shrink: 1; 

 

 

container의 width에 따라 60%30%10%씩 변동한다

 

align-self: 아이템하나만 배치하고싶을떄

flex:1 flex: 1 1 0와 같다

+ Recent posts