티스토리 뷰
1. 자바의 상속 이란?
- 객체 지향 프로그램에서 상속은 현실 세계 처럼 부모가 자식에게 물려주는 의미로 부모 클래스의 멤버나 메소드를 자식의 클래스에게 물려주는 것을 의미한다.
- 상속을 사용함으로 공통된 특징을 가지는 클래스에서 코드 중복을 줄여주고 부모 클래스의 멤버를 재사용 하면서 자식클래스의 간결함을 유지 시켜준다.
- 부모 클래스의 수정으로 모든 자식 클래스들의 수정 효과를 가져오기 때문에 유지 보수 시간이 감소한다.
- 공통적인 기능을 부모 클래스에 추가해주면 상속 받은 여러 개의 자식 클래스에서 사용이 가능하기 때문에 확장성이 용이하다.
- 클래스간의 계층적 분리를 도와줘 분류, 관리의 이점이 있다.
상속의 특징
- 자바에서 부모 클래스를 super class라 하고 자식 클래스를 sub class라고 한다.
- 상속 시 'extends' 키워드 사용한다. → 자바는 다중 상속을 지원하지 않는다.
- 하나의 부모 클래스(Parent class)는 여러 개의 자식 클래스(Children)를 가질 수 있다.
- 부모 클래스로 부터 상속 받은 자식 클래스는 부모 클래스의 자원을 모두 사용할 수 있다.
- 부모 클래스는 자식 클래스의 자원을 가져다 쓸 수 없다.
- 자식 클래스는 부모 클래스로 부터 물려받은 자원을 Override 할 수 있다.
- 부모 클래스가 상속받은 자원도 자식클래스가 사용 가능하다.
- 자바의 최 상위 클래스는 Object이므로, 자바의 모든 클래스는 Object의 자손이다.
상속 방법
1. 선언(extends)
class (자식) 클래스명 extends (부모) 클래스명 { ... }
2. 다중 상속 불가
class (자식)클래스 extends (부모)클래스1, (부모)클래스2 { ... } // 불가!!!!
2. super 키워드
- super 키워드는 부모 클래스로 부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는데 사용하는 참조 변수 이다.
- 인스턴스 변수의 이름과 지역 변수의 이름이 같을 경우 인스턴스 변수 앞에 this 키워드를 사용하여 구분할 수 있듯이, 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별할 수 있다.
- 자바에서는 super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있다. this 와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드 뿐이며, 클래스 메소드에서는 사용할 수 없다.
- super() 메소드는 부모 클래스의 생성자를 호출할 때 사용된다. super() 를 통해 부모의 기본 생성자를 호출한다.
3. 메소드 오버라이딩
- 오버라이딩(Overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것을 의미한다.
- 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받는다. 이렇게 상속 받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의 하여 사용할 수도 있다.
- 즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미한다.
- 이렇게 재 정의를 할 경우 부모의 메소드는 은닉되고 자식의 메소드가 호출된다.
오버라이딩의 조건
- 부모의 메소드와 동일한 형태여야 한다. (리턴 타입, 이름, 매개변수)
- 부모 클래스의 메소드보다 접근 제한자를 더 좁은 범위로 변경할 수 없다.
- 부모 클래스의 메소드 보다 더 큰 범위의 예외를 선언할 수 없다.
public class Person {
public void getInfo() {
System.out.println("Person 입니다.");
}
}
public class AIPerson extends Person {
@Override
public void getInfo(){
System.out.println("AIPerson 도 Person 일까");
}
}
4. 다이나믹 메소드 디스패치(Dynamic Method Dispatch)
- 메소드 디스패치란, 어떤 메소드를 호출할지 결정하는 과정을 의미한다.
- Static Dispatch: 컴파일 시점에서, 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고 있는 경우이다. 런타임(실행 시점)이 되지 않아도 미리 결정하는 개념이다.
- Dynamic Dispatch: 정적 디스패치와 반대로 컴파일러가 어떤 메소드를 호출하는지 모르는 경우이다. 동적 디스패치는 호출할 메소드를 런타임 시점에서 결정한다.
public class Phone {
public void type() {
System.out.println("Phone 입니다.");
}
}
public class Apple extends Phone{
@Override
public void type(){
System.out.println("Apple phone 입니다.");
}
}
public class Main {
public static void main(String[] args){
Phone phone = new Phone(); // Phone 참조 Phone 객체
Phone applePhone = new Apple(); // Phone 참조, Apple 객체
phone.type(); // 참조와 객체가 동일하다.
applePhone.type(); // 참조와 객체가 다르다(상속) => 다이나믹 메소드 디스패치
}
}
5. 추상 클래스
- 추상 클래스란 하나 이상의 추상 메소드를 포함하는 클래스이다.
- 추상 메소드의 경우 선언만 존재하고 따로 구현이 되어 있지 않다. 구현은 함수의 본체에서 하고 선언 부에 abstract 키워드를 넣어준다.
- 추상 메소드의 접근 지정자로는 private 불가능하다. why? private 지정 시 다른 클래스가 상속을 받을 수 없다.
- 추상 클래스는 다른 클래스에서 공통으로 가져야 하는 메소드를 정의해 준다.
- 어떤 추상클래스를 상속 받은 자식 클래스에서 추상 메소드를 구현하지 않았다면 자식 클래스도 추상 클래스가 되어야 한다.
abstract class Person {
public String personName;
public void getInfo() {
System.out.println("Person 입니다.");
}
abstract void getBloodType();
}
class AIPerson extends Person{
public void getInfo(){
System.out.println("AI Person 입니다.");
}
void getBloodType(){
System.out.println("AI Person은 Blood Type이 정의되지 않습니다.");
}
}
추상 클래스와 일반 클래스의 차이
- 추상 클래스는 추상 메소드를 포함하고 객체화가 불가능하다는 점만 제외하면 일반 클래스와 다르지 않다.
- 추상 클래스는 일반 클래스와 마찬가지로 생성자, 멤버 변수, 일반 메서드를 가질 수 있다.
6. Final 키워드
- final 키워드는 변수(variable), 메소드(method), 또는 클래스(class)에 사용될 수있다.
- final 키워드는 어떤 곳에 사용되냐에 따라 다른 의미를 가진다. 하지만 final 키워드를 붙이면 무언가를 제한한다는 의미를 가진다.
Final 클래스란?
- 클래스를 선언시 앞에 final 키워드를 붙이면 final 클래스가 되는데 이는 수정이 불가능한 클래스를 의미한다.
- final 키워드를 클래스에 붙이면 상속 불가능 클래스가 된다. 즉, 다른 클래스에서 상속하여 재정의를 할 수 없다는 것을 의미한다.
Final 메소드란?
- 메소드에 final을 붙이면 클래스에 final이 붙지 않은 경우 클래스는 상속이 가능하지만, 재 정의(override)를 제한한다.
Final 변수란?
- 변수에 final을 붙이면 이 변수는 수정할 수 없다는 의미를 가진다. 수정될 수 없기 때문에 초기화 값이 필수적이다. 만약에 객체안의 변수라면 생성자, static 블럭을 통한 초기화 까지는 허용한다.
7. Object 클래스
- 자바의 모든 클래스는 암묵적으로 Object클래스를 상속 받고 있다. 즉, Object는 모든 클래스의 조상이다.
- Object 클래스에는 다양한 메소드가 존재하는데, 어떤 클래스에서도 이 메소드를 호출할 수 있다.
Object 클래스 대표 메소드
- equals(): 두 객체가 동일한 객체라면 true 를 리턴하고, 다르다면 false를 리턴한다.
- hashCode(): 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴한다.
- toString(): 객체의 문자 정보를 리턴한다. 즉, 객체를 문자열로 표현한다.
- 그외:
- clone()
- finalize()
- getClass()
- notify()
- wait()
'Study > Java' 카테고리의 다른 글
[스터디 7주차] import 키워드 (0) | 2022.01.22 |
---|---|
[스터디 7주차] package 키워드 (0) | 2022.01.22 |
[스터디 5주차] 클래스 (0) | 2022.01.09 |
[스터디 4주차] Queue (0) | 2022.01.02 |
[스터디 4주차] LinkedList로 Stack 구현 (0) | 2022.01.02 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 데이터베이스
- 자료구조와알고리즘 23강
- 프로세스 주소공간
- https
- 자료구조
- CS.
- 리스트함축
- CS 스터디
- 이차 리스트
- 프로그래머스
- 정렬
- SW
- 운영체제
- 프로그래머스강의
- 리스트 복사
- 보험
- Greedy sort
- It
- 알고리즘
- 네트워크
- 자바
- 리스트
- 스터디
- 코드업 기초
- 파이썬
- 리스트2
- 완전탐색
- 이진탐색
- 연결리스트활용
- CS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함