728x90
✨ 이 글은 [ 코드프레소 Java 웹 개발 체험단 활동 ] 내용입니다 ✨
💜 코드프레소 이러닝 강의 수강 중 - Java 프로그래밍 초급 💜
😎 아래의 링크를 통해 프리미엄 IT 교육 서비스, 코드프레소를 확인해보세요 😎
상속의 개념(Inheritance)
- 일반화된 특성이 정의된 클래스 -> 추상적
- 일반화된 특성을 모두 가지면서, specific한 특성까지 정의한 클래스 -> 구체화
- 상속을 하는 클래스 -> 부모/상위/기반 클래스
- 상속을 받는 클래스 -> 자식/하위/파생 클래스
- 일반화된 클래스(부모 클래스)를 재사용하여 새로운 specific한 클래스(자식 클래스)를 생성하는 것이다
- 자식 클래스는 부모 클래스의 모든 멤버변수와 메소드를 상속 받는다
- 상속은 여러 번 가능하기 때문에, 상속을 거듭할수록 자식 클래스의 멤버 변수와 메소드 개수는 같거나 늘어날 수도 있다
- 상속의 횟수는 제한이 없다 -> 여러 레벨로 상속이 가능하다!
- 객체 지향 프로그래밍을 구성하는 주요 특징 중 하나이다
- 클래스 간의 계층적 분류(hierarchical classifications)가 가능해진다
Java 로 상속 구현하기
- extends를 사용하여 부모 클래스의 멤버를 상속받아 확장시킬 수 있다
- 상속받은 멤버는 자식 클래스에서 별도로 선언하지 않는다
상속의 특징
- 클래스 간의 계층적 분류(hierarchical classification)가 가능해진다
- 상속받은 멤버는 자식 클래스에서 별도로 선언하지 않는다 -> 자식 클래스를 간결하게 유지 가능!
- 상속받은 멤버에 대한 코드는 부모 클래스에서 공통적으로 관리할 수 있다
상속의 장점
- 코드의 재사용성 증가
- 공통된 부분은 부모 클래스에 놓고, specific한 부분만 자식클래스에 추가하면 되기 떄문에 재사용성이 증가한다
- 클래스 간의 계층 구조에 따른 다형성(polymorphism)을 적용할 수 있다
단일 상속
- JAVA는 다중 상속을 허용하지 않는다 (다중 상속을 허용하는 언어도 존재함!)
- 즉, 하나의 클래스로부터만 상속을 받을 수 있다 -> 단일 상속만 허용
- 2개 이상의 클래스로부터 상속을 시도하면 에러 발생!
접근 제어자(access modifier)
- 외부로부터의 접근을 제한하기 위한 목적의 키워드
- 상속 관계에서의 접근을 제한하기 위해서도 사용된다
private 접근 제어자
- 외부로부터의 접근을 제한하기 위한 키워드
- 오직 같은 클래스 내에서만 접근이 가능하다
- 상속 받은 자식 클래스에서도 접근이 제한된다
- private 멤버 변수에 대해 외부 접근이 필요한 경우, 부모 클래스에 public getter, setter 메소드를 제공한다
protected 접근 제어자
- 외부로부터의 접근을 제한하기 위한 키워드
- 상속 받은 자식 클래스에서의 접근을 가능하게 한다
상속 관계의 접근 제어
- 자식 클래스에서의 접근을 제한하기 위해서는 private 을 사용한다
- 자식 클래스에서의 접근을 허용하기 위해서는 protected 를 사용한다
- 멤버 변수의 특성에 맞는 접근 제어자를 선택하는 것이 중요하다!
상속 관계에서 생성자는 어떻게 동작할까요?
- 부모 클래스의 생성자는 상속되지 않는다
- 자식 클래스의 객체를 생성 시, 부모 클래스의 기본 생성자를 자동으로 호출한다
- 최상위 부모 클래스의 생성자부터 한 단계 아래 자식으로 차례대로 호출한다
super 키워드
- Java에서 super 는 부모 클래스를 의미하는 키워드
- super( ); => 부모 클래스의 파라미터 없는 생성자를 호출한다
- 자식 클래스에서 부모 클래스 생성자를 명시적으로 호출하지 않으면, Java 컴파일러는 자식 클래스 생성자의 첫번째 라인에 super( ); 를 자동으로 삽입한다
- 굳이 super()를 쓰지 않아도 자바 컴파일러가 알아서 호출하는거임!
- 파라미터가 있는 부모 생성자는 Java 컴파일러가 자동으로 호출하지 않는다
- 파라미터가 있는 생성자를 호출할 때는 반드시 명시적인 선언이 필요하다
- 부모 클래스의 멤버 변수 또는 메소드 접근 시 super를 사용한다
- 자식 객체에서 부모 객체의 멤버 변수 또는 메소드 접근 시 super 사용
상속 관계의 생성자 정리!
- 상속 시 생성자는 상속되지 않는다
- super()는 파라미터가 없는 부모 클래스 생성자를 호출한다
- 자식 객체 생성자에서 명시적으로 부모 클래스 생성자를 호출하지 않는 경우 super()를 자동으로 호출한다
- 파라미터가 있는 부모 객체 생성자는 명시적으로 호출해야 한다
- super는 부모 클래스를 지칭한다 (this는 자기 자신을 지칭)
- super.oo 으로 부모 클래스의 멤버 변수 또는 메소드에 접근이 가능하다
메소드 오버라이딩(method overriding)
- 부모 클래스로부터 상속받은 메소드를 자식 클래스가 자신만의 특성에 맞게 새롭게 구현하는 것
- 이름도 파라미터도 같지만, 다른 동작을 수행하는 것
- 오버라이딩을 통해 코드의 간결성을 유지하면서 내용을 확장시킬 수 있다!
메소드 오버라이딩의 조건
- 오버라이딩하는 부모 클래스의 메소드와 이름이 같아야 한다
- 오버라이딩하는 부모 클래스의 메소드와 파라미터가 같아야 한다
- 오버라이딩하는 부모 클래스의 메소드와 리턴 타입이 같아야 한다
다형성 실습
- 다형성 : 다양한 형태를 가질 수 있는 성질
- 자바에서는 특정 타입의 참조 변수가 때에 따라서 여러 객체를 참조할 수 있다!
- 부모 객체가 자식 객체 타입을 참조할 수 있으므로 다형성의 장점을 살릴 수 있다
- 예를 들어 부모 객체를 파라미터로 받는 메소드를 작성한다고 해보자
- 자식 객체에는 부모 객체의 메소드를 자신의 특성에 맞춰 오버라이딩한다
- 그리고 한 메소드에서 오버라이딩한 메소드를 호출한다고 하자!
- 그럼 부모 객체를 파라미터로 받아서 메소드를 호출하기 때문에 굳이 코드를 여러 번 작성하지 않아도 각각의 특성에 맞는 오버라이딩한 메소드가 출력된다!
public void processLogin(User user) {
System.out.println("process something before login");
user.login();
user.enterPage();
System.out.println("process somethig after login");
}
만약 요런식으로 작성했다고 해보자
여기서 User 객체가 부모 객체고, 해당 메소드 호출은 다음과 같이 한다
그럼 결과는 아래와 같다!
동일한 메소드를 호출해도 각각 다른 동작을 수행할 수 있게 되는 것이다!
728x90
'코드프레소 체험단 > Java 프로그래밍' 카테고리의 다른 글
[Java 프로그래밍 초급] 객체지향 고급 (2) (0) | 2022.01.21 |
---|---|
[Java 프로그래밍 초급] 컬렉션 프레임워크의 개념 (0) | 2022.01.20 |
자바, 인텔리제이 꿀팁! (0) | 2022.01.20 |
[Java 프로그래밍 초급] 객체지향 기초개념 (3) (0) | 2022.01.20 |
[Java 프로그래밍 초급] 객체지향 기초개념 (2) (0) | 2022.01.20 |
댓글