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

값 변수와 참조변수 :

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

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

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바이트가 출력된것. 

CSS 스타일 입히기

Cascading : 계단식, 덧칠하기식, HTML태그의 원래 스타일을 Cascading

CSS 속성 : 스타일을 입힐 수있는 가지수 ? 속성수 ?

              배경/경계선/폰트/색상/마진-left,top/패딩/박싱/박스라운드-img,color,repeat

대상선별 : 선택자(selector)사용

선택자 기본요소 : id, class , element

 


  • a  :  <a></a> 태그
  • .a  :  <*class ="a">
  • *#a  또는  #a  :  <*id="a">
  • aside.a  :  <aside class="a">

 

 

 

선택자

  • #a{color: green;} : a라는 id를 가지는 엘리먼트에 색상을 적용
  • .a{color: green;} : a라는 class에 포함된 엘리먼트에 색상을 적용
  • a{color: green;} : a라는 태그를 대상으로 색상을 적용

연산자

  • A B : 공백자체가 연산을 의미. A안에 포함된 모든B.
  • A>B : A안에 B자식들만 모두선택
  • A+B : B의 형제 바로 밑동생
  • A~B : A의 동생들 중에 B만 적용

 

#aa+nav+section : nav의section만 고른것


셀럭터를 이용한 엘리먼트  선택

 

.h1{ color:red; } 

class 명이 h1인 태그들을 레드로 적용 

 

 

aside.h1{ color:red; }

class 명이 h1이면서 aside태그를 가지고있는것 레드로 적용

 

 

h1{ color : red; } 

h1의 모든태그에 빨간색 적용

*h1{ color ; red; }와 같다.

 

 

 

section h1{ color : red; }

section안에 포함된 h1 모두를 찾는다.

 

 

 

section > h1 {color: red; }

section태그의 h1자식만 적용

 

 

 

a.first + span : 바로 밑동생으로서의 span 없음

 

 

 

h1 : 범위가 넓으므로 우선권이없음

.h1 , #h2 범위가 좁혀져 우선권생김

우선순위가 같다면 나중에 적용한게 결과로나온다

 

 

 

h1.h1보다 복합연산자가 더높다 
태그명이 속성을 가질땐 우선순위높다

 

 

 

h1{ } :기본 태그이므로 가장 우선순위낮음

.h1{ } : h1클래스로 좁혀짐

h1[lang="ko"] {} : <*lang="ko"> 특정랭귀지속성을 가진 h1태그 , h1에 랭귀지속성 한정사가 한번더 들어가서 우선선위높음

 

 


HTML

a[href^="#"]

  • ^ 시작 의미
  • #으로시작하는것

 

  • dir

    ltr : left to right   왼쪽부터 쓰기
    rtl  : right to left  오른쪽부터 쓰기
      a[dir='rtl']
    이 속성에다가도 스타일을 입힐수있다

/* Links with "example" anywhere in the URL */
a[href*="example"] { background-color: silver; }
example이 포함된것들만 비교가능

 

/* Links with "insensitive" anywhere in the URL,

   regardless of capitalization */
a[href*="insensitive" i] { color: cyan;}
i : 대소문자구별하지않겠다

 

/* Links with "cAsE" anywhere in the URL,
with matching capitalization */
a[href*="cAsE" s] { color: pink;}
s : 대소문자를 가린다.

/* Links that end in ".org" */

a[href$=".org"] { color: red;}
.org로 끝나는것

/* Links that start with "https" and end in ".org" */
a[href^="https"][href$=".org"] { color: green;}
"https" &".org"
두가지속성만족시

 

 

 

 


연습

  • A B : 공백자체가 연산을 의미. A안에 포함된 B의 하위요소. A의 자손만 (B의 자식)

Descendant selector

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .aa div{
            color : red;
        }
    </style>
</head>

<body>
    <div class="aa">
        <p>자식1</p>
        <div>
            <p>aa의 자손</p>
        </div>
        <p>자식2</p>
        <div>
            <p>자손2</p>
            <ul>
                <li>자손3</li>
                <li>자손3</li>
                <li>자손3</li>
            </ul>
        </div>    
    </div>
</body>
</html>

 

  •  A안에 B자식만 선택

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        section>p{
            color : red;
        }
    </style>
</head>

<body>
    <div class="aa">
        <p>Child 1</p>
        <div>
            <p>Descendant1</p>
            <section>
                <p>Descendant2</p>
                <ul>
                    <li>Descendant3</li>
                    <li>Descendant3</li>
                    <li>Descendant3</li>
                </ul>
            </section>   
        </div>
        <p>Child 2</p>
        <section>
            <p>Descendant2</p>
            <ul>
                <li>Descendant3</li>
                <li>Descendant3</li>
                <li>Descendant3</li>
            </ul>
        </section>    
    </div>
</body>
</html>
더보기
    • A+B : B의 형제 바로
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div+p{
            color : red;
        }
    </style>
</head>

<body>
    <div class="aa">
        <p>Child 1</p>
        <div>
            <p>Descendant1</p>
            <section>
                <p>Descendant2</p>
                <ul>
                    <li>Descendant3</li>
                    <li>Descendant3</li>
                    <li>Descendant3</li>
                </ul>
            </section>   
        </div>
        <p>Child 2</p>
        <p>Child 3</p>
        <section>
            <p>Descendant2</p>
            <ul>
                <li>Descendant3</li>
                <li>Descendant3</li>
                <li>Descendant3</li>
            </ul>
        </section>    
    </div>
</body>
</html>

 

복습

  • 버퍼를 이용한 입출력은 다양한 장치에서도 동일하다.
  • System.in : 콘솔입력
  • System.out : 콘솔출력
  • FileInputStream fis = new FileInputStream("파일경로"); // new연산자를 통해 객체를 만듦
  • fis.read(); 를 사용했다면 문자하나씩 읽어옴
  • next(); 단어단위, 공백전까지
  • nextLint() 문자열단위, 줄단위
  • 모든 함수는 객체를 통해서 사용
  • Scanner scan = new Scanner(fis); App -> Scanner -> fis -> 파일이용

 

산술연산

산술연산

*산술 연산시 출력절차 주의

print(x+y)로 쓰면 x+y로만 보이지만
print(3+y)
print(7)
print('7')로 출력되는 절차가있다.

print(x+y)로 쓰면 x+y로만 보이지만
print(3+4.0)
print(7.0)
print('7.0')로 출력되는 절차가있다.

 

*연산자와 자료형

10/3 -> 3 : 정수/정수는 정수
10/3.0 ->3.3333 : 정수/실수는 실수

*나머지연산자 : 반복적인계산 할때자주쓰임

반드시 암기

 

 

 

단항 연산자

단항 연산자
전위식과 후위식 예제

  • kor++; 후위식 연산자의 의미 :
    kor = kor+1; 
  • 단항연산자 ++,--는 앞뒤로 쓸 수 있다.
  • 후위식은 세미콜론(;)지나고 증가한다.

 

 

비교/논리 연산자

==같다

= 대입연산자와 주의

 

 

관계 연산자

범위가 갈라질때는 ||

한범위안에 들을때는 &&

 

 

 

 

비트 논리 연산자

비트연산자
& and (교집합) 모든 비트가 1일때만 1
^ xor (차집합) 모든 비트가 같으면 0,하나라도 다르면1
| or (합집합) 모든비트중 한 비트라도 1이면 1
~ not (부정) 각 비트의 부정, 0면 1,1이면 0

 

 

 

쉬프트 연산자

 

연산자암기할것

 

 


FileInputStream 과 FileOutputStream 사용

메모장에 데이터를 적은 뒤 저장.

 

메모장 데이터 저장모습

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

class Hello {
	public static void main(String[] args) throws IOException {
		int kor, eng, math;
		int total;
		float avg;

		kor = 0;
		eng = 0;
		math = 0;
		
		//여기에 성적을 입력하는 코드를 작성하시오
		//data.txt파일에서 국어,영어,수학성적을 입력받으시오
		// 1.파일 입력 스트림 객체를 fis라는 이름으로 만든다.
		FileInputStream fis = new FileInputStream("C:\\Users\\yh\\git\\repository3\\JavaPrj\\data.txt"); 
		// 2. fis를 Scanner로 포장해서 사용한다.
		Scanner scan1 = new Scanner(fis);				
		kor = scan1.nextInt(); //파일에서 성적을 불러온다.
		eng = scan1.nextInt();
		math = scan1.nextInt(); 
		scan1.close(); // Scanner먼저닫기
		fis.close(); // FileInputStream 닫기
		
				
		
		FileOutputStream fos = new FileOutputStream("C:\\Users\\yh\\git\\repository3\\JavaPrj\\data.txt"); 
		// 2. fis를 Scanner로 포장해서 사용한다.
		PrintStream fout = new PrintStream(fos);
		kor = kor +1; //파일에서 성적을 불러오면서 숫자 1증가
		eng = eng +1; 
		math = math +1; 
				
		fout.printf("%d %d %d", kor,eng,math); 
		fout.close();
		fos.close();
		
		
		total = kor + eng + math;
		avg = total / 3.0f;
				
		//System.out.printf("total is %d\n", total);
		
		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("총점 : %d\n",total);
		System.out.printf("평균 : %5.2f\n",avg); 
		System.out.println("──────────────────────────────────────────");

	
		}
}

콘솔출력
변경된 메모장내역

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

  • FileInputStream : 입력스트림,파일을 불러오기 위해 사용
  • fis : 연산자 new를 통해 객체 fis생성
  • File관련 스트림은 에러가 발생하므로 예외처리해준다.

Scanner scan = new Scanner(fis);

  • Scanner : java.util에있는 클래스
  • fis를 매개변수로 받고Scanner의 객체 scan 생성
  • import 처리

kor = scan.nextInt();

  • scan을 통해 입력받은 정수값을 kor에 저장한다.

scan.close();

  • 안쪽에있는 Scanner를 먼저 닫아준다.

fis.close();

  • 다음 FileInputStream을 닫아준다. 닫지않으면 계속 파일을 열어둔것과 같음.

FileOutputStream fos = new FileOutputStream("파일경로");

  • FileOutputStream : 출력스트림, 파일을 출력하기 위해 사용

  • fos : 연산자 new를 통해 객체 fos 생성

  • File스트림은 에러가 발생하므로 예외처리해준다.

  • File관련 스트림은 에러가 발생하므로 예외처리해준다.

PrintStream fout = new PrintStream(fos);

  • PrintStream : 출력클래스
  • fos를 매개변수로 받고 PrintStreamd의 객체 fout을 생성
  • 메모장출력은 없는 함수이므로 새로운 객체생성

kor = kor + 1;

  • 입력받은 kor에 숫자 1을 더하고 kor에 저장

fout.printf("%d %d %d",kor,eng,math);

  • four통해 출력을 하되, 메모장에 출력한다.
  • 메모장에 각각 1이 더한값이 출력된다.

fout.close();

  • 안쪽에있는 PrintStream을 먼저 닫아준다.

fos.close();

  • 다음 FileOutputStream을 닫아준다.

System.out.printf("국어: %d", kor);

  • System.out은 PrintStream에 이미 포함되어있어 바로 사용가능
  • (연산자 new를 통해 객체만들 필요 없다)
  • printf()에 서식문자열 %d를 넣어 kor를 불러온다.

 

 

 

HTML

복습 (시멘틱태그)

  • HTML : 웹과 관련된 마크업언어
  • HTML4까지 <div></div>를 이용해서 구조를 잡았지만 HTML5 시멘틱태그가 생겼다.
  • 구성을 식별하기위한 표준방식이 생김.
  • 시멘틱태그 : <header>, <main>,<footer> 
  • header,main,footer안에 <Section><h1>을 이용해서 아웃라인을 잡아줄수있고 넘버링을 편리하게 할수있다.
  • <ul><li> :순서가 필요없는 목록
  • <ol><li>: 순서가 있는 목록
  • 섹션태그 : <article>,<aside>,<nav>

 

 


 

블록태그 : 구조만들기에 사용

인라인태그 : 블록안에서 콘텐츠를 마크업하는 태그

 

 


 

Button Elements

<input type="button" value="Button Test">

일반 버튼타입 태그

출력화면

<button name="favorite" type="button">
  <svg aria-hidden="true" viewBox="0 0 10 10"><path d="M7 9L5 8 3 9V6L1 4h3l1-3 1 3h3L7 6z"/></svg>
   Button Test
</button>

<button></button>좀더 다양하게 꾸며줄수있는 버튼태그

출력화면

 

 


 

Image

<img src="../images/logo.png"alt ="뉴렉처 온라인">

이미지 태그사용시 어떤 이미지인지 설명넣을것

 

 

 


 

<pre>

<pre>
		int i = 1;
		int j = 2;
</pre>

쓰여진그대로 출력하는 태그. 코드소스출력시 유용

<code></code>는 한줄만 2줄 이상 일경우 <pre>로 감싸주기.

 

 

키보드태그

<kbd>Shift</kbd> + <kbd>Tab</kbd> 

들여쓰기 단축키

브라우저별로 적용되는 태그가달라 적용효과가 다르다.

 


<b>,<strong> 등 쓰지않는 태그들이있다. 이것들은 what인지가 아니라 how를 나타내고있다. 요즘은 CSS가 스타일을 대신하므로 사용하지않는다.

 

지수표현

                int i<sup>2</sup> = 0;
                int j = 1;

 


 

 

CSS

메뉴하나에만 스타일 적용했을경우

<h1 style="color:blue;font-size:20px;">메인메뉴</h1>

출력화면

특정부분에만 공통적으로 스타일을 적용하고싶다면?

<head> 부분에 <style></style>을 넣고 id, 그룹명 또는 클래스를 넣어준다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .redsun{
            color: red;
        }

        #h1{
            color: pink;
        }
    </style>
</head>
  • .클래스명 { }
  • #id명 { }
  • h1 { } : h1만 넣으면 h1로 잡힌 태그를 찾는다.

id 명 지정하기

<header id="h1">

클래스 지정하기

<h1 class="redsun">메인메뉴</h1>

 

  • id가 부여된곳에 스타일을 적용할뿐만 아니라, id이름으로 구역을 찾을수도있다. (id명이 aside인경우 .html#aside로 들어가면 아래와같이 출력)


 

실습

  • .greenclass로 그룹화해서 초록색 적용
  • h1라는 아이디 생성해서 h1에 핑크적용 (header영역에 모두적용됨)
  • 아이디 aside에 보라색적용

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .greenclass{
            color: rgb(26, 126, 47);
        }

        #h1{
            color: pink;
        }
        #aside{
            color:blueviolet
        }
    </style>
</head>
<body>

    <header id="h1">
        <h1><img src="../images/logo.png"alt ="뉴렉처 온라인"></h1>
        <section>
            <h1>헤더</h1> 

            <nav>
                <h1 class="greenclass">메인메뉴</h1>
                <ul>
                    <li><a class="greenclass" href="">학습가이드</a></li>
                    <li><a href="">강좌선택</a></li>
                    <li><a href="">AnswerIs</a></li>
                </ul>
            </nav>

            <section>
                <h1>강좌검색폼</h1>
                <form>
                과정검색
                </form>
            </section>
            
            <nav>
                <h1>회원메뉴</h1>
                <ul>
                    <li><a href="index.html">Home</a></li>
                    <li><a href="../member/login.html">로그인</a></li>
                    <li><a href="">회원가입</a></li>
                </ul>
            </nav>
            
            <nav>
                <h1>고객센터메뉴</h1>
                <ul>
                    <li>마이페이지</li>
                    <li>고객센터</li>
                </ul>
            </nav>
        </section>
    </header>    


    <section id="aside">
        <h1>고객센터</h1>
        <div></div>
        <nav>                
            <h1>고객센터메뉴</h1>
            <ul>
                <li><a href="list.html">공지사항</a></li>
                <li>자주하는 질문</li>
                <li>수강문의</li>
                <li>이벤트</li>
            </ul>   
        </nav>

        <nav>
            <h1>협력업체</h1>
            <ul>
                <li>노트펍스</li>
                <li>나무랩연구소</li>
            </ul>
        </nav>                 
    </section>



    <main>
        <section>
            <h1>공지사항</h1>

            <section>
                <h1>경로</h1>
                <ol>
                <li>home</li>
                <li>고객센터공지사항</li>    
                <li> 제목</li>    
                </ol>
            </section>
           


        <section>
            <H1>공지사항 목록</H1>
            <table>
                <tr>
                    <td>1024</td>
                    <td>스프링 MVC 소스코드</td>
                    <td>newlec</td>
                    <td>2020-12-12</td>
                    <td>1352</td>
                </tr>
                <tr>
                    <td>1023</td>
                    <td>스프링 JSON 출력을 위한 라이브러리 설정</td>
                    <td></td>
                    <td>2020-11-29</td>
                    <td>994</td>
                </tr>
                <tr>
                    <td>1022</td>
                    <td>스프링 강좌 <kbd>Ctrl</kbd>+<kbd>shit</kbd>RestController 한글 깨짐 설정 코드</td>
                    <td>newlec</td>
                    <td>2020-11-25</td>
                    <td>802</td>
                </tr>
            </table>
        </section>

        <section>
            <h1>현재 페이지 정보</h1>
            <div> 1 / 2 pages
            </div>
        </section>

        <nav>
            <h1>페이저</h1>
            <div>이전</div>   
            <ul>
                <li>1</li>
                <li>2</li>
                <li>3</li>
                <li>4</li>
                <li>5</li>
            </ul>
            <div>다음</div>
        </nav>    

     
                int i<sup>2</sup> = 0;
                int j = 1;

        <div>
            <input type="button" value="Button Test">
                    </div>

    </section>
</main>



    <footer>
        회사정보
        Copyright ⓒ newlecture.com 2012-2014 All Right Reserved. Contact admin@newlecture.com for more information
    </footer>
</body>
</html>

 

 

+ Recent posts