Java의 정석 기초편
Chapter 7 객체지향 언어Ⅱ
1. 상속
상속이란? 기존 클래스를 재사용해 새로운 클래스를 작성하는 것.
새로 작성하는 클래스 이름 뒤에 상속받으려는 클래스 이름을 'extends'와 함께 작성. ex) class Child extends Parent {}
장점: 코드를 공통적으로 관리. 재사용성을 높이고 코드 중복 제거. 프로그램의 생산성과 유지보수 기여.
자손 클래스는 조상클래스의 모든 멤버를 상속받는다. (단, 생성자와 초기화 블럭은 상속되지 x)
조상 클래스가 변경되면 자손 클래스는 자동으로 영향을 받음.
자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다. (상속을 받는다는 것은 조상 클래스를 확장한다(extend)는 의미로 해석 o.)
2. 클래스 간의 관계 - 포함관계
상속 외에 클래스를 재사용하는 방법: 클래스 간의 포함관계를 맺어주는 것. → 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것. ex) class Circle { Point c = new Point(); int r; }
3. 클래스 간의 관계 결정하기
클래스를 작성할 때 상속관계를 맺어 줄 지, 포함관계를 맺어 줄 지 결정하는 법? is-a, has-a 문장 만들어보기
원은 점이다. Circle is a Point. (x)
원은 점을 가지고 있다. Circle has a Point. (o) → 포함관계
SportsCar is a Car. (o) → 상속관계
SportsCar has a Car. (x)
4. 오버라이딩
조상클래스로부터 상속받은 메서드의 내용을 변경하는 것.
조건1. 선언부(메서드 이름, 매개변수, 반환타입)가 조상 클래스의 메서드와 일치해야 함.
조건2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경x. public > protected > (default) > private
조건3. 예외는 조상 클래스의 메서드보다 많이 선언x.
오버로딩 vs 오버라이딩
오버로딩(overloading)은 기존에 없는 새로운 메서드를 추가하는 것, 오버라이딩(overriding)은 조상으로부터 상속받은 메서드의 내용을 변경하는 것.
5. 참조변수 super
super는 자손클래스에서 조상클래스로부터 상속받은 멤버를 참조하는데 사용.(멤버변수와 지역변수의 이름이 같을 때 this를 붙여 구별했듯, 상속받은 멤버와 자신의 멤버와 이름이 같을 때 super를 붙여 구별.)
6. super() - 조상의 생성자
this()처럼 super()도 생성자. this()는 같은 클래스의 다른 생성자를 호출, super()는 조상의 생성자를 호출.
7. 제어자
접근제어자: public, protected, default, private
그외 제어자: static, final, abstract, native, transient, synchronized, volatile, strictfp
static- 클래스의, 공통적인. 멤버변수, 메서드, 초기화 블럭에서 사용 가능.
final- 마지막의, 변경될 수 없는. 클래스, 메서드, 멤버변수, 지역변수에서 사용 가능. (변수에 사용되면 값을 변경할 수 없는 상수가 되고, 메서드에 사용되면 오버라이딩 불가, 클래스에 사용되면 자신을 확장하는 자손클래스를 정의 불가.)
abstract- 미완성. 클래스, 메서드에서 사용 가능. 클레스에 사용되면 추상메서드가 선언되어있음을 의미, 메서드에 사용되면 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드를 선언하는데 사용.
접근제어자- 멤버 또는 클래스에 사용. 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한.
8. 캡슐화와 접근제어자
접근제어자를 사용하는 이유? 외부로부터 데이터를 보호하기 위해서 + 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서. → 데이터 감추기, 객체지향개념의 캡슐화
9. 다형성
다형성? 여러가지 형태를 가질 수 있는 능력. 조상클래스 타입의 참조변수로 자손클래스의 인스턴스 참조 가능.
- 조상 타입의 참조변수로 자손타입 인스턴스 참조 가능.
- 반대로 자손타입의 참조변수로 조상타입의 인스턴스 참조 불가.
class Tv {
boolean power;
int channel;
void power() {...}
void channelUp() {...}
void channelDown() {...}
}
class CaptionTv extends Tv {
String text;
void caption() {...}
}
CaptionTv c = new CatpionTv(); // 참조변수와 인스턴스 타입 일치
Tv t = new CaptionTv(); // 조상타입 참조변수로 자손타입 인스턴스 참조
//CaptionTv c = new Tv(); // 불가. 실제 인스턴스인 Tv의 멤버 개수보다 참조변수 c가 사용할 수 있는 멤버 개수가 더 많기 때문.
둘 다 같은 타입의 인스턴스이지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라짐.
10. 참조변수의 형변환
상속관계에 있는 클래스 사이에서 자손타입의 참조변수를 조상타입의 참조변수로(생략가능) , 조상타입의 참조변수를 자손타입의 참조변수로 형변환(생략 불가) 가능. 형변환을 하는 이유는 사용할 수 있는 멤버 개수를 조절하기 위함.
11. 추상클래스
추상클래스: 미완성 설계도에 비유. 클래스가 미완성이라는 것은 추상 메서드를 포함한다는 의미. 인스턴스 생성 불가. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성. 키워드 abstract 붙임.
추상메서드: 메서드의 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 것. 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상클래스에서는 선언부만을 작성. 키워드 abstract 붙이고 구현부가 ㅇ벗으므로 괄호{} 대신 문장의 끝을 알리는 ';'을 적어줌.
상속이 자손클래스를 만드는데 조상 클래스를 사용하는 것이라면, 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상 클래스를 만드는 것.
12. 인터페이스
인터페이스는 일종의 추상클래스. 밑그림만 그려져있는 기본설계도에 비유. 추상화 정도가 높아서 오직 추상메서드와 상수만을 멤버로 가질 수 있음.
조건1. 모든 멤버변수는 public static final이어야 하며, 생략 가능.
조건2. 모든 메서드는 public abstarct 이어야하며, 생략 가능. (단, static 메서드와 default 메서드는 예외. JDK1.8부터)
*참고: interface에 static method와 default메서드를 허용한 이유
[모던 자바] 디폴트 메서드(default method)란?
디폴트 메서드(default method)란? 보통 인터페이스는 규칙을 잡거나, 서비스의 플로우 로직을 잡는 데 사용하곤 한다. 하지만 인터페이스를 구현하는 클래스에서는 메서드를 모두 구현해야하기 때
devbksheen.tistory.com
인터페이스 상속: 인터페이스는 인터페이스로부터만 상속받을 수 있음. 다중상속 가능.
인터페이스 구현: 추상클래스와 마찬가지로 그 자체로는 인터페이스 생성 불가. 'implements' 붙임. 인터페이스에 정의된 추상메서드를 모두 구현해야함. 일부만 구현한다면 'abstract'를 붙여 추상클래스로 선언해야함.
상속과 구현 동시 가능.
인터페이스를 이용한 다형성
해당 인터페이스 타입의 참조변수로 이를 구현한 인스턴스 참조 가능. ex) Fightable f = new Fighter();
인터페이스 타입으로의 형변환 가능. ex) Fightable f = (Fightable) new Fighter();
인스턴스 타입의 매개변수 가능(→메서드 호출시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 의미). ex) public void attack(Fightable f) {...}
메서드의 리턴타입으로 인터페이스 지정 가능.(메서드가 해당 인스턴스를 구현한 클래스의 인스턴스를 반환한다는 의미) ex) Fightable method(){ return new Fighter(); }
13. 내부클래스(inner class)
내부클래스는 클래스 내에 선언된 클래스.
장점: 내외부 클래스의 멤버들 간에 서로 쉽게 접근. 코드의 복잡성 줄임.(캡슐화)
종류: 인스턴스 클래스, 스태틱 클래스, 지역 클래스, 익명 클래스
익명클래스: 클래스 선언과 객체 생성을 동시에 하는 일회용 클래스. 이름이 없기 때문에 생성자도 x. 단 하나의 클래스를 상속받거나 하나의 인터페이스만 구현 가능.
'공부일기 > JAVA' 카테고리의 다른 글
JAVA 공부일기1-10 (0) | 2023.04.26 |
---|---|
JAVA 공부일기1-9 (0) | 2023.04.25 |
JAVA 공부일기1-7 (0) | 2023.04.22 |
JAVA 공부일기1-6 (0) | 2023.04.19 |
JAVA 공부일기1-5 (0) | 2023.04.18 |
댓글