회고록 블로그

[공부 필기] Java 기본 공부하기 (17) 본문

2. 프로그래밍 언어 공부/Java

[공부 필기] Java 기본 공부하기 (17)

김간장 2021. 11. 16. 23:07

공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의.

링크 : https://cafe.naver.com/cstudyjava

 

윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페

윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^

cafe.naver.com

 


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 타입으로 존재하면

   → 파라미터 값으로 "모든 클래스"가 전달될 수 있음(=모든 타입을 전달할 수 있음)

[그림1] Object 클래스의 일부

   → 하지만.. 무분별하게 파라미터로 Object 타입을 전달하면 안되는 듯함 (= 참고 자료)

 

참고 자료 :  

https://hashcode.co.kr/questions/8936/%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A1%9C-object-o%EB%A5%BC-%EB%B0%9B%EC%9C%BC%EB%A9%B4-%EB%AD%98-%EC%9D%98%EB%AF%B8%ED%95%98%EB%8A%94%EC%A7%80-%EB%AA%A8%EB%A5%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4

 

매개변수로 Object o를 받으면 뭘 의미하는지 모르겠습니다.

public int compareTo(Object o) CircleTwo c = (CircleTwo) o; 여기서 CompareTo의 매개변수 Object o가 뭘 가르키는지 모르겠습니다.그리고 둘째 줄에서 (CircleTwo) o를 형변환한다는 뜻인가요??위에 CircleTwo라는 생성자

hashcode.co.kr

 

 

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

         * 파라미터 : 없음

[그림2]

   → 그림3과 같이 자식 클래스 Fish에는 같은 이름을 가진 메소드가 있음. 하지만 파라미터(매개변수)는 다름

        * 메소드명 : showRecentInfo

        * 파라미터(매개변수) : int today

[그림3]

   → 이때, 메인 메소드에서 showRecentInfo를 호출한다고 가정하면 아래와 같은 상황이 됨 (그림4 참고)

[그림4]

   → ManagingStock 클래스의 showRecentInfo 메소드와 Fish 클래스의 showRecnetInfo 메소드는 파라미터(매개변수)가 다르기 때문에 메소드 오버라이딩이 아닌 메소드 오버로딩이 되어버림

         * 메소드 오버라이딩을 하려고 했으나 실수로 오버로딩이 되어버린 상황임

   → 이때, @Override가 유용해짐

 

   → 오버라이딩을 하려고 계획한 메소드에 @Override를 추가하면 컴파일러에게 "메소드 오버라이딩을 할 것"이라고 알리게 됨

         그리고 개발자가 오버라이딩을 하지 않으면 컴파일러가 에러 메시지를 발생시켜줌

   → 즉, 위의 예시에서 @Override를 추가해보면 아래와 같이 에러가 발생함

showRecentInfo 메소드를 오버라이딩 해야만 한다는 에러 발생

 

Comments