ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바기초개념 다시잡기 자바의정석 - 인터페이스/내부클래스/익명클래스
    자바 기초 2021. 7. 29. 21:05

    남궁성님의 자바의 정석 - 기초편 유투브 참조!

     

    1. 인터페이스

    • 추상메서드의 집합
    • 추상화와 비슷하게 구현된것이 없는 설계도
    • 인터페이스는 인터페이스끼리만 상속 됨 (Object가 최고 부모가 아님)
    • 또한 다중 상속이 가능
    • 인터페이스를 implements시에 일부만 구현하게되면 'abstract' 붙여야 함

    추상화 vs 인터페이스 차이

    1. 추상화 -> 일반클래스에 추상메서드를 가지고 있는 것
    2. 인터페이스 -> 아무것도없이 추상메서드만 들고 있는 것

    상수 + 추상메서드만 가능
    인터페이스도 추상화처럼 추상메서드를 완성하는것이 목적

    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 는 단 한번만 쓰기때문에 익명클래스로 처리한다. 
    클래스 이름 대신 부모이름으로 선언되고 그 기능이 들어간다.

Designed by Tistory.