상속
- 일반화된 특성이 정의된 클래스와 일반화된 특성을 모두 가지면서 specific한 특성까지 정의된 클래스도 존재한다고 가정하자.
- 일반화된 특성이 정의된 클래스가 Specific한 특성까지 정의된 클래스에 상속을 하게 되면 일반화 클래스의 멤버 변수뿐만 아니라 자기 자신의 변수마저 가지게 된다.
- 상속 관계에서 상속을 하는 클래스를 부모, 상위, 기반 클래스라 하며, 상속을 받는 클래스를 자식, 하위, 파생 클래스라고 표현을 한다.
상속의 개념
- 일반화된 클래스를 재사용하여 새로운 specific한 클래스를 생성하는 것
- 자식 클래스는 부모 클래스의 모든 멤버변수와 메소드를 상속받는다.
- 상속을 거듭할수록 자식 클래스의 멤버 변수와 메소드 개수는 같거나 늘어난다.
- 상속의 횟수는 제한이 없다.
- 클래스 간의 계층적 분류가 가능하다.
Java로 상속 구현하기
extends 키워드를 사용하여 부모 클래스의 멤버를 상속받아 확장시킬 수 있다.
class 자식 클래스명 extends 부모 클래스명 {
자식 클래스 코드;
}
※ 가끔 순서를 헷갈리는 사람이 많다. (나또한...ㅎ) 그러니 주의해서 사용
상속의 장점
- 코드의 재사용성 증가
- 클래스 간의 계층 구조에 따른 다형성 적용 가능
아마 객체지향 프로그래밍을 하면 이 상속의 개념이 정말 많이 사용되고 중요하다. 바로 위에 작성한 장점들 때문이다.
private 접근 제어자
- 외부로부터의 접근을 제한하기 위한 키워드
- 오직 같은 클래스 내에서만 접근이 가능하다.
- 상속받은 자식 클래스에서도 접근이 제한된다.
- private 멤버 변수에 대해 외부 접근이 필요한 경우, 부모 클래스에 public getter, setter 메소드를 제공
protected 접근 제어자
- 외부로부터의 접근을 제한하기 위한 키워드
- 상속받은 자식 클래스에서의 접근을 가능하게 한다.
private와 protected 접근 제어자의 공통점과 차이점
공통점
- 두 키워드가 외부로부터의 접근을 제한하기 위한 키워드
- 상속받은 자식 클래스에서도 접근이 제한된다.
차이점
- private는 상속 관계에서 자식 클래스가 부모 클래스에 속성을 사용할 수 없다.
- 다만 protected는 getter, setter로 사용된 메소드를 이용하여 접근을 할 수 있다.
- 즉, 상속 관계에서 접근을 허용하기 위해 protected, 상속 관계에서도 제한하기 위해 private를 사용한다.
상속 관계의 생성자
- 만약 상속 관계가 이렇게 되어있다고 가정하자.
- 그럼 생성자의 호출 순서는 부모 클래스부터 시작된다.
- User -> EnterpriseUser -> UniversityUser 순으로 출력된다.
- 허나 실행순서는 자식부터 실행된다.
- 부모 클래스의 생성자는 상속되지 않는다.
- 자식 클래스의 객체를 생성 시, 부모 클래스의 기본 생성자를 자동으로 호출
- 최상위 부모 클래스의 생성자부터 한 단계 아래 자식으로 차례대로 호출
Super 키워드
- Java에서 super는 부모 클래스를 의미하는 키워드이다.
- 부모 클래스의 파라미터 없는 생성자를 호출
- 자식 클래스에서 부모 클래스 생성자를 명시적으로 호출하지 않으면, Java 컴파일러는 자식 클래스 생성자의 첫 번째 라인에 super(); 를 자동으로 삽입
- 파라미터가 있는 부모 생성자는 Java 컴파일러가 자동으로 호출하지 않음
- 파라미터가 있는 생성자를 호출할 때는 반드시 명시적인 선언이 필요함
- 부모 클래스의 멤버 변수 또는 메소드 접근 시 super.메소드() 사용
메소드 오버라이딩(method overriding)
부모 클래스로부터 상속받은 메소드를 자식 클래스가 자신만의 특성에 맞게 새롭게 구현하는 것
메소드 오버라이딩의 조건
오버라이딩하는 부모 클래스의 메소드와 이름, 파라미터, 리턴타입이 같아야 한다.
Java의 타입 체킹
- Java는 타입 간의 호환에 매우 엄격한 언어
PaidUser luke = new EnterpriseUser();
- 과연 이 코드는 에러가 발생하지 않을까?
- 발생한다. 일반 자료형이 아니더라도 객체나 클래스의 타입이 서로 다르면 에러가 발생한다.
- 기본적으로 서로 다른 타입의 객체를 참조할 수는 없다.
- 그러나 예외의 경우가 있는데, 바로 부모 타입의 참조 변수는 자식 타입의 객체를 참조 가능하다.
- 즉, Java에서는 부모 클래스의 참조 변수가 자식 클래스의 객체를 참조할 수 있다.
부모 부모타입 참조변수 = new 자식();
- 이런 식으로 선언은 가능하다.
- 반대로 부모가 자식의 참조 변수내에 속성은 접근 불가하다.
다형성(polymorphism)
- 사전적 정의: 다양한 형태를 가지는 성질
- 객체지향의 주요 특성 중에서 가장 중요한 개념이다.
- 동일한 사물이 때에 따라 서로 다른 기능을 할 수 있는 것
- 하나의 타입이 때에 따라 여러 종류의 객체의 특성을 가질 수 있는 것
- 여러 종류의 객체를 참조할 수 있는 것 - 같은 형태의 메소드가 때에 따라 다양한 동작을 수행한다.
- Java 에서는 다음 특성을 이용하여 다형성을 구현할 수 있음
- 부모 클래스의 참조 변수가 자식 클래스의 객체를 참조할 수 있다.
- 메소드 오버라이딩
다형성의 구현
- 각 클래스의 멤버 변수를 초기화하는 생성자 구현
- 부모 클래스의 login()을 각 자식 클래스에서 오버라이드
왜 다형성을 사용하는가?
- SW 요구사항 변경이나 추가에 대해 유연한 설계가 가능
- 요구사항 추가되었을 시 기존 코드의 변경이 최소화된다.
- 확장 가능한 소프트웨어를 개발할 수 있다.
- 유지보수 측면이 좋다.
자바 컬렉션 프레임워크
- 여러 건의 데이터를 다루기 위해서는 Array와 같은 데이터를 다루기 위한 자료구조의 구현가 필요
- 다양한 특성을 가진 데이터를 다루기 위해서는 그에 적합한 자료구조 필요
- 다양한 자료구조의 구현을 위한 클래스와 인터페이스의 집합
컬렉션 프레임워크의 필요성
- 다양한 데이터를 위한 자료구조의 구현체 필요
- 저장되는 데이터에 순서가 존재
- 중복되는 데이터가 저장될 수 있음
'Java' 카테고리의 다른 글
Java - 객체지향 설계, 클래스, 생성자, 메소드 오버로딩 (2) | 2022.01.21 |
---|---|
Java 입문 (제어문 및 연습문제 리뷰) (2) | 2022.01.17 |
Java 입문 (자료형 및 연산자) (2) | 2022.01.17 |