본문 바로가기
TIL

241007-TIL 인터페이스, 입출력

by 민경현(John) 2024. 10. 7.

인터페이스

- 다중 상속처럼 사용할 수 있는 기능

- 추상 메소드와 상수만으로 이루어짐

접근제어자 interface 인터페이스이름{
    public static final 타임 상수이름 = 값; 
    public abstract 반환타입 메소드이름(매개변수);
    ...
		
}

class 클래스이름 implements 인터페이스이름 {
    ...
}
  • 내부의 모든 메서드는 public abstract 로 정의
  • 내부의 모든 필드는 public static final 상수

- 동시 사용으로 다중 상속과 같은 효과를 낼 수 있다.

- 인터페이스 끼리는 다중 상속이 가능하다.

접근제어자 interface 인터페이스이름 {
		...
}

접근제어자 class 클래스이름 {
		...
}

class 클래스이름 extends 클래스이름 implements 인터페이스이름1, 인터페이스이름2 {
		...
}

인터페이스 vs 추상클래스

  추상 클래스 인터페이스
사용 키워드 abstract interface
사용 가능 변수 제한 없음 static final
사용 가능 접근자 제한 없음 public
사용 가능 메소드 제한 없음 abstract, default, static, private method
상속 키워드 extends implements
다중 상속 가능 여부 불가능 가능

 

공통점

  1. 추상 메소드를 가지고 있어야 한다.
  2. 인스턴스화 할 수 없다
  3. 인터페이스 혹은 추상 클래스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다.
  4. 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현해야 한다.

추상클래스를 사용해야 하는 경우

  • 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많아 중복 멤버 통합을 할 때
  • 멤버에 public 이외의 접근자 선언이 필요한 경우
  • non-static, non-final 필드 선언이 필요한 경우
  • 요구사항과 함께 구현 세부 정보의 일부 기능만 지정했을 때
  • 하위 클래스가 오버라이드 하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
  • 상속 관계를 타고 올라갔을 때 같은 부모 클래스가 가진 기능들을 구현해야할 경우 사용

인터페이스를 사용해야 하는 경우

  • 어플리케이션의 기능을 정의해야 하지만 그 구현 방식이나 대상에 대해 추상화 할 때
  • 서로 관련성이 없는 클래스들을 묶어 주고 싶을때
  • 다중 상속을 통한 추상화 설계를 해야 할때
  • 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우
  • 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용

참고

 

☕ 인터페이스 vs 추상클래스 용도 차이점 - 완벽 이해

인터페이스 vs 추상클래스 비교 이 글을 찾아보는 독자분들은 아마도 이미 인터페이스와 추상클래스 개념을 학습한 뒤에 이 둘에 대하여 차이의 모호함 때문에 방문 했겠지만, 그래도 다시한번

inpa.tistory.com

 

입출력

콘솔

입출력 방식 중 콘솔 입력 방법

System.in.read();
InputStreamReader readr = new InputStreamReader(System.in);
BufferedReader br =  new BufferedReader(new InputStreamReader(System.in)); 
Scanner sc = new Scanner(System.in);
  • Systme.in.read(); 의 경우 System.in.read(new byte[System.in.available()]); 을 사용하여 남아있는 데이터를 소진해주어야 함.
  • InputStreamReader : 읽고자 하는 갯수만큼의 배열을 만들어 주어야 함.
  • Scanner의 입력 메소드
    • sc.nextByte() : byte 형 입력 및 리턴
    • sc.nextShort() : short 형 입력 및 리턴
    • sc.nextInt() : int 형 입력 및 리턴
    • sc.nextLong() : Long 형 입력 및 리턴
    • sc.nextFloat() : float 형 입력 및 리턴
    • sc.nextDouble() : double 형 입력 및 리턴
    • sc.nextBoolean() : boolean 형 입력 및 리턴
    • sc.next() : String 형 입력 및 리턴 (공백을 기준으로 한 단어를 읽음)
    • sc.nextLine() : String 형 입력 및 리턴 (개행을 기준으로 한 줄을 읽음)

입출력 방식 중 콘솔 출력 방법

System.out.println(...);// 엔터키 있음
System.out.print(...);// 엔터키 없음
System.out.printf(”출력 서식”, 출력할 내용); // 포멧을 이용한 출력
  • printf() - 지시자
    • %b : boolean 형식으로 출력
    • %d : 10진수(decimal) 형식으로 출력
    • %o : 8진수(octal) 형식으로 출력
    • %x : 16진수(hexa-decimal) 형식으로 출력
    • %f : 부동 소수점 형식으로 출력
    • %e : 지수 형식으로 출력
    • %c : 문자(character) 형식으로 출력
    • %s : String 형식으로 출력
  • printf() - 플래그
    • “ - ” : 왼쪽으로 정렬
    • “+” : 부호출력
    • “ 0 ” : 남는 자리를 0으로 채움
    • “ , ” : 일정 자리수마다 구분문자 표시
    • “ # ” : 8진수, 16진수 표시시 접두사 포함 등 출력형태 보완
    • “\n” : 줄 바꿈
System.out.printf("%5d\\n", 123); // "  123"
System.out.printf("%-5d\\n", 123); // "123  "
System.out.printf("%5d\\n", 1234); // " 1234"
System.out.printf("%5d\\n", 123); // "12345"

System.out.printf("%.2f\\n", 1.12345f); // "1.12"
System.out.printf("%.2f\\n", 1.12645f); // "1.13"

 

파일

입출력 방식 중 파일로부터 출력 하는 방법

BufferedReader br = new BufferedReader(new FileReader("읽어올 파일명"));

while(true){
		Stirng line = br.readLine();
		
		if(line == null){
				break;
		}
		System.out.println(line);
}
br.close();

입출력 방식 중 파일로 출력하는 방법

FileOutputStream ...
FileWriter fw = new FileWriter("파일명");
PrintWriter pw = new PrinterWriter("파일명");

fw.close();
pw.close();
  • FileWriter로 이어 쓰기 하고 싶다면 FileWriter fw = new FileWriter("파일 명", true); 로 작성하면 됨.
  • PrintWriter로 이어 쓰고 싶다면 PrintWriter pw = new PrinterWriter("new FileWriter("파일 명", true)");처럼 FileWriter를 넣어줘야함.
  • .close()로 종료해주어야 함.