1. [제네릭 메서드] (days26 이어서)
- 메서드의 선언부에 제네릭 타입이 선언된 메서드(ex. Collections.sort() )
- 선언 위치 : 리턴 자료형 앞에 선언
[접근지정자] [기타제어자] <T> 리턴자료형 메서드명([매개변수...]){
[return 리턴값];
}
- 제네릭 타입이 다른 것만으로는 오버로딩이 성립되지 않는다.
class Juicer{
static Juice makeJuice(FruitBox<Apple> box) {
return new Juice();
}
// 에러메시지 : Erasure of method makeJuice(FruitBox<Grape>) is the same as another method in type Juicer
// 제네릭 타입이 다른 것만으로는 오버로딩이 성립되지 않는다.
static Juice makeJuice(FruitBox<Grape> box) {
return new Juice();
}
} // class
코드 예제)
아래 코드와 같이 Juicer 클래스 안에 makeJuice 메서드를 Apple 타입을 지정해주면, main() 메서드 안에서 appleJuice는 만들 수 있지만, Grape 타입의 주스는 만들 수 없다. 이 문제를 와일드카드와 제네릭 메세드를 이용해서 해결할 수 있다.
// Juicer 클래스
static Juice makeJuice(FruitBox<Apple> box) {
return new Juice();
}
// main 메서드
FruitBox<Apple> appleBox = new FruitBox();
Juice appleJuice = Juicer.makeJuice(appleBox);
<제네릭 메서드, 와일드 카드 사용한 코드>
// Juicer 클래스 내 메서드
// 와일드카드를 사용하여 모든 과일 주스를 만들 수 있는 메서드 선언
static Juice makeJuice(FruitBox<? extends Fruit> box) {
return new Juice();
}
// 위의 와일드 카드를 사용한 메서드를 [제네릭 메서드]로 선언할 수 있다. -> 위의 코딩과 동일한 코딩
static<T extends Fruit> Juice makeJuice(FruitBox<T> box) {
return new Juice();
}
과일, 과일상자, 쥬스 클래스)

Juicer 클래스)

main() 메서드)

2. 열거형(enums)
1) 열거형이란?
- 상수의 나열(열거)
- 서로 관련된 상수를 편리하게 선언하고 사용하기 위한 것
2) 열거형 선언 형식
- enum 열거형이름 {상수명, 상수명, 상수명, 상수명 };
3) 열거형 사용 방법
- 열거형이름.상수명
4) 열거형의 조상은 java.lang.Enum 클래스
5) 열거형을 사용하는 이유?
- 개발은 주로 팀작업, 팀작업시 사람마다 다 다르게 코딩을 한다.
아래와 같이 다 다르게 하는 걸 방지하기 위해서 표준화 필요
-> 표준화를 하기 위한 기능이 '열거형'(JDK 1.5 기능 추가)
ex)
int gender = 1/0
boolean gender = t/f
char gender = 'm'/'f'
String gender ="남자"/"여자"
[Enum클래스에 정의된 메서드]
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 Class 객체를 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 열거형 상수가 정의된 순서를 반환(0부터 시작) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환 |
열거형을 사용하기 전 코드)


열거형 사용 코드)
아래와 같이 열거형 파일을 따로 생성할 수도 있고,

파일을 생성하지 않고 같은 java 파일 안에서 main() 메서드 밖에 생성할 수 있다.

전체 코드)

[열거형 활용하는 예제]
열거형)

main() 메서드)

Student 클래스)
class Student{
// fields
private int no, kor, eng, mat, tot, rank;
private String name;
private double avg;
// 디폴트 생성자
public Student() {
super();
}
// 생성자
public Student(int no, String name, int kor, int eng, int mat, int tot, double avg, int rank) {
super();
this.no = no;
this.kor = kor;
this.eng = eng;
this.mat = mat;
this.tot = tot;
this.rank = rank;
this.name = name;
this.avg = avg;
}
// getter, setter
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
public int getTot() {
return tot;
}
public void setTot(int tot) {
this.tot = tot;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getAvg() {
return avg;
}
public void setAvg(double avg) {
this.avg = avg;
}
@Override
public String toString() {
return "Student [no=" + no + ", name=" + name + ", kor=" + kor + ", eng=" + eng + ", mat=" + mat +
", tot=" + tot + ", avg=" + avg + ", rank=" + rank + "]"; }
} // Student
3. 애너테이션(annotation) == 어노테이션
- 프로그램의 소스 코드 안에 [다른 프로그램]을 위한 정보를 미리 약속된 형식으로 포함시키기 위한 것(알려주기 위한 것)
- 사전적 의미 ? 주석, 메모
- 소스코드의 주석(/** */)에 소스코드에 대한 정보를 저장
- 소스코드의 주석으로부터 HTML 설명 파일을 생성할 수 있다.( javadoc.exe로 인해)

[표준 애너테이션]

- '*' 가 붙은 것은 메타 애너테이션으로 애너테이션을 위한 애너테이션이다. 즉, 애너테이션의 적용대상(target)이나 유지기간(retention)등을 지정하는데 사용한다.
애너테이션 사용 예)



3. 입출력(I/O) - 간단한 개념 정리
1. 자바의 입출력 == Input / Output == I/O
2. 입출력이란?
- 컴퓨터 내/외부의 장치와 프로그램간의 데이터를 주고 받는 것

3. 자바의 모든 데이터 입출력은 스트림(Stream)이라는 개념으로 이루어진다.
4. 스트림(Stream)이란?
- 쉽게 음료수를 마실 때 사용하는 빨대와 같다.
- 스트림 객체는 단방향이기에 2가지 종류가 있다.
ㄱ. 읽기(입력용) 스트림
ㄴ. 쓰기(출력용) 스트림
- 스트림의 사전적 의미 : 흐르는 물
5. 자바의 스트림은 대상을 기준으로 2가지로 구분한다(대상 : 읽고 쓰는 대상)
ㄱ. 문자(텍스트) 스트림
- 읽기(입력용) 스트림 : 최상위 부모 인터페이스는 Reader 인터페이스
- 쓰기(출력용) 스트림 : 최상위 부모 인터페이스는 Writer 인터페이스
- 대부분 XXXReader, XXXWriter
ex) BufferedReader, InputStreamReader, FileReader, FileWriter
- 기본단위 : 유니코드 2바이트 == 1문자 == 2바이트(16비트)
- 한 문자, 문자열, 문자 배열 저장
ㄴ. 바이트 스트림
- 읽기(입력용) 스트림 : 최상위 부모 인터페이스는 InputStream 인터페이스
- 쓰기(출력용) 스트림 : 최상위 부모 인터페이스는 OutputStream 인터페이스
- 대부분 XXXInputStream, XXXOutputStream
ex) FileInputStream, FileOutputStream
- 기본단위 : 1바이트(8비트)
- 바이트, 바이트배열, 정수(int) [][][][00001111] -> [] 1바이트만 저장함
6. 보조스트림
- 어떤 스트림을 사용하기(I/O) 더 쉽도록 보조해주는 스트림
ex) BufferedReader 문자를 읽기위한 용도의 보조 스트림
BufferedReader br = new BufferedReader(new FileReader("a.txt"))
> new FileReader("a.txt") : a.txt 파일을 1문자(2바이트 단위)로 읽기 위한 스트림 == 읽기 문자 스트림
> br.readLine(); : 한 라인단위로 처리하기 쉬움
- 버퍼(Buffer) = 임시기억공간 > 보조스트림은 입출력 기능을 하는 것이 아니라 버퍼만 제공
4. 입출력(I/O) - File 클래스
- 파일(File)은 기본적이면서도 가장 많이 사용되는 입출력 대상
- 자바에서는 File 클래스를 사용해서 [파일]과 [디렉토리]를 다룰 수 있다.
[File의 생성자와 경로와 관련된 메서드]

[경로와 관련된 File의 멤버변수]

[File의 메서드]



간단한 예제)

예제1) Ex01.java을 읽어서 File f1 객체로 만들고 읽기 작업(Input)해서 화면 출력(Ouput)하기


예제2) Ex01.java 파일을 읽어서 복사하기(FileReader, FileWriter 사용)

fileCopy_textStream() 메서드 생성해서 코드 붙여넣기)

예제3) Ex01.java 파일을 읽어서 복사하기(FileReader, FileWriter + BufferedReader, BufferedWriter 사용)

예제4) 파일/폴더 유형, 이름, 마지막 수정된 날짜, 크기 가져오기

<콘솔창 결과>

목록을 돌려주는 메서드 2가지, 리턴값이 다르다.
- String[] : currDir.list();
- File[] : currDir.listFiles();
메서드 확인 예제) canRead(), canWrite(), canExecute(), isHidden()

예제5) 모든 자바파일을 검색해서 "Lotto" 문자열을 포함하는 파일만 찾아서 출력


[com.util 패키지안에 FileUtil 클래스 생성 및 사용해보기]
package com.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class FileUtil {
// 파일 절대경로를 매개변수 넣어주면 파일명을 반환하는 메서드 Car.java
public static String getFileName( String path ) {
String fileName;
int idx = path.lastIndexOf("\\");
fileName = path.substring(idx + 1);
return fileName;
}
// 확장자 반환 메서드 .java
public static String getExtension(String fileName) {
String ext = fileName.substring( fileName.lastIndexOf(".") ); // +1을 안해서 .java까지 돌려주는 중 java만 필요하면 +1하기
return ext;
}
// 오버라이딩....
public static String getExtension(File file) {
String ext = file.getName().substring( file.getName().lastIndexOf(".") );
return ext;
}
// 확장자를 제외한 순수한 파일명만 반환하는 메서드 Car
public static String getBaseName(String fileName) {
int endIndex = fileName.lastIndexOf(".");
String baseName = fileName.substring(0, fileName.lastIndexOf(".") );
return baseName;
}
// 삭제하는 메서드
private static void directoryDelete(File file) {
while(!file.delete()) {
// 하위 폴더 + 파일
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if(!files[i].delete()) {
directoryDelete(files[i]);
}else {
// System.out.printf("%s 삭제가 완료되었습니다.\n",files[i]);
} // if
} // for
} // method
// System.out.printf("%s 삭제가 완료되었습니다.\n",file);
} // method
} // class
사용 예시)

예제6) 폴더/파일 존재 유무 확인 후 생성하기

예제7) 폴더/파일 존재 유무 확인 후 삭제하기

- 하위폴더, 파일이 있는경우 delete() 메서드로 삭제 불가
예제8) 모든 하위 폴더/파일을 삭제를 한 후 삭제하고자 하는 폴더/파일 삭제

예제9) days27 패키지 안에 파일명이 Ex06 시작하는 파일만 찾기(다른 작업을 하기 위한)

- 이름변경 : renameTo()
익명클래스 사용하기)

예제10) 이미지 파일명 수정하기

<결과>

'TIL > Java' 카테고리의 다른 글
[SIST] Java_days29 (0) | 2022.03.31 |
---|---|
[SIST] Java_days28 (0) | 2022.03.29 |
[SIST] Java_days26 (0) | 2022.03.25 |
[SIST] Java_days25 (0) | 2022.03.24 |
[SIST] Java_days24 (0) | 2022.03.23 |