본문 바로가기
JAVA SE/이론 및 개념

[20.07.24/Day_12] Java SE / Interface 인터페이스

by 파프리카_ 2020. 7. 24.
728x90
반응형

[ Review ]

~ 면접 준비 ~ 

 

▶ OO | Object Oriented → 분석, 설계 기법 (UML 이용)

: 객체를 기본단위로 하여,  객체와 객체의 관계를 중심으로 분석 설계하는 것.

 

Object는?

: 시스템의 기본 단위, 정보를 저장하는 단위

: 속성과 기능으로 구성됨

 

Class와 Object의 관계

: Class는 Object의 blue print(설계도/청사진)

 

▶ 객체지향의 주요개념 | java

1. Encapsulation (인터페이스는 보이고, 구현부는 감춘다.)

:  모듈을 소통할 수 있는 interface와 implement(구현부)를 분리하여, 정의한다.

: "public interface, pirvate implement"

 

2. 상속 Inheritance (부모클래스를 상속받아 그 멤버-속성,기능 들을 사용할 수 있다.)

1) 재사용성이 좋다, 생상성 향상 및 유지보수에 용이하다.

2) 계층구조를 형성해서, 다형성 적용 환경을 만든다.

* java는 단일 상속을 채택한다. (부모로써 하나의 객체만 받는다)

→ 다중 상속의 경우 객체가 지나치게 무거워진다.(super-부모 생성자가 너무 많아진다.)

→ 객체의 정체성이 모호해진다.(계층구조 형성을 통한 다형적 적용 환경을 만드는데 어려워진다.)

→ 다중 상속의 장점을 이용하기 위해,  java interface로 보완한다.

 

3. 다형성 polymophism (버튼 하나가 다양한 기능을 수행한다.)

: 재생버튼 떠올리기! (하나의 메세지 방식이 다양한 기능을 수행) *인터페이스가 편해졌다 = 다형성이 적용됐다

: "One Interface, Multiple Implement"

: 단일한 소통방식(메세지 방식)으로 다양한 객체들이 각자의 방식으로 동작하는 성질

 

:  프로그래밍 기법 → 오버라이딩, 오버로딩

# 공통점 : 같은 이름 (동일한 사용법), 간결한 인터페이스로 다양한 구현을 가능케한다.

# 차이점 

* 오버로딩 :  매개변수를 다양하게 구성하여,  서로 다르게 사용할 수 있다 (input의 다양성)

* 오버라이딩 : 기능을 서로 다르게 해서 사용자의 편의성을 높일 수 있다 (부모메서드 재정의)

 


▶ UML : 통합 모델링 언어

- Class diagram

1. association : 연관 / use a 관계 / 사람이 렌트카를 이용한다

2. aggregation : 집합 / has a 관계 / 사람이 스마트폰을 가지고있다

3. composition : 구성 / consist of 관계 / 사람은 뇌,뼈,피부 등으로 구성된다

4. generalization : 일반화 / is a 관계 / 개는 동물이다.


static

:  정적이다.(시작할 때 메모리에 올라간다) 객체 생성 없이 사용(접근) 가능하다.

class loading 시점에 static 정보가 적재된다(class정보와 동시에 적재된다)

→ 클래스명.static member 으로 접근  ex)Integer.parseInt( );

*참고 링크 : https://creamilk88.tistory.com/26

 

abstract 

추상적이다. (=실재가 아니다.)

> 추상 클래스 abstract class : 객체 생성을 못한다(하지 않는다).  부모 클래스로서의 역할만 충실히 한다.

   - 자식에게 멤버를 상속시키기 위해 존재

   - 직접 객체화될 수 없음(상속을 통한 간접 객체화만 가능)

> 추상 메서드 abstract method : 구현부가 없다. 상속받은 자식 클래스에 구현을 강제한다.

 

 


[ Interface 인터페이스 ]

: 인터페이스를 사용하는 측과 인터페이스를 구현하는 측과의 약속이다 !  ex)GUI

 

: 다중 상속의 장점을 가지기 위한 자바의 기술

 → "다양한" 계층구조 형성을 통한 다형성 적용환경

 

* 상속의 장점은 두가지이다. 첫 번째는 재사용성이고, 두 번째는 (단일한) 계층구조 형성을 통한 계층구조 형성이다.(**자바가 단일 상속을 채택하기 때문에 계층구조는 단일할 수 밖에 없다)

interface를 사용하게 되면, 재사용성의 장점(부모→자식 멤버물려줌)이 아닌, 단일→다양한 계층구조를 통한 다형성 적용환경 형성을 더욱 잘 활용하기 위하여 이용하는 것이다.

 

* 자바는 단일 상속을 채택한다.

why? 다중 상속이 지원되어 남발될 경우, 객체 생성 시 불필요하게 많은 정보를 로딩할 수 있기 때문

(생성자의 super()가 호출되면서 자신의 객체 생성 시 상위의 모든 객체를 먼저 생성)

 

 

특징

1. instance variable(객체의 멤버변수)를 가질 수 없다. (인터페이스는 abstract class와 같이 객체화될 수 없다.)

← 재사용성에 무게를 두지 않기 때문 : 다양한 계층구조 형성을 통한 다형성 적용이 목적 !

2. abstract method와 static final 상수만 가질 수 있다.

→ 즉, 객체의 멤버인 인스턴스 변수를 가질 수 없고, 구현된 일반 메서드는 가질 수 없다.

3. 인테페이스를 구현하는 클래스는 다수의 인터페이스를 구현할 수 있다.

→ 즉, 다양한 계층구조 형성을 지원한다.

4. 인터페이스끼리는 상속(extends)이 가능하다. (추상 메서드 상속 OK)

5. jdk 1.8이상에는 'default' 제어자가 명시된 구현부가 있는 메서드를 가질 수 있다. 또한, static method는 구현부를 가질 수 있다.

 

 

 

인터페이스 문법을 확인하는 예제1

// interface class 상위인터페이스 
interface Flyer {
	public void fly(); // abstract를 별도로 명시하지 않아도 됨
}

//super class
class Animal {}

//sub class 1
class Person extends Animal {}

//sub class 2 & 하위구현체 1(implement됨)
class Bird extends Animal implements Flyer {
	@Override
	public void fly() {
		System.out.println("새가 날다");
	}
}

//하위구현체 2(implement됨)
class Airplane implements Flyer {
	@Override
	public void fly() {
		System.out.println("비행기가 날다");
	}

}

// main class
public class TestInterface1 {
	public static void main(String[] args) {
		// Animal a = new Airplane(); 
		//error : 상위타입만 가능, Airplane은 Animal의 자식이 아니기 때문에
			
		//상위 인터페이스 타입으로 하위 객체를 참조할 수 있다
		//다형성 적용 가능 !!
		Flyer f1 = new Bird();
		Flyer f2 = new Airplane();
		f1.fly();
		f2.fly();
		/* 출력값:
		 * 새가 날다
		 * 비행기가 날다
		 */
	}
}

 

 

인터페이스 문법을 확인하는 예제2

interface A{
	public void a();
	
	//jdk 1.8에 추가된 default method
	//interface의 확장성을 고려해서 구현부를 가지는
	//default 메서드 문법이 추가되었다
	public default void aa() {
		System.out.println("구현부를 가지는 default method");
	}
}

// interface끼리는 상속이 가능하다
// B에는 a()와 aa()와 b()가 있다
interface B extends A{
	public void b();
}

// B를 구현한 test class는  a()와 b()를 구현해야 한다.
// interface내에서 default로 구현된 aa()메서드는 굳이 구현해주지 않아도 된다.
class Test implements B{

	@Override
	public void a() {
	}

	@Override
	public void b() {
	}
		
}

public class TestInterface4 {
	public static void main(String[] args) {
		Test t = new Test();
		t.aa();
	}
}

 

abstract와 interface를 비교

# 공통점

1. 다형성을 지원하여, 계층구조형성을 통해 사용자에게 단일한 메세지 방식을 지원할 수 있다.

2. 객체 생성이 될 수 없다.

3. 자식 or 하위클래스에게 구현을 강제할 수 있다.

 

# 차이점

abstract - 객체의 멤버(instance variable, method)를 가질 수 있다. → 속성과 기능을 자식에게 물려줄 수 있다.

interface - 다양한 계층 구조 형성을 지원

 

 

 

728x90
반응형