JAVA/JAVA수업

#13. API, I.O(Input/Output)

열하나요 2023. 7. 19. 09:32

13-1. API

Application Programming Interface

 

import java.lang.*; (생략)

자바를 사용하면서 필수적인 클래스들을 모아놓은 패키지

 

1. Math 클래스(수학과 관련)

	메소드명(매개변수타입) : 반환형
 1. 올림 => Math.ceil(double) : double
 2. 반올림 => Math.round(double) : long
 3. 버림 => Math.floor(double) : double
 4. 절대값 => Math.abs(int/double/long/float) : int/double/long/float)
 5. 최소값 => Math.min(int, int) : int
 6. 최대값 => Math.max(int, int) : int
 7. 제곱근(루트) => Math.sqrt(double) : double
 8. 제곱 => Math.pow(double, double) : double

 

2. String 클래스 => 불변클래스 (변하지 않음을 의미)

String은 클래스지만 new를 사용하여 생성자를 호출하지 않고 대입연산자를 통해서 직접 값을 대입하여 생성한다.

String str = "hello";

리터럴 값 대입 시, String Pool영역에 올라가며, String Pool 안에 같은 리터럴이 존재하면 새로운 주소값의 객체를 생성하지 않고 기존의 주소값을 참조한다.

 

String str1 = "hello";
String str2 = "hello"; 이면,

String 은 같은 리터럴을 가지면 같은 주소값이다

str1 = str2

 

String str1 = new String("hello");
String str2 = new String("hello"); 이면,

new String 하면 다른 주소값을 갖지만

equals와 toString과 hashCode()는 override되어서 같은 값을 가지게 된다( 리터럴값으로 변환하게 되어있음)

str1 ≠  str2

str1.toString = str2.toString

str1.equals(new String str2)

str1.hashCode = str2.hashCode

System.identityHashCode(str1) ≠ System.identityHashCode(str2)

 

1. 단일문자 추출 => 문자열.charAt(int index) : char
2. 문자열합치기 => 문자열.concat(String str) : String 
3. 문자열 길이 => 문자열.length() : int
4. 인덱스부터 끝까지 추출 => 문자열.substring(int beginindex) : String
   인덱스부터 인덱스까지 추출 => 문자열.substring(int beginindex, int endindex) : String
5. 단일문자 변경 => 문자열.replace(char old, char new) : String
6. 앞뒤 공백제거 => 문자열.trim() : String
7. 대문자로 변경 => 문자열.toUpperCase() : String
   소문자로 변경 => 문자열.toLowerCase() : String
8. 배열로 담은 후 배열을 반환 => 문자열.toCharArray() : char[]

 

 

# 문자열 합치기

문자열에 문자열을 추가할 수도 있다. 그럴 경우 새롭게 heap메모리에 새로운 공간을 할당하고 새롭게 집어넣는다. 

이를 막기위해 임시공간을 만들어 한번에 처리해주는 'StringBuffer'가 있지만,

여기서 동시 제어기능(Thread Safe)기능을 뺀 'StringBulder'를 더 많이 사용한다. 

public void method5() {
	StringBuilder sb = new StringBuilder();
    
    sb.append("Hello");
    sb.append(" World");
    System.out.println(sb);
}

 

# 문자열 분리하기

방법1. 구분자를 제시해서 해당 문자열을 분리시키는 방법 => 배열이용

public void method6() {
	String str = "One,Two,Three,Four";
	String[] arr = str.split(",");
    
    for(int i = 0; i < arr.length; i++) {
    	System.out.println(arr[i]);
    }
}

for문을 다르게 쓸 수도 있다.

(String s라는 변수에 arr배열을 순차적으로 접근한다.)

	for(String s : arr) {
    	System.out.println(s);
    }

 

방법2. 분리된 각각의 문자열을 토큰으로 취급하는 방법 => 토큰이용

public void method7() {
	StringTokenizer stn = new StringTokenizer(str, ",");
    System.out.println("분리된 문자열의 개수 : " + stn.countTokens());
    
    while(stn.hasMoreTokens()) {
    	System.out.println(stn.nextToken());
    }
}

countTokens() : 분리된 문자열의 개수를 알려주는 메소드

hasMoreTokens() : 토큰이 남아있다면 true, 토큰이 하나도 남아있지않다면 false

nextToken() : 다음 토큰을 지정

 

3. Wrapper Class : 기본자료형을 객체로 포장해주는 클래스

(기본자료형 <-> Wrapper 클래스)
boolean <->  boolean
char  <-> Character
byte <->  Byte
short <->  Short
int  <-> Integer
long <->  Long
float <->  Float
double <->  Double

 

public void method8() {
    
    Integer i1 = 10;
    Integer i2 = 15;
    System.out.println(i1.equals(i2)); 
    System.out.println(i1.compareTo(i2)); 
    
}

equals는 주소값을 비교하고, true/false 값을 반환해준다.

 

intValue를 이용하여 문자열을 Integer타입으로 변환해보자.

	Integet i3 = new Integer("123");
	int num = i3.intValue();
	System.out.println(num);

String형을 기본자료형으로 바꿀 수 있다. (parse)

 	String str1 = "10";
	String str2 = "15.0";
	System.out.println(str1 + str2); 
    
	int i = Integer.parseInt(str1);
	double d = Double.parseDouble(str2);
	System.out.println(i + d);

 

기본자료형을 String형으로 바꿀 수 있다. (valueOf)

	String strI = String.valueOf(10);
	String strD = String.valueOf(15.0);
	System.out.println(strI + strD);

 

 

13-2. I.O(Input/Output)

간단하게 파일을 만들어 볼 수 있다.

java.io 패키지의 File 클래스를 이용한다.

package com.kh.chap01_file;

import java.io.File;
import java.io.IOException;

public class FileRun {

	public static void main(String[] args) {
    	
		try {
		File folder = new File("ff");
		folder.mkdir();
		File file = new File("ff\\test.txt");
		file.createNewFile();
		} catch(IOException e) {
        	e.printStackTrace();
        }
	}
}

File이란 클래스 안의 객체 중 createNewFile(파일이름/경로)이라는 메소드를 이용해서 파일을 생성해준다. 이때 CheckedException이 발생할 수 있으므로 예외처리를 해주어야 한다. 또한, mkdir() 메소드를 이용하여 파일도 생성할 수 있다.

+ 다른 메소드

isFile() : boolean타입. 파일이니?

getName() : String타입. 파일이름?

getParent() : String타입. 상위폴더?

length() : long타입. 파일크기?

getAbsolutePath() : String타입. 절대경로?

 

I.O란, 프로그램 상의 데이터를 외부매체(모니터, 스피커, "파일")로 출력하거나, 입력장치(키보드, 마우스, 카메라, 마이크, "파일")로 입력받는 과정이다.

I.O를 진행하려면 프로그램과 외부매체와의 통로(Stream)을 만들어야 한다.

 

#바이트 스트림 (1Byte)

1. 출력 (Output) 

public void FileSave() {

	FileOutputStream fout = null;
    try {
    	fout = new FileOutputStream("a_byte.txt");
        fout.write(97);
        fout.write('A');
    } catch(FileNotFoundException e) {
    	e.printStackTrace();
    } catch(IOException e) {
    	e.printStackTrace();
    } fianlly {
    	try {
        	if(fout != null) {
            	fout.close();
            }
        } catch(IOException e) {
        	e.printStackTrace();
        }
    }
}

FileOutputStream() : 파일과 연결되는 통로를 만든다. (매개변수에 true를 넣으면 이어서 작성) 

write() 를 이용하여 데이터를 출력할 수 있다. 한글은 2Byte이므로 깨진다.

Stream을 다 사용하고 나면 Close() 를 꼭 해줘야 하는데,

예외가 발생을 했던 안했던 무조건 실행해야 하므로 finally 를 이용하여 작성한다. (예외가 생기면 무시하고 예외를 찾으러 가기 때문)

 

2. 입력 (Input)

public void fileRead() {

	FileInputStream fis = null;
    try {
    	fis = new FileInputStream("a_byte.txt");
        
        int value = 0;
        while((value = fis.read()) != -1) {
        	System.out.println(value);
        }
        } catch(FileNotFoundException e) {
        	e.printStackTrace();
        } catch(IOException e) {
        	e.printStackTrace();
        } finally {
        	try {
            	if(fis != null) {
                	fis.close();
                }
            } catch(IOException e) {
            	e.printStackTrace();
            }
        }
    
}

FileInputStream() : 파일과 연결되는 통로를 만든다.

read() 를 이용하여 데이터를 입력받는다. 1Byte 단위로 하나씩 읽는다.

만약 다 읽으면 값이 -1이 출력된다. 그러므로 -1이 입력되기전까지만 입력받는다.

Stream을 다 쓰면 Close() 해준다.

 

'JAVA > JAVA수업' 카테고리의 다른 글

#15. Set  (0) 2023.07.21
#14. I.O(Writer/Reader), buffer, Collection, List  (0) 2023.07.20
#12. 추상클래스, 인터페이스, 예외처리  (0) 2023.07.18
#11. 상속, 다형성  (0) 2023.07.17
#10. 오버로딩, static, 객체배열, list  (0) 2023.07.14