객체지향 정리 마지막
다형성
여러가지 형태를 가질 수 있는 능력
하나의 배열에 여러종류의 객체 저장
조상 타입의 참조변수로 자손 타입의 객체를 다루는 것
참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버개수보다 같거나 적어야 한다
참조변수 타입과 인스턴스 타입은 보통 일치하지만, 일치하지 않을수도 있다.
참조변수의 형변환
사용할 수 있는 멤버의 개수를 조절하는 것
조상 - 자손 관계의 참조변수는 서로 형변환이 가능하다
**참조변수가 가리키는 실제 인스턴스가 무엇인지가 중요(멤버 개수 확인)
instanceof 연산자
참조변수의 형변환 가능여부 확인에 사용. 가능하면 true반환
형변환 전에 반드시 instanceof로 확인해야 함
주로 조건문에 사용한다 if(참조변수 instanceof 타입(클래스명))
매개변수의 다형성
참조형 매개변수는 메서드 호출시 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
여러종류의 객체를 배열로 다루기
조상타입의 배열에 자손타입 객체를 담을 수 있다
다루고 싶은 객체들의 상속관계를 다져서 가장 가까운 공통조상 클래스 타입의
참조변수 배열을 생성해서 객체들을 저장
추상클래스
미완성 설계도. 미완성 메서드를 가지고 있는 클래스
다른 클래스 작성에 도움을 주기 위한 것, 인스턴스 생성불가
상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
추상 클래스를 상속받아 >추상 메서드의 {구현부} 완성 >완성된 설계도
추상메서드
미완성 메서드. 구현부 {몸통}이 없는 메서드
추상메서드에서 선언된 것의 몸통을 전부 구현하지 않으면 추상 클래스(미완성)로 남기 때문에
객체 생성이 불가하다
필수적인 기능이라 강제성이 있다
추상 클래스의 작성
여러 클래스에 공통적으로 쓸 수 있는 추상 클래스를 바로 작성하거나
기존 클래스의 공통된 부분을 뽑아서 추상 클래스 작성
장점 : 설계도를 쉽게 작성, 코드 중복 제거, 코드관리 용이, 구체화 된 코드보다 유연(변경에 유리)
추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
구체화 : 상속을 통해 클래스를 구현, 확장하는 작업
인터페이스
추상 메서드의 집합 (추상 메서드와 상수만을 멤버로 갖고있음)
구현된 것이 전혀 없는 설계도, 껍데기(모든 멤버가 public)
인터페이스 선언
interface 인터페이스 이름 {
public static final 타입 상수이름 = 값; //상수
public abstract 메서드 이름(매개변수목록); //추상메서드
} //모든 인터페이스 멤버는 public
인터페이스의 추상메서드는 public, abstract 생략가능 = 항상 그렇기 때문
상수도 마찬가지로 public static final 생략가능
인터페이스의 상속
인터페이스의 조상은 인터페이스만 가능 (Object가 최고 조상이 아님)
다중 상속이 가능(추상메서드는 충돌해도 문제 없음)
인터페이스의 구현
인터페이스에 정의된 추상 메서드를 완성하는 것
class 클래스 이름 implements 인터페이스 이름 {
//인터페이스에 정의된 추상메서드를 모두 구현해야 한다
}
->일부만 구현하는 경우 클래스 앞에 abstract를 붙여야 함
상속과 구현을 동시에 할 수 있다
추상 클래스와 인터페이스의 공통점
추상 메서드를 가지고 있다(미완성 설계도)
추상 클래스와 인터페이스 차이점
인터페이스는 iv를 가질 수 없다.
인터페이스를 이용한 다형성
인터페이스도 구현클래스의 부모이다
인터페이스 타입의 매개변수는 인터페이스를 구현한 클래스의 객체만 가능하다
인터페이스를 메서드의 리턴타입으로 지정할 수 있다(형변환 가능)
인터페이스의 장점
두 대상(객체)간의 연결, 대화, 소통을 돕는 '중간역할'을 한다
변경에 유리한 설계가능
선언(설계)와 구현을 분리시킬 수 있게 한다
개발시간을 단축할 수 있다
표준화가 가능하다
서로 관계없는 클래스들을 관계 맺어줄 수 있다.
디폴트 메서드와 static 메서드
인터페이스에 디폴트 메서드, static 메서드 추가 가능(1.8부터)
인터페이스에 새로운 메서드를 추가하기 어려움 -> 디폴트 메서드
디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책
여러 인터페이스의 디폴트 메서드 간의 충돌
-인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야한다
디폴트 메서드와 조상 클래스의 메서드 간의 충돌
-조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
//객체지향파트 끝
객체 : iv의 묶음
객체배열 : 참조변수를 묶은 것
객체에서 다른 객체를 참조할 때 메서드를 거쳐서 간접적으로 접근 -> 캡슐화
내부클래스
클래스 안의 클래스
내부 클래스의 장점
내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다
코드의 복잡성을 줄일 수 있다(캡슐화)
내부클래스의 종류와 특징
내부 클래스의 종류와 유효범위(scope)는 변수와 동일
내부 클래스 | 특징 |
인스턴스 클래스 | 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다. |
스태틱 클래스 | 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static 멤버처럼 다루어진다. 주로 외부 클래스의 static멤버, 특히 static 메서드에서 사용될 목적으로 선언된다. |
지역 클래스 | 외부 클래스의 메서드나 초기화 블록 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다 |
익명 클래스 | 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용) |
내부 클래스의 제어자와 접근성
내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일하다
내부 클래스에서는 외부 클래스의 private 멤버도 접근 가능하다
외부 클래스의 지역변수는 final이 붙은 상수만 접근 가능하다 //*변수인데 값이 안 바뀐다면 상수로 간주한다
예외) JDK 1.8 부터는 final 생략가능
익명클래스
이름이 없는 일회용 클래스. 정의와 생성을 동시에한다
1.클래스 정의 2.객체생성