배열을 복제하는 방법은 여러가지가 있는데, 그 중 하나는 clone이라는 메소드를 이용하는 방법이다.

int[] before = {1,2,3,4,5};
int[] after = before.clone();

위와 같이 사용하면 된다. 

배열 after는 배열 before가 참조하는 배열 본체의 복제를 참조한다.

 

좀 더 완성된 코드로 예를 들어보면, 

public class CloneArray{
    public static void main(String[] args){
        int[] before = {1,2,3,4,5};
        int[] after = before.clone();

        after[3]=0;
        System.out.print("before:");
        for(int i=0;i<before.length;i++){
            System.out.print(before[i]);
        }
        System.out.print("\nafter:");
        for(int i=0;i<after.length;i++){
            System.out.print(after[i]);
        }
        System.out.println();
        
    }
}

 

위 코드 실행시

before:12345

after:12305 가 출력된다

 

1. 문제

long sum(int[] a); (클래스 이름: Test)

  • a: 합을 구해야 하는 정수 n개가 저장되어 있는 배열 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
  • 리턴값: a에 포함되어 있는 정수 n개의 합

2. 코드

public class Test {
    long sum(int[] a) {
		long sum = 0;	// sum : a 배열안의 원소들의 합을 저장하는 변수
        
		for(int i = 0; i < a.length; i++) {
			sum += a[i];
		}
		return sum;
	}
}

 

3. 풀이

long타입 함수이므로, return값은 long타입임에 유의하자

따라서 sum을 선언할 때, long 타입으로 해주어야 한다.

 

4. 링크

www.acmicpc.net/problem/15596

 

15596번: 정수 N개의 합

C++17, Java 8, Python 3, C11, PyPy3, C99, C++98, C++11, C++14, Python 2, PyPy2, Go, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)

www.acmicpc.net

 

소수점 n번째 자리까지 나타내는 방법에는 2가지가 있다. 

첫번째로, Math.round()함수를 이용하는 방법

두번째로, String.format()함수를 이용하는 방법

 

1. Math.round()함수

round함수는 소수점 첫번째 자리를 반올림하여 정수로 리턴하는 함수인데, 이를 이용하여 소수 두번째자리, 세번째 자리, 등등을 나타낼 수 있다. 

3.1415를 예로 들면, 

3.1415를 round하면, 4가된다.

3.1415에 100을 곱한 후에 round하면? 314가 된다. 여기서 100.0을 다시 나눠주면 3.14가 된다. 

이렇게 되면 소수점 둘째까지 반올림 한 값을 표현하게 되는 것이다. 

셋째자리를 표현하고자 한다면?

3.1415에 1000을 곱한 후에 round하고 다시 1000.0으로 나누어 주면 된다. 

float n = 3.1415;
System.out.println(Math.round(n*100)/100.0); //소수점 아래 둘째자리까지 반올림
System.out.println(Math.round(n*1000)/1000.0); //소수점 아래 셋째자리까지 반올림

하지만, Math.round()함수는 소수점 아래 숫자가 0이면 과감히 버려버리기 때문에 3.00 이렇게 표현하고 싶다면, 해당 함수를 사용하면 안된다. 그 대안이 String.format()함수이다.

 

2. String.format()함수

String클래스의 format 함수는 리턴되는 문자열 형태를 지정하는 함수인데, 이 함수를 이용하여 소수점 n번째자리 까지 나타낼 수 있다. 

String.format(format,args)형태로 사용한다.

예를 들면..

float n=3.1415;
System.out.println(String.format("%3f",n)); //소수점 아래 셋째자리까지 출력

 

 

 

 

<참고>:coding-factory.tistory.com/250

자바의 GUI

- 그래픽 이용, 사용자가 이해하기 쉬운 모양으로 정보제공

- 마우스나 키보드를 이용하여 입력

 

GUI 프로그래밍

- GUI 컴포넌트와 그래픽 이용

  AWT – java.awt 패키지

  Swing – javax.swing 패키지

 

AWT

Swing

자바가 처음 나왔을 때 함께 배포된 GUI 라이브러리

AWT 기술을 기반으로 순수 자바언어로 만든 라이브러리

java.awt 패키지

javax.swing 패키지

Heavy weight (중량) 컴포넌트

Light weight (경량) 컴포넌트

Native(peer) OSGUI 컴포넌트의 도움을 받아 작동

Native(peer) OS에 의존 X

빠른 속도, OS 많은 부담

화려한 고급 컴포넌트+AWT

 

유형 1) JComponet 상속받는 클래스 : 대부분

유형 2) AWTContainer를 상속받는 클래스 : JApplet, JDialog,JFrame,

 

Swing(스윙)

- JComponet : 스윙 컴포넌트의 공통 속성을 구현한 추상 클래스, AWTComponent를 상속받음

  new JComponent() 인스턴스 생성 X

 

스윙 GUI 프로그램 만드는 방법

1. 스윙 프레임 작성

2. main() 메소드 작성

3. 프레임에 스윙 컴포넌트 붙이기

스윙 패키지 사용 import

      import java.awt.*; //그래픽 처리 클래스의 경로명

      import java.awt.event.* //AWT 이벤트 사용을 위한 경로명

      import javax.swing.*; // 스윙 컴포넌트 클래스들의 경로명

      import javax.swing.event.*; //스윙 이벤트를 위한 경로명

 

컨테이너와 컴포넌트

컨테이너

컴포넌트

다른 GUI 컴포넌트를 포함할 수 있는 컴포넌트

컨테이너에 포함되어야 화면에 출력될 수 있는 순수 컴포넌트

java.awt.Container 상속, 다른 컨테이너에 포함될 수 O

모든 컴포넌트는 java.awt.Componet 상속받음

모든 스윙 컴포넌트는 javax.swing.JComponent 상속받음

AWT 컨테이너 : Panel, Frame, Applet, Dialog, Window

 

Swing 컨테이너 : 앞에 J 붙인거

 

 

최상위 컨테이너

-      독립적 출력 O

-      JFrame, JDialog, JApplet

-      모든 컴포넌트는 컨테이너에 포함되어야 화면 출력 O

 

 

컨테이너와 컴포넌트의 포함관계

스윙 프레임

- 모든 스윙 컴포넌트를 담는 최상위 GUI 컨테이너

- JFrame을 상속받아 구현

- 스윙 프레임에 의존

  프레임 : 스윙 프로그램의 기본 틀

  메뉴바  메뉴 부착

  Content Pane : GUI 컴포넌트 부착

 

300*300 크기의 스윙 프레임 만들기

import javax.swing.*;
public class swing1 extends JFrame{
	public swing1(){
			setTitle("300 * 300 swing frame 만들기");
			setSize(300,300);
			setVisible(true);
		}
	
	public static void main(String[] args) {
		swing1 frame = new swing1();

	}
}

위의 코드를 실행하면 아래와 같은 창이 뜬다

cf) main()을 프레임 클래스 내의 멤버로 작성

 

프레임에 컴포넌트 붙이기 

- 3개의 버튼 컴포넌트를 가진 스윙프레임

import javax.swing.*;
import java.awt.*;
public class swing2 extends JFrame{
	public swing2() {
		setTitle("ContentPane과 JFrame");	//메소드를 호출하여 타이틀달기
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container contentPane = getContentPane(); //컨텐트팬 알아내기
		contentPane.setBackground(Color.ORANGE);
		contentPane.setLayout(new FlowLayout());
		
		//컨텐트팬에 컴포넌트 달기
		contentPane.add(new JButton("OK"));
		contentPane.add(new JButton("Cancel"));
		contentPane.add(new JButton("Ignore"));
		
		setSize(300,150);
		setVisible(true);
	}
	public static void main(String[] args) {
		new swing2();
	}

}

위의 코드를 실행하면 아래와 같은 창이 뜬다

 

스윙 응용프로그램의 종료

- 응용프로그램 내에서 스스로 종료

   System.exit(0); -언제 어디서나 종료

- 프레임 종료 버튼(x) 클릭되면?

   프레임은 닫히지만, 응용프로그램은 작동함

   setVisible(true) 호출 시 프레임 보이고 다시 작동

- 프레임 종료 버튼 클릭시 프레임 닫고 응용프로그램 종료하려면? 

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

main() 종료 뒤에도 프레임이 살아 있는 이유?

- 스윙 프로그램이 실행되는 동안 메인스레드, 이벤트분배스레드 생성

더보기

  메인스레드 : main() 실행, 자바 응용 프로그램의 실행 시작

이벤트 분배 스레드 : 자동실행, 프레임과 버튼, 등 GUI 화면 그리기, 키와 마우스 입력받아 호출

실행중인 사용자 스레드가 하나도 없을 때 자바 응용프로그램 종료

->  메인 스레드가 종료되어도 이벤트 분배 스레드가 살아있어 프레임 화면, 마우스나 키 입력을 받기 때문

 

컨테이너와 배치 개념

1. 컨테이너마다 하나의 배치 관리자가 존재

- 삽입되는 모든 컴포넌트의 위치와 크기 결정, 적절히 배치

2. 컨테이너의 크기가 변하면 내부 컴포넌트들의 위치와 크기를 모두 재조절/재배치

 

배치관리자

- ­java.awt 패키지에 구현되어 있음

(FlowLayout, BorderLayout, GridLayout, CardLayout) 4가지 유형이 있다

"이쪽으로 가세요" 하는 사람을 배치관리자(Layout Manager)

자리를 컨테이너(Container)

자리를 배정받는 사람을 컴포넌트(Component)

 

배치관리자

- ­java.awt 패키지에 구현되어 있음

(FlowLayout, BorderLayout, GridLayout, CardLayout)

 

컨테이너와 디폴트 배치관리자

AWT와 스윙 컨테이너

디폴트 배치관리자

Window, JWindow

BorderLayout

Frame, JFrame

Dialog, JDialog

Panel, JPanel

FlowLayout

Applet, JApplet

 

컨테이너에 새로운 배치 관리자 설정

- Container.setLayout(LayoutManager Im) : Im을 새로운 배치관리자로 설정

//JPanel 패널에 BorderLayout 배치 관리자 설정
JPanel p = new JPanel();
p.setLayout(new BorderLayout());

//컨텐트팬의 배치 관리자를 FlowLayout으로 변경
Container c = frame.getConentPane(); 	//컨텐트팬
c.setLayout(new FlowLayout());

 

FlowLayout

- 컨테이너 크기가 변하면 컴포넌트 재배치

-   FLowLayout(int align, int hGap, vGap)

   align : 컴포넌트 정렬방법( FlowLayout.LEFT)

   hGap : 좌우 컴포넌트 사이 수평간격, 픽셀단위, 디폴트는 5

   vGap : 상하 컴포넌트 사이 수직간격, 픽셀단위, 디폴트는 5

 

FlowLayout 배치 관리자 활용

import javax.swing.*;
import java.awt.*;
public class swing3 extends JFrame{
	public swing3() {
		setTitle("FlowLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		
		//FlowLayout(int align, int hGap, int vGap)
		c.setLayout(new FlowLayout(FlowLayout.LEFT,30,40)); //왼쪽으로 정렬
		//align : 컴포넌트 정렬방법 
		//(FlowLayout.LEFT) (FlowLayout.RIGHT) (FlowLayout.CENTER(디폴트))	
		//hGap : 좌우 컴포넌트 사이 수평간격, 픽셀단위, 디폴트는 5
		//vGap : 상하 컴포넌트 사이 수직간격, 픽셀단위, 디폴트는 5
		c.add(new JButton("add"));
		c.add(new JButton("sub"));
		c.add(new JButton("mul"));
		c.add(new JButton("div"));
		c.add(new JButton("Calculate"));
		
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new swing3();

	}

}

위의 코드를 실행하면 아래와 같은 창이 뜬다

창의 크기를 바꿨더니 아래와 같은 화면이 되었다. 

 

BorderLayout

- 배치방법 : 컨테이너 공간 5구역으로 분할 배치

(East,West,South,North,Center)

- 컨테이너 크기가 변하면 재배치

- void add(Component comp, int index)

  : comp 컴포넌트를 index 위치에 삽입

   (BorderLayout.EAST)

 

BorderLayout 배치관리자를 사용하는 코드

import javax.swing.*;
import java.awt.*;

public class swing4 extends JFrame{
	public swing4() {
		setTitle("BorderLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		c.setLayout(new BorderLayout(30,20));
		c.add(new JButton("Calculate"),BorderLayout.CENTER);
		c.add(new JButton("add"),BorderLayout.NORTH);
		c.add(new JButton("sub"),BorderLayout.SOUTH);
		c.add(new JButton("mul"),BorderLayout.EAST);
		c.add(new JButton("div"),BorderLayout.WEST);
		
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new swing4();
	}

}

위의 코드를 실행하면 아래와 같은 창이 뜬다

창의 크기를 바꿨더니 아래와 같은 화면이 되었다. 

 

GridLayout

- 컨테이너 공간을 동일한 사각형 격자(그리드)로 분할하고 각 셀에 하나의 컴포넌트 배치

- 생성자에 행수와 열수 지정(vGap,hGap)

- 컨테이너 크기가 변하면 재배치

- GridLayout(int rows, int cols, int hGap, int vGap)

  rows: 그리드 행수, 디폴트는 1

  cols : 열수, 디폴트는 1

  hGap 좌우 vGap 수직 디폴트는 0

 

GridLayout으로 입력 폼 만들기

import javax.swing.*;
import java.awt.*;

public class swing5 extends JFrame{
	public swing5() {
		setTitle("GridLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		GridLayout grid = new GridLayout(4,2);
		grid.setVgap(5);
		
		Container c = getContentPane();
		c.setLayout(grid);
		c.add(new JLabel("이름")); c.add(new JTextField(""));
		c.add(new JLabel("학번")); c.add(new JTextField(""));
		c.add(new JLabel("학과")); c.add(new JTextField(""));
		c.add(new JLabel("과목")); c.add(new JTextField(""));
		
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new swing5();
	}

}

위의 코드를 실행하면 아래와 같은 창이 뜬다

 

배치관리자 없는 컨테이너

- 응용프로그램에서 컴포넌트의 절대크기와 절대위치 결정

(용도)

 - 컴포넌트의 크기나 위치 임의 지정

 - 시간이나 마우스/키보드의 입력에 따라 컴포넌트들의 위치와 크기가 수시로 변하는 경우

 - 여러 컴포넌트들이 서로 겹쳐 출력하고자 하는경우

 

컨테이너의 배치 관리자 제거 방법 : container.setLayout(null)

- 크기설정 setSize (width, height) 위치설정 setLocating(x,y)

- 위치와 크기 동시 설정 setBounds(x,y,width,height)

컴포넌트를 절대위치와 크기로 지정

import javax.swing.*;
import java.awt.*;
public class swing6 extends JFrame{
	public swing6() {
		setTitle("Null Container Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(null);
		
		JLabel la = new JLabel("Hello, Press Buttons!");
		la.setLocation(130,50);
		la.setSize(200,20);
		c.add(la);
		
		for(int i=1;i<=9;i++) {
			JButton b = new JButton(Integer.toString(i));	//버튼 생성
			b.setLocation(i*15,i*15);
			b.setSize(50,20);
			c.add(b);	//버튼을 컨텐트팬에 부착
		}
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new swing6();

	}

}

위의 코드를 실행하면 아래와 같은 창이 뜬다

 

 

 

 

 

bskwak.tistory.com/179

바이트 스트림, 문자스트림, 버퍼 스트림 정의

 

[JAVA] 스트림 - 바이트 스트림, 문자 스트림, 버퍼스트림을 이용한 파일 입출력

Slow but steady wins the race [JAVA] 스트림 - 바이트 스트림, 문자 스트림, 버퍼스트림을 이용한 파일 입출력 본문 Programming Language/Java [JAVA] 스트림 - 바이트 스트림, 문자 스트림, 버퍼스트림을 이용한

bskwak.tistory.com

텍스트 파일 복사

- FileReader와 FileWriter이용

더보기

(코드 알고리즘 )

원본파일 문자 하나씩 읽어서 복사 파일에 하나씩 쓰면 된다 

package streamStudy;
import java.io.*;
public class practice_file8 {
	public static void main(String[] args) {
		File src = new File("c:\\windows\\system.ini"); //원본 file 경로명
		File dest = new File("system.txt");	//복사 file 경로명
		int c;
		try {
			FileReader fr = new FileReader(src);
			FileWriter fw = new FileWriter(dest);
			while((c=fr.read())!=-1) {	//문자 하나 읽고
				fw.write((char)c);	//문자 하나쓰고
			}
			fr.close(); fw.close();
			System.out.println(src.getPath()+"를"+dest.getPath()+" 로 복사");
		}catch (IOException e) {
			System.out.println("파일 복사 오류");
		}
	}
}

 

cf) 파일 클래스

-      파일의 경로명을 다루는 클래스 (java.io.File)

-      파일관리 기능 (이름 변경, 삭제, 디렉터리 생성, 크기, )

-      f.getName() f.getPath() f.getParent() f.listFiles() 등등이 있음

 

바이너리 파일 복사

- 바이트 스트림 이용

package streamStudy;
import java.io.*;
public class practice_file9 {
	public static void main(String[] args) throws IOException{
		File src = new File("test.out");
		File dest = new File("copytest.out");
		int c;
		try {
			FileInputStream fi = new FileInputStream(src);
			FileOutputStream fo = new FileOutputStream(dest);
			while((c=fi.read())!=-1) {
				fo.write((byte)c);
			}
			fi.close(); fo.close();
			System.out.println("복사 성공");
		}catch(IOException e) {
			System.out.println("실패");
		}
	}
}

 

블록 단위로 바이너리 파일 고속 복사

- 10KB 단위로 읽고 쓰도록 하여 고속으로 파일 복사

package streamStudy;
import java.io.*;
public class practice_file10 {
	public static void main(String[] args) {
		File src = new File("C:\\Users\\0214k\\OneDrive\\바탕 화면\\picture.jpg");
		File dest = new File("picture2.jpg");
		try {
			FileInputStream fi = new FileInputStream(src);
			FileOutputStream fo = new FileOutputStream(dest);
			byte[] buf = new byte[1024*10];
			while(true) {
				int n= fi.read(buf);
				fo.write(buf,0,n);	//buf[0]부터 n byte 쓰기
				if(n<buf.length) break;
			}
			fi.close();	fo.close();
			System.out.println("복사 성공");
		}
		catch(IOException e) {
			System.out.println("복사 오류");
		}
	}
}

바이너리 파일이므로 사진도 복사 가능

 

스트림 입출력

- 버퍼를 가지고 순차적으로 이루어지는 입출력

- 자바의 입출력 스트림 : 응용프로그램과 입출력 장치를 연결하는 소프트웨어 모듈(객체)

 

컴퓨터 시스템 I/O 연결 구조

 

자바의 입출력 스트림

- 스트림 양끝에 입출력장치와 자바 응용프로그램 연결

- 스트림은 단방향 (입출력 동시 불가능)

- 선입선출 구조

 

바이트 스트림

- 입출력되는 데이터를 단순 바이트로 처리

- 단위 byte

 

문자 스트림

- 문자만 입출력, 바이너리 데이터(이미지, 동영상)는 스트림에서 처리 불가

- 단위 : 문자 (2byte)

- 클래스 (Reader/Writer) (InputStreamReader/OutputStreamWriter) (FileReader/FilerWriter)

 

FileReader 이용해 파일 읽기

import java.io.*;

public class practice_file1 {
	public static void main (String[] args) {
		
		FileReader fin = null;
		try {
			//파일과 입력바이트 스트림 객체 fin 연결
			fin = new FileReader("c:\\windows\\system.ini");	
			int c;
			
			//파일 전체를 읽어 화면에 출력 (byte씩 c에 읽어들임)
			while((c=fin.read())!=-1){	//파일의 끝을 만나면 read()는 -1 리턴
				System.out.print((char)c);	//byte c 를 문자로 변환하여 출력
			}
			fin.close();
		}
		catch(IOException e) {
			System.out.println("입출력 오류");
		}
		
	}
}

 

InputStreamReader로 한글 텍스트 파일 읽기

-      MS949 사용 (MS에서 만든 한글 확장  완성형 문자 집합)

import java.io.*;
public class practice_file2 {

	public static void main(String[] args) {
		InputStreamReader in = null;
		FileInputStream fin = null;
		
		try {
			fin = new FileInputStream("hangul.txt");
			in = new InputStreamReader(fin,"UTF-8");
			int c;
			
			System.out.println("인코딩 문자 집합은 "+in.getEncoding());
			while((c=in.read())!=-1) {
				System.out.print((char)c);
			}
			in.close();
			fin.close();
		}catch(IOException e) {
			System.out.println("입출력 오류");
		}

	}

}

나는 MS949를 사용해도 한글이 깨진채로 출력됐다. UTF-8로 수정하니 한글이 깨지지 않고 출력되었다.

 

FileWriter 사용해서 파일 쓰기

- 문자 단위 쓰기 : fout.write(‘A’)

- 블록단위 쓰기 : fout.write(array,0,array.length)

import java.io.*;
import java.util.*;
public class practice_file3 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		FileWriter fout = null;
		int c;
		try {
			fout = new FileWriter("text.txt");
			while(true) {
				String line = sc.nextLine();
				if(line.length()==0) break;
				fout.write(line,0,line.length());
				fout.write("\r\n",0,2);	//한 줄 뛰기
			}
			fout.close();
		}catch(IOException e) {
			System.out.println("입출력 오류");
		}
		sc.close();
	}


}

 

바이트 스트림

- 입출력되는 데이터를 단순 바이트로 처리

- 단위 byte

- 클래스

(InputStream/OutputStream) : 추상 클래스, 슈퍼 클래스

(FileInputStream/FileOutputStream) : 바이너리 파일 입출력, 파일로부터 바이트 단위로 읽거나 저장 (DataInputStream/DataOutputStream) : 자바의 기본 data type(변수)을 바이너리 값 그대로 출력

 

FileOutputStream으로 바이너리 파일쓰기

package streamStudy;
import java.io.*;
public class practice_file4 {

	public static void main(String[] args) {
		byte b [] = {7,3,2,-1,65,32};
		try {
			FileOutputStream fout = new FileOutputStream("test.out");
			for(int i=0;i<b.length;i++) {
				fout.write(b[i]); //배열 b의 바이너리를 그대로 기록
			}
			fout.close();
		}catch(IOException e) {
			System.out.println("오류, 경로명 재확인");
			return;
		}
		System.out.println("test.out 저장 성공");
	}

}

cf) 바이너리 파일은 메모장으로 확인 불가

 

 

fileOutputStream으로 만든 바이너리 파일 "test.out"를 FileInputStream으로 읽기

package streamStudy;
import java.io.*;
public class practice_file5 {

	public static void main(String[] args) {
		byte b[] = new byte[6];
		try {
			FileInputStream fin = new FileInputStream("test.out");
			int n=0, c;
			while((c=fin.read())!=-1){
				b[n]=(byte)c;
				n++;
			}
			for(int i=0;i<b.length;i++) {
				System.out.print(b[i]+" ");
			}
			System.out.println();
			fin.close();
		}catch(IOException e) {
			System.out.println("오류, 경로 재확인");
		}

	}

}

 

표준 출력 스트림(System.out)과 연결한 버퍼크기가 5인 버퍼 출력 스트림을 이용한 출력

package streamStudy;
import java.io.*;
import java.util.Scanner;

public class practice_file6 {

	public static void main(String[] args) {
		FileReader fin = null;
		int c;
		try {
			fin = new FileReader("test.txt");
			BufferedOutputStream bout = new BufferedOutputStream(System.out,5);
			//  20byte크기의 버퍼 설정. System.out 표준 스트림에 출력
			while((c=fin.read())!=-1) {
				bout.write(c);	//버퍼가 꽉찰때 문자가 화면에 출력
			}
			
			//파일 데이터가 모두 출력된 상태
			new Scanner(System.in).nextLine();	//enter 키 대기
			//enter키를 누르면
			bout.flush();	//버퍼에 남아있던 모든 문자 출력
			
			fin.close();
			bout.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

}

 

추가 예시

bskwak.tistory.com/180

 

[JAVA] 텍스트 파일 및 바이너리 파일 복사

Slow but steady wins the race [JAVA] 텍스트 파일 및 바이너리 파일 복사 본문 Programming Language/Java [JAVA] 텍스트 파일 및 바이너리 파일 복사 BS Kwak 2020. 12. 12. 19:52 Prev 1 2 3 4 5 ··· 156 Next

bskwak.tistory.com

 

class(클래스) 선언

- class 키워드로 선언

- public : 다른 클래스에서 해당 클래스를 사용하거나 접근할 수 O

- { 필드, 메소드구현 } 

class(클래스) 구성멤버

1. 필드(Field)

객체의 데이터가 저장되는 멤버 변수 (데이터 : 객체의 고유 데이터, 부품 객체, 상태정보, 등)

 

2. 생성자(Constructor)

객체 생성 시 초기화 역할 담당

- new 연산자로 호출되는 { } 

- 필드 초기화/ 메소드 호출 -> 객체 사용할 준비

- 클래스 이름으로 되어있고 return X

 

3. 메소드(Method)

객체의 동작에 해당하는 실행 블록(=객체의 동작 구현)

- 함수

 

객체(Object)란? 

고유한 속성(state)과 동작(behavior)을 가지고 있는 것

- 속성 : 필드(field)

- 동작 : 메소드(method)

 

객체 모델링(Object Modeling)

(간단히 말하면) 현실 세계의 객체를 소프트웨어 객체로 설계하는 것

= 현실 세계 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정 

 

객체지향 프로그래밍의 특징 - 1. 캡슐화 2. 상속 3. 다형성

1. 캡슐화(Encapsulation)

객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것

- 외부의 접근으로부터 객체 보호

- Access Modifier(접근 제한자) 사용 : 객체의 필드와 메소드의 사용범위를 제한

 

2. 상속(Inheritance)

상위 클래스(부모)가 자신이 가지고있는 필드와 메소드를 하위클래스(자식)에게 물려줌

- 반복된 코드 중복을 줄여줌 (객체의 재사용) -> 효율적, 시간 절약

- 부모클래스(super class) 자식클래스(serve class) 

 

3. 다형성(Polymorphism)

하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 하는것

- 부모 클래스, 인터페이스의 타입변환 허용 

  : 부모타입에는 모든 자식 객체 대입 O

  : 인터페이스 타입에는 모든 구현 객체 대입 O

- 메소드 오버로딩 : 같은 이름 but 다르게 작동하는 여러 메소드

- 메소드 오버라이딩 : super class의 메소드를 server class마다 다르게 구현

 

객체(object)와 클래스(class)의 차이

● 클래스(class)

- 객체 모양을 선언한 틀/설계도

- 객체를 생성하기 위한 필드와 메소드가 정의되어 있음

- 와플틀이 있어 와플을 계속 찍어내듯이 클래스(틀)이 있어 객체를 찍어낸다 생각

 

 객체

- 클래스로부터 만들어진 객체 = 클래스의 인스턴스(instance)

- 메모리 공간을 갖는 구체적인 실체

와플틀로 찍어내는 와플

 

 

객체지향 프로그래밍의 개발 단계

1. 클래스 설계 2. 클래스를 이용해 객체 생성 3. 생성된 객체 이용

 

 

+ Recent posts