

✅ 문자열을 파일에 출력하는 것은 JAVA I/O 한 예이다. 이를 위해서는 'PrintWriter' 클래스를 사용할수있다. 시작하기에 앞서 인터페이스 및 클래스 상속 계층도를 살펴보자면.

▶printwriter hierarchy
더 자세한 사항은 Oracle document 에 All package 계층도를 계시하였으니
https://docs.oracle.com/javase%2F7%2Fdocs%2Fapi%2F%2F/java/io/package-tree.html 에서 참고하면 좋을것이다.
(Class) Object - javaLang
-최상의 패키지 중하나로 이 패키지에는 Java 언어의 핵심 클래스들이 포함되어 있다. 따라서 java.lang 패키지에 속한 클래스들은 모든 Java 프로그램에서 기본적으로 사용.└((Abstract)Class) Writer - java.io
"Writer" 클래스는 Java I/O에서 문자를 쓰는데 사용되는 추상 클래스이다. 따라서 이 클래스를 상속하여 실제로 파일이나 다른 출력 대상에 문자를 쓰는 클래스를 작성할 수 있다.
└(Class)PrintWriter - java.io
→ WrappingWriter - java.io.ProxyingConsole
→ new PrintWriter(){...} - jdk.internal.io.jdkConsolempl.JdkConsolelmpl(...)
→new PrintWriter() {...} - jdk.javadoc.internal.tool.JavadocLog.createPrintWriter(...)
duck-ach
▶ 클래스 계층도에서 Abstract 클래스와 Interface 와는 다르다.
Abstract 클래스와 인터페이스는 Java에서 둘 다 다형성을 구현하는데 사용되는 중요한 개념이지만, 그들 간에는 몇 가지 중요한 차이가 있습니다.
구현:
1️⃣ Abstract 클래스: Abstract 클래스는 일부 메서드를 구현할 수 있고, 추상 메서드를 포함할 수 있습니다. 하지만 추상 클래스는 인스턴스화될 수 없으며, 추상 메서드를 하나 이상 포함하고 있어야 합니다.
인터페이스: 인터페이스는 추상 메서드와 상수를 정의할 수 있습니다. 하지만 인터페이스 내의 모든 메서드는 구현되지 않고 선언만 되어 있습니다. 클래스에서 인터페이스를 구현하려면 인터페이스에서 선언된 모든 메서드를 구현해야 합니다.
다중 상속:2️⃣ Abstract 클래스: Java에서는 단일 상속만 허용됩니다. 즉, Abstract 클래스는 다른 클래스를 상속하면서 동시에 Abstract 클래스를 상속할 수 없습니다.
인터페이스: 인터페이스는 다중 상속을 지원합니다. 클래스가 여러 개의 인터페이스를 구현할 수 있습니다.
상태:3️⃣Abstract 클래스: Abstract 클래스는 인스턴스 변수를 가질 수 있으며, 이 변수들은 하위 클래스에게 상속됩니다.
인터페이스: 인터페이스는 상태(인스턴스 변수)를 가질 수 없습니다. 오직 메서드의 시그니처만을 정의할 뿐입니다.
사용:4️⃣Abstract 클래스: Abstract 클래스는 부분적으로 구현된 클래스를 나타내며, 공통된 코드를 재사용하기 위해 사용됩니다.
1️⃣ 인터페이스: 인터페이스는 클래스 간에 계약을 정의하고, 다른 클래스에서 구현할 표준을 제공합니다. 다형성을 활용하여 객체들을 동일한 방식으로 처리할 수 있게 해줍니다.
🔆 요약하면, Abstract 클래스는 부분적으로 구현된 클래스이고, 인터페이스는 구현이 없는 메서드의 집합입니다. Abstract 클래스는 상태와 메서드를 포함할 수 있으며, 다중 상속을 지원하지 않지만, 인터페이스는 다중 상속을 지원하고 상태를 가질 수 없습니다.
abstract class Animal { // 상태(필드) String name; // 생성자 Animal(String name) { this.name = name; } // 구현된 메서드 void eat() { System.out.println(name + " is eating."); } // 추상 메서드 (하위 클래스에서 구현해야 함) abstract void sound(); } class Dog extends Animal { Dog(String name) { super(name); } // 추상 메서드 구현 @Override void sound() { System.out.println(name + " barks."); } } class Main { public static void main(String[] args) { Dog dog = new Dog("Buddy"); dog.eat(); // 상속받은 메서드 사용 dog.sound(); // 구현된 sound 메서드 사용 } }
interface Animal { // 상수 (상태를 가질 수 없음) String category = "Mammal"; // 메서드 (구현이 없고, 반드시 구현해야 함) void sound(); } interface Pet { // 상수 (상태를 가질 수 없음) String type = "Domestic"; // 메서드 (구현이 없고, 반드시 구현해야 함) void play(); } class Dog implements Animal, Pet { @Override public void sound() { System.out.println("Bark"); } @Override public void play() { System.out.println("Playing fetch"); } } class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.sound(); // 인터페이스에서 구현한 메서드 호출 dog.play(); // 또 다른 인터페이스에서 구현한 메서드 호출 } }
▶상위 클래스가 하위 모듈을 제공할때에 인터페이스와 추상클래스간 메소드 오버라이딩 방식에도 차이가있는가?
✅Abstract 클래스의 경우:
하위 클래스가 Abstract 클래스를 상속할 때, 하위 클래스는 반드시 Abstract 클래스에서 선언된 추상 메서드를 오버라이딩해야 합니다.
Abstract 클래스에서 구현된 메서드는 하위 클래스에서 오버라이딩을 선택할 수 있습니다. 오버라이딩을 선택하지 않으면 상위 클래스의 메서드가 사용됩니다.
Abstract 클래스에서 선언된 메서드가 하위 클래스에서 반드시 구현되어야 하는 경우, 해당 메서드를 추상으로 선언해야 합니다.✅인터페이스의 경우:
하위 클래스가 인터페이스를 구현할 때, 해당 인터페이스에서 선언된 모든 메서드를 반드시 구현해야 합니다.
인터페이스는 오직 메서드의 시그니처만을 정의하고 있으므로, 구현체는 인터페이스에서 선언된 모든 메서드의 내용을 제공해야 합니다.
인터페이스에서 선언된 메서드는 하위 클래스에서 반드시 오버라이딩되어야 하며, 구현체가 제공되어야 합니다.
요약하면, Abstract 클래스에서는 하위 클래스가 추상 메서드를 오버라이딩하거나 선택적으로 상속된 메서드를 재정의할 수 있지만, 인터페이스에서는 구현체가 반드시 인터페이스에서 선언된 모든 메서드를 구현해야 합니다.
①.직렬화
②.java ser 파일
③.JAVA 하이픈 제거에 대하 학습하도록 하겠다.