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]출력된다.

 

 

 

중첩 제어문

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~");
	}
}

 

 

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

더보기

복합 대입 연산자

 

기타연산자

 

연산자 우선순위

 

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


삼항연산자

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

복습

  • 버퍼를 이용한 입출력은 다양한 장치에서도 동일하다.
  • 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를 불러온다.

 

 

 

System.out(객체)API함수는 대상이 있다.
대상을 개체와 객체로 나눌수있다.

출력버퍼(개체)를 사용하기 위해 실체화(=객체화=인스턴스화)해서 객체를 만들어야한다.

객체 = 실존물 = 실체

객체를 호명 할 수있어야한다. (네것인지, 내것인지)

객체는 명칭이 부여되거나 소유격을 통해 참조한다.


*오류종류

  • 구문오류
  • 논리적버그 : 컴파일러에게는 오류가 아니지만, 개념적으로 아닌것
  • 입력값 오류

System.in.read(); 사용

int code = System.in.read();

입력버퍼인 System.in와 read()메소드를 이용해서 입력.

콘솔창에 임의의 값을 입력하면 입력버퍼에 값이 담긴다.

System.out.printf()를 통해 출력을한다.

 

35를 입력했을때,

%d 는 3의 아스키코드값 51을 출력

%c 는 3을 char타입으로 바꾸어 'c'를 출력

즉 3에 대해서만 출력한다. (숫자하나에 대해서만 출력)

 

 

 

두 개의 숫자 입력후 그 두 개를 출력하려면:

80을 입력했을때, 8과0 에 대해 모두 출력하려면

code = System.in.read();

System.out.printf();를 한번씩 더 넣어야 두개의 숫자에 대해 출력이된다.

위의 %d 는 8의 아스키코드 값 56을 출력

아래의 %d 는 0의 아스키코드 값 48을 출력

 

 

보이는 그대로 출력하려면 ? 

아스키코드값이 아닌 보이는그대로 출력한다면 

System.out.printf("code1 is %d\n",code1-48); 

8은 아스키코드에서 56이고 48을빼야 8이나오므로 code에서 48을빼준다.

숫자 하나를 입력받아 그대로 출력하고자 할때 아스키코드 값 48을 빼주어야한다.

 

하지만 출력이 8과 0각각되므로

두 코드를 붙여서 출력하려면

(code1-48)*10+(code2-48); 으로 코드를 더해줘야 80으로 출력된다.

 

아스키코드값 문자변환과 숫자갯수만큼 메소드를 넣는 번거로움을 해결할 함수가 있다.

Scanner scan = new Scanner(System.in);

Scanner를 이용해서 80이라는 문자를 그대로 불러와서 숫자로 변환해줄 수있다.

Scanner scan = new Scanner(System.in);

new연산자를 통해 객체를 생성한다.

scan은 Scanner의 이름이다. (변수선언과 비슷)

다른 Scanner와 식별이 가능하도록 이름을붙여준다.

System.in은 Scanner가 사용하는 부품이다.

개체 Scanner를 이용해 scan이라는 객체를 만들어준다.

String line = scan.next();

Scanner를 통해 입력받은 값을 String형 변수 line에 넣어준다.

 

 

Scanner사용시 import를 해줘야한다.

impot : 개체가 다른것들과 중복되지않도록 식별자역할을 한다.

도구사용시 도구가 속한 패키지명을 같이써야하지만 상단에 한번만 명명해주면 사용가능.

java.util패키지의 Scanner 클래스를 이용하는것.

java.util.Scanner; // 상단에 명명해주면

java.util.Scanner scan = new java.util.Scanner(System.in);을

Scanner scan = new Scanner(System.in); 로만 사용가능.

 

 

단축키

ctrl + / : 주석처리

ctrl + shift + / : 범위주석처리 /**/ , 서식중간에도 사용가능

alt + 화살표 : 코드이동

서식안 주석처리 예시

 

 

next()메소드

nextLine() 문자열을 모두 입력받아 리턴.
next()단어단위로, 공백 이전까지만 문자열리턴
nextInt()정수로

 

 

기본형 과 참조형

기본형 : byte, short, int, long , char, float, double, boolean

기본형 변수에는 값을 담는다.

 

참조형 : String

참조형 변수에는 이름만 붙인다.

 

 

변수선언

int a = 3;

변수선언시 타입과 변수명을 선언 한후 초기화한다.

a는 값을 담는 변수가 된다.

Scanner scan은 객체를 담는 변수다(이름표). 정해놓은 명칭을 통해 도구(Scanner)를 쓰게된다.

 

 


 

 

실습

 

*성적입력하고 출력하기.

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

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

		kor = 0;
		eng = 0;
		math = 0;
		
		System.out.println("┌──────────────────────────────────────────┐");
		System.out.println("│                 성적 입력                  │");
		System.out.println("└──────────────────────────────────────────┘");
		//여기에 성적을 입력하는 코드를 작성하시오
		Scanner scan = new Scanner(System.in);

		System.out.printf("국어 : ");
		kor = scan.nextInt(); //공백까지만 출력	
		System.out.printf("영어 : ");
		eng = scan.nextInt(); //공백까지만 출력		
		System.out.printf("수학 : ");
		math = scan.nextInt(); //공백까지만 출력

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

		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("──────────────────────────────────────────");

		}
}

출력화면

  • Scanner scan = new Scanner(System.in);  으로 입력값을 받는다.
  • System.out.printf("국어 : ");    무엇을 입력해줘야하는지 묻는 출력문을 넣는다.
  • kor = scan.nextInt();     입력받은 값을 kor에 넣는다.
  • System.out.printf("국어 : %d\n",kor);  입력받은 값을 출력한다.

 

 


 

*메모장에있는 내용 출력하기

메모장 작성 후 저장

import java.io.FileInputStream;
import java.io.IOException;
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;
		
		//여기에 성적을 입력하는 코드를 작성하시오
	
		FileInputStream fis = new FileInputStream("C:\\Users\\yh\\Desktop\\202102\\workspace\\data.txt");
		Scanner scan = new Scanner(fis);
		kor =scan.nextInt();
		eng = scan.nextInt();
		math = scan.nextInt();
		
		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("총점 : %d\n",total);
		System.out.printf("평균 : %5.2f\n",avg); 
		System.out.println("──────────────────────────────────────────");
	}
}

 

 

출력버퍼 : OutputStream

버퍼는 원래 우리가 만들어야한다.

객체지향 : 기능을 갖고있는 주체를 얻어낸다.

 

35를 넣었을때 35를 그대로 인식하지 않고 코드로 인식한다. 그에 대응되는 문자를 출력

 

System.out.write('A');
System.out.flush();

출력: A

 

System.out.write() 는 문자 하나만 출력하므로 문자열을 출력하려면 여러번써줘야하는 번거로움이 발생한다.

System.out.print()를 사용하면 문자열출력가능

이스케이프 문자 : 문자열 사이에 꽂아 넣을 수 있는 명령어

" " 문자열의 시작과 끝을 의미

  • \n 새 행new line삽입
  • \" 큰 따옴표 삽입
  • \' 홑 따옴표 삽입
  • \\ 역슬래쉬 삽입

포맷 문자열과 형식 지정자
형식 지정자

 

write(80)을 넣으면 해당 되는 문자값인 P를 출력한다.

80출력을 위해서는 아스키코드 56,48을 코드값을 얻어서 '8'과 '0'이라는 문자값으로 출력해야한다.

 

System.out.print()는 문자를 그대로출력해준다.

 

		System.out.write(80); // P 출력
		System.out.flush();
		System.out.print(80); //80

print() 매개값이 여러개이다 ex. print(double d),print(boolean b),print(char c)

print()사용시 ()안에 \n을 넣으면 새 행삽입.

printf()는 형식을 변환해주고 그 형식에 맞게 숫자를  출력해준다.

println() 개행

System.out.printf("%d-%d-%d",2013, 07, 23);//2013-7-23
System.out.printf("%d년%d월%d일",2013, 07, 23); //2013년7월23일
System.out.println('A'+1);//65+1 => 66 출력
System.out.println("A"+1);//A1 출력 String타입

System.out.write('A'+1); //B 출력
System.out.flush();

System.out.printf("국어 :%d\n",kor);// %d 출력형식 \n새행, kor값불러오기

double num2 = 12.3456789;
System.out.printf("num2(소수점 둘째 자리까지) :%.2f\n",num2);//num2(소수점 둘째 자리까지) :12.35

System.out.printf("평균 : %5.2f\n",avg); //평균 : 74.33 소수점을 포함하여 총 5자리, 소수점이하는 2자리
  • 정수/실수타입은 값이 실수타입으로 나온다. avg = total / 3.0 (avg에 실수타입으로 저장됨)
  • print('A'+1) A라는 문자를 아스키코드값(A=65)로 인식하여 65+1 =66 출력
  • System.out.printf("%.2f\n",num) 
  • 정수/실수 =실수

 

 

 

 

언어에는 연산자, 제어구조, 배열, 함수, 구조체가 있다.

각 언어마다 특징이있다.
과거 : 플랫폼을위해탄성
현재 : 특정기술에맞는 특화된언어
ex:그루비(자바 위), 스칼라(자바 위 )




자바 :규칙, 단일방법, 객체지향

변수선언 : 반드시 영문소문자로, 스페이스 (X) ,특수기호(X)

형변환 : Cascading

번역기를통해 프로그램을만든다.
메모리+CPU는 쉽게달라지지않는다(계산기 기능이 바뀌지않는거처럼)
계산기능 + 계산값을저장할 공간(메모리) + 실행기(real machine)
계산 ->인터페이스-> 출력 : 모니터 직접사용하지않는다.
인터페이스 : 간접적으로만나게. 밑단을 가려줌.함수형태

플랫폼이 프로그램을 직접사용하지않고 반드시 인터페이스API(함수형태)이용

프로그램 : 절차언어역할
절차작성 : 프로그래밍
입출력도구 : 플랫폼 (자동차,냉장고,소프트웨어들 카카오톡,페이스북)

어떤API쓰니 ? = 어떤플랫폼쓰니 ?


 

콘솔:

콘솔은 입력장치와 출력장치를 총칭하는 말

사용자인터페이스, 입출력장치, 함수형태
과거 : 라디오(주파수) ->스크린(색감조정,전원=콘솔) ->스크린안에 여러스크린이 생김(윈도우창같은)리얼콘솔,virtual콘솔=>사용자인터페이스

컴퓨터 기본콘솔 : 모니터, 키보드, (프린터x 마우스x)

자바플랫폼이 제공하는 기능 : 콘솔

 

함수이름: 직관적인 이름사용

System.out(포장지역할).write(30);

함수들은 객체안에 포함

 

 

 

출력스트림을 통해 비동기처리

자바 변수선언 / 부동소수점 / 함수의 역할/ OutputStream

스트림이란?

자바에서 데이터는 stream을 통해 입출력된다. stream은 데이터가 출발지에서 나와 도착지로 흘러가는 단일방향의 흐름.

입력과 출력을 동시에 수행하려면 입력스트림, 출력스트림이 필요하다.

스트림에는 버퍼가 포함되어있다.

 

출력스트림을 통한 비동기처리

API write(3)을 넣고 호출할때, 모니터를 직접사용하지 않는다.

프로그램과 모니터가 1:1로 동기화하지않는다. (1:1로 일을하지않는다)
어플리케이션은 여러개 존재하기 때문에 동기화를 하게될 경우 모니터는 과부하된다.
입출력 길목에 버퍼를 두고 값을 버퍼(=대기장소)에 머물게한다.


자바는 운영체제위에서 사용 ->운영체제버퍼, 자바의 버퍼 각각 존재
출력버퍼, 입력버퍼 : 함수이용->출력
함수를 갖고있는 포장지역할 : out 
출력버퍼는 물리적으로 컴퓨터안에서 출력을위해 사용하는 데이터공간(메모리상에있음/실존)
비어있는공간에 값을 넣는다.

 

개체(Entity)와 객체(Obejct)

개체(Entity)와 객체(Object)

API는 객체로 포장되어있다.
출력될때 사용되는 대상(출력버퍼가 대상),모니터가 대상이아니라 버퍼가 대상
대상을 준비해놓고 함수이용
개체 (entity) :실존하지않는것, but 식별가능, 자동차메뉴, 음식메뉴, 메뉴명,

                  명칭은분명하지만 실존하지않는다. 메뉴이름, k7

                  타입명칭=자료형명=형식명칭
객체 (object) : 실존물,쇠돌이,실체,인스턴스 
                   쇠돌이는 k7의 객체이다=쇠돌이는 k7의 인스턴스이다
자동차를 주문할때 k7주세요할수있지만, 실존하면 k7라고하지않는다. 나의 k7이다. 소유격(너의, 나의)사용
객체에 이름을 부여한다. k7형식(개체)의 쇠돌이(객체)다.
부여한 이름을 객체이름, 참조변수라고 한다.


Stream객체
out : 출력을 위한 함수를 갖고있는 출력객체
in :입력을위한 함수를 갖고있는 객체

 

 

System.out.println() 에 대해..

System.out = new PrintStream(new OutputStream());

  • System : 카테고리역할
  • out : PrintSteam의 인스턴스다.

        PrintStream을 통해 OutputStream을 간접적으로 사용.

        PrintStream은 OutputStream의 자식의 자식클래스.

  • println() : 객체가 참조하는 개체의 메소드중 하나

 

java.lang.System 클래스 내부에 존재하는 static 객체인 out이 있고,

out객체는 PrintStream의 객체이므로 PrintStream이 갖고있는 println()메소드를 사용한다.

 

OutputStream은 추상클래스(추상 클래스는 객체가 될 수없다)->후손클래스이용해서 객체생성

println()은 out이라는 객체와 그 객체에서 뽑아온 함수.

 

ref. cbw1030.tistory.com/59?category=1060226

 

 

 

출력버퍼의 사용

출력할때, 출력버퍼를 준비해야함, 객체생성시 new라는 연산자를 이용해야한다.(실존하게하는연산자)
하지만 출력버퍼는 실존하게 만들필요가없다. 자바는 이미 만들어놨다.
콘솔입출력은 프로그램마다 하나씩 부여받은 버퍼

 

System.out = new PrintStream(new OutputStream());
System이라는 포장용기에 담여 out(객체)으로 존재
'.'(점)을찍어 수많은 API이용 : System.out.함수();


함수는 무엇인가 ? 기능
무슨기능 ? 켜다,끄다, 함수로 구현 -> 대상은 ? 라디오, 티비,가스레인지

대상을 거론하지않고 함수를 만들면 :대상이 눈에띄지않음->대상이 주인공 
라디오가있어야 켜고 끌수있다.
티비가 있어야 켜고끌수있다.


대상이 머릿속에있음,실존객체
기능은 부차적
타겟 실존객체에 대해 조립 ->기능(객체지향),기능은 따라오는것
출력도구가 필요 , 도구, 입력도구, 입력객체(안에 기능)

 

문자코드

KeyCode

2를누르면 입력버퍼에 2(입력값)가 그대로 들어가지않는다.

키보드에 다양한 값이있다 (수많은 키) 키를 식별하는 번호가있다.
키를 식별하는 번호가 만들어졌다->keycode(키코드.일련번호)
키를 누르면 키코드가 들어간다.

 

ASCII(아스키코드,American Standard Code for Information Interchange)

입력값들을 전달할때 똑같은 값이 전달.

사용하는 모든기호에 숫자부여한 문자코드표

예시:

A : 65
B : 66
C : 67.

아스키코드

총 128개 0부터 127까지. 총128개를 7비트로 표현

총 128개 (2^7) 7비트 + 1비트 (패리티비트) = 총 8비트로 표현가능 (256개, 2의 8승)

한국어/중국어/일본어 : EUC-KR, EUC-JP, EUC-CN

문제점 발생 : 다른언어간 같은 코드발생 (번호충돌)

유니코드:

유니코드등장 (재배열) :전세계모든 언어모드가 충돌나지않게 여러언어 같이쓸수있게나옴

 

System.out.write()함수 예시:

public class Exam_01{
    public static void main(String[] ar){
    System.out.write(65); //값이 버퍼에 담김ㄴ다
    System.out.flush(); // 출력
    }
}

write는 문자하나만 담을 수 있고 출력하려면 flush() 함수를 사용해야함 -불편함

 


자바 실습

이클립스 -> download -> download Packages -> Eclipse IDE for EnterPrise Java Developers

www.eclipse.org/

 

The Community for Open Innovation and Collaboration | The Eclipse Foundation

The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 375 open source projects, including runtimes, tools and frameworks.

www.eclipse.org

압축풀고 eclipse폴더를 자주 사용할 폴더로 옮겨준다.

eclipse폴더안의 eclipse.exe 선택후 마우스 오른쪽클릭 ->시작화면에 고정

 

 

통합개발환경 IDE

편집기(코드작성) + 컴파일실행환경 + 파일관리(탐색기) + 번역과 실행(개발도구)

특정개발도구 

JDK위에 통합개발도구를 사용할수있고 통합개발도구에는 인텔리제이와 이클립스가있다.

JDK가 설치되어야 이클립스 사용가능. 이클립스가 컴퓨터에 깔린 JDK를 알아서 사용

개발 : 소스코드작성 -> 번역-> 디버깅-> 배포과정이 필요

JDK는 각각의 과정을 수행 할 수있도록 환경을 제공, 이클립스는 JDK를 사용해서 위의 과정을 한꺼번에 할 수 있도록 도와준다.

이클립스는 IBM에서 자바전용 개발환경을 기획했다가 워크벤치만 만들고 플러그인기능을 추가해 다른언어에도 사용할수있도록 만듦.
이클립스:워크벤치

 

이클립스 실행 -> workspace 디렉토리선택

Open Perspective에서 개발환경을 선택할 수있다. java선택 (자기 환경에 맞게 배치)

 

메모장으로 만들었던 Hello.java 파일을 src폴더로 드래그해서 넣어준뒤 run 

출력 : total is 210

 

 

 

 

 


  • 실수로 메뉴를 닫았을 경우 window - perspective - reset 하면 복구가능
  • ctrl + shift + f : 들여쓰기
  • ctrl + f11 : run
  • 파일명에 * 뜬경우 : 저장 안됨
  • ctrl + Alt + ↑↓:라인위아래로복사
  • ctrl + Shift + c : 한줄 주석처리

 

 

 

자바 프로그래밍이란? : 자바(를 이용해서 컴퓨터) 프로그램을 만드는 것

 

1. 프로그램은 무엇입니까?

2. 왜 자바를 이용합니까?

 

1. 프로그램은 무엇입니까?

:“목적하는 것을 이루기 위한 순서를 미리 작성해 놓은 것”



1.1 컴퓨터 프로그램은 무엇입니까?

: 컴퓨터를 이용해서 “목적하는 것을 이루기 위한 순서를 미리 작성해 놓은 것”

 

1.2 컴퓨터란 무엇입니까?

: 계산기? <-> 컴퓨터: 프로그래밍이 가능한 계산기

 

1.3 컴퓨터를 이용하는 방법은 어떻게 되나요?

: 컴퓨터가 가지고 있는 계산기 기능을 이용해서 원하는 계산식을 얻는 것.

 

1.4 스위치 조작 방법은?

0과 1을 이용해서 조작을 할 텐데

 

1.5 스위치 조작을 대신할 수 있는 방법은 없는지?

: 번역기를 거쳐서 0과 1로 만든다.

 

1.6 처음 만든 번역기의 형태는 어셈블리어를 번역하는 번역기였다. 어셈블리어란?

: 기계 장치의 내장된 기능에 대한 명칭

 

1.7 2세대 번역기가 또 있다고 한다. 종류는 크게 컴파일러와 인터프리터로 나누어 볼 수 있는데… 기존 1세대 번역기(어셈블러)에서 2세대 번역기가 나온 이유는 무엇인가?

: 장치가 달라질 경우에 장치에 맞게 프로그램을 다시 작성해야 하는 불편함을 없애기 위해




운영체제란?

DJ->CD/LP판 옮겨서 실행해주는 사람

DJ가 사라졌다. 왜? DJ 역할(음악을 틀어주는 역할)을 누군가가 대신해주게 되었다. 

: DJ의 역할을 대신해주는 기계란? 주크박스

컴퓨터 사용자와 컴퓨터 하드웨어 간의 인터페이스로서 동작하는 시스템 소프트웨어의 일종, 다른 응용프로그램이 유용한 작업을 할 수 있도록 환경을 제공.


컴퓨터의 운영방법

컴퓨터 테이프

 


운영체제의 구현 기술 

: 사용자 인터페이스 : shell (bsh(bash), dos->윈도우 탐색기)

  커다란 보조기억 장치





1.8 2세대 번역기인 컴파일러와 인터프리터는 어떤 차이가 있으며 어떤 경우에 인터프리터를 사용하는가?

차이: 번역하는 순서?(x), 중간 과정을 생략하고 안생략하는 차이(x)

         번역만 하느냐-전문 번역기 / 실행하면서 번역을 하느냐-실행기(필요에 따라서 번역)

REPL(Read–eval–print loop - Wikipedia)의 필요성이 인터프리터를 만들게 되었다.

 

인터프리터 언어는 두 가지 큰 단점(소스코드/실행속도)이 있음에도 요즘 그것이 확산되는 이유는?

아마도 다른 장점의 필요성이 단점을 누르는 것 아닌가?

: 파이썬(범용플랫폼)/자바스크립트/…

“문법이 쉬워서? 다양한 뭐든지 약간 쉽게 만들 수 있다.”

“멀티플랫폼”/배열을 정렬(기준? 데이터 구조?  p.x > p.x ) / 

 

1.9 자바의 탄생 배경이 WORA를 구현하기 위해 태어났기

: Write Once Run Anywhere(Write once, run anywhere - Wikipedia)

 

2. 왜 자바를 이용합니까?

 

2.1 왜 자바를 이용해서 컴퓨터 프로그램을 만듭니까?

: WORA 때문에

2.2 탄생배경

 

2.3 WORA를 위해서 자바 플랫폼을 새로 만들었다.

자바 플랫폼은 어떤 역할을 하는건가요?

 

1) 플랫폼이란

: 프로그램이 운영되기 위한 기반

2) 자바 플랫폼의 특징은?

기존 플랫폼이 없는 것도 아닌데 굳이 자바 플랫폼을 만든 이유는?

:  WORA 때문에 .. 돼지코를 구현하고 있는 플랫폼

 

2.4 번역기도 인터프리터와 컴파일러 두 가지를 사용한다.

컴파일러와 인터프리터 중에 하나만 사용하면 될텐데…

왜 굳이 두 가지 번역기를 사용하는가?

: 성능과 WORA 두 마리 토끼를 잡으려고 했다.

자바는 꼭 두 가지를 사용해야만 하나요? 한 가지만 사용해도 되나요?

: 한가지만 사용해도 되죠..- 인터프리터만 사용해도 된다.

 

반만 번역해서 반은 실행할 때 번역한다.

반만 번역한 결과물을 우리는 무엇이라고 하는가?

: 중간코드, 의사코드, 슈도코드, 바이트코드,.......



3 자바의 계보

언어적인 특징

 

jdk -> 컴파일 -> 실행

 

3세대 프로그래밍 언어

 

1. 값(데이터형식)

값의 종류 : 정수, 실수, 문자, 부울

 

정수의 표현

: 진수에 따른 값의 표현 -> 10진법, 16진법, 8진법, 2진법

: 크기에 따른 값의 표현 -> 4바이트(기본크기), 8바이트 : 35L(대/소문자 안가림)

실수의 표현

: 소수점에 따른 값의 표현 -> 234.12, 지수표현으로 바꾸면 2.3412e2

: 크기에 따른 값의 표현 -> 4바이트 : 34.23F , 8바이트(기본크기) : 34.23

 

2. 값의 형식명

정수의 형식명 

: byte, short,  int, long

실수의 형식명

: float, double

 

23->정수->4바이트 크기

:  2바이트 크기의 정수로 사용하고 싶다. -> (short)23 : 명식적인 형식 변환

 

자바

  • 컴파일러 + 인터프리터

모든장치에서 돌아가는 단일한 실행 환경을 위해 만들어짐

모든 플랫폼에서 실행할 수있도록 코드를 만들기 위함

WORA : Write Once Run Anywhere (한번작성하면 모든곳에서 실행)

 

  • 자바소스파일 (.java)     →      바이트코드 파일 (.class)    →    기계어 변환    →    실행

 

코드작성

점점 실행코드가 길어지고 복잡해짐 -> 함수+클래스

클래스명 : 대문자로 시작, 파일명과 동일

들여쓰기 : 가독성

블럭만들기

 

 

세미콜론 ; 의 역할 

식과 식을 구분

한문장의 끝을 ; 으로 끝내야함

 

 

변수선언

어떠한 용도로 쓸것인지 선언

컴파일러에게 키워드를 알려주는것

컴파일러가 정의해놓은 키워드 : if, switch, for, while, case, break, +, - ,* , ...

사용자가 사용할 키워드 : x, y, z, menu, .. ->선언

 

  • 값의 형식명칭

 

값의 형식명칭 / 데이터타입

 

  • 정수형식과 변환

26(10진수) = 0x1A (16진수)

byte  = 8 bit

short = 2 byte = 16 bit

int    = 4 byte = 32 bit

long = 8 byte = 64 bit 

 

long x = 30; 

30은 정수 int타입 4 byte이다. 이것을 long타입 8byte에 담을 수있다.

 

byte x = (byte)30;

30은 정수 int타입 4byte이다. 이것을 byte타입 1byte에 담을때는 '(바꾸려는형식)' 으로 형변환을 해줘야한다.

int형을 byte로 형식변환할때는 손실되는 부분이 있기 때문에 형변환해야한다.

 

 

 

  • 정수값의 크기와 범위

음수,양수부분 모두 0을 포함하므로 -1

 

 

 

  • 고정소수점

실수를 표현하는 소수부의 자릿수를 미리 정해놓고 고정된 자릿수로 소수를 표현하는것

고정소수점은 32비트 실수를 고정 소수점방식으로 표현

1비트 부호, 15비트 정수, 16비트 소수부 방식으로 표현

정수부표현에 한계가있다.

정수부가 15비트로 이므로 -2^15 ~ 2^15 -1 = 32767까지만 정수부 표현가능.

 

 

  • 부동소수점(Float Point) 표현방식의 4바이트 실수

부동소수점이란 하나의 실수를 가수부와 지수부로 나누어 표현

부동소수점 방식은 고정 소수점방식보다 훨씬 많은 범위까지 표현가능

 

12.125 → 1.2125e1 (e:지수 exponent)

부호비트가 1일경우 음수

 

 

 

절차를 자르는 도구로써의 함수

함수내용이 바뀌면 함수사용하는입장에서는 모른다.(코드의 변화를 알 수가 없다) ->코드변화를 차단할수있음

인터페이스 : 안쪽의 구현을 바꿔도 그 이름을 쓰는 입장에서는 문제가 없다.
함수 :인터페이스역할 , 또다른역할

 

 

 

출력 스트림을 이용한 비동기처리

출력함수는 System.out이라는 객체에 묶여있다.

입력함수는 System.in 이라는 객체에 묶여있다.

 

어플리케이션에서 모니터에 어떤것을 출력할때, 실제로 함수가 모니터에 값을 전달하지않는다.

여러개의 프로그램이 동시에 돌아가고있다. 명령을 분산하고 동시에 사용하기 위해 버퍼를 이용한다.

마치 회사에 서류결제할 사람들이 여러명일때 결제함을 만들어 결제서류를 두고오면 본인일을 할 수있다.

자바에서는 출력버퍼를 OutputStream이라고 부른다. (단방향버퍼)

출력버퍼는 어플리케이션들이 동기화 되는것을 막아주고 비동기형식으로 어플리케이션이 출력값을 출력버퍼에 담는다.

함수 : 반복되는것을 함수화, 밑단의 코드가 달라져도 영향x, 단일화된 기능부여,코드변화 차단,대리자역할

 

  • 인터페이스 장점 : 장치가 달라지면 프로그램을 다 고쳐야한다 -> 문제발생 -> 장치코드가 달라져도 프로그램은 달라지지않게 - > 함수만듦 -> 함수사용자는 변동이없다(이름변동x) -> 함수는 그대로니까 - > interface
  • 함수는 인터페이스다 ( X ) :인터페이스는 함수능력중 하나.
    인터페이스는 함수다 ( X ) :과거 : ok, 현재 : 인터페이스 기능이 늘어났음

 

 


자바 실습

메모장에 소스코드 입력 → Hello.java 로 저장 cmd창에 소스코드경로지정 → javac Hello.java + 엔터  에러출력

에러 출력 이유 : 변수타입을 지정안함

 

 

변수타입 지정 → int , double 입력 → 출력을위한 함수입력 'System.out.printf() cmd창에 javac Hello.java + 엔터 → 총점출력됨

 


메모리구조 찾아볼것

자바 프로그램 순서 :

  • 자바소스파일 (.java)     →      바이트코드 파일 (.class)    →    기계어 변환    →    실행

                            컴파일러 javac.exe                               인터프리터 java.exe

 

  • 이클립스에서 소스작성 후 저장을 누르면 .class파일 생성 → run →Computer

 


 

자바번역기 특징

 

컴파일러 : 개발자가 사용 , 인터프리터 : 사용자 사용

 

 

 


Java CMD창에서 컴파일

메모장을 켜서 아래와 같은 코드를 입력해준다.

public class Hello{
	public static void main(String[] args){
		System.out.println("Hello World!");
	}
}

 

 

클래스명과 동일한 이름인 Hello.java로 저장해준다. (확장자는 반드시 .java)

 

 

윈도우키 + R 눌러 cmd창을 실행후 방금 저장한 파일의  경로를 넣어준다.

 

dir로 목록을 조회한다

 

 

'javac Hello.java' + 엔터 : 자바소스파일을 컴파일해서 바이트코드파일(.class)생성하기

 

 

바이트코드파일이 생성되었는지 확인을 위해 dir + 엔터해서 목록검색

 

 

.class파일 확인후 'java Hello'+ 엔터를 누르면 "Hello World"가 출력된다.

 

 

 

명령프롬프트에서 컴파일 ( 소스코드 번역없이 실행 )

· 메모장에 코드 입력 - 새로운폴더 "workplace" 생성 후 .java로 저장

· 윈도우키+ R (실행창 켜기) → cmd입력 (명령 프롬프트)

· cd + 스페이스 + java가 설치되어있는 경로붙여넣기 (ctrl+v 또는 마우스 오른쪽버튼)

· java -version 입력 + 엔터 : jdk 설치버전확인

· 메모장으로 작성한 소스파일있는 경로에서 java -version엔터하면 'java'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.' 오류발생

 

·java.exe파일 위치와 소스코드 위치차이때문에 발생

 

java.exe파일 위치와 소스코드  위치차이 때문에 발생

환경변수 설정

· 어느위치에서든 자바파일을 실행시키기 위해 환경변수 설정을 해야함

· 제어판 → 시스템 및 보안 시스템속성 고급 환경변수시스템변수 에서 경로 등록

(소스코드가 어디에 있든 자바실행을 도와준다)

· JAVA_HOME으로 변수를 새로 설정 : 경로를 bin전까지 넣기.

· PATH에 %JAVA_HOME%\bin 넣기 : bin앞의 디렉토리가 변경될 경우 JAVA_HOME으로인해 자동반영.

 

JAVA_HOME
PATH

· 커맨드창 다시 실행 ->소스코드있는 경로지정 ->java -version + 엔터 : jdk확인

· 소스코드있는 경로지정 -> 파일명입력

C:\Users\yh\Desktop\202102\workspace>java Hello.java

다음과 같은 에러발생 (클래스 등 미입력으로 인한 오류)

· 번역기 미사용시 : 실행타임이길고 소스코드노출문제발생

· cd ../ 엔터: 상위로 이동

· dir 엔터 : 목록을 나타냄

 

환경변수 설정이 완료되면 어느 경로에서든 자바가 실행되어야한다. java -version했을때 jdk가 확인되어야한다.

*프로그래밍 :

컴퓨터 프로그램을 만드는것

메모리에 있는것을 실행

*C/C++단점을 보완 -> 자바

C/C++단점을 보완 -> 자바

*자바 언어의 특징:

양방향 소프트웨어

언어와 플랫폼이름이 동일 (플랫폼단일화)

간결 / 가이드/ 객체지향

 

*자바 플랫폼의 특징 :

자바플랫폼을 통해 다양한 운영체제사용가능

(전용 운영체제쓰는 단점탈피)

자바API가 interface역할 (자바코드와 운영체제사이)

ex. 변환플러그어댑터

 

*컴파일 언어 :

코드 → 번역 → 보조기억장치 → 메인메모리 → 실행

ex: C, C++ 

CPU안의 Control Unit이 실행

특정CPU에서만 동작

기계어를 직접 만들어 실행

메모리 관리를 해야함

한번에 미리 번역

배포시 구문오류 존재 X

실행환경 도구 필요X

컴파일언어 실행방법

컴파일언어 특징

*인터프리터언어 :

번역없이 소스코드가 바로실행

실행을 도와주는 실행엔진필요(virtual machine)

소스코드로 배포 -> 배포환경넓힘

한줄한줄 번역

실행타임이 느림

ex:python, javascript

*JDK, JRE, JVM 차이점 :

JVM : 자바가상머신( Java Virtual Machine)

OS별로 존재, 바이너리 코드를 읽고 검증, 실행.

 

JRE : 자바실행환경(Java Runtime Environment)

JVM + 자바프로그램 ,

실행에 필요한 라이브러리 파일 등 ,

JVM의 실행환경 구현

 

JDK : 자바개발도구(Java Development Kit) 

JDK = JRE + 개발을 위한 도구

컴파일러, 디버그 도구등 포함

 

JDK > JRE > JVM (JDK가 가장 큼, JDK를 설치하면 JRE, JVM도 설치됨)

  • 어떤것을 만들것인가에 따라 언어가 결정된다

  • C,C++ : 코딩절차를 만드는데 적합​

  • 컴파일 언어 : 3+4 를 컴파일(binary code)로 번역후 디스크에 저장 ->런타임 ->Execute (실행속도빠름)

  • 컴파일언어 : C,C++, Java, C#

  • 인터프리터언어 : 번역없이 실행 ->소스코드가 바로 디스크에있음 ->바로필요할때 필요한언어만 번역

  • 인터프리터언어: Python , Javascript , 실행속도 느림, 배포부담이 적음

  • 컴퓨터가 1,0 만 인식하는 이유? 천공처럼 기계가 구멍뚫린곳, 안뚫린곳에 따라 움직인것에서 반도체 발전

  • 프로그램이란 ? 컴퓨터프로그램은 컴퓨터를 이용하기 위한 수행절차, 자바프로그램이란 자바이용을 위한 수행절차


 

JDK 설치

https://jdk.java.net/15/

  1. 파일다운로드 -> 압축파일 풀기
  2. 압축을 푼 폴더에서 jdk-15.0.2폴더를 잘라내기 -> 바탕화면에 새로운 폴더(tools)생성해서 안에 붙여넣기
  3. 윈도우키 + R : 커맨트창 켜기
  4.  jdk-15.0.2가 있는 경로를 찾아준다
  5.  cd+스페이스바+탭 : 탭을 누르면 해당 디렉토리의 파일을 순서대로 보여준다.
  6. cd입력후 스페이스바를 넣기 -> jdk-15.0.2가 들어있는 주소를 저장후 붙여넣기해준다.
  7. C:\Users\yh\Desktop\20210219\tools\jdk-15.0.2>cd bin엔터
  8. C:\Users\yh\Desktop\20210219\tools\jdk-15.0.2\bin>javac -version
  9. javac 15.0.2 // javac -version 엔터
  10. 자바 버전이 확인되면 설치 완료

*C로 한번에 이동은 'cd C:\'  

+ Recent posts