모든 클래스는 Object라는 클래스를 기본적으로 상속받고 있다. extends Object를 쓰지 않아도 알아서 상속한다.
equals(), hashCode(), toString() 등의 메서드를 선언하지 않고 사용하는 것은 Object클래스에 이미 마련되었기 때문!
오버라이딩
상위 클래스에서 선언된 메서드를 상속받은 자식 클래스에서 재정의하는 것 ( = 덮어쓰기)
메서드의 이름, 반환형, 매개변수가 모두 동일해야 한다! = 단지 메서드 내부 로직이 바뀌는 것!
반드시 상속 관계에서만 사용 가능
어노테이션 표시를 해야 한다. (권장)
조상보다 더 큰 예외를 던질 수 없다.
class Car { void startEngine() { System.out.println("엔진이 켜졌습니다."); } }
class ElectricCar extends Car { // 오버라이딩: ElectricCar만의 방식으로 startEngine 메서드를 다시 정의합니다. @Override // 어노테이션 void startEngine() { System.out.println("전기 엔진이 조용히 켜졌습니다."); } }
public class Main { public static void main(String[] args) { ElectricCar myElectricCar = new ElectricCar(); myElectricCar.startEngine(); // "전기 엔진이 조용히 켜졌습니다." 출력 } }
//객체 생성 Movie movie1 = new Movie(1, "인터스텔라", "놀란", "스릴러", 300); Movie movie2 = new Movie(2, "마더", "봉준호", "공포", 100); Movie movie3 = new Movie(3, "아바타", "카메룬", "판타지", 92);
- nextLine(), nextInt(), nextTokenizer() 등 다양한 타입을 입력받을 수 있다.
- 멀티스레드 환경에서는 부적합
- 정규표현식 지
<BufferedReader 예시>
// 임포트 필요 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException;
public class BufferedReaderExample { public static void main(String[] args) { // 입력 받기 위한 변수 선언 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("Enter your name: "); String name = reader.readLine(); // 한 줄씩 입력 System.out.println("Hello, " + name + "!"); } catch (IOException e) { e.printStackTrace(); } } }
<Scanner 예시> // 임포트 필요 import java.util.Scanner;
public class ScannerExample { public static void main(String[] args) { // 입력 받기 위한 변수 선언 Scanner scanner = new Scanner(System.in); System.out.print("Enter your name: "); String name = scanner.nextLine(); System.out.println("Hello, " + name + "!"); } }
비교
특징
BufferedReader
Scanner
입력속도
더 빠름
비교적 느림
사용 용이성
복잡 (예외처리, 입력타입 문자열 뿐)
간편 (다양한 메서드 제공)
데이터 타입
String
다양 (int, double,String 등)
정규 표현식
지원 X
지원
멀티스레드 환경
멀티스레드에서 안전
멀티스레드에서 위험
속도차이가 나는 이유는 Buffer 사용 여부 차이, 정규표현식 적용 과정 여부 등 때문
여기서 Buffer란 데이터를 일시적으로 저장하는 메모리 공간을 말함.
BufferedReader는 8KB 크기의 버퍼에 저장되었다가 한 번에 전송하는 방식이고
Scanner는 입력에 바로바로 전송되는 방식
바로바로 전송되는 것보다 여러개 묶어서 보내는 것이 더 효율적이라는 원리.
결론
BufferedReader는 데이터 입력이 많거나 멀티스레드 환경, 빠르고 효율적인 처리가 필요할 때 사용
Scanner 다양한 데이터 타입을 입력할 수 있어 간편하므로 간단한 입력 처리인 경우에 용이