안녕하세요! 쏘코입니다.

이번 포스팅에서는 조금 어려운 다형성에 대한 개념을 알아보고,

사용설명서 속의 인터페이스에 대해서 추가로 공부해보도록 하겠습니다.

 

목차


    0. 다형성

    다형성인스턴스를 만들 때 하나의 클래스가 다양한 얼굴을 갖게 하는 것입니다.

    아직은 무슨 이야기인지 이해가 잘 안가시죠?!

    이제 이 다형성을 코드로 확인하기 위해서 InterfaceApp.java 파일로 돌아가겠습니다.

     

    우리는 new를 통해 인스턴스를 만들 때 항상 new 뒤의 클래스명과 인스턴스의 데이터형을 같게 만들었습니다.

    ex) RealCal c = new RealCal();

    하지만 특정 경우에 모든 기능이 필요하지 않을 수 있습니다.

     

    현재 RealCal 는 Calculable과 Printable이라는 interface를 기반으로 완성된 클래스입니다.

    만약 사용자가 Printable이라는 인터페이스에 속한 메소드만 사용하게 하고 싶다면 어떻게 하면 될까요?

    인스턴스의 데이터형을 인터페이스의 이름으로 지정하면 됩니다.

    ex) Printable c = new RealCal();

    이렇게 만들면 c라는 인스턴스에서는 Printable에서 선언한 print 메소드는 사용할 수 있지만, Calculable에서 선언한 PI 변수와 sum 메소드는 사용할 수 없습니다.

     

    sum, PI는 에러가 발생!!

     

    즉, 인스턴스의 데이터형으로 인터페이스를 지정하면 똑같은 인터페이스를 구현하고 있는 클래스라면 어떤 것이 new 뒤에 와도 상관이 없다(호환성을 보장한다)는 이야기가 됩니다.

     

    interface Calculable{
    	double PI = 3.14; // 인터페이스에는 변수의 실제 값이 들어간다!
    	int sum(int v1, int v2);
    }
    
    interface Printable{ // 인터페이스의 이름은 대문자로 시작, 형용사 형태의 이름
    	void print();
    }
    
    class RealCal implements Calculable, Printable{ // 하나의 클래스에 여러 interface 구현 가능!
    	public int sum(int v1, int v2) {
    		return v1+v2;
    	}
    
    	public void print() {
    		System.out.println("This is RealCal!!");
    	}
    }
    
    class DummyCal implements Calculable{ // 인터페이스가 규제하고 있는 형태를 엄수해야만 정상적으로 동작
    	public int sum(int v1, int v2) {
    		return 3;
    	}
    }
    
    public class InterfaceApp {
    
    	public static void main(String[] args) {
    		// 더하기 기능이 있는 클래스를 만들어주세요.
    		Printable c = new RealCal();
    //		System.out.println(c.sum(2, 1)); // Error
    		c.print();
    //		System.out.println(c.PI); // Error
    	}
    
    }

    1. 사용설명서 속의 인터페이스

    인터페이스의 의미를 통해 대상을 잘 파악할 수 있는 방법에 대해 알아보도록 하겠습니다.

     

    아래의 FileWriter 클래스를 보면 우리가 지금까지 배웠던 내용들이 녹아있습니다.

    여기서 우리가 신경써야 하는 부분은 바로 close입니다.

    파일을 작성하기 위해서 한번 열었다면 사용 후에는 반드시 닫아주어야 합니다.

    그래야 다른 파일을 작성해야 할 때 꼬이지 않고 정상적으로 작성할 수 있습니다.

    이때 필요한 메소드가 바로 close 입니다.

     

     

    FileWriter 클래스를 오라클의 자바 docs에서 찾아보았습니다.

    아래 링크를 올려드립니다.

     

     

    FileWriter (Java SE 16 & JDK 16)

    All Implemented Interfaces: Closeable, Flushable, Appendable, AutoCloseable Writes text to character files using a default buffer size. Encoding from characters to bytes uses either a specified charset or the platform's default charset. Whether or not a fi

    docs.oracle.com

     

    이곳에서 FileWrite 클래스를 확인해보면 AutoCloseable이라는 인터페이스가 Implements 되었다고 나와있죠!

     

     

    이걸 눌러서 들어가보면 여러 정보들이 나오는데,

    먼저 쭉 아래로 내리면 AutoCloseable이 가지고 있는 메소드close()가 있다고 나옵니다.

    이 말은 AutoCloseable 인터페이스를 implements한 모든 클래스는 close()라는 메소드가 구현이 되어있다는 말과 같습니다.

     

     

    그리고 다시 조금 위로 올려보면 All Known Implementing Classes라는 칸이 있습니다.

    여기에는 이 인터페이스를 implements한 클래스들이 쫙 나옵니다.

    여기 적혀있는 클래스들은 전부 AutoCloseable이라는 인터페이스를 implements했기 때문에 모두 close()를 사용할 수 있다는 말이 됩니다.

     

     


    인터페이스를 모두 공부했습니다.

    지금 바로 적용하기는 어렵겠지만, 다른 사람이 인터페이스를 어떻게 사용하는 지 유심히 살펴보세요.

    언젠가 내가 만든 클래스가 커져서 특정 부분만 사용자에게 제공하고 싶다면, 혹은 다른 사람과 협업할 때 기능을 보다 명확하게 알려주고 싶다면 그 때 인터페이스를 사용하시면 됩니다.

     

    그렇다면 다음 포스팅부터는 예외처리에 대한 내용을 다뤄보도록 하겠습니다!

    오늘도 읽어주셔서 감사합니다 😁😁

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기