-
자바기초개념 다시잡기 자바의정석 - 인터페이스/내부클래스/익명클래스자바 기초 2021. 7. 29. 21:05
남궁성님의 자바의 정석 - 기초편 유투브 참조!
1. 인터페이스
- 추상메서드의 집합
- 추상화와 비슷하게 구현된것이 없는 설계도
- 인터페이스는 인터페이스끼리만 상속 됨 (Object가 최고 부모가 아님)
- 또한 다중 상속이 가능
- 인터페이스를 implements시에 일부만 구현하게되면 'abstract' 붙여야 함
추상화 vs 인터페이스 차이
- 추상화 -> 일반클래스에 추상메서드를 가지고 있는 것
- 인터페이스 -> 아무것도없이 추상메서드만 들고 있는 것
상수 + 추상메서드만 가능 인터페이스도 추상화처럼 추상메서드를 완성하는것이 목적 2. 인터페이스와 다형성
- 인터페이스도 인터페이스를 받는 클래스의 부모처럼 사용 가능
- 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체에만 가능
Fightable인터페이스를 구현한 클래스의 인스턴스들만 가능 - 인터페이스를 메소드의 리턴타입으로 지정 가능, 즉 인터페이스를 반환타입으로 두면 리턴은 반드시 '인터페이스를 구현한 객체'를 반환해야함
abstract class Unit { int x,y; abstract void move(int x, int y); void stop () { System.out.println("Stopping!"); } } interface Fightable { void move(int x, int y); void attack(Fightable f); } class Fighter extends Unit implements Fightable { @Override public void move(int x, int y) { System.out.println("Moving to ["+x+","+y+"]"); } @Override public void attack(Fightable f) { System.out.println("Attacking "+f); } @Override void stop() { super.stop(); } } public class Ex_4 { public static void main(String[] args) { Fighter f = new Fighter(); f.move(10, 20); f.attack(f); f.stop(); } } Moving to [10,20] Attacking Ch6.Fighter@762efe5d Stopping!
3. 인터페이스의 장점 및 핵심 개념
- 두 객체간의 '연결,대화,소통'을 돕는 중간 역할
- 선언(설계)과 구현을 분리 시킬 수 있다. (유연하고 변경에 유리하다)
인터페이스 덕에 B가 바껴도 A는 수정할 필요가 없다 - 개발 시간 단축 가능 (인터페이스를 간단히 만들어놓고 나머지 부분이 인터페이스를 받아 개발 가능)
- 표준화가 가능하다 (JDBC)
- 서로 관계 없는 클래스들을 연결 지을 수 있다
예로 수리하는 메소드가 필요한데 'Marine'은 사람이라서 제외를 시켜야하지만 각각 다른클래스들의 로봇을 수리하려면 오버로딩으로 처리가 가능하지만 오버로딩시에는 각각의 유닛만큼 만들어야하는 불편함이 있다.
또한 GroundUnit / AirUnit으로 매개변수를 받으면 Ground는 Air로, Air는 Ground로 못가고 또한 사람이라는 Marine 유닛도 수리에 들어오기때문에 맞지 않다. 그래서 필요한게 인터페이스이다.
사람까지 들어오는 문제 및 Air 변수들이 못가는 문제! 인터페이스로 처리하면 다중상속처럼 각각에 필요한 클래스들만 연결지어서 사용 가능하다!
* JDK 1.8부터는 인터페이스에 디폴트 메서드, static메서드 추가가 가능하다
4. 내부 클래스
- 클래스 안의 클래스를 넣는 것
- 각각의 클래스에서는 각각의 멤버객체로 접근이 안되지만 내부클래스로 넣으면 내부클래스에서 외부 클래스의 멤버들에게 쉽게 접근이 가능하다.
- 캡슐화의 개념중 하나로 코드의 복잡성을 줄일 수 있다
- 원래클래스는 default/public 밖에 못쓰지만 내부클래스는 모두 가능
(단 static을 쓰려면 쓰는곳에 반드시 static선언)
class A{ //A의 클래스에서 다른 클래스를 사용하려면 아래와 같다 B b = new B(); } class B{ } 하지만 다른클래스에서 다른 클래스의 멤버객체를 쓰려면? class A{ int i=100; //A의 클래스에서 다른 클래스를 사용하려면 아래와 같다 B b = new B(); } class B{ void method() { A a = new A(); System.out.println(a.i); } } public static void main(String[] args) { B b = new B(); b.method(); } } --> 객체를 계속해서 생성하는 번거로움과 길어지는 코드.... 그럼 내부클래스로 처리해보자! class A{ int i=100; B b = new B(); class B{ // B클래스는 A의 내부 클래스가 됨 void method() { System.out.println(i); <- 바로 접근 가능! } } } 하지만 B를 사용하려면 A를 먼저 선언 해야 가능하다. public class Ex_5 { public static void main(String[] args) { A a = new A(); a.b.method(); } }
5. 익명클래스
- 이름이 없고 일회용 클래스, 정의와 생성을 동시에 한다. (조상클래스 이름 또는 구현인터페이스 이름으로 선언)
EventHandler 는 단 한번만 쓰기때문에 익명클래스로 처리한다. 클래스 이름 대신 부모이름으로 선언되고 그 기능이 들어간다. '자바 기초' 카테고리의 다른 글
자바기초개념 다시잡기 자바의정석 - 예외처리/컬렉션프레임/제네릭/쓰레드 (0) 2021.08.02 자바기초개념 다시잡기 자바의정석 - 연습문제 7장 (0) 2021.07.30 자바기초개념 다시잡기 자바의정석 - 상속/캡슐화/다형성/추상화 (0) 2021.07.29 자바기초개념 다시잡기 자바의정석 - 연습문제 6장 (0) 2021.07.26 자바기초개념 다시잡기 자바의정석 - 연습문제 5장 (0) 2021.07.24