[SIST] Java_days27

2022. 3. 28. 20:35·TIL/Java
728x90
반응형

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) 이미지 파일명 수정하기

<결과>

728x90
반응형

'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
'TIL/Java' 카테고리의 다른 글
  • [SIST] Java_days29
  • [SIST] Java_days28
  • [SIST] Java_days26
  • [SIST] Java_days25
야리니
야리니
오늘보다 내일 더 성장하는 개발자가 되기 위한 야리니 블로그입니다 :)
    반응형
    250x250
  • 야리니
    야리니의 step by step
    야리니
  • 링크

    • GitHub
    • Linkedin
  • 전체
    오늘
    어제
    • 분류 전체보기 (478) N
      • TIL (379)
        • Java (97)
        • Kotlin (28)
        • JPA (16)
        • Spring (37)
        • Oracle (22)
        • JDBC (7)
        • Web(HTML, CSS, JS, jQuery) (90)
        • View Template (31)
        • AWS (7)
        • HTTP (7)
        • CS (5)
        • Linux, Unix (2)
        • Python (20)
      • Trouble Shooting(Error) (37)
      • Algorithm (15)
      • Git,GitHub (8)
      • Diary (24) N
      • 독서 (9)
      • Etc (6)
        • Mac (1)
        • 학원준비과정 (2)
  • 블로그 메뉴

    • 방명록
    • 태그
  • 공지사항

    • 안녕하세요 :)
  • 인기 글

  • 태그

    java기초
    CSS
    쌍용교육센터
    국비지원학원
    java
    백엔드 개발자
    Kotlin
    코틀린
    oracle
    HTML
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
야리니
[SIST] Java_days27
상단으로

티스토리툴바