반응형

           

  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)의 선언부만 알면된다.(내용은 몰라도 됨)


- 디폴트 메서드와 static메서드
: 디폴트 메서드
- 추상메서드의 기본적인 구현을 제공하는 메서드
- 추상메서드가 아니기 때문에 디폴트메서드가 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 됨
- 여러 인터페이스의 디폴트 메서드간 충돌
: 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩
- 디폴트 메서드와 조상 클래스의 메서드 간 충돌
: 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시

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

+ Recent posts