1.상속
ㄴ extends : 확장하다. 연장하다
● 상속의 설명
다른 클래스가 가지고 있는 멤버(메소드,필드)들을 새로 작성할 클래스에 직접 만들지 않고,
상속을 받음으로써 새 클래가 자신의 멤버처럼 사용할 수 있는 기능
● 상속의 목적
클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약 정의
● 상속의 장점
① 보다 적은 양의 코드로 새로운 클래스 작성가능
② 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경 용이
③ 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여
● 사용방법
클래스간의 상속 시에는 extends 키워드 사용
[접근제한자] class 클래스명 extends 클래스명 { }
: 자식 : 부모
public class Academy extends Company
● 상속의 특징
① 모든 클래스는 Object클래스의 후손
② 부모 클래스의 생성자 초기화 블록은 상속 안됨
- 자식 클래스 생성시, 부모 클래스 생성자가 먼저 실행
- 자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시 하고 싶으면 super() 활용
③ 부모의 private 멤버는 상속은 되지만 직접 접근 불가
- super() 이용하여 전달 받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나
setter / getter메소드로 이용하여 접근
✔ super()가 뭐길래 ? 계속 super()을 사용하라는거지 ?
● super ( ) 설명
- 부모 객체 생성자를 호출하는 메소드로 기본적으로 후손 생성자에 부모 생성자 포함
아래 3개의 클래스가 있다.
사람에 필드안에 이름/ 나이 / 국적이 있다.
학생에 필드안에 이름/나이/국적/학번/반이 있다.
직장인에 필드안에 이름/나이/국적/회사명이 있다.
지금 위에 클래스 안에 '이름/나이/국적' 이 계속 반복 된다.
이런 부분을 계속 작성하는 것은 매우 효율적이지 않다!
그래서 상속을 이용하여, 다른 클래스에 있는 멤버들을 새로 만들 클래스 작성할 필요 없이 상속을 통해 받아 오면 된다.
그럼 필드에서 상속을 받았다. 그럼 상속 받은 것을 어떻게 사용할 것 인가 ?
기존과 같기 this.name = name;으로 작성하려고 하였으나 오류가 발생한다
그 이유는 부모 필드인 사람에 private 접근 제한자가 있어서
상속의 특징 ③에 작성했듯 직접 접근이 불가하여 super()을 이용하여 간접접근 방법을 사용해야한다.
또한 기본 생성자에는 super()를 작성해줄 필요가 없다
이유는 컴파일러가 컴파일 단계에서 자동으로 추가 되기 때문이다.
● 오버라이딩
자식 클래스가 상속 받은 부모메소드를 재 작성하는 것
ex) 부모한테 집을 받았는데, 집이 내 스타일이 아니다! 그렇다면 내가 내 스타일에 맞게 고친다! == 오버라이딩
위에 사용했던 예제를 다시 이용해서 설명을 해보자
Person으로 부터 상속 받은 메소드 중 move()메소드를 Employee에 메소드와 맞지 않다고 생각되어 재 정의하였다.
이 것이 오버라이딩이며, 오버라이딩을 사용시에는 메소드 위에 @Override 어노테이션을 작성 해줘야한다.
✔ @Override 어노테이션: 해당 메소드가 오버라이딩 되었음을 컴파일러/다른 개발자에게 알려주는 역할
만약, 부모인 Person에 .toString() 메소드를 오버라이딩한다면,
- toString() 메소드는 객체가 가지고 있는 모든 값(필드)을 하나의 문자열로 반환하는 용도의 메소드다.
아래와 같이 작성하면 된다.
@Override
public String toString() {
return name +"/"+age+"/"+nationality;
}
Empolyee에 toString를 아래와 같이 작성할 수 있다.
@Override
public String toString() {
return super.toString()+"/"+company;
}
Empolyeer객체를 만들어서 출력하게 되면
Employee emp = new Employee("김근로",26,"한국","00증권");
System.out.println(emp);
//출력 결과 : 김근로/26/한국/00증권
● 오버라이딩 성립조건
① 메소드 이름이 동일 해야한다.
② 반환형 동일 해야한다.
③ 매개변수 동일해야한다.
④ 접근제한자가 같거다 더 넓은 범위어야한다.
ex)부 protected -> 자 protected 또는 public
⑤ 예외처리 범위는 같거나 더 좁게
⑥ 부모의 private 메소드는 오버라이딩 불가 -> 자식이 직접 접근할 수 없기 때문이다.
아까 사람 / 학생 / 직장인 클래스 그림을 이용하면
사람이 부모였으며 학생 / 직장인이 자식의 관계였다. 그렇다면 사람의 부모는 누가 있을까 ? 바로 Object가 있다.
Object.toString()메소드 오버라이딩
- toString()메소드는 객체가 가지고 있는 모든 값(필드)을
하나의 문자열로 반환하는 용도의 메소드
★ 면접 단골 질문 ★
오버라이딩 오버로딩에 차이점을 설명하시오!
오버라이딩(Overriding) | 오버로딩(Overloading |
하위 클래스에서 메소드 정의 | 한 클래스내에서 메소드 여러 개 정의 |
메소드 이름 동일 매개변수 동일(개수, 타입, 순서) 리턴 타입 동일 |
메소드 이름 동일 매개변수 다름(개수, 타입, 순서) 리턴 타입 상관 없음 |
자식 메소드의 접근 범위가 부모 메소드의 접근 범위보다 넓거나 같아야 함 | 접근 제어자와 상관 없음 |
자식 메소드의 예외 수가 부모 메소드의 예외 수보다 적거나 범위가 좁아야 함 | 예외처리와 상관 없음 |
'ON > JAVA' 카테고리의 다른 글
15일차 _ 인터페이스 및 예외처리 (4) | 2023.05.09 |
---|---|
14일차_객체지향 복습 및 다형성/바인딩 (0) | 2023.05.04 |
12일차 객체지향에 대해서 복습 및 객체 실습 문제 (0) | 2023.05.02 |
11일차_객체지향 3번째 시간 (0) | 2023.05.01 |
10일차_ 객체지향 2번째 시간 (0) | 2023.04.28 |