회고록 블로그
[공부 필기] Java 기본 공부하기 (17) 본문
공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의.
링크 : https://cafe.naver.com/cstudyjava
1. 상속 마무리 - 상속의 장점
- 상속은 연관된 일련의 클래스들에 대해 공통적인 규약을 정의하고 적용할 수 있음
- 즉, 상속 관계로 묶으면 공통적인 부분을 간편하고 효율적으로 구현할 수 있다는 얘기
- 예시
→ 재고관리 클래스(ManagingStock)에 공통적으로 적용해야하는 멤버 정의해놓음 (e.g. 입고날짜, 재고명 등)
→ 야채 클래스(Vegetable)에는 "최초 입고량"이 반드시 입력되어야 하고
→ 어류 클래스(Fish)에는 "신선도"가 반드시 입력되어야 한다고 가정
→ 야채 클래스(Vegetable)에는 신선도가 입력될 필요가 없고, 어류 클래스(Fish)에는 최초 입고량이 입력될 필요가 없다고 가정
→ 코드
→ 상속을 이용했기 때문에 공통의 정보(입고날짜, 재고명, 고유번호, 공급사 등)을 중복해서 작성할 필요가 없음
* e.g. Vegetable 클래스와 Fish 클래스에 공통의 정보(입고날짜 등)를 각각 변수로 넣어줄 필요가 없음
→ 또한 showRecentInfo 메소드를 오버라이딩했기 때문에 더 간단해짐
* 만약, 메소드 오버라이딩이 없었다면 Vegetable과 Fish에는 같은 이름의 메소드가 존재하지 못했을 것임
(e.g. Vegetable에는 메소드명을 showRecentVegetable이라고 짓고 Fish에는 showRecentFish 등으로 지어야했을지도)
* 그럼 if문을 통해 인스턴스가 Vegetable인지 Fish인지 구분 후 -> 각각 인스턴스의 메소드를 호출해야함
(e.g. if문을 통해 인스턴스 확인한 후 -> 인스턴스가 Vegetable이면 showRecentVegetable 메소드 호출 -> 인스턴스가 Fish이면 showRecentFish 메소드 호출)
- 이렇게 상속은 굉장히 유용하게 사용할 수 있음
2. Object 클래스와 final 선언과 @Override
2.1. Object
- 클래스가 아무것도 상속하는게 없다면 (=개발자가 extends 키워드를 사용하지 않음) Java 컴파일러가 자동으로 java.lang.Object 클래스를 상속하게 만들어줌
- 만약 extends 키워드를 사용해서 B 클래스를 상속하도록 만들었다면 A 클래스는 Object 클래스를 직접 상속하지는 않음
class A extends B { ... }
- 대신 B 클래스가 Object 클래스를 상속함
→ 만약 B 클래스도 다른 클래스(= C 클래스라고 가정)를 상속하고 있다면, B 클래스는 Object 클래스를 직접 상속하지 않음
대신 C 클래스가 (컴파일러에 의해서) Object 클래스를 상속함
→ 만약 C 클래스도 다른 클래스(= D 클래스라고 가정)를 상속하고 있다면, D 클래스가 (컴파일러에 의해) Object 클래스를 직접 상속함
- 결국, 클래스들의 상속 관계를 역으로 찾아 올라가다보면 최초의 클래스에는 Object 클래스가 있음
→ 정리하자면 Java의 모든 클래스는 Object 클래스를 직.간접적으로 상속하게 되어있음
- 클래스들이 이런 관계로 구성되어 있기 때문에 Java의 모든 클래스에 공통적으로 적용하는 규약은 Object 클래스에 정의되어 있음
- Object 클래스의 멤버 변수와 메소드는 아래와 같음
- 그림1과 같이 파라미터가 Object 타입으로 존재하면
→ 파라미터 값으로 "모든 클래스"가 전달될 수 있음(=모든 타입을 전달할 수 있음)
→ 하지만.. 무분별하게 파라미터로 Object 타입을 전달하면 안되는 듯함 (= 참고 자료)
참고 자료 :
2.2. final 선언
- final 키워드는 "최초의 값을 할당하면 그 이후에는 값의 변경이 불가능'하도록 하는게 컨셉임
- 클래스를 대상으로도 final 키워드를 사용할 수 있음
- 클래스에 final 키워드를 사용하면
→ '이 클래스는 다른 클래스가 상속할 수 없음'을 의미함
→ 사용 예시
public final class Coffee { ... }
- 메소드에도 final 키워드를 사용할 수 있음
- 메소드에 final 키워드를 사용하면
→ '이 메소드는 다른 클래스에서 오버라이딩 할 수 없음'을 의미함
→ 사용 예시
final void printResult() { ... }
2.3. @Override
- @Override가 없어도 컴파일은 가능함 하지만 있으면 안정성을 부여할 수 있음
- @Override를 붙이면 컴파일러에게 "부모 클래스의 메소드를 오버라이딩 할것이다"라는 목적을 명확하게 알리는 역할을 함
→ 만약 @Override를 붙여놓고 메소드 오버라이딩을 하지 않는다면 컴파일러는 에러 메시지를 던짐
- @Override가 왜 필요한가?
→ 위에서 말했듯이 없어도 되지만 일종의 안정성을 부여하는 역할임
- 예시
→ 유의사항!
* 본 예시에서 개발자는 '메소드 오버라이딩을 구현하려고 했다'고 가정함
하지만 실수를 한 상황이라고 가정
→ 그림2와 같이 부모 클래스 ManagingStock 에게는 showRecentInfo() 라는 메소드가 있음
* 메소드명 : showRecentInfo
* 파라미터 : 없음
→ 그림3과 같이 자식 클래스 Fish에는 같은 이름을 가진 메소드가 있음. 하지만 파라미터(매개변수)는 다름
* 메소드명 : showRecentInfo
* 파라미터(매개변수) : int today
→ 이때, 메인 메소드에서 showRecentInfo를 호출한다고 가정하면 아래와 같은 상황이 됨 (그림4 참고)
→ ManagingStock 클래스의 showRecentInfo 메소드와 Fish 클래스의 showRecnetInfo 메소드는 파라미터(매개변수)가 다르기 때문에 메소드 오버라이딩이 아닌 메소드 오버로딩이 되어버림
* 메소드 오버라이딩을 하려고 했으나 실수로 오버로딩이 되어버린 상황임
→ 이때, @Override가 유용해짐
→ 오버라이딩을 하려고 계획한 메소드에 @Override를 추가하면 컴파일러에게 "메소드 오버라이딩을 할 것"이라고 알리게 됨
그리고 개발자가 오버라이딩을 하지 않으면 컴파일러가 에러 메시지를 발생시켜줌
→ 즉, 위의 예시에서 @Override를 추가해보면 아래와 같이 에러가 발생함
'2. 프로그래밍 언어 공부 > Java' 카테고리의 다른 글
[공부 필기] Java 기본 공부하기 (19) (0) | 2021.11.22 |
---|---|
[공부 필기] Java 기본 공부하기 (18) (0) | 2021.11.17 |
[공부 필기] Java 기본 공부하기 (16) (0) | 2021.11.16 |
[공부 필기] Java 기본 공부하기 (15) (0) | 2021.11.10 |
[공부 필기] Java 기본 공부하기 (14) (0) | 2021.11.09 |