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와 같다

자바는 포인터가없고 값변수, 참조변수가 있다.

값 변수와 참조변수 :

값변수는 담는 공간을 가지는 변수

참조변수는 담을 공간이 없으며 객체를 가리키는 변수, 객체의 주소를 담고있다. 객체에 이름을 부여.

hailey라는 글자가 주소를 갖고있는게 아닌것처럼, hailey는 참조변수(이름)이다.

String name = "hailey";

자료형 이름     객체(가 공간을가지고있다)

다양한 hailey중 이름을 붙여 구별할수있게한다.


Q. 데이터 4번째 컬럼의 총 합을 구하시오.

데이터 값 출력하기

 

원본데이터

반복해야할 구문 :

1.문자열 한줄을 불러온다.

2.문자열을 쉼표로 구분한다.

3.구분한 문자열을 배열에 넣는다.

4. 인덱스3번의  문자를 숫자로 변환하고 누적값을 구한다.

1~4번을 반복하면 전체 누적수가 나온다.


 

FileInputStream fis = new FileInputStream("파일상대경로");

하드디스크에는 암이라는게있고, 트랙이있다.트랙어딘가에 데이터가있다.

어플리케이션에서 데이터를 사용한다. 어플리케이션은 일정한 버퍼를 통해 데이터를 가져온다.

 

 

Scanner scan = new Scanner(fis);

fis을 사용하는 Scanner의 이름을 scan이라부른다.

데이터를 가져올때 fis.read()를 통해 가져올 수 있다. read는 코드를 하나씩읽어온다.

fis로 Scanner를 이용하면 문자열로 (단어,라인) 읽어올 수 있다.

 

 

String line = scan.nextLine();

nextLine()은 데이터의 일부만 가져오는데, 엔터(13번)까지 가져온다.

line은 "문자열"(scan.nextLine()이 가져온 것)의 이름이다.

문자열 객체인 [기준일자,제주 확진자,제주 사망자,제주 검사진행자수,자가격리중,..]을 가져온다.

line은 [..]을 가리킨다.

 

 

line = scan.nextLine();

line은 첫번째행을 읽어들였는데, 이번엔 두번째 라인을 불러온다.

[2020-10-01,59,0,28,0,0,58,8,230,2020-12-14]을 가져온다.

line은 더이상 위의 scan.nextLine() 을 가르키지않고 현재 scan.nextLine()을 가리킨다.

참조하는게없는 데이터공간을 가비지라고 부른다.

첫번째scan.nextLine()은 메모리누수를 방지하기위해 런타임환경에서 가비지콜렉션이 수거해간다.

즉, 참조하는게없는것은 자바실행환경이 수거해간다.

 

 

String[] cols = line.split(",");

line을 가지고 split이 넣어준 구분자","로 문자열을 쪼갠 후 각각을 문자열로 만든다.

문자열들의 배열이 새로 만들어진다. line.split(",")에 의해 line안에있었던 문자열들이 문자배열이 되었다.

이 문자배열을 참조하기 위해 새로운 String[]배열 이름 cols을 만들어준다.

cols도 line.splite을 가르키는 이름이다.

["2020-10-02","59","0","35","0","0","58","7","230","2020-12-14"]

cols는 공간이아니다. line.split(",");을 참조한다.

 

 

System.out.println(Integer.parseInt([cols[3]);

합계를 구하기위해선 "28" 문자열이기때문에 형변환을 해줘야한다.

 

 

while(scan.hasNextLine())

scan.가 다음라인을 가지고오면 hasNextLIne이 true를 반환한다.

가져올 데이터유무에 따라 true, false값을 반환한다. 이것을  while의 조건으로쓴다.

true를 반환하는동안 while이 반복한다.

끝까지읽고 더이상 읽어올게없으면 false를 반환한다.

 

 

 

추가문제 : 제주 검사진행자수 컬럼의 총합을 구하시오

 

package ex3.array.test2;

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

public class Jeju {

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

		FileInputStream fis = new FileInputStream("res/corona.csv"); //파일위치지정
		Scanner scan = new Scanner(fis); //파일불러오기
		String line = scan.nextLine(); // 1행불러온것

		int total = 0;

		// 2020-10-01,59,0,28,0,0,58,8,230,2020-12-14 

		while (scan.hasNextLine()) {// 다음에읽어올게있어?
			line = scan.nextLine();
			String[] cols = line.split(",");		// [2020-10-01,59,0,28,0,0,58,..]
			total += Integer.parseInt(cols[3]);
		}		
		System.out.println(total);

		scan.close();
		fis.close();
		System.out.printf("10월 1일부터 12월14일까지 검사진행자수:%d",total);
	}

}
//10월 1일부터 12월14일까지의 누적검사진행자수
//누적 검사진행수
//첫번째열읽고

 

 

 

 

 

Flex
-1차원적이 배치기법을 위해 고안됨
-컨텐츠 중심

Grid
-2차원적인 배치기법
-레이아웃 중심

 

flex, grid에서 쓸 수 있는 속성 구별하기

 

static (기본값) :위치를 지정하지 않을 때 사용한다.

 

position : absolute ;

절대적인위치, 기준점 : 브라우저 좌측상단

absolute

문서끝에서의 기준에서 300, 300적용

 

position : fixed;

유리면에 포스트잇을 붙이는상황,스크롤을 움직여도 고정되어있음(기준이 내가보고잇는화면)

position : fixed;

원래 위치와 상관없이 위치를 지정할 수 있다. 하지만 상위 요소에 영향을 받지 않기 때문에 화면이 바뀌더라도 고정된 위치를 설정 할 수 있다.

브라우저 화면의 상대 위치를 기준으로 위치가 결정된다

 

부모position : relative / 자식position : absoluate , left, top 지정한경우

relative : 상대적인위치, left,top위치,자신이 있던 위치에서 넣어준만큼이동

부모 : relative / 자식 : absoluate

부모에는 relative , 자식은 absolute로 부모그레이칸 위에 자식을 위치시킴.

relative : top, right, bottom, left(위, 오른쪽, 아래, 왼쪽)으로 원하는 만큼 조절할 수 있다.

 

position : sticky 헤더부분고정시

포스트잇이 유리창위에 붙인것. 자기공간이 유지되어 동생이랑 겹치지않음.

노란색(#header) position : sticky 적용시, 검정이미지가 노란색의 자리(흰색)을 침범하지않는다.

스크롤을 내리면 노란색이 상단에 고정이 되고 동생들 (#visual)가 뒤로 지나간다.

 

position : relative;

포스트잇을 문서위에 붙인것. 자기공간유지

 

검정이미지가 노란색의 자리(흰색)을 침범하지않는다.

스크롤내리면 안보임.

 

position : absolute;

포스트잇을 문서위에 붙인것. 자기공간 없어짐

검정이미지가 노란색의 자리(흰색)을 침범함.

스크롤내리면 안보임.

 

position : fixed;

포스트잇을 유리창위에 붙인것. 자기공간 없어짐

검정이미지가 노란색자리를 침범함.

스크롤을 내리면 노란색이 상단에 고정이 되고 동생들 (#visual)가 뒤로 지나간다.

String클래스

new라는 연산자를 통해 객체를 생성해야하지만 생략가능

String은 문자열 개체이다.

아래의 n1은 "hello"문자열을 가지고 있는 도구이다.

n1을 통해 String클래스가 가지고있는 도구들을 사용할 수있다.

String n = new String("hello"); //String클래스 객체를만든것, 문자를 조작할수있는 기능들을갖고있다.
String n1 = "hello"; //객체화됨, 문자열을 담고있는도구 /

 

객체 n1을 통해 indexOf(),substring(),length,toUpperCase(),compareTo 등 메소드들을 사용 할 수있다.

문자열비교

		String n1 = "홍길동";
		String n2 = "홍길동";

		String n3 = new String("홍길동");
		String n4 = new String("홍길동"); //객체비교
		
		System.out.println(n1 == n2); //참 new연산자
		System.out.println(n1.equals(n2)); //참 *자주사용함
		System.out.println(n3 == n4); //거짓
		System.out.println(n3.equals(n4)); //참

n1과 n2는 new를 이용해서 객체를 생성하지 않으면 컴파일러가 해준다. 같은 문자열을 갖고있으면 같은곳에 위치한다.(같은객체참조)

n1==n2비교하면 객체비교,(주소값 비교)이며, 이라고 나온다.

 

n1.equals(n2)는 대상의 내용자체를 비교한다. 결과는 참이다.

 

n3 == n4 는 각각 다른 주소값을 갖으므로 거짓이 나온다.

n3.equals(n4)는 같은 내용을 갖고있으므로 참이 나온다.

equals참조

 

length()

String fileName = "photo.jpg";
String test = fileName.substring(3);//to.jpg
System.out.println(test.length());//6

fileName.substring(3) : fileName의 인덱스3부터 끝까지 문자열을 반환한다. 

test.length() : test의 문자열 길이를 반환한다.

 

 

indexOf() / substring()

		String fileName = "photo.jpg";
		System.out.println(fileName.length()); // 9
		System.out.println(fileName.indexOf(".")); //"."가 포함되었는지? 5
        System.out.println(fileName.indexOf(".",6)); 
        //-1 "."가 6번째부터 포함되어있는지?없다면-1
		System.out.println(fileName.substring(3)); //to.jpg
		System.out.println(fileName.substring(3,2)); // 에러 
		System.out.println(fileName.substring(3,5)); // 인덱스3~4까지 to 

fileName.length() : fileName의 문자열 갯수. 총 9개를 반환한다.

fileName.indexOf(".") : fileName의 문자열 중 "."위치를  찾아준다. "."의 위치 5가 반환된다.

fileName.indexOf(".",5) : fileName의 문자열 중 "."를 인덱스6부터 찾는다.없다면 -1반환한다.

fileName.substring(3,5) : fileName의 인덱스3부터 인덱스4까지 반환 

 

 

String.substring(start,end)

		String fileName = "photo.jpg";
		//위의 파일명에서 .이있는곳까지의 문자열을 출력(단.제외)
		int pos = fileName.indexOf(".");//위치파악
		System.out.println(fileName.substring(0,pos)); //photo
		System.out.println(fileName.substring(pos)); //.jpg

String.substring(start,end): start부터 end전까지 문자열출력

fileName.indexOf(".") : fileName의 특정문자열위치(숫자로 반환)를 갖고있는 객체생성.

fileName.substring(0,pos) : 0부터 pos전까지 문자열출력

fileName.substring(pos) : pos부터 끝까지 문자열출력

 

 

String.compareTo()

		int a = fileName.indexOf(".");//위치파악
		System.out.println(fileName.compareTo("aphoto.jpg")); // 15  결과가0 보다크다면 앞이크다
		System.out.println(fileName.compareTo("photo.jpg")); // 0 문자열 같을때 0을 반환
		System.out.println(fileName.compareTo("qphoto.jpg")); // -1
		System.out.println(fileName.compareTo("rphoto.jpg") > 0); // -2 0보다작으면 괄호

String.compareTo("A") : String의 문자열과 "A"문자열의 순서를 비교

첫번째글자가 같으면 다음 두번째글자를 비교한다. 

String의 문자열이 사전편찬순서상 뒤에있다면 0보다큰 양수 값이 반환된다.(a,b,c,d,...,z순서)

fileName > "aphoto.jpg" 보다 크다면 15가 반환(f가 a보다 순서가 뒤에있으므로 f가 크다)

fileName과 "aphoto.jpg"의 알파벳순서가 같다면 0이 반환

String.compare("A")결과 값이 0이라면 String값이 "A"값보다 더 크다.(조건문의 조건으로사용가능)

fileName > ("aphoto.jpg") 0 보다 크면 fileName이 크다. 음수이면 "aphoto.jpg"이크다.

 

 

문자열배열의 인덱스섞기

		String[] names = new String[] {"강호동","유재석","하하","김지호","김현준","김태희","박민정"};

		Random rand = new Random();
		
		for(int i=0; i<100;i++) {
			int idx1 = rand.nextInt(7); //0~6
			int idx2 = rand.nextInt(7); //0~6
//			System.out.printf("idx1 :%d, idx2:%d\n",idx1,idx2); //랜덤값을 확인한다.
						
			String temp; //데이터형이달라져도 똑같다.
			temp = names[idx1]; //랜덤값끼리 섞어준다
			names[idx1] = names[idx2];
			names[idx2] = temp;			
		}

배열 인덱스 섞기는 자료형이 달라져도 방식은 똑같다.

배열의 인덱스 숫자만큼 랜덤숫자를뽑는다.

임시변수만 String타입으로 선언해준다.

 

 

문자열비교 String.compareTo("A")

		for(int j=0;j<7-1;j++) 		
			for(int i=0;i<7-1-j;i++) 
				if(names[i].compareTo(names[i+1]) > 0){
					String temp;
					temp = names[i];
					names[i] = names[i+1];
					names[i+1] = temp;
					}			
				

String.compareTo()메소드를 통해 두 문자열을 비교할 수있다.

b.compareTo(a) > 0 이라면 b가 a보다 크다. 둘의 위치를 바꾸면 사전편찬순으로 정렬된다.

총7개의 인덱스를 6번반복하면 가장 마지막 문자열 1개가 나오고(작은for문) 이 반복을 6번반복하면 전체정렬이된다.

 

 

String클래스를 통해 만들어진 객체.하면 String클래스에 포함된 메소드들이 뜬다.

 

package ex3.array.test2;

import java.util.Random;

public class Program2 {

	public static void main(String[] args) {
		

		
//		String n = new String("hello"); //String클래스 객체를만든것, 문자를 조작할수있는 기능들을갖고있다.
//		String n1 = "hello"; //객체화됨, 문자열을 담고있는도구 /
		
		
		String n1 = "홍길동";
		String n2 = "홍길동";

		String n3 = new String("홍길동");
		String n4 = new String("홍길동"); //객채비교
		
		System.out.println(n1 == n2); //참 new연산자
		System.out.println(n1.equals(n2)); //참 *자주사용함
		System.out.println(n3 == n4); //거짓
		System.out.println(n3.equals(n4)); //참

		
//		
		String fileName = "photo.jpg";
		System.out.println(fileName.length()); // 9
		System.out.println(fileName.indexOf(".")); //"."가 포함되었는지? 5
		System.out.println(fileName.substring(3)); //to.jpg
//		System.out.println(fileName.substring(3,2)); // 에러 
		System.out.println(fileName.substring(3,5)); // 인덱스3~4까지 to 
//		
		//위의 파일명에서 .이있는곳까지의 문자열을 출력(단.제외)
		int a = fileName.indexOf(".");//위치파악
		System.out.println(fileName.substring(0,a)); //-1이상이면 0부터있다는걸로파악.
		System.out.println(fileName.substring(a,8)); //-1이상이면 0부터있다는걸로파악.

		System.out.println(fileName.compareTo("aphoto.jpg")); // 15 > 0 보다크다면 
		System.out.println(fileName.compareTo("photo.jpg")); // 문자열 같을때 0을 반환
		System.out.println(fileName.compareTo("qphoto.jpg")); // -1
		System.out.println(fileName.compareTo("rphoto.jpg") > 0); // -2 0보다작으면 괄호
		//fileName 이 크면 양수, fileName이 괄호()보다 작으면 음수
		
	
		//"912"(문자열은 1 2 라고읽는다) "9" 문자열의크기 앞글자의 비교
		
		
		String[] names = new String[] {"강호동","유재석","하하","김지호","김현준","김태희","박민정"};

		Random rand = new Random();
		
		for(int i=0; i<100;i++) {
			int idx1 = rand.nextInt(7); //0~6
			int idx2 = rand.nextInt(7); //0~6
//			System.out.printf("idx1 :%d, idx2:%d\n",idx1,idx2); //랜덤값을 확인한다.
						
			String temp; //데이터형이달라져도 똑같다.
			temp = names[idx1]; //랜덤값끼리 섞어준다
			names[idx1] = names[idx2];
			names[idx2] = temp;			
		}
		
		for(int i=0;i<7;i++) {
			System.out.printf("\"%s\"",names[i]);
			if(i<7-1)
				System.out.print(",");		
		}		
		//정렬

						
		for(int j=0;j<7-1;j++) 		
			for(int i=0;i<7-1-j;i++) 
				if(names[i].compareTo(names[i+1]) > 0){
					String temp;
					temp = names[i];
					names[i] = names[i+1];
					names[i+1] = temp;
					}			
			
	}
}


package ex3.array.test2;

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

public class Program3 {

	public static void main(String[] args) throws IOException {
		
		FileInputStream fis = new FileInputStream("res/names.txt");
		Scanner fscan = new Scanner(fis);

		String line = fscan.nextLine();
		
		String[] names = line.split(",");//쉼표기반으로 잘라줌
		
//		System.out.println(names[1].trim());	//문자열앞뒤빈공백없애줌
		
		String names1 = names[1].trim();
		
		System.out.println(names[1].trim());		
		
				
		fscan.close();
		fis.close();

	}
}

flex : flex-grow / flex-shrink / flex-basis 의 축약

순서암기

래핑 flex-wrap

flex-direction : column

flex-wrap : wrap

 

Flex-flowflex-wrap이랑 direction한번에쓰는것

order : 순서바꿈

 

justify-content 와 align-items

콘텐트 : 팩킹

 

justify-content : center;

 

 

justify-content mdn 검색하면서 할것

 

justify-content : space-evenly

 

align-content와 align-items 비교

 write(byte [] b, int off, int len) 사용

write(byte[] b) : 

write(byte[] b)를 통해 비트맵파일의 바이트갯수를 한번에 불러와 빠르게 파일을 빠르게 복사했지만,

바이트배열 생성시 1000바이트씩 읽고 1000바이트씩 써서 원본의 크기와 차이가 발생했다.

보통 파일의 값은 1000으로 딱떨어지지않는다.

마지막은 1000개가아니라 454만 출력하도록 해보자.

( 이전글 write(byte[] b) )

 

좌: 원본 / 우 : write(byte[] b) 사용시 

write(byte [] b, int off, int len) 를 이용해 마지막 454바이트까지 불러오게한다.

fos.write(buf,0,size); 넣으면 

0~1000,0~1000,...,0~1000개를 출력하다가 마지막 454개를 출력한다.

 

 

write(byte [] b, int off, int len)

 : b[off] 부터 len 개의 바이트를 출력 스트림으로 보냄.

OutputStream os = new FileOutputStream("파일 경로");

byte[] data = "가나다".getBytes();

os.write(data, 1,2) // "나다"만 출력

package ex3.array;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyProgram {

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

		FileInputStream fis = new FileInputStream("res/aaa.bmp"); // 이미지파일 불러오기
		FileOutputStream fos = new FileOutputStream("res/img_copy.bmp"); // 이미지파일출력

		// 2. fis를 통해서 1 바이트를 읽어서 byte 변수 b에 담는다.
		// b의 값을 fos로 통해서 출력한다.
		int size = 0;
		
		byte[] buf = new byte[1000];
				
		while ((size = fis.read(buf)) != -1)
			fos.write(buf,0,size);


		fis.close();
		fos.close();

		System.out.println("복사완료");				
	}
}

 

 

hasNextLine()

txt파일(메모장)을 작성후, 메모장내역을 불러와 콘솔에 출력하기

package ex3.array.test2;

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

public class Program {

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

	//1.문자열 10개 짜리 names 배열을 생성한다.
		String[] names = new String[10];
		
	//2.파일에서 name들을 읽어와서 names 배열애 대입한다.
		FileInputStream fis = new FileInputStream("res/names.txt");
		Scanner fscan = new Scanner(fis); //문자불러오기
		
		int i =0;
		while(fscan.hasNextLine()) { //참인동안 반복
			String name = fscan.nextLine(); //끝까지 읽었다는 것을 알려줌
			names[i++] = name; // 다음을 증가
			System.out.printf("%s, ",names[i-1]);
			
			if(fscan.hasNextLine()==true) // 거짓이면 중단
				System.out.printf(","); //마지막줄
		}
				
	//3.names 배열의 이름을 다음처럼 콘솔에 출력한다.
	//홍길동,김길동,강호동,유재석
				
		fscan.close();
		fis.close();

		System.out.println("복사완료");	
	}
}

nextLine()줄을 읽어오지만, 끝을 읽었다는걸 알려주거나, 값을가져오는내용이없다. 

fscan.점을찍으면 여러메소드들이 조회된다

hasnextline() : 불리언, 트루, 거짓 값을 반환한다, 다음라인을 가져올수있으면 트루값을가져오도록 한다.

 

if(fscan.hasNextLine() : 불러올 문자가 더 있다면 참
String name = fscan.nextLine(); : 불러온 문자를 변수name에 넣는다.

names[i++] = name; 배열에 담는다.

names[i++] : 다음을 증가, 

 

다음라인이있는지 찾고, 있다면 배열에 담는것을 반복한다-> while로 반복

 

 

 

 

 

1. 정수 10개짜리 nums배열을 생성한다. 

		int[] nums = {1,2,3,4,5,6,7,8,9,10};

 

2. 랜덤값 두개를 뽑아서 100번 섞는다.

정수 두개 변수선언을하고 각각 랜덤함수를 적용해준다.

잘 섞였는지 출력해서 확인

		Random rand = new Random();
		
		for(int i=0;i<100;i++) {
			int idx1 = rand.nextInt(10); //0~9
			int idx2 = rand.nextInt(10); //0~9
			System.out.printf("idx1: %d, idx2:%d\n",idx1,idx2);

 

3. 랜덤으로 뽑은 두 인덱스를 섞는다. (섞기연습)

			int temp;
			temp = nums[idx1];
			nums[idx1] = nums[idx2];
			nums[idx2] = temp;		
			

 

4. 버블정렬을 위해 제일 큰 값을 찾는다.

n번째값보다 n+1번째 값이 크다면 서로 위치를 바꾼다.(if문)

가장 큰값이 마지막에온다.

0번째값이 1번쨰값보다 크다면 두 위치를 값을 바꾼다.

1번쨰값이 2번째값보다 크다면 두 위치의 값을 바꾼다. ~ 8번째값이 9번째값보다 크다면 두 위치의 값을 바꾼다.

		for(int i=0;i<9;i++) // 범위주의 (인덱스갯수-1 : 인덱스가4개일경우 3번이면 모두비교됨)
			if(nums[i]>nums[i+1]) {
				int temp;
				temp = nums[i];
				nums[i] = nums[i+1];
				nums[i+1] = temp;
			}

 

5. 버블정렬로 오름차순(이중 for문)

0,1,2,3,4,5,6,7,8,9의 10개의 수가 섞여있는 배열을 오름차순으로 정렬하기위해서

각 수를 두개씩 묶어서 비교하면 9번만 검사하게된다. (안쪽 for문)

이 반복을 또 9번해야 전체적으로 정렬이된다.(바깥 for문)

 

바깥for (int j=0;j<9-1;j++) : 전체범위 , 9번 반복

안쪽for ( int i=0;i<10-i-1;i++) : 바깥for문이 한번돌면 가장큰 숫자는 맨 오른쪽에위치한다. 확정된 것은 더이상 비교할필요없다.

		for(int j=0;j<10-1;j++) 
			for(int i=0;i<10-1-j;i++) 
				if(nums[i]>nums[i+1]){
				int temp;
					temp = nums[i];
					nums[i] = nums[i+1];
					nums[i+1] = temp;
				}

큰for문의 j가 작은for문안에서 쓰여서 

for(int i=0;i<10-1;i++) : 제일큰 것 찾기, 나머지애들끼리 값을 비교

for(int i=0;i<9-1;i++) : 두번쨰로 큰 것 찾기

for(int i=0;i<8-1;i++) , ... 로 점차좁혀진다. 

for문 범위 변화에 따른 결과값

 

콘솔출력

6. ',' 쉼표찍기

인덱스가 10개이지만 쉼표는 마지막에 빠져야한다. (즉, 9번만 발생)

if문을 사용해서 9번째까지만 찍도록 for문안에 중첩한다. 

for문을 이용해 nums[i]의 값을 순서대로 출력하되, i가 9보다 작다면 ','를 출력한다.

		for(int i=0;i<10;i++) {
			System.out.print(nums[i]);
			
			if(i<9)
				System.out.print(",");
			}

 

5. 전체 오름차순으로 버블정렬

package ex3.array.test2;

import java.util.Random;

public class practice {

	public static void main(String[] args) {
		
		//1.정수 10개짜리 nums배열을 생성한다. 단, 1,2,3,4~10

		int[] nums = {1,2,3,4,5,6,7,8,9,10};
		
		//섞는다.
		//랜덤값을 얻어서
		Random rand = new Random();
		
		for(int i=0;i<100;i++) {
			int idx1 = rand.nextInt(10); //0~9
			int idx2 = rand.nextInt(10); //0~9
			System.out.printf("idx1: %d, idx2:%d\n",idx1,idx2);
			
		//두 인덱스의 위치를 바꿔라.		
			int temp;
			temp = nums[idx1];
			nums[idx1] = nums[idx2];
			nums[idx2] = temp;		
			}
		for(int i=0;i<10;i++) {
			System.out.print(nums[i]);
			
			if(i<9)
				System.out.print(",");
			}System.out.println();
		
		
		//버블정렬 제일큰 값을 찾아서 맨 뒤로 밀어내기
		//배열에서 가장 큰 값찾기		
	    // 범위주의 (인덱스갯수-1 : 인덱스가4개일경우 3번이면 모두비교됨)
		for(int j=0;j<10;j++) {
			for(int i=0;i<(10-j)-1;i++) 
				if(nums[i]>nums[i+1]){
				int temp;
					temp = nums[i];
					nums[i] = nums[i+1];
					nums[i+1] = temp;
				}
		}
				
		
		for(int i=0;i<10;i++) {
			System.out.print(nums[i]);
			
			if(i<9)
				System.out.print(",");
			}
			System.out.println();
		
	}
}

 

블록태그와 인라인태그

블록태그

방을 만드는 태그

가장 큰 블록태그

  • header, main, footer

콘텐츠 블록 종류 5개

  • 제목: <h>, <h1>
  • 목록 : <ul> , <ol>
  • 문장 : <div>, <p>
  • 표 : <table>
  • 입력폼 : <form>

텍스트,콘텐트를 감싸는 최전방 블록들

제목열 정리하는 section 태그

  • section, article,nav,aside

상대경로와 절대경로 차이 /크롬 확장프로그램/ HTML 문서구조

인라인요소


인라인태그

블록안에서 사용되는 태그

콘텐츠를 감싸거나, 콘텐츠 그 자체인 태그

<font>, <b> bold처리 ,<u> underline, <i>글기울임 

 


  1. flex박스 지정하기
  2. 기존 지정된것을 잃어버리고 flex디스플레이로 속성적용
  3. 아이템의 기본크기 : 콘텐트크기
  4. 여백나눠갖기 

 

콘텐트크기에 따라 기본 너비가 지정된다.

 


콘텐츠가 밖으로 나오는 현상

<div> 에 height 100px가 기본콘텐츠들의 높이보다 작아서 콘텐츠가 밖으로 나온다.

 

 

delete elements

개발자도구를 열고, elements에서 마우스오른쪽버튼을누르면 delete elements기능을통해 동적으로 확인가능

 

 

display : flex

display : flex 기본은 수평방향으로 나열된다.

 

 

flex-grow

flex-grow

1~7까지 콘텐츠박스가있고 나머지 오른쪽에 여백이있다. 이것을 나눠가져보자.

부모(item)에 flex-grow :1 지정 후 자식1(child) flex-grow :3 을 지정하면 

자식1을 제외한 6자식들에게 여백1개가 주어지고, 자식1에게 총3개의 여백칸이 주어진다.

여백을 3(자식1)+6(나머지자식) = 총 9등분으로 나눠서 가지게된다.

이때, 아이템박스자체가 3배가 되는것이 아니라, 자식1은 자신의콘텐츠블록과 여백3개를 갖는것이다.

콘텐츠영역과 여백영역이 합쳐보이니 주의.

 

flex-direction: 

flex-direction

flex-direction: ;컨테이너에게만 적용가능

 

 

 

반응형 움직임

width설정을 없애면 각 색깔이 창의 움직임대로 변형된다. (반응형)

 

 

여백

여백을 box3이 다 갖게되어 창을 움직일때마다 여백이box3으로 표현된다.

고정크기를 줘도 flex-grow를 설정하면 늘어난다.

 

 

flex-shrink

box1이 200px에서 고정되어 줄어들지않는다.

width는 개별적인 속성을 갖는다.

flex-shrink : 0 너비고정

flex-shrink : 1 남들보다 1배 줄어든다.

 

 

flex-direction : row-reverse 역방향

 

flex-basis

flex-basis 기본값이된다

 

 

File Stream이용해 파일복사하기

배열을 만들어 반복문실행

package ex3.array;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyProgram {

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

		FileInputStream fis = new FileInputStream("res/aaa.bmp"); // 이미지파일 불러오기
		FileOutputStream fos = new FileOutputStream("res/img_copy.bmp"); // 이미지파일출력

		// 2. fis를 통해서 1 바이트를 읽어서 변수 b에 담는다.
		// b의 값을 fos로 통해서 출력한다.
		int size = 0;
		
		byte[] buf = new byte[1000];
		
		
		while ((size = fis.read(buf)) != -1)
			fos.write(buf);


		fis.close();
		fos.close();

		System.out.println("복사완료");
				
	}
}

FIleInputStream fis = new FileInputStream("상대경로");

FileOutputStream fos = new FileOutStream("상대경로");

  • 입출력스트림의 객체생성

 

int size = 0; 

  • 변수 size 선언

 

byte[] buf = new byte[1000];

  • buf 배열생성

 

size = fis.read(buf);

  • read()는 한 바이트씩 읽어들이지만,
  • read(byte[] b)는 배열byte[] b를 이용해서 한꺼번에 바이트 갯수를 읽어온다.
  • 읽어올게 없으면 -1를 반환한다.

 

read()메소드를 사용했을경우 파일복사가 2분정도걸렸다면 read(byte[] b)메소드는 1초정도 걸린것같다!

 


 

 

배열생성,반복문이용,인덱스이용해서 거꾸로 출력하기

package ex1.bit;

import java.io.IOException;

public class test {

	public static void main(String[] args) throws IOException {
		//1.A부터 J까지 출력
		char[] nums = new char[10]; // 배열생성
		for(int i=0;i<10;i++) { // 0부터9까지 총 10번반복
			nums[i] = (char)('A'+i); //배열 초기화(A~J)문자넣기
			System.out.printf("%c",nums[i]); // 배열안에 넣은 문자출력
		}System.out.println();
		// [ABCDEFGHIJ]
		
		//2.J부터 A까지 출력
		for(int i=0;i<10;i++) {
			nums[i] =(char)('J'-i); //J부터 A까지넣기
			System.out.printf("%c",nums[i]); //출력			
		}System.out.println();
		//[JIHGFEDCBA]
		
		char tmp;
		for(int i=0;i<5;i++) {
			tmp = nums[i]; // 값바꾸기
			nums[i] = nums[9-i];
			nums[9-i] = tmp;//nums[0]와 nums[9]가 맞바꾼상황이 반복된다
			System.out.printf("%c",nums[i]);
			//양쪽값끼리바꾸므로 5번이면 다시A~순으로출력됨			
			//[ABCDE]
	}
}
}

char[] nums = new char[10];

  • 배열 생성

 

for(int i=0;i<10;i++) 

  • 0부터 9까지 10번반복

 

nums[i] = (char)('A'+i);

  • 'A' + 1 은 'B', 'A'+2 는 'C'이다. 한 문자에 숫자를 더하고 char타입으로 형변환을 해주면 다음 알파벳이 nums[i]에 들어간다.

 

nums[i] = (char)('J'-i);

  • i가 증가할때 'J'-0, 'J'-1, 'J'-2으로 위의 서식과 반대가된다. 내림차순[JIHGFEDCBA]으로 배열에 들어간다.

 

tmp = nums[9];

nums[9] = nums[0];

nums[0] = tmp;

  • nums[9]와 nums[0]가 서로 바뀐다.
  • [JIHGFEDCBA] 다시 역순이 되어 [ABCDEFGHIJ]출력된다.

 

 

 

변동크기 em 과 rem

html font-size: 50px일때

html { font-size : 50px; } 의 경우

 

html font-size : 10px 일때

html { font-size : 10px; } 경우

#header { height: 5em; } : 

  • 폰트사이즈 변화, 하이트 변화 , 루트를 기준(10px)으로 5배 늘어난다.

#header>div { height: 10rem; } : 

  • 폰트사이즈 변화, 하이트 변화, 루트를 기준(10px)으로 10배커짐. 

 

#visual{ height: 5em; font-size: 60px; } 

  • 변화없음, 자기속성가짐

#body { } :

  • 폰트사이즈 변화, 하이트 변화

 

#footer {font-size: 50px; } :

  • 변화없음,자기속성가짐

고정크기 : px, cm

변동크기 : rem,em,ex

em : 부모요소를 따라가지만, 자기 속성이있다면 자기속성을 따라간다.

rem : 루트(html{ })설정한 내용을 따라가고. 자기 속성이있다면 자기속성을 따라간다.

 


 

그룹화

class : 그룹으로 묶어서 스타일을 지정 할 수있다.

그룹화로 패턴을 만들어서 생산성을 높힐 수 있다.

 

 


min-height 최소높이
max-height 최대만정함(더이상클수없음)

 

 

height

 

 #visual height : 171px

#visual>div : height 100%

<div style =" : height : 100%;"> 부모영향

171px적용됨

 

 

#visual height : 50%이고 div style = height : 100% 인 경우

부모(visual>div)의 50%에 대해서 <div style>이 100%물려받음.

Style = , height : 100%        50%의 100%

 

 

#visual height : 50%이고 div style = height : inherit 인 경우

부모(visual>div)의 50%에 대해서 <div style>이 50%으로받음. (inherit)

Style = , height : inherit        50%의 50%

 

그러므로 height을 100%로 해야 나중에 부모높이를 바꿨을때 영향을 받지않을 수있다.

 


세번째 방

그룹화시킨 class 'float-content에서 opacity : 불투명도 조정

 

기존: static(수직방향적재), relative(상대적으로,기준위 기준아래등), absolute(절대위치)

최근: flex, grid

 

방을 위한 배치

수평방향:메인방향
반대는 크로스방향(수직)

 

display : flex;

수직으로되어있던 방을 수평으로 함


단축키

주석해제 : ctrl + k + u

주석처리 : ctrl + k + c

중첩 제어문

If

if의 조건문 검사 -> 종속문자 실행 -> 다음문자

while문이 되는 동안 if조건문들 넣기.

while(more){
	if(menu == 1){ }
    else if(menu == 2){ }
    else if(menu == 3){ }
    	more = false;
}

if문은 위에서부터 조건을 하나하나 순차적으로 본다.

 

 

switch

while(more){
	switch(menu){
    case 1:
    	break;
    case 2:
    	break;
    case 3:
    	break;
        }
  }

switch문은 사전에 거치는게없다.

조건별로 break 넣을것.

하지만 while을 벗어날 수 없다. break은 switch문만 벗어난다.

 

 

EXIT 중첩된 제어구조 벗어나기

EXIT:
while(more){
	switch(menu){
    	case 1 :
        	break;
        case 2 :
        	break;
        case 3 :
        	break EXIT;
        }
   }
         

라벨을 붙여 중첩된 문을 한번에 나갈 수 있다.

 

 

while

System.out.printf("국어 : ");
kor = Integer.parseInt(scan.nextLine());
                
while( kor<0 || 100< kor)
{					
	System.out.println("입력값초과 다시입력해주세요.");
	System.out.printf("국어 : ");
	kor = Integer.parseInt(scan.nextLine());
					
}

while의 조건문 검사 -> 종속문장 실행 ->while 조건문 검사

선행한작업을 검사하기위해 while하고 검사하고 그 후에 똑같은내용을적었다.

나중에 수정사항이 생기면 똑같이 고쳐줘야하는 문제가 발생한다.

 

 

do while

do{
	System.out.printf("국어 : ");
	kor = Integer.parseInt(scan.nextLine());
					
	if(kor<0 || 100< kor) {
	System.out.println("입력값초과 다시 입력해주세요");
	}
}while( kor<0 || 100< kor);

선행조건의 반복이 필요할 때 유용

먼저선행 국어를 다시입력받는 로직이 한번으로끝난다.

오류 java.lang.NumberFormatException : For input string: ""

  • 오류원인 :

nextInt()메소드가 사용자가 입력한 enter를 제거하지 않기때문.

입력버퍼에 엔터값이 그대로 남아있게된다.

다음 scan.nextLine()이 남겨진 개행문자를 읽어들이고 parsing하다가 오류가난다.

 

 

  • 오류해결 1 : nextInt()뒤에 nextLine()추가

menu = scan.nextInt();

scan.nextLine(); 남은 엔터값을 없애주기

 

 

  • 오류해결 2 : nextLine()을 입력받아 형변환하기

menu = Integer.pasrseInt(scan.nextLine()); 

scan.nextLine()가 문자를 읽어들인후 Integer.pasrseInt가 변환을한다.

문자열로 읽어서 조건검사를 하는것이 좀더 바람직하다.

package ex2.control;

import java.util.Scanner;

public class ProgramWithMenu {

	public static void main(String[] args) {
	      Scanner scan = new Scanner(System.in); // 반복에 포함될 필요없음
	      int kor, eng;
	      int math;
	      int total;
	      float avg;

	      kor = 0;
	      eng = 0;
	      math = 0;
	      
	      boolean more = true; //인위적으로바꾼것
	      
	      while(more)
	      {
	    	  int menu;
	      // 여기에 성적을 입력하는 코드를 작성하시오.
		      
		      System.out.println("┌────────────────────┐");
		      System.out.println("│       메인메뉴      │");
		      System.out.println("└────────────────────┘");
		      
		      System.out.println("1.성적입력");
		      System.out.println("2.성적출력");
		      System.out.println("3.종료");
		      System.out.print(">");
		      menu = Integer.parseInt(scan.nextLine());
		      
		      if(menu==1) {
			      System.out.println("┌────────────────────┐");
			      System.out.println("│       성적 입력      │");
			      System.out.println("└────────────────────┘");


			      System.out.printf("국어 : ");
			      kor = Integer.parseInt(scan.nextLine());
			      System.out.printf("영어 : ");
			      eng = Integer.parseInt(scan.nextLine());
			      System.out.printf("수학 : ");
			      math = Integer.parseInt(scan.nextLine());
		      }
		      else if(menu==2) //1번일경우 더이상 2를할필요없다.->else if
		      {
			      total = kor + eng + math;
			      avg = total / 3.0f;
		
			      System.out.println("┌────────────────────┐");
			      System.out.println("│       성적 출력      │");
			      System.out.println("└────────────────────┘");
		
			      System.out.printf("국어 : %d\n", kor);
			      System.out.printf("영어 : %d\n", eng);
			      System.out.printf("수학 : %d\n", math);
		
			      System.out.printf("총점 : %2d\n", total);
			      System.out.printf("평균 : %26.2f\n", avg);
		
		      }
		      else if(menu==3) {
			      more = false;
		      }
		    }
	      System.out.println("Bye~");
	}
}

 

 

CSS

 

Block 레이아웃을 이용한 방만들기

제일 큰 방을 단뱡향으로 정하기 → 더 나눈다면 방"안"에서 다시 나누어진다.

가장 큰 방은 식별할 수 있는 이름넣기

<header id = "header">

<div id = "body">

 

Overflow 

자식요소가 부모요소의 범위를 초과할때

overflow : hidden

overflow : scroll

 

 

margin : 외부 여백, 박스와 박스경계선사이

padding : 내부 여백 , 경계선과 텍스트사이의 간격

min-height : 가변적으로 높이가 늘어 날 수있음

 

CSS의 값 할당 단위

 

CSS의 값 할당 단위

고정크기 : px, cm

변동크기 : rem,em,ex

em : 부모요소를 따라가지만, 자기 속성이있다면 자기속성을 따라간다.

rem : 루트(html{ })설정한 내용을 따라간다.

복합 대입 연산자 / 기타 연산자/ 연산자 우선순위 

더보기

복합 대입 연산자

 

기타연산자

 

연산자 우선순위

 

연산자우선순위는 무조건암기 할 필요가없다. ()소괄호를 이용한다.


삼항연산자

value3 = (3 < 1) ? value 1 : value2

import java.util.Scanner;

public class Mar5th {

	public static void main(String[] args) {
		//1.scan이라는 이름으로 Scanner 객체를 생성하고
		Scanner scan = new Scanner(System.in);
		//2.scan을 이용해서 정수값을 입력 받아 변수 ans에 담는다.
		int ans = scan.nextInt();
		//3.ans값이 3보다 크면 2를 거짓이면 3을 x변수에 담아서
		int x = (ans > 3) ? 2 : 3;
		//4. x변수의 값을 출력한다.
		System.out.println(x);
	}
}

Scanner scan = new Scanner(System.in);

  • Scanner : 개체
  • scan : Scanner의 객체
  • new : 객체생성
  • System.in : 콘솔입력값을 받음.

 

int ans = scan.nextInt();

  • scan.nextInt() : 객체 scan을 이용해 nextInt()메소드를 호출한다. 정수값을 받는 메소드.
  • int ans : 불러온 정수값을 변수 ans에 담는다.

 

int x = ans > 3 ? 2 : 3;

  • ans > 3 ? 2 : 3  : 삼항연산자, (조건) ? 참 : 거짓 , ans가 3보다 큰가 ? 참이면 2, 거짓이면 3
  • int x : 삼항연산자의 결과값을 변수 x에 담는다.

 

System.out.println(x)

  • System.out : 출력스트림의 객체 (이미 만들어져있어서 객체만들필요없음)
  • println() : System.out 출력객체를 통해 println()메소드 호출

 

 

제어구조

제어구조 : 흐름을 제어한다.

  • 흐름을 파악하는것이 중요. (작성순서와 상관없는 흐름이 만들어 질 수있음)
  • 컴퓨터프로그램은 반복을 기본으로한다.
  • 반복문에서 선택구조를 넣어, 프로그램이 계속해서 다른행동을 하는것 처럼 보이게 한다.
  • 반복을하면서 데이터를 불러올 수 있다.
  • 반복흐름 ,  선택구조를 넣어서 다른행동처럼보임.

 

제어구조의 종류

  • 선택문 if, else, else if
  • 반복문 while, do - while , for
  • 분기 switch, case, ...

 


while(조건){ }

국어,영어,수학 점수를 입력받아서 출력하는 성적표.

다시 출력하고싶다면 ? 반복되길 원한다면 ?

 

package ex2.control;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner;

public class Program {

	public static void main(String[] args) throws FileNotFoundException {
	      // 기본형식 : primitive type
	      int kor, eng;
	      int math;
	      int total;
	      float avg;

	      kor = 0;
	      eng = 0;
	      math = 0;
	      
	      while(true)
	      {
	      // 여기에 성적을 입력하는 코드를 작성하시오.
	      Scanner sc = new Scanner(System.in); // 반복에 포함될 필요없음
	      
	      System.out.println("┌────────────────────┐");
	      System.out.println("│       성적 입력      │");
	      System.out.println("└────────────────────┘");


	      System.out.printf("국어 : ");
	      kor = Integer.parseInt(sc.nextLine());
	      System.out.printf("영어 : ");
	      eng = Integer.parseInt(sc.nextLine());
	      System.out.printf("수학 : ");
	      math = Integer.parseInt(sc.nextLine());

	      total = kor + eng + math;
	      avg = total / 3.0f;

	      System.out.println("┌────────────────────┐");
	      System.out.println("│       성적 출력      │");
	      System.out.println("└────────────────────┘");

	      System.out.printf("국어 : %d\n", kor);
	      System.out.printf("영어 : %d\n", eng);
	      System.out.printf("수학 : %d\n", math);

	      System.out.printf("총점 : %2d\n", total);
	      System.out.printf("평균 : %26.2f\n", avg);

	      }
	}
}
더보기
출력후 바로 반복되는 모습 (성적입력/성적출력)

반복하고싶은 부분을 {}중괄호로 감싼다.

while(true){ while의 종속된 문장 } : 무한반복한다. while의 조건이 참인동안 실행된다. 실행 후 다시 시작점으로돌아간다.

반복을 끝내고싶을때 : 강제종료


while(조건)이 거짓이된다면 while문을 벗어날 조건이된다.

즉, (조건)에 변수를 넣어 선택구조를 만들 수 있다.

 

import java.util.Scanner;

public class Mar5th {

	public static void main(String[] args) {
		int score =0;
		Scanner scan = new Scanner(System.in);
		boolean more = true;
		
		while(more) {
		System.out.print("What grade did you get?");
		score = scan.nextInt();
		
		System.out.println("Let me know your score. It's "+score);
		
		System.out.print("Did you wanna try again?");
		more = scan.nextBoolean();
		}
		System.out.println("Bye");
	}

}

 

boolean more = true

  • boolean : 논리자료형, 참과 거짓을 의미
  • more = true : 변수 more 를 true초기화한다.

 

while(more) { }

  • while(more) : more가 true를 의미하기때문에 무한반복할것이다.

 

more = sc.nextBoolean();

  • sc을 통해 nextboolean메소드를 호출한다.
  • nextBoolean() : true 또는 false를 입력하면 그 문자열을 boolean값으로 바꾸어준다.

 

 


Unreachable 에러 발생

while(true) { 실행문 } 

다른실행문;

while이 무한반복하기 때문에 while{ }뒤에 어느문장도 실행될 수없어 에러가 발생한다.

 


FileInputStream, FileOutputStream 을 이용해 파일복사 & 반복문

반복문을 통해 bmp파일의 바이트를 순서대로 입력하고, 출력하기

A라는 파일가져와서 B라는 파일을 만들어보자.

package ex2.control;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyProgram {

	public static void main(String[] args) throws IOException {
		// 1.res/img.bmp 파일을 읽기 위한 FileInputStream 객체 fis를 생성하고
		//res/img_copy.bmp 파일로 쓰기 위한 FileOutputStream 객체 fos를 생성한다.
		FileInputStream fis = new FileInputStream("res/aaa.bmp"); //이미지파일 불러오기
		FileOutputStream fos = new FileOutputStream("res/img_copy.bmp"); //이미지파일출력

		// 2. fis를 통해서 1 바이트를 읽어서 변수 b에 담는다.
		// b의 값을 fos로 통해서 출력한다.
		int b = 0;
		while((b = fis.read()) != -1)
			fos.write(b);
		
		//3. 2번을 더 이상 읽어들인 값이 없을때까지 반복		
		fis.close();
		fos.close();
		
		System.out.println("복사완료");		
	}
}

FileInputStream fis = new FileInputStream("bmp파일이 저장된 상대경로");

  • FileInputStream: 입력스트림을 이용해 파일경로를 불러온다.
  • fis : 연산자 new를 통해 객체 fis 생성

 

FileOutputStream fos = new FileOutputStream("복사본 저장할 상대경로");

  • FileOutpuStream : 출력스트림을 사용해 저장할 파일경로를 넣어준다.
  • fos : 연산자 new를 통해 객체 fis 생성

 

int b = 0 ; 

  • 변수 b를 정수값으로 선언하고 0으로 초기화한다.

 

while((b = fis.read()) != -1)

  • while : 제어구조의 종류, 반복문
  • b = fis. read() : 입력스트림의 객체 fis이 read()를 호출한다. 불러온 바이트를 변수b에 대입
  • read() : read()메소드는 한번 호출 될때 1바이트씩 불러온다. read()메소드는 더이상 불러올 값이 없으면 -1을 반환
  • b != -1 : -1이 나올때까지 while문이 반복된다.  while(조건)이 거짓일때까지 반복

 

fos.write(b);

  • 객체 fos를 통해 출력할wrtite() 메소드를 호출하고, b를 출력버퍼에 넣어준다.

 

fis.close();

  • FileInputStream을 닫아준다.

 

fos.close();

  • FileOutputStream을 닫아준다.

 

System.out.println("복사완료");

  • System.out을 이용해 println()메소드를 호출한다.
  • "복사완료"문구를 넣어 실행종료를 알린다.

실행 후 복사완료가 뜨면, bmp파일이있는 폴더에서 복사된 파일이 확인가능하다.

복사완료된 모습

 

 

 

  1. 쉬프트연산

  2. 진법 정리

  3. 0x000000ff과 교집합


쉬프트연산

한 변수에 두개의 값을 대입하기

쉬프트연산 후 합집합

 

상황 : x,y 좌표를 보내야하는데 Integer를 short로 비트를 줄여서 보내야함

즉, 16비트안에 두 좌표를 넣어야하는 상황

 

16비트중 앞 8비트에는 7을, 뒤8비트에는 5를 나타내고자한다면

  1. pos = 7<<8 : 7를 왼쪽으로 8비트 이동시키고(쉬프트연산) pos에 대입.
  2. pos | 5 : 합집합

5를 바로 대입해버리면 7이 없어진다.

합집합은 서로 영역을 건들이지않으면서 그대로 나온다.

쉬프트 연산 ( 한 변수에 두개의 값 대입하기)
7 5 결과값

 

 


 

진수

컴퓨터는 2진수를 사용한다. : 0, 1 (1,0을 비트라고부른다)

16진수는 2진수보다 가독성이 좋다(ex 11111111 -> ff)

 

2진수 0 ,1
2가지 데이터표현
1비트 0b  
4진수 00, 01, 10, 11
4가지 데이터표현
2비트    
8진수 000 ~ 111
8가지 데이터표현
3비트   0
16진수 0000 ~ 1111
16가지 데이터표현
4비트 0x 0~9ABCDEF

1 byte = 8 bits (바이트는 컴퓨터가 저장하는 최소단위)

10진수 : 23

2 진수 : 0b10(1bit*2=2bit)

8진수 : 023 (3bit*2=6bit)

16진수 : 0x00(4bit*2=8bit)

 

16진수, 각 4비트를 의미,

0xff = 0b1111 1111

0x0f = 0b0000 1111

0x0f7 = 0b0000 1111 0111

0b000000 : 6bit (1bit*6)

0x000000 : 24bit (4bit*6)

 

 


 

0x000000ff과 교집합

0x000000ff와 비트연산자&(교집합)를 이용해 원하는 값을 도출하기

0x000000ff : 0000 0000 0000 0000 1111 1111 (0하나당 4비트를 의미)

[ ? ][ ? ][ ? ][ b]->[  ][  ][  ][ b]로 채우고싶다면

 

0x000000ff와 교집합한 결과

0으로쓰인 블럭은 교집합을 하면 0만 나온다.

1과 교집합하면 그대로 나온다.

남기고싶은 영역을 1로 활성화 시키고 나머지를 0으로하면 정리된다.

 

 

FileInputStream을 이용해 Bitmap File Size 출력하기

 

더보기

File - new - class 

class명을 Program 으로 넣고

Package에 ex1을 넣어 패키지클래스를 동시에 생성 한다.

구글에서 '풍경사진'을 검색후 bmp파일로 저장한다.

작업하고있는 프로젝트폴더 안에 'res'폴더를 만들고 사진파일을 넣어준다.

 

res폴더 생성 후 bmp파일 넣은 화면

FileInputStream("절대경로")를 상대경로로 바꿔준다.

FileInputStream fis = new FileInputStream("res/aaa.bmp");

절대경로는 다른컴퓨터로 가져가겼을때 소스코드가 변경되어야하는 불편함이생긴다.

소스코드의 위치는 bin폴더에있지만, project파일위치 기준으로 상대경로를잡는다.

 

 

 

FileInputStream fis = new FileInputStream("res/aaa.bmp");

  • 입력스트림에 bmp파일의 상대경로를 넣어준다.

int b ;

b = fis.read();

b = fis.read();

  • FileInputStream의 객체 fis를 이용해서 이미지파일의 크기를 읽어온다.
  • read()는 호출될때마다 1바이트씩 불러온다.
  • 비트맵파일의 구조는 Signature, FileSize, Reserved,FileOffset순이며 Signature(비트맵을 상징하는자리)는 2바이트(1바이트씩 2자리)를 차지한다.

int b1 = fis.read();

int b2 = fis.read();

int b3 = fis.read();

int b4 = fis.read();

  • 파일사이즈를 읽어오기위한 변수선언을 새로 해준다.
  • 파일사이즈는 4바이트이므로 변수 4개를 선언하고 fis객체를 이용해 순서대로 초기화시킨다.
  • 앞서 b에 Signature 2바이트를 불렀고, 다음 FileSize를 위해 변수4개를 새로 만들고 read()를 4번호출한다.
  • 비트맵파일의 구조에서 FileSize(파일의 크기)는 Signature다음의 4자리(4바이트)에 나타난다. 변수b에 담긴건 버린다.

int fileSize = 0;

  • read()로 불러온 파일사이즈(b1~b4)를 담을 변수 fileSize를 선언해주고 0으로 초기화한다.
  • int로 4바이트가 담긴다.

fileSize = (b4 & 0x000000ff) << 8*3 |

             (b3 & 0x000000ff) << 8*2 |

             (b2 & 0x000000ff) << 8*1 |

             (b1 & 0x000000ff);

  • 파일에 저장되어있는 바이트순서(Big Endian)와 CPU(Little Endian)의 바이트출력순서가 다르기때문에 쉬프트연산(*)을 통해 위치변동을 한다.
  • 0x000000ff(*)와 비트연산자' & '(교집합) 이용하면 원하는 위치에 담을 수 있다.
  • 비트연산자 ' | '(합집합)을해서 불러온 비트를 합치고 fileSize에 대입한다.

System.out.println(Integer.toBinaryString(b4));

System.out.println(Integer.toBinaryString(b3));

System.out.println(Integer.toBinaryString(b2));

System.out.println(Integer.toBinaryString(b1));

  • b1부터 b4의 정수값을 2진수로 출력하기
  • Integer.toBinaryString()은 정수를 2진수로 변환하는 메소드

System.out.printf("file size : %d\n",fileSize);

  • println메소드를 통해 콘솔에 출력한다
  • fileSize가 비트맵파일 속성의 내용과 같은지 확인한다.

콘솔화면  /  bmp파일 속성

package ex1.bit;

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

public class Program {

	public static void main(String[] args) throws IOException {
		// 1. 이미지파일을 일기위한 파일입력 스트림을 fis로 생성
		FileInputStream fis = new FileInputStream("res/aaa.bmp");
		
		// 이미지 파일의 Signature를 불러온 후 FileSize를 불러온다.
		int b;
		// 2바이트
		b = fis.read();
		b = fis.read();
		
		//fileSize
		int b1 = fis.read();
		int b2 = fis.read();
		int b3 = fis.read();
		int b4 = fis.read();
		
		//b1b2b3b4		
		int fileSize = 0; //[b1][b2][b3][b4];
		fileSize = b1;// [][][][b1]; 자체가 32비트
		fileSize = b2;// [][][][b2];
		fileSize = b3;// [][][][b3];
		fileSize = b4;// [][][][b4];
		
		fileSize = (b4 & 0x000000ff) << 8*3 | //[b4][][][] 원래는 오른쪽부터채워지는데,왼쪽으로옮김
			(b3 & 0x000000ff) << 8*2 | //[b4][b3][][]
			(b2 & 0x000000ff) << 8*1 | //[b4][b3][b2][]
			(b1 & 0x000000ff);         //[b4][b3][b2][b1]
					
		System.out.println(Integer.toBinaryString(b4)); // 변수별로 바이너리값출력
		System.out.println(Integer.toBinaryString(b3));
		System.out.println(Integer.toBinaryString(b2));
		System.out.println(Integer.toBinaryString(b1));
	
		System.out.printf("file size : %d\n",fileSize);
		fis.close();
	}

}

오류발생

  1.  값이 음수로 나온 경우
  2.  비트맵 파일 속성과 다른 숫자가 나온 경우

값이 음수로 나온경우 :

합집합시 다른 비트가 섞여서 발생할 수있다.

쉬프트연산 전에 b4에 0x000000ff를 비트연산자&를 사용해서 총 32비트중 의도했던 비트만 나오게한다.

쉬프트연산 / 진법 / 0x000000ff과 교집합

비트맵 파일 속성과 다른 숫자가 나온 경우:

비트맵파일 구조상 맨앞 2바이트는 시그니처이므로 그 뒤의 4바이트를 출력해야 filesize를 출력할 수있다.

시그니처부분을 담을 read()메소드를 생략한 경우 다른숫자가 출력되었다.

read()출력부분을 버리지않았다면

Signature 2바이트 + FileSize 2바이트가 출력된것. 

+ Recent posts