JAVA Study
6. 추상클래스 (abstract class)
- 미완성 메서드(추상메서드)를 포함한 미완성 클래스 (추상메서드가 없어도 키워드를 붙여 추상클래스로 지정 가능)
- 추상클래스 자체로는 클래스로서의 역할을 다하지 못함, but 새로운 클래스를 작성할 때 바탕이 되는 조상클래스로서 중요한 의미를 가짐
- 추상클래스는 키워드 abstract를 붙이기만 하면 됨
- 추상클래스에도 생성자는 존재, 멤버변수와 메서드도 가질 수 있음
- 추상메서드 없이 완성된 클래스여도 추상클래스로 지정되면 클래스의 인스턴스를 생성할 수 없음
- 추상 메서드
: 선언부만 작성하고 구현부는 작성하지 않은 메서드
: 실제 내용은 상속받는 클래스에서 구현하도록 비워둠
: 키워드 abstract를 앞에 붙여줌, 구현부가 없으므로 {}대신 ;을 붙임
: 추상클래스를 상속받은 자손클래스에서 오버라이딩을 통해 추상클래스의 추상메서드들을 모두 구현해야 함
- 만약 하나라도 구현하지 않으면 자손클래스역시 추상클래스로 지정해주어야 함
- 추상클래스 작성
: 여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성
: 기존 클래스의 공통 부분을 뽑아 조상클래스를 만듦
: 추상화 - 클래스간의 공통점을 찾아내 공통의 조상을 만드는 작업
: 구체화 - 상속을 통해 클래스를 구현, 확장하는 작업
7. 인터페이스 (interface)
- 일종의 추상클래스, 추상메서드를 갖지만 추상클래스보다 추상화정도가 높아 추상클래스와달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없음
- 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않음
- 인터페이스 작성
: 인터페이스를 작성하는 것은 클래스 작성과 같다, 키워드로 class 대신 interface를 사용한다
: 접근제어자로 public 또는 default를 사용할 수 있다.
interface 인터페이스 이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
: 인터페이스 제약사항
- 모든 멤버변수는 public static final 이어야하며, 이를 생략할 수 없음
- 모든 메서드는 public abstract 이어야하며, 이를 생략할 수 없음 (단, static메서드와 default메서드 제외)
- 인터페이스 상속
: 인터페이스는 인터페이스로부터만 상속받을 수 있음, 다중상속 가능
: 자손 인터페이스는 조상 인터페이스에 정의된 멤버를 모두 상속받음
- 인터페이스 구현
: 그 자체로는 인스턴스생성할 수 없음 -> 인터페이스를 구현하는 클래스를 작성해야 함
: implements를 사용해 구현하는 인터페이스의 메서드 중 일부만 구현한다면 abstract를 붙여서 추상클래스로 정의해야 함
: 상속 (extends)과 구현(implements)을 동시에 할 수 있음
class Fighter extends Unit implements Fightable{
}
- 인터페이스를 이용한 다중상속
: 인터페이스는 static상수만 정의할 수 있으므로 조상클래스의 멤버변수와 충돌하는 경우는 거의 없고 충돌된다 하더라도 클래스 이름을 붙여서 구분이 가능함
- 인터페이스를 이용한 다형성
: 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로 형변환 가능
: 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것
: 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미
package apple;
interface Parseable{
// 구문 분석작업을 수행
public abstract void parse(String fileName);
}
class ParserManager{
// 리턴타입이 Parseable인터페이스
public static Parseable getParser(String type){
if(type.equals("XML")){
return new XMLParser();
} else{
Parseable p = new HTMLParser();
return p;
//return new HTMLParser();
}
}
}
class XMLParser implements Parseable{
public void parse(String fileName){
//구문 분석 작업을 수행하는코드를 적는다.
System.out.println(fileName+"- XML parsing completed.");
}
}
class HTMLParser implements Parseable{
public void parse(String fileName){
//구문 분석 작업을 수행하는 코드를 적는다.
System.out.println(fileName+"-HTML parsing completed.");
}
}
public class ParserTest {
public static void main(String[] args) {
Parseable parser = ParserManager.getParser("XML");
parser.parse("document.xml");
parser = ParserManager.getParser("HTML");
parser.parse("document2.html");
}
}
: Parseable인터페이스는 구문분석(parsing)을 수행하는 기능을 구현할 목적으로 추상메서드 'parse(String fileName)'을 정의
: XMLParser클래스와 HTMLParser클래스는 Parseable인터페이스를 구현
: 매개변수로 넘겨받은 타입값에 따라 XMLParser인스턴스 또는 HTMLParse인스턴스를 반환
- 인터페이스의 장점
: 개발시간 단축
: 표준화 가능
: 서로 관계없는 클래스들에게 관계를 맺어줄 수 있음
: 독립적인 프로그래밍 가능
- 인터페이스의 이해
: 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다.
: 메서드를 사용(호출)하는 쪽(User)에서 사용하려는 메서드(Provider)의 선언부만 알면된다.(내용은 몰라도 됨)
8. 내부클래스 (inner class)
- AWT나 Swing같은 GUI어플리케이션의 이벤트처리 외에는 잘 사용하지 않음
- 클래스 내에 선언된 클래스
: 두 클래스가 긴밀한 관계이기 때문에 내부에 선언
- 내부클래스 장점
: 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있음
: 코드의 복잡성을 줄일 수 있음 (캡슐화)
- 내부클래스의 종류와 특징
: 변수의 선언위치에 따른 종류와 같음
: 인스턴스 클래스
- 외부 클래스의 멤버변수 선언위치에 선언
- 외부 클래스의 인스턴스멤버처럼 다루어짐
- 외부클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언
: static 클래스
- 외부 클래스의 멤버변수 선언위치에 선언
- 외부 클래스의 static멤버처럼 다루어짐
- 외부 클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언
: 지역 클래스
- 외부 클래스의 메서드나 초기화블럭 안에 선언
- 선언된 영역 내부에서만 사용될 수 있음
: 익명 클래스
- 클래스 선언과 객체의 생성을 동시에 하는 이름없는 클래스 (일회용)
- 내부 클래스의 선언
: 변수의 선언위치와 동일한 위치에 선언
: 각 선언위치에 따라 같은위치의 변수와 동일한 유효범위, 접근성을 가짐
- 내부 클래스 제어자와 접근성
: 변수와 동일
: 내부 클래스 중 static클래스만 static멤버를 가질 수 있음
- 익명 클래스
: 이름이 없음
: 클래스의 선언과 객체 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고, 오직 하나의 객체만 생성할 수 있는 일회용 클래스
: 이름이 없으므로 생성자도 가질 수 없음
: 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없음
: 이름이 없기 때문에 '외부 클래스명 $숫자.class'의 형식으로 클래스파일명이 결정됨
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] 7 객체지향 프로그래밍 2-2 (0) | 2017.07.21 |
---|---|
[JAVA] 7 객체지향 프로그래밍 2-1 (0) | 2017.07.11 |
[JAVA] 6 객체지향 프로그래밍1 (0) | 2017.07.05 |
[JAVA] 배열 예제 (0) | 2017.07.04 |
[JAVA] 5 배열 (Array) (0) | 2017.07.03 |