Java 기초

 

Interface

  • 자바에서의 interface 개념도

  • 클래스 개념에서 필수인 생성자가 인터페이스에서는 사용 불가
  • 클래스를 다중상속하면 메소드 사용시 모호성이 발생할 수 있어서 인터페이스를 사용한다

    class Animal { 
        public void cry() {
            System.out.println("짖기!");
        }
    }
    
    class Cat extends Animal {
        public void cry() {
            System.out.println("냐옹냐옹!");
        }
    }
    
    class Dog extends Animal {
        public void cry() {
            System.out.println("멍멍!");
        }
    }
    
    class MyPet extends Cat, Dog {}
    
    public class Polymorphism {
        public static void main(String[] args) {
            MyPet p = new MyPet();
            p.cry();
        }
    }
    
  • 위 코드에서 MyPet 객체가 어떤 부모 클래스의 cry()를 사용해야할지 모호해짐
  • interface를 사용하면 그 안에 들어있는 추상함수를 사용하는 클래스에서 직접 정의해줘야 하므로 모호성이 발생하지 않는다. 또한 인터페이스 끼리는 인터페이스 끼리만 상속이 가능하다.

    interface Animal { public abstract void cry(); }
    
    interface Cat extends Animal { public abstract void cry(); }        // 인터페이스가 인터페이스를 상속한 모습
    interface Dog extends Animal { public abstract void cry(); }
    
    class MyPet implements Cat, Dog {
        public void cry() {
            System.out.println("멍멍! 냐옹냐옹!");
        }
    }
    
    
    public class Polymorphism05 {
        public static void main(String[] args) {
            MyPet p = new MyPet();
            p.cry();
        }
    }
    

익명 클래스란?

  • 이름이 없는 클래스
    • 클래스의 존재 목적은 객체지향적 성격을 가지고 코드의 중복, 복잡해짐을 최소한으로 하기 위함
    • 특정 클래스의 객체지향적 특성은 활용하겠지만(상속, 인터페이스 관계등은 유지) 그 기능은 일회성이므로 내가 정하겠다
      • 안드로이드의 button listener가 대표적인 예시임. 버튼의 이벤트들은 각 버튼마다 역할이 부여되는 것이므로 재사용 가능성이 매우 적음. 이럴때 익명 클래스 사용
public class Test
{
    private int num = 1;
    public int getNum(){
        return this.num;
    }
    
    public void setNum(int num){
        this.num = num;
    }
}


public class App {
    public static void main(String[] args) throws Exception {
        Test t1 = new Test(){
            private int num = 1000;

            @Override
            public int getNum() {
                return 50000;
            };
        };

        System.out.println(t1.getNum());
    }
}
  • Test 클래스를 new 연산자를 통해 인스턴스화 하지만 override를 통해 기존 틀에서 벗어난 인스턴스가 만들어짐. 기존에 없던 새로운 클래스를 통해 인스턴스를 생성해냈고 그 클래스의 이름은 없다라고 생각하면 편함