상속에 대한 이해
클래스는 '상속'을 받을 수 있습니다. 상속이라는 개념은 '물려받는 것' 정도로 생각할 수 있는데,
이미 만들어져 있는 클래스를 물려받는다는 것입니다.
클래스는 부모와 자식으로 나뉘고,
자식 클래스는 부모 클래스가 가지고 있는 모든 자원을 그대로 사용할 수 있습니다. (private 한 자원 제외)
자식 클래스에는 부모 클래스에 없던 기능을 새로 추가해서 사용할 수 있고,
자식 클래스는 반드시 가장 먼저 부모의 생성자를 호출해야 합니다.
부모 클래스가 자동 기본 생성자만 가지고 있다면 자식 클래스는 딱히 호출할 필요가 없습니다.
부모 클래스에서 생성자가 있다면 자식 클래스는 가장 먼저 부모의 생성자를 먼저 호출하여야 합니다.
또한 부모가 public 한 접근제어자를 가지고 있으면 자식도 public 한 접근 제어자로 Override 해서 사용할 수 있습니다.
super
자식 클래스로 생성된 인스턴스는 내부에 두 가지로 분류가 되는데
this는 현재 인스턴스 중 자식 클래스의 부분을 뜻하고,
super는 현재 인스턴스 중 부모 클래스의 부분을 뜻합니다.
this() 가 현재 클래스의 생성자를 의미하듯이 super() 는 부모 클래스의 생성자를 의미합니다.
상속을 사용하는 이유
그렇다면 우리는 왜 상속을 하는 것일까?
프로그래밍의 법칙에는 DRY (Don't Repeat Yourself) 라는 용어가 존재합니다
소포트웨어 개발 원리 중 하나로, 모든 형태의 정보 중복을 배제하는 원리입니다.
내가 직접 쓴 코드여도 경험적으로 보았을 때 줄을
한 줄, 한 줄 읽는 것이 코드 저장해뒀다가 일주일만 뒤에 다시봐도
천천히 어떤코드를 쓰려 했는지 해석하며 읽어야 합니다.
하물며 다른사람이 내 코드를 보았을 땐 어떨까요?
중구난방식에 중복이 잦은 코드를 보면 아무리 코딩 고수여도
그 코드를 해석하는데 어려움이 따를것이라고 봅니다.
남들이 볼 때 이해하기 힘든 코드는 좋은 코드라고 볼 수 없다고 많이들 하는데요,
자바의 클래스 상속(extends) 는 이러한 문제를 해결해줍니다!
Person 이라는 클래스를 만들었습니다.
Person 이라는 클래스의 생성자는 name과, age를 매개변수로 받을 수 있고,
클래스 변수에 name과 age가 저장이 되며, sayHi 라는 메서드를 통해 나이를 받아서 인사를 할 수 있습니다.
또 Police 라는 클래스를 만들었습니다.
Police라는 클래스는 '경찰'인데, 경찰은 개념적으로 사람이라는 범주 안에 속해있습니다.
사람은 모두가 경찰이 될 수 없지만 모든 경찰은 사람이라고 할 수 있습니다. (경찰견 이런소리 하지마셈 😊)
상속을 받는 방법은 클래스 옆에 extends 를 붙여주고 상속받을 부모 클래스명을 작성해주면 끝이 되는데요,
밑에 setName과 setAge 를 보면 알겠지만 police에서 name과 age를 각각 받아서
super 전달자를 통해 Person의 name과 age로 전달합니다.
그런데 왜 Police에 빨간 밑줄이 쳐져있을까요?
그 이유는 Police의 부모 클래스인 Person의 생성자를 자식 클래스에서 생성해주지 않았기 때문입니다.
자식 클래스는 부모 클래스로부터 상속받으면 생성자부터 작성해주셔야 합니다.
Add constructor 'Police(String int)' 는 'Police(String타입 int타입)' 의 생성자를 추가하라는 말인데요,
이클립스는 이렇게 전구버튼을 누르고, 이 이클립스 내에서 오류가 발생하지 않기 위해 필요한 것들을 예시로 보여주는데 단축키는 [Ctrl + Space] 입니다. 메서드 탐색할 때 유용하니 이 단축키는 두고두고 기억해뒀다가 사용하면 되겠습니다.
Add constructor ~ 를 선택해서 누르면
이렇게 자동으로 생성이 됩니다.
보통 자동생성하고 주석처리로 되어있는 Todo~ 는 이런식으로 개발자가 스스로 쓴 코드가 아니라,
이클립스 편집기가 자동으로 코드를 생성했다는 것을 표시하기 위해 작성되는데,
저는 상관 안하고 바로 삭제하는 편입니다.
super(name, age) 는 Police의 부모 클래스 Person의 생성자에
Police에서 입력받은 name과 age를 전달합니다.
아까 위에 Person 클래스에서는 sayHi를 자식 클래스인 Police에서 수정을 할 수 있습니다.
Override 에는 ~보다 우선하다라는 뜻이 있습니다.
자식 클래스인 Police에서 sayHi를 수정해서 작성하면,
부모클래스의 내용보다 우선시하여 자식클래스의 수정된 sayHi를 출력하게 됩니다.
다른 패키지에서 Person객체와 Police객체를 만들어보고 그 예시를 출력해보면...
Police 클래스는 원래 Override를 할 예정인데 일단 주석처리를 했습니다.
다른 클래스에서 생성한 객체 인스턴스를 사용하려면 [Ctrl + Shift + O]
Person 클래스의 나이별 조건문을 잘 통과한 걸 볼 수 있습니다.
Police 클래스의 오버라이딩에 있는 주석을 풀어주면?
나는 Police 클래스에서 Person 클래스로 name과 age를 넘겨줬었기 때문에
super.name 과 super.age로 다시 값을 받아 왔는데요~
우선순위가 바뀌어 부모 클래스 Person을 제치고 자식 클래스 Police의 sayHi 의 형식이 적용된 걸 볼 수 있습니다.
상속은 이후 객체의 다형성과 캐스팅, 여러가지 자바 내용을 보다보면 계속 나오게 되니
이 파트는 이해 될 때 까지 반복하는게 중요할 것 같습니다.
'Java (국비지원 당시 공부했던 글) > OOP (Java)' 카테고리의 다른 글
[자바] OOP - 6. toString() (0) | 2022.06.03 |
---|---|
[자바] OOP - 5. 상속 (객체의 다형성과 캐스팅) (0) | 2022.05.30 |
[자바] OOP - 3. static과 변수 선언위치, 생성시기 (0) | 2022.05.16 |
[자바] OOP - 2. 클래스의 생성자와 오버로딩 (0) | 2022.05.16 |
[자바] OOP - 1. 메서드와 클래스 (0) | 2022.05.04 |