-
객체 지향2. 상속(Inheritance)은 무엇일까?Java 2018. 7. 16. 11:42반응형
객체 지향의 특징인 상속에 대해 알아보자~
1. 상속 (Inheritance)
- 상속은 자식 객체들의 공통적인 속성과 기능을 부모 객체에 정의하고 물려 받아 재사용하는 것입니다.
-> 코드의 중복을 줄일 수 있고, 유지 보수가 편하며 생산성이 높아집니다.
- 상속을 통해 계층구조를 형성하면 다형성 적용환경이 됩니다.
- 상속은 is a relationship 입니다. (generalization)
- 자바는 단일 상속입니다.
2. extends keyward
- 부모 클래스르 확장해서 자식 클래스를 정의합니다.
3. 상속 사용 예제
① Bank라는 클래스를 만듭니다.
123456789101112131415161718package org.bank;public class Bank {public void testPublic() {System.out.println("testPublic ok~");}protected void testProtected() {System.out.println("testProtected ok~");}void testDefault() {System.out.println("testDefault ok~");}private void testPrivate() {System.out.println("testPrivate ok~");}}cs ② AccessExam이라는 클래스에서 Bank의 클래스 함수를 사용하기 위해 새로운 객체를 생성하고 참조하여 testPulic() 메소드를 사용할 수 있습니다.(public으로 선언된 메소드에만 접근이 가능하고 protected, default, private에는 접근이 불가합니다.)123456789101112131415161718package step2;import org.bank.Bank;class AccessExam{public void test() {Bank bank = new Bank();bank.testPublic();testPublic();}}public class TestAccessModifier {public static void main(String[] args) {}}cs ③ AccessExam의 클래스는 extends 키워드를 사용하여 Bank의 클래스를 상속받습니다.▶ public뿐만 아니라 protected method 까지 접근이 가능합니다. 또한, 객체를 따로 생성할 필요가 없습니다.하지만 상속을 받았다고 하더라도 private method에는 접근이 불가합니다.12345678910111213141516171819package step2;import org.bank.Bank;class AccessExam extends Bank{public void test() {// Bank bank = new Bank();// bank.testPublic();testPublic();testProtected(); // 상속받았으므로 다른 팩키지의 클래스의 protected method 접근 가능}}public class TestAccessModifier {public static void main(String[] args) {}}cs 4. super keyword
- 생성자의 첫 실행라인에 위치하고, 부모 생성자를 호출하여 부모 객체를 생성합니다.
- super()를 명시하지 않는다면 컴파일러가 자동으로 삽입합니다.
* 기본적인 상속을 받지 않는 클래스라도 모든 클래스의 부모클래스인 Object클래스를 기본 생성자로 생성합니다.
* 기본적으로 Object클래스를 상속받는 이유는 Object 클래스는 객체의 최소한의 기본 기능을 내장하고 있고, 객체간의 네트워크 송수신이 가능하게 하기 때문입니다.
- 부모 생성자를 실행하여 부모 객체를 heap영역에 생성합니다.
① 아래의 예제에서 Person객체를 생성함과 동시에 super()가 호출이되고 Animal객체가 먼저 생성되는 것을 볼 수 있습니다.
( super의 위치는 생성자의 첫 실행라인에 위치해야 합니다.)
* 모든 클래스는 Object 클래스의 상속을 받습니다. 정확히는 Animal 클래스가 생성되기전. Object 클래스가 생성됩니다. !! (모든 클래스 계층 구조의 최상위 클래스 java.lang.Object)
Object -> Animal -> Person
12345678910111213141516171819class Animal {Animal() {System.out.println("부모 클래스 Animal 생성자 실행, Animal 객체 생성");}}class Person extends Animal {Person() {super(); // 만약 super()를 명시하지 않으면 컴파일러가 자동 삽입합니다.System.out.println("자식 클래스 Person 생성자 실행, Person 객체 생성");}}public class TestSuper {public static void main(String[] args) {new Person();}}cs 결과화면
*** 부모 클래스의 생성자가 인자를 가지고 있다면 어떻게 될까요 ? ***
1234567891011121314151617181920class Parent {private int money;Parent(int money) {this.money = money;}public int getMoney() {return money;}}class Child extends Parent {Child() {super(1);}}public class TestSuper2 {}cs ▶Child가 Parent로부터 상속받을때, Child의 생성자에서 super를 통해 Parent의 생성자에 인자값을 할당하면 됩니다.
반응형'Java' 카테고리의 다른 글
객체 지향3. 다형성(Polymorphism)이란 무엇일까? (0) 2018.07.17 객체 지향2-1. 오버로딩(Overloading)과 오버라이딩(Overriding)은 무엇일까? (0) 2018.07.16 객체 지향1. 캡슐화(Encapsulation)은 무엇일까? (0) 2018.07.13 가비지 컬렉션(Garbage Collection)??? (0) 2018.07.12 JVM 메모리 구조 (0) 2018.07.12