ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체 지향2. 상속(Inheritance)은 무엇일까?
    Java 2018. 7. 16. 11:42
    반응형







    객체 지향의 특징인 상속에 대해 알아보자~



    1. 상속 (Inheritance)

      - 상속은 자식 객체들의 공통적인 속성과 기능을 부모 객체에 정의하고 물려 받아 재사용하는 것입니다.

          -> 코드의 중복을 줄일 수 있고, 유지 보수가 편하며 생산성이 높아집니다.

      - 상속을 통해 계층구조를 형성하면 다형성 적용환경이 됩니다.

      - 상속은 is a relationship 입니다. (generalization)

      - 자바는 단일 상속입니다.




    2. extends keyward

      - 부모 클래스르 확장해서 자식 클래스를 정의합니다.




    3. 상속 사용 예제

      ① Bank라는 클래스를 만듭니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package 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에는 접근이 불가합니다.)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package 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에는 접근이 불가합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package 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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class 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

    결과화면


      *** 부모 클래스의 생성자가 인자를 가지고 있다면 어떻게 될까요    ? ***

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class 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의 생성자에 인자값을 할당하면 됩니다. 


    반응형
Designed by Tistory.