오늘은 여러가지 클래스에 관해 공부했다.
먼저, abstrcat 클래스부터 살펴보면

abstract 클래스는 인스턴스화 될 수 없는 클래스이다.
??
그러면 왜 abstract 클래스를 쓰는 것일까?

상속을 목적으로 상위클래스로 선언하고 싶은 경우 abstract를 사용한다.
abstract 선언은 클래스와 메소드에서 사용할 수 있다.

abstract 클래스는 인스턴스 생성이 불가능하다.
그렇기 때문에 다른 클래스에서 상속을 받은 후 abstract 메소드를 오버라이딩 해서 사용한다.

- Interface
: 완벽한 abstract 클래스이다.
완벽한 abstract 클래스란 내부 메소드들이 전부 abstract메소드인 클래스를 말한다.
전부 abstract 인 메소드들을 가지고 있는 클래스 앞에 interface라고 선언을 하면
자동으로 내부 메소드들은 public abstract으로 설정되고 내부에 존재하는 변수는 자동으로 public static final로 선언된다.



(interface 선언)



위 선언을 보면 메소드들의 { } 의 내용이 없는 것을 확인 할 수 있다.

즉 이 메소드들은 오버라이딩 해서 사용해야한다.
이러한 interface는 extends로 받지 않고 implements 라고 받는다.
상속이라는 표현보다 구현이라는 표현을 사용한다. 텅 빈 메소드들을 채워 넣는 개념이다.

- interface 기반의 상수표현
interface를 이용해 상수를 표현하는 방법도 있다.



(interface를 이용해 상수를 표현하는 방법)



* 인터페이스를 이용해 다중상속을 구현할 수 있다.

원칙적으로 자바에서는 다중상속을 못하게 되어있다.

하지만, interface를 이용하면 다중상속과 같은 표현을 할 수 있다.

예를 들어 IPTV는 TV이기도 하고 Computer이기도 하다. 이 것을 표현하고자 한다면
interface를 이용해서



(interface와 TV, Computer 클래스 선언)





(IPTV는 TV와 Computer 다중상속)



정확히 표현하자면 다중상속은 아니지만
다중상속과 같은 표현이다.

* Inner 클래스
클래스 안에 클래스를 선언 할 수 있다.

- Outer 클래스의 인스턴스 생성 후에야 Inner 클래스의 인스턴스 생성이 가능하다.
- Inner 클래스 내에서는 Outer 클래스의 멤버에 직접 접근이 가능하다.
- Inner 클래스의 인스턴스는 자신이 속할 Outer 클래스의 인스턴스를 기반으로 생성된다.

-> Inner 클래스를 사용하면
1. 클래스들을 논리적으로 묶는 수단이된다.
2. 클래스들을 논리적으로 묶다 보니, 캡슐화가 증가하는 효과가 있다.
3. 결과적을 ㅗ코드의 가독성이 향상되고, 유지보수성이 좋아진다.


* 전화번호 관리 프로그램 5단계
출력 내용은 같지만
코드 면에서 가독성을 높이고
효율적으로 만들기 위해 5단계로 업그레이드하였다.

바꾼 내용은 먼저



(case 상수)



case에서 쓰던 상수를 읽기 편하게 interface를 이용해 상수를 선언했다.


(안정성을 높인 코드)


위 코드는 PhoneBookManager가 하나만 생성될 수 있도록
static메소드로 밖에서 호출 할 수 있고 이 메소드를 이용해 PhoneBookManager를 생성 할 수 있도록 하였다.

(* 참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)




@ 상속의 조건
 
아래 조건과 필요가 충족되지 않으면 상속을 안하는 것이 좋다.
 
* IS-A관계
: IS-A 관계란 하위 클래스를 상위 클래스로 부를 수 있어야한다.
 
예를 들면,
핸드폰 -> 스마트폰
여기서 핸드폰은 상위클래스이고, 스마트폰은 하위클래스이다.
 
이 때, 우리는 스마트폰을 핸드폰이라고 말할 수 있다.
스마트폰 IS A 핸드폰
 
이 관계를 IS-A 관계라고 부른다. 이 조건을 만족하지 않는다면 상속을 하지 않는 것이 더 좋다.
 
* HAS-A 관계
: HAS-A 관계란 하위클래스가 상위클래스를 가지고 있다는 의미이다. 이 경우 상속을 사용할 수 있지만, 왠만하면 쓰지 않는 것이 좋다.
이유는 가지는 게 추가해야될 때 고치기 힘들다. 자바에서는 중복상속이 안되기 때문이다.
그렇기 때문에 HAS-A 관계에서는 복합관계로 대신하는 것이 좋다.
 
@ 메소드 오버라이딩
: 메소드 오버라이딩이란 상위클래스에서 정의한 메소드를 다시 정의한 것이다. 메소드의 이름과 반환형, 매개변수의 선언이 완전이 일치할 때 메소드 오버라이딩이된다.
 
참조 변수를 이용해서, 인스턴스의 오버라이딩 된 메소드를 호출하면, 상위클래스가 아닌 하위 클래스의 메소드가 호출된다.
하위 클래스에서 오버라이딩 된 상위 클래스의 메소드를 호출하려면 키워드 super를 사용한다.
 
쉽게 말하면 오버라이딩이 되면 하위 클래스에서 재정의 된 메소드로 호출이 되고, 그 전의 메소드들은 가려지게 된다. 그 전의 메소드는 호출이 불가능하다.
 
 
 
 
여기서 조금 복잡한 내용인데,
상속에 있어서 인스턴스 참조관계를 일반화 해서 정리하면
 
AAA -> BBB -> CCC ( 상속 관계)
 
AAA ref1 = new BBB();
AAA ref2 = new CCC();
BBB ref3 = new CCC();
 
위를 보면 ref1, ref2는 클래스 AAA로 바라봐진다. ref3는 클래스 BBB로 바라봐진다.
 
ref1BBB로 인스턴스가 생성되지만 AAA 취급을 받는다.
ref1AAA의 메소드만 이용할 수 있다.
 
* XXX 클래스의 참조변수는 XXX 클래스의 이느턴스, 또는 XXX를 상속받는 하위 클래스의 인스턴스를 참조할 수 있다.
* 참조변수의 자료형에 상관없이 마지막으로 오버라이딩을 한 메소드만 호출된다.
(가려지기 때문이다.)

문제 15-1
오버라이딩을 이용해 같은 메소드로 다른 메소드로 연결시킨다.


(코드)


(동작화면)


-> 오버라이딩으로 자료형에 상관없이 같은 메소드로 다른 메소드처럼 동작하였다.

@ 상속의 목적
상속을 통해 연관된 일련의 클래스에 대한 공통적인 규약을 정의할 수 있다.”
 
이 뜻은 상속이 된 클래스들에 대해 일괄적으로 다룰 수 있게 된다는 이야기 이다.
상속을 계획하여 설계하고 이러한 이득을 얻을 수 있다.
 
* Object 클래스
: java.lang 패키지에 묶여있는 클래스이다. 보통 다른 어떤 클래스도 상속하지 않으면 Object 클래스를 상속하게 된다.
Object클래스 안에는
public String toString() 메소드가 정의되어있다.
그렇기 때문에 이 toString을 오버라이딩하여 사용할 수 있다.
 
* final 클래스와 final 메소드
: final 선언이 된 클래스는 상속되지 않는다.
final로 선언된 메소드는 오버라이딩을 허용하지 않겠다는 의미이다.

(*참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)



+ Recent posts