Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

오버플로

[Java] Interface 본문

Java

[Java] Interface

NACO 2021. 7. 28. 20:45

오늘은 Java의 꽃,, Interface★

 

 Interface 

- 구현클래스(자식클래스)에서 반드시 구현해야 할(Override) 일(method)의 목록을 정의한 것

 

<구조>

  interface

    상수(Constact) (*final 선언)

    abstract method

    *default method

 

       *default method : JDK1.8에서부터 method body({})가 있는 default method가 추가됨

                             : interface 내에서 업무를 구현하여 제공할 필요가 있을 때 사용

                             : 이 method도 당연히 구현 클래스에서 객체화가 진행된 후 호출할 수 있음

 

<특징>

  - 다중 상속 효과 (여러 개의 인터페이스를 한 클래스에서 구현 가능)

  - 약결합을 구현하여 객체 간의 유연성 향상

  - 인터페이스는 생성자를 가질 수 없음 (객체화 불가)

  - 인터페이스끼리 상속 가능 (여러개 가능)

  - 인터페이스는 인스턴스 변수가 존재하지 않으므로 구현클래스의 *객체 크기에 영향을 주지 않음

       *객체 크기 : heap에 적재되는 인스턴수 변수의 총 크기 

  - FunctionalInterface : interface가 abstract method를 반드시 하나를 가져야 하는 경우

                           : 편하게 사용하기 위해 Lambda식이 JDK1.8에서부터 지원됨

 

<객체다형성>  

  - is a 관계의 객체화 가능 (부모가 자식의 주소를 저장하는 것)

    > 인터페이스는 객체화가 될 수 없지만, 구현한 클래스의 객체주소를 저장할 수 있음

    > 부모클래스, 부모인터페이스의 method를 호출하면 자식이 구현한 method가 최우선적으로 호출

       (부모쪽은 abstract method라서 원래 동작하지 않아야 하지만 객체다형성으로 가능해짐)

  - interface를 매개변수로 받는 method가 있을 때,

    이 인터페이스를 구현한 class들은 모두 interface를 parameter로 하는 곳에 할당 가능함

    > 구현한 클래스의 객체명으로 할당함

    > 어느 클래스를 할당 하냐에 따라 값이 다 다르게 나올 수 있음 (구현 내용이 다 다를 수 있으니까)

    ★ 원 method 생성자의 입장에서는 부모의 기능만 잘 알고 있으면

        그것을 어떻게 구현했는지

        상세 내용을 알지 않고도

        부모의 이름으로 다양한 기능들을 호출할 수 있게 됨

 

<구현 방법>  

  - 인터페이스 생성 문법)

     접근지정자 interface 인터페이스명 [extends 부모인터페이스명,,,] { }

     > 접근지정자 : public – 패키지 외부에서 접근 가능, default(package) – 패키지 내부만 가능

     > 인터페이스명은 낙타체로 작성 (첫 글자 대문자!)

 

  - 인터페이스를 클래스에서 구현할 때)

     접근지정자 class 클래스명 [extends 부모클래스명] [implements 구현인터페이스명,,]

 

  - abstract method 문법) – abstract 생략 가능 / body({}) X

     1) abstract 생략 : 접근지정자 반환형 method명(매개변수,,,);

     2) abstract 명시 : 접근지정자 abstract 반환형 method명(매개변수,,,);

      > 접근지정자 : public, protected, default

 

  - default method 문법) – body O

    접근지정자 default 반환형 method명(매개변수,,,)  { 업무 구현 };

    > 접근지정자 : public, protected, default


# 오늘의 코딩 #

package test;

/**
 * 날기 위한 일의 목록 정의
 * 추진력, 양력이 필요
 * @author user
 */
public interface Fly {

	/**
	 * 추진력
	 * @return
	 */
	public String drivingForce();
	
	/**
	 * 양력
	 * @return
	 */
	public String upwardForce();
	
}//interface

- 날기 위한 간단한 interface를 작성해보았다. 모두 abstract method

 

package test;

/**
 * Fly interface를 구현하고 사용할 class
 * @author user
 */
 
public class Superman implements Fly {
	String name = "";

	public Superman() {
		name = "Clark";
	}// Superman

	/**
	 * interface의 abstract method 구현<br>
	 * 추진력<br>
	 */
	@Override
	public String drivingForce() {
		return "팔을 하늘로 뻗기";
	}// drivingForce

	/**
	 * interface의 abstract method 구현<br>
	 * 양력<br>
	 */
	@Override
	public String upwardForce() {
		return "슈퍼 망토";
	}// upwardForce

	public static void main(String[] args) {
    
		Superman man = new Superman();
		System.out.println(man.name + "의 추진력:" + man.drivingForce());
		System.out.println(man.name + "의 양력:" + man.upwardForce());

	}// main

}// class

- Fly interface를 구현하고 사용할 class 작성!

 

# 출력 결과 #

Clark의 추진력:팔을 하늘로 뻗기
Clark의 양력:슈퍼 망토

 

>> 잘 나오는 거 확인 ㅎㅎ 나중엔 extends까지 더해서 다중 상속해볼 예정!

Comments