본문

160117P(일)

Java Chapter 6 - 상속과 인터페이스


일전에 면접에서 Interface와 abstract의 차이에 대해서 명확히 설명하지 못했다.

반성하면서 다시한번 공부해보겠다.


기존의 소스코드를 복사해서 수정한 후 다시 컴파일하는 방법은 유지보수(수정이 필요할 때 클래스 전부를 건드려야 하는 점)에 매우 불리하다.


자바 컴파일러는 컴파일 할 때 생성자의 첫 번째 명령문이 슈퍼클래스의 생성자 호출문이 아니면

super(...); 

자동으로 슈퍼클래스의 no-arg constructor 호출문을 그 위치에 추가한다.


해결방법

1. 슈퍼클래스에 no-arg constructor 추가

객체지향 프로그래밍 답지 않다.


2. 슈퍼클래스의 생성문을 호출해준다.

super(...);

반드시 생성자의 맨 처음에 위치해야 한다.


메소드 오버라이딩(method overriding)

슈퍼클래스의 메소드와 똑같은 시그니쳐의 메소드를 선언해서 슈퍼클래스의 메소드를 무시하도록 만드는 것

위와 같이 동작하여 새로운 기능을 담당하도록 할 수 있다.(override : 덮어쓰다)


파라미터가 달라지면 다른 메소드로 판단한다.

즉, 메소드 오버로딩으로 판단해버린다.


오버라이드 메소드의 기능이 상속받은 메소드의 로직을 단순히 확장한다면

super.메소드이름(파라미터);


새로_추가된_코드_입력;

이런 식으로 확장하는것이 더 편하고 객체지향적인 코딩이다.


상속을 금지하는 final 키워드

다른 프로그래머가 상속하는것을 금지하고 싶다면 클래스에 final을 붙여준다.

이러한것을 final class라고 한다.


마찬가지로 메소드에도 final을 붙여주면 final 메소드가 되며 오버라이딩이 불가하다.


인스턴스화(instantiation)

클래스를 가지고 객체를 만드는 일


추상화(abstract)

인스턴스화를 금지할 수 있다.

abstract 클래스는 객체를 만드는것이 불가능하기 때문!


abstract class MessageSender {

String title;

String senderName;


MessageSender(String title, String senderName) {

this.title = title;

this.senderName = senderName;

}

abstract void sendMessage(String recipient);

}


class SMSSender extends MessageSender {

void sendMessage(String recipient) {

...

}

}


사용하는 목적

1. 서브 클래스가 반드시 구현해야하는 메소드를 강제할 수 있다.


2. 다형성의 구현

JVM은 객체의 메소드를 호출할 때 변수의 타입에 상관없이 객체가 속하는 클래스의 메소드를 호출한다.

Java 컴파일러는 객체가 아니라 변수의 타입만 가지고 그 메소드가 있는지 없는지를 체크


따라서 컴파일러로부터 슈퍼클래스의 메소드를 체킹받고, 그 서브클래스의 메소드가 호출되도록 하기 위해서 사용한다.


인터페이스(interface)

다중상속 되지 않는 abstract의 단점을 극복하기 위해서 사용한다.


인터페이스는 메소드만 표현 가능하고 필드는 표현 불가능하다.

하지만 상수필드는 허용한다.


메소드는 무조건 추상 메소드이다.


interface Lendable {

abstract void checkout(String aborrower, String date);

abstract void checkIn();

}


class separateVolume implements Lendable {

public void checkout(String aborrower, String date) {

...

}


public void checkIn() {

...

}

}


인터페이스를 구현하는 메소드에는 반드시 public 속성이 붙는다.


인터페이스는 다중상속을 지원한다.

interface Changable extends Resizable, Coloable {

...

}


abstract와 interface의 차이

1. abstract는 클래스, interface는 interface

abstract calss Newabs {

...

}


interface Newint {

...

}


2. abstract는 상속(extends), interface는 구현(implements)


3. interface는 다중상속이 가능하다.


4. abstract는 필드와 일반적인 메소드를 가질 수 있다. interface는 필드와 일반 메소드 불가

'Programming > Java' 카테고리의 다른 글

170924(일) - Thread  (0) 2017.09.24
160127P(수)  (0) 2016.01.27
160109P(토)  (0) 2016.01.10
160108P(금)  (0) 2016.01.09
160107P(목)  (0) 2016.01.07

공유

댓글