2주차가 끝났다..
이제 완전히는 아니지만, 자바에 익숙한 단계인 것 같다.
이번주에서 제일 중요했던 객체지향 개념을 WIL 로 정리하겠다.
이때 형식은 다음과 같다.
class 자식클래스 extends 부모클래스 {/내용생략/}
클래스의 관계는 다음 두가지로 나눌 수 있다.
상속은 앞에서 이야기를 했다시피 클래스들 간의 부모 자식 관계를 만들어 준 것이다.
이때 포함은 어떻게 될까?
포함
클래스간 관계 설정
상속관계: ~는 ~이다.
포함관계: ~는 ~를 가지고 있다.
cf) 대부분은 포함관계이다. (왜냐면 상속은 제약이 많기 때문에 꼭 필요할 때만 사용한다.)
단일상속
자바는 단일상속만을 허용한다.
C++ 과 같은 경우에는 다중상속도 허용하지만, 자바는 단일 상속이다.
Object 클래스
Object 클래스는 모든 클래스의 조상이다.
이때 특징들을 살펴보자면
오버라이딩 (메서드 오버라이딩)
오버라이딩에서의 주의사항
- 선언부(이름, 매개변수, 리턴의 타입)가 조상 클래스의 메서드와 일치해야 한다.
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상클래스의 메서드보다 많이 선언할 수 없다. (8장에서 나온다)
오버로딩 vs 오버라이딩
오버로딩
기존에 없는 새로운 메서드를 정의하는 것이다. (이름만 동일)
상속과는 전혀 관련이 없다.
오버라이딩
상속받은 메서드의 내용을 변경하는 것이다.
참조변수 Super
참조변수 this 와 참조변수 super
생성자 super()
자손이 조상의 생성자를 호출할때 사용.
조상의 멤버는 조상의 생성자가 초기화 하도록 해야한다.
-> 조상의 멤버들을 어떻게 초기화를 해야할지를 가장 잘 아는 것은 조상이기 때문.
생성자이 첫줄에는 반드시 생성자를 호출해야한다.
첫줄에 생성자가 호출되지 않으면 컴파일러가 super() (기본생성자)를 삽입한다.
Package
Package 선언
import 문
static import문
제어자
"클래스"와 "클래스의 멤버"(변수, 메서드) 에 부가적인 의미 부여한다. (표면적 의미)
하나의 대상에 여러 제어자를 같이 사용가능 (이떄, 접근 제어자는 하나만 )
접근 제어자
- public
- protected
- (default)
- private
static: 클래스의, 공통적인
final: 마지막의, 변경될 수 없는
final 클래스 -> 변경될 수 없는, 확장될 수 없는 클래스 즉 , 다른 클래스의 조상이 될 수 없다.
final 메서드 -> 변경될 수 없는 메서드, 즉 오버라이딩 불가하다.
변수 -> 값을 변경할 수 없는 상수
abstract: 추상의, 미완성의
abstract 클래스 -> 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
abstract 메서드 -> 선언부만 작성하고, 구현부는 작성하지 않은 추상 메서드 (미완성 메서드), 몸통이 없는 메서드
이때, 추상 메서드는 미완성이므로 그렇다면 자연스럽게 추상 클래스 또한 미완성 이다.
미완성 설계도는 제품 생성이 불가능하기 때문에
"객체 생성이 불가능"히다, 이때 상속을 통해 완성된 설계도로 객체 생성가능함을 알아두자.
접근제어자
접근제어자를 사용하는 이유
이때 접근제어자의 범위는 좁으면 좁을수록 좋다.
다형성
여기에서 알아둘 부분이 2가지가 있다. 이를 살펴보면 다음과 같다.
하지만 이때 조상 객체로 자손 객체를 다루는 경우 (객체와 참조변수의 타입이 일치하지 않을떄)는
조상이 가진 멤버만을 다룰 수 있다
참조변수의 형변환
: 사용할 수 있는 멤버의 개수를 조절하는 것이다. 즉 값이 바뀐다.
상속관계 참조변수는 서로 형변환 가능
instanceOf 연산자
사용의 목적은 결국 형변환을 안전하게 할 수 있다는 것이다.
형 변환을 하기 전에 instanceOf 연산자로 형변환 가능여부를 체크하자.
참조변수의 형변환 가능여부 확인에 사용할 수 있다.(true/false)
객체의 조상에 대해서도 '참' 값을 반환한다.
참조변수를 변경함으로써 사용할 수 있는 멤버의 개수 조절가능
- 이 말은 참조변수의 리모콘을 변경하고, 사용할 수 있는 멤버 수를 변경하겠다는 것이다.
다형성의 장점
다형성 다시 정리
1) Tv t = new SmartTV();
2) 참조변수의 형변환 -> 리모콘 바꾸기, 사용가능한 iv 갯수 조절하는 역할.
3) instanceof 연산자 -> 형변한 가능 체크 기능을 함.
class Buyer{
void buy(Product p){// 내용생략 }
}
Buyer b = new Buyer();
Product p = new Tv1();
b.buy(p);
// 위의 내용들을 다음과 같이 한꺼번에 정리가 가능ㅎ다ㅏ.
b.buy(new Tv1()) // 익명클래스 이용하여 한줄로 가능
추상 클래스(abstract class)
추상 메서드 (abstract method)
미완성 메서드, 구현부가 없음, 강의에서는 '몸통이 없는 메서드' 라고 부른다.
양식: abstract 리턴타입 메서드이름();
꼭 필요하지만 자손마다 다르게 구현될 것으로 예상될 때 사용한다.
인스턴스 메서드에서 추상 메서드를 사용할 수 있다.
인스턴스 메서드가 호출되기 위해서는 인스턴스가 생성되야 하기 때문에 가능하다 (추상 메서드가 완성되어야 인스턴스가 생성 가능)
스탭을 밟으면서 어떻게 작성이 되는지 확인해보자.
2.이 추상클래스를 배열로하여 각 일반클래스들을 저장시킨다.
Unit[] group = {new tank[], new marin[], ... };
group[0].move(100,200);
cf)
Unit 을 조상인 Object 로 바꿔도 해당부분은 문제가없지만
Object 부분엔 move가 없기 때문에 구현부분에선 문제가 발생.
결론적으로 추상화를 하는 이유는 다음과 같다.
추상화된 코드는 구체화된 코드보다 "유연하다" , 즉 변경에 유리하다.
인터페이스
: 추상 메서드의 집합(프로그래밍 관점)
추상 클래스와 인터페이스 차이점
추상 클래스: 일반 클래스이지만 추상 메서드를 가진 클래스.
인터페이스: 구현된 것이 아무것도 없이 추상 메서드만 가진다.
말로만 하면 이해가 안가니까, 가장 큰 차이를 이야기를 해보자면,
차이점 : 추상클래스는 생성자 및 iv 가 존재하지만, 인터페이스는 구현한 것이 아무것도 없이 추상메서드만 나열
공통점: 추상메서드를 가진다.
인터페이스 구현
정의된 추상메서드의 완성이다.
class ClassName implements InterfaceName {
// 인터체이스에 정의된 추상메서드를 모두 구현해야 함
// 일부만 구현할 경우 미구현에 abstract붙여라
}
이 부분은 많이 어렵고, 예시를 통해서 이해를 하는 것이 제일 빨라보인다.
class Fighter extends Unit implements Fightable {
public void move(int x, int y) {}
public void atrack(Fightable f) {}
}
Unit u = new Fighter(); // 상속
Fightable f = new Fighter(); // 인터페이스
인터페이스의 장점
: 두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간역할(기계껍데기라고 생각하자.)
ex) GUI(Graphic User Interface)
알멩이가 바뀌어도 껍데기가 그대로면 사용에 아무 지장없다(변경에 유리)
선언(설계)와 구현을 분리시킬 수 있게 한다
(즉, Provider가 변경되도 User는 안바꾸고 쓰기가 가능하다. 이를 느슨한 결합이라고 한다.)
개발 시간을 단축시킬 수 있다.