[ 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 - 다양한 계층 구조 형성을 지원