일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 그래프
- AWS
- 백준 1987
- MySQL
- SQL
- 백준 17451번
- 명품자바
- SWEA 15612번
- 다이나믹프로그래밍
- react
- HUFS 모각코 캠프
- ubuntu
- javascript
- 자바
- 다이나믹 프로그래밍
- 백준
- 깃헙
- 알고리즘
- 백준 1253번
- 백준 18310번
- 백준 2512번
- 백준 16918번
- 그리디
- 머신러닝과 딥러닝
- 모각코
- java_programming
- Python
- 백준 15787번
- 백준 1331번
- 백준 3085번
- Today
- Total
차곡차곡
#5장 상속 본문
상속과 생성자
서브 클래스 (기본 생성자, 매개 변수를 가진 생성자) > 슈퍼 클래스 (기본 생성자)
※super()를 이용하여 명시적으로 슈퍼 클래스의 생성자 호출 (반드시 생성자 코드의 첫 라인에 와야 함)
객체의 타입 변환 : 업캐스팅과 다운캐스팅
[업캐스팅]
Person p; // 슈퍼 클래스
Stuendt s = new Student("소현"); // 서브 클래스
p = s; // 업캐스팅 발생
업캐스팅에 의해 레퍼런스 p는 Student 객체를 가리키고 있지만 Person 멤버만 접근 가능하다.
[다운캐스팅]
Student s = (Student)p; // 다운캐스팅 발생
instanceof 연산자
객체 레퍼런스 instanceof 클래스 타입
객체 레퍼런스가 가리키는 객체가 해당 클래스 타입이면 true, 아니면 false
오버라이딩
업캐스팅 되어도 가리키는 객체에 최종적으로 오버라이딩된 메소드 호출
[조건]
1. 슈퍼 클래스의 메소드와 완전히 동일한 메소드를 재정의
2. 슈퍼 클래스 메소드의 접근 지정자보다 접근의 범위가 좁아질 수 없다.
3. 메소드 오버라이딩에서 메소드 이름, 매개 변수 리스트는 같으나 리턴 타입만 다를 수 없다.
*static, private, final로 선언된 메소드는 오버라이딩될 수 없다.
동적 바인딩 : 오버라이딩된 메소드가 항상 우선적으로 호출된다.
오버라이딩과 super 키워드
super 키워드로 슈퍼 클래스 멤버 접근
super.슈퍼클래스의 멤버
this: 현재 객체의 주소(혹은 레퍼런스)
this(): 생성자에서 동일한 클래스 내의 다른 생성자 호출
super: 현재 객체 내에 있는 슈퍼 클래스 영역의 주소
super(): 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 선택 호출
추상 클래스
1. 추상 메소드를 포함하는 클래스로서 반드시 abstract로 선언되어야 함
2. 추상 메소드가 하나도 없지만 abstract로 선언한 클래스
3. 객체화 불가능
[추상 클래스의 상속]
1. 추상 클래스의 단순 상속
추상 클래스를 상속받아 추상 메소드를 구현하지 않으면 서브 클래스도 추상 클래스 >> 서브 클래스 abstract으로 선언해야 함
2. 추상 클래스 구현 상속
서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩) >> 서브 클래스 추상 클래스 아님
내장 클래스
클래스 안에 클래스 정의
외부 클래스 : 내부에 클래스를 가지고 있는 클래스
내부 클래스 : 클래스 내부에 포함되는 클래스
정적 내장 클래스 : 앞에 static이 붙어서 내장되는 클래스
비정적 내장 클래스 : static이 붙지 않은 일반적인 클래스
내부 클래스(inner class) : 클래스의 멤버처럼 선언되는 내장 클래스
외부 클래스의 인스턴스 변수와 메소드 전부 사용 가능
지역 클래스(local class) : 메소드의 몸체 안에서 선언되는 내장 클래스
무명 클래스(anonymous class) : 수식의 중간에서 선언되고 바로 객체화 되는 클래스
무명 클래스 : 상속
[상속]
class 클래스이름1 extends 부모클래스 {...}
부모클래스 변수 = new 클래스이름1();
↓
부모클래스 변수 = new 부모클래스() {...};
[구현]
class 클래스이름2 implements 인터페이스 {...}
인터페이스 변수 = new 클래스이름2();
↓
인터페이스 변수 = new 인터페이스() {...};
인터페이스
1. 멤버는 추상 메소드와 상수만으로 구성된다. (필드(멤버 변수) 선언 불가)
상수 (public static final 생략 가능), 메소드 (추상, default, private, static)
2. 인터페이스의 객체를 생성할 수 없다.
3. 다른 인터페이스에 상속될 수 있다. (인터페이스의 다중 상속 가능)
* 클래스는 인터페이스를 상속받을 수 없고 오직 인터페이스만이 상속이 가능하다.
4. 인터페이스 구현 (인터페이스의 추상 메소드를 클래스에서 구현하는 것) > implements 키워드로 구현
* 클래스는 인터페이스의 모든 추상 메소드를 구현해야 한다.
인터페이스 타입
인터페이스 내부에서 선언한 메소드들만 사용할 수 있다.
인터페이스와 구현 클래스 사용 방법
인터페이스 변수 = 구현객체;
interface RemoteControl rc = new Television();
람다식
이름이 없는 메소드
람다식을 사용하기 위해선 한 개의 추상 메소드만 갖고 있는 인터페이스가 필요하다.
구현해야 할 추상 메소드가 하나만 정의된 인터페이스를 함수 인터페이스라고 한다.
명시된 함수 인터페이스에 두 개 이상의 메소드가 선언되면 오류가 발생한다.
인터페이스명 변수 = (argument) -> {body}
'Language > JAVA' 카테고리의 다른 글
#7장 입출력 스트림 (0) | 2021.06.28 |
---|---|
#6장 패키지 개념과 자바 기본 패키지 (0) | 2021.06.28 |
#4장 클래스와 객체 (0) | 2021.06.28 |
#3장 반복문과 배열 그리고 예외 처리 (0) | 2021.06.28 |
#2장 자바 기본 프로그래밍 (0) | 2021.06.28 |