그리드 아이템 정렬 속성

 

inline 수평 축 정렬(좌우방향)

  • justify-items: center; (수평축 가운데, 모눈종이 내부) 
  • justify-content: center; (수평축 가운데, 모눈종이 자체)

block 수직축 정렬(위아래방향)

  • align-items: start; (수직축 가운데, 모눈종이 내부)
  • align-content:center;(수직축 가운데, 모눈종이 자체)

패키징정렬은 content

아이템 정렬은 items

항목별 정렬은 self

 

 

justify-items : center;

justify-items : end;

justify-items : stretch;

justify-items: center; (수평축 가운데)

align-items: start; (수직축 위)

justify-items: center; (수평축 가운데)

align-items: center; (수직축 가운데)


justify-items: center; (수평축 가운데, 모눈종이 내부) 

justify-content: center; (수평축 가운데, 모눈종이 자체)

align-items: start; (수직축 위, 모눈종이 내부)

모눈종이가 맨위 가운데에 놓여있다.


justify-items: center; (수평축 가운데, 모눈종이 내부) 

justify-content: center; (수평축 가운데, 모눈종이 자체)

align-items: start; (수직축 가운데, 모눈종이 내부)

align-content:center;(수직축 가운데, 모눈종이 자체)


부모의 여백에 따라서 그리드정렬이 바뀐다.

여백이 얼만큼 있느냐에 따라, 그리드 박스의 크기에 따라 정렬이 결정된다.


  grid-template-areas

areas에 따라 하나의 영역이 되어 적용된다. 

Summary :

  • 캡슐화란 ? 속성에 접근지시자적용, 해당 속성을 사용하는 함수를 같은 클래스내에서 만듦
  • 데이터의 변화가 외부파일에서 오류를 발생 -> 데이터사용하는 함수를 데이터와 같은 클래스에 둔다
  • 캡슐화를 했지만 데이터를 외부에서 쓴다면 ? 캡슐이 깨진다. ->막으려면 ? -> 접근지시자 사용
  • 접근제어자 : 외부에서 데이터를 볼수 없게하는것 
  • print함수를 분리한 이유: Lotto{}에 포함할 경우 콘솔용이 되어버린다.
  • 함수: static / 객체지향에서 사용하는 함수 : 메소드

 

함수는 원래 외부변화에 영향을 받지 않아야한다.

하지만 다른 클래스에서 데이터계층lotto.nums[i]을 사용할때 문제가 발생한다. 

속성을 정의하는 쪽(Ellipse{ })과 사용하는 사람(main메소드())이 다른경우 :

1. 속성을 간접적으로 쓰기위해 속성과 연관된 함수를 호출. 

2. main에서 속성을 따로만들어도 Ellipse{}클래스안에서 만들어달라고 부탁하는것 

 

도형을 담당하는 데이터가 있다고 가정해보자. 다양한 정수를 Ellipse{ }라고 묶어서 데이터를 개념화시킨다. 데이터를 파악하는게 용이하다.

 

Ellipse{ }안의 속성을 마음대로 쓰는것에 주의해야한다.

직접 사용한다면 각 x,y,w,h를 누가, 어느코드에서 ,몇개를 사용하는지 파악하기가 힘들어진다. → 어느코드에서 오류가 발생하는지 파악하기 힘들다.

 

Ellipse{ }안의 속성(int x,y,w,h)을 쓰는것이 모두 Ellipse{ }안에 있다면 속성명이 변경되는 경우 오류의 범위가 Ellipse{ }안으로 한정된다. 외부에서 속성을 직접사용하는것이 없어진다.

 

Ellipse{ } : 데이터구조를 정의하고있는것, 함수를 모아둘 수 있는 울타리역할→클래스

 

캡슐 : 데이터구조와 함수를 하나로 모아둔것

캡슐화 : 캡슐을 만드는 과정 (함수가 외부영향에 받지않도록 최소화) ↔캡슐이 깨지다.(캡슐밖에서 사용되는경우)

데이터 속성과 데이터를 직접쓰는 함수를 묶는것.

 

캡슐을 깨지못하게 하는 도구 : 접근 제어 지시자

외부에서 아예 접근못하도록 막을 수있다.

protected 자식에게만 접근허락.

private int[] nums ; 

캡슐화 실습

  • main()함수에있을때는 lotto.nums에 에러가 발생한다. int[] nums가 private처리되어 다른클래스에서 접근이 불가능하기 때문이다. 
  • main()함수에 있던 gen()와 sort()함수를 Lotto{}클래스 안에 넣었다. lotto.nums[] 오류가 사라진다.
  • 속성에 접근지시자적용, 해당 속성을 사용하는 함수를 같은 클래스내에서 만듦

 

 

 

print()함수를 Lotto{}에 포함하지않은 이유 ? 

사용자에게 보여줄 수 있는 옵션들 : 콘솔출력 / 윈도우 출력 / 웹 출력/ VR

print()함수를 Lotto에 포함하면 콘솔용 프로그램이 된다. 특정UI로 종속되어버린다.

 

Lotto{}클래스에는 입력버퍼가없다. ->데이터입력이 없다.

배열[]인 메모리할당을 한다. 

사용자에게 입력을 받거나 파일에서 읽어들이는 버퍼가 없다.

 

private int[] nums ; 외부접근막았으니 

getNum(Lotto lotto, int i): Lotto클래스의 정수를 하나씩 꺼내줄 수 있는 함수를 만든다.

외부에서는 Lotto.getNum() 함수를 통해 int[] nums에 담긴 값을 불러온다. (클래스명.함수명으로 호출)


Getter함수(값을 얻어오는 함수 Getter, 값을 적용하는 함수Setter)

외부에있는 print()함수에서 int[] nums에있는 숫자를 가져오기위한 함수getNum()를 Lotto클래스에 만든다.

외부클래스에서는 Lotto.getNum()을 통해 숫자를 가져온다.

 

Program 클래스

getNum[]함수는 lotto가 가지고있는 데이터중에서 i번째 숫자를 반환해주는 역할

함수가 해야할 일을 Lotto{}클래스에서 만들어준다.

 

lotto라는 객체,실체,인스턴스를 공유한다

Lotto{}클래스의 nums명을 바꿔도 Lotto클래스안에서만 오류가 발생한다.

int[] nums변수명 변겨시 Lotto클래스에서만 에러발생

초기화함수 static void init()

main()에서 Lotto.init();호출하고 

nums배열 초기화(lotto.nums = new int[6];를)하는 init()메소드를 Lotto클래스에서 만든다.

Pritn()함수가 밖에 있기때문에 size에 직접 접근할 수없고 getSize()함수를 통해 가져온다.

Lotto.getSize()

Program클래스

package ex6.캡슐화.로또;

import java.util.Random;

public class Program {
	
	// 로또를 출력하자
	private static void print(Lotto lotto) {
		//밖에있으니까 캡슐깨지않고 함수를통해얻어야함
		for (int i = 0; i < Lotto.getSize(lotto); i++) {
			System.out.printf("%d", Lotto.getNum(lotto, i));
			if (i < 5)
				System.out.printf(",");
		}
		System.out.println();
	}

	public static void main(String[] args) {// 어플리케이션역할
		//lotto객체를 생성.기존gen()함수에서 분리함 : gen()함수는 숫자만생성하도록
		Lotto lotto = new Lotto();

		//lotto.nums = new int[6];
		Lotto.init(lotto);			
		
		//int[] lotto;

		lotto = Lotto.gen(lotto);//Lotto의 인스턴스(객체,실체)를 만드는 함수

		print(lotto);
		
		Lotto.sort(lotto);

		print(lotto);
		
	}// main메소드 끝

}
package ex6.캡슐화.로또;

import java.util.Random;

//재사용
public class Lotto {
	private int[] nums; // Lotto의 청사진,단순 정의,
	private int size;

	public static int getNum(Lotto lotto, int i) {
		int num = lotto.nums[i];
		return num;
	}
	public static void init(Lotto lotto) {
		lotto.size = 6;
		lotto.nums = new int[lotto.size];
	}

	public static int getSize(Lotto lotto) {
		return lotto.size;
	}

	public int getSize() {
		return size;
	}


	static Lotto gen(Lotto lotto) {
//		Lotto lotto = new Lotto(); // 4바이트
//		lotto.nums = new int[6]; // 배열의 공간생성
		Random rand = new Random();
		for (int i = 0; i < 6; i++) {
			lotto.nums[i] = rand.nextInt(45) + 1;
		}
		// 자판기
		return lotto;
	}// gen()끝

	public static void sort(Lotto lotto) {

		for (int j = 0; j < lotto.size - 1; j++) {
			for (int i = 0; i < lotto.size - 1 - j; i++) {
				int compare;
				if (lotto.nums[i] > lotto.nums[i + 1]) {
					compare = lotto.nums[i];
					lotto.nums[i] = lotto.nums[i + 1];
					lotto.nums[i + 1] = compare;
				}
			}
		}
	}// sort()끝

}

자바는 컴파일하면 바이너리코드가 만들어진다. 다른사람이 만든 컴파일된 결과물을 가져다 쓸 수 있다.

작성한 소스코드를 컴파일하고 jar파일로 압축해 다른곳에서 결과물을 재사용할 수있다.

 

jar파일생성 방법

해당 클래스파일이있는 프로젝트 클릭 → 마우스 오른쪽 →Export→JAR file 선택 후 next

→ 변환하고자하는 파일위치 선택 → 필자의 경우 Lotto.java 선택→저장할경로선택 finish

 

선택한 경로에 들어가면 압축된 jar파일이 확인가능하다.

이때 확장자를 zip파일로 바꾸면 프로젝트폴더안에 해당 저장된 클래스파일을 확인 할 수있다.

 


 

배포된 실행파일 이용하는 방법

배포된 파일을 적용할 프로젝트선택 →마우스 오른쪽클릭 build path Configure Build Path

→Libraries →Add External Jars→해당jar파일을선택 →Apply and Close


 

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 엔터:

 

+ Recent posts