1. 상속(inheritance)

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소이다
  • 두 클래스를 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 것을 의미한다
  • 여기서 우리는 이 두 클래스를 서로 상속 관계 있다고 하며, 하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받게 됩니다.
  • 하위 클래스의 멤버 개수는 상위 클래스의 멤버 개수보다 같거나 많아야 한다
  • 상위 클래스-하위 클래스의 관계를 조상-자손 관계로 표현하기도 한다
  • 두 클래스 간 상속 관계를 설정할 때 사용하는 extends 키워드는 "확장하다"라는 의미를 가지고 있다

  • 상위 클래스와 하위 클래스의 공통점과 다른점이 있다
    - 상위 클래스의 변수와 메서드를 하위 클래스에 그대로 받아와서 사용한다
    - 하위 클래스는 필요한 변수와 메서드를 추가하여 코드를 작성할 수 있다 
  • 상속을 통해 클래스를 작성하면 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다
  • 상속은 다형적 표현이 가능하다는 장점이 있다
  • 하위 객체의 클래스에 상위 객체에서 확장된 클래스의 성격도 가지고 있는 것을 다형성이라 한다
  • 위의 그림을 코드로 작성하면 아래와 같다
    - extends 를 확장 메서드로 사용한다
class Person{
    String name;
    int age;
    void learn(){
        System.out.println("study");
    }
    void walk(){
        System.out.println("walking");
    }
    void eat(){
        System.out.println("eating");
    }
}
class Teacher extends Person{
    String schoolName;
    void teach(){
        System.out.println("teaching");
    }
}
class Ceo extends Person{
    String companyName;
    void approval(){
        System.out.println("review");
    }
}
class Developer extends Person{
    String groupName;
    void coding(){
        System.out.println("coding");
    }
}
public class Extends {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "kms";
        p.age = 25;
        p.learn();
        p.walk();
        p.eat();
        System.out.println(p.name);

        Teacher t = new Teacher();
        t.name = "kim";
        t.age = 30;
        t.learn();
        t.walk();
        t.eat();
        t.teach();
        System.out.println(t.name);
    }
}
  • 코드의 결과는 다음과 같이 출력된다
    - Teach 클래스가 person 클래스의 변수와 메서드를 상속받아서 확장된 것을 확인할 수 있다
    - extends 메서드로 상위 클래스를 확장하지 않았다면 중복된 변수와 메서드를 반복해서 작성해야 했을 것이다

 

 

2. 포함(composit)

  • 포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법이다
  • 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언한다
  • 클래스명(멤버1, 멤버2, 멤버3,...) 의 형태로 사용한다
    - 외부 클래스 내에 내부 클래스를 작성한다
    - 내부 클래스에 main 클래스가 있다
    - Address 객체를 외부 클래스 밖에서 별도의 클래스로 선언 한다
public class Composit {
    int id;
    String name;
    Address address;

    public Composit(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    void showInfo() {
        System.out.println(id + " " + name);
        System.out.println(address.city + " " + address.country);
    }


    public static void main(String[] args) {
        Address address1 = new Address("Gangnamgu", "Seoul");
        Address address2 = new Address("Junggu", "Seoul");

        Composit e = new Composit(1, "kms", address1);
        Composit e2 = new Composit(2, "kim", address2);

        e.showInfo();
        e2.showInfo();
    }
}
class Address {
    String city, country;

    public Address(String city, String country) {
        this.city = city;
        this.country = country;
    }
}
  • Address 클래스에 포함되어 있는 인스턴스 변수 city와 country를 각각 Composit 클래스의 변수로 정의해주어야 하지만, Address 클래스로 해당 변수들을 묶어준 후 Composit 클래스 안에 참조변수를 선언하였다
    - 코드의 중복을 없애고 포함관계로 재사용하는 방법이다

 

 

3. 상속과 포함의 선택

  • 클래스 간의 관계가 ‘~은 ~이다(IS-A)’ 의 관계이면 상속을 사용한다
  • 클래스 간의 관계가 '~은 ~을 가지고 있다(HAS-A)'의 관계이면 포함을 사용한다

 

4. 메서드 오버라이딩(Method Overriding)

  • 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 의미한다
  • Override는 사전적으로 "~위에 덮어쓰다"를 의미한다

 1) 일반적인 메서드오버라이딩

class Airplane{
    void fly(){
        System.out.println("Airplane is flying");
    }
}

public class MethodOverriding extends Airplane {
    void fly(){
        System.out.println("MethodOverriding is flying");
    }

    public static void main(String[] args) {
        MethodOverriding over = new MethodOverriding();
        over.fly();
    }
}

  • MethodOverriding 클래스가 Airplane 클래스의 fly 메서드를 오버라이딩 한 후 MethodOverriding 클래스에 적합하게 fly 메서드를 변경하고 있다
  • 메서드 오버라이딩은 세가지 조건을 반드시 만족해야 한다
    - 메서드의 선언부(메서드 이름, 매개변수, 반환타입)가 상위클래스와 완전히 일치해야 한다
    - 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다
    - 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다

 2) 상위 클래스의 타입을 적용한 메서드 오버라이딩

public class Overriding {
    public static void main(String[] args) {
        Bike bike = new Bike();
        Car car = new Car();
        Human human = new Human();

        bike.run();
        car.run();
        human.run();

//상위 클래스 Vehicle 타입을 사용하여 각각의 객체의 메서드 값을 다르게 출력한다
        Vehicle bike2 = new Bike();
        Vehicle car2 = new Car();
        Vehicle human2 = new Human();

        bike2.run();
        car2.run();
        human2.run();
    }
}
class Vehicle{
    void run(){
        System.out.println("Vehicle is running");
    }
}
class Bike extends Vehicle{
    void run(){
        System.out.println("Bike is running");
    }
}
class Car extends Vehicle{
    void run(){
        System.out.println("Car is running");
    }
}
class Human extends Vehicle{
    void run(){
        System.out.println("Human is running");
    }
}

 

 3) 배열을 적용한 메서드 오버라이딩

 Vehicle[] vehicles = new Vehicle[]{new Bike(), new Car(), new Human()};
        for (Vehicle vehicle : vehicles) {
            vehicle.run();
        }

??? 이해가 잘 안간다...추가로 찾아보자.

 

5. super

 1) super

  • 자신보다 상위의 클래스에 있는 객체를 의미한다
  • 반드시 함수의 첫 줄에 위치하여야 한다

ex1) Parents의 변수 count와 Kim의 변수 count가 동일한 상황에서의 Kim 과 Parents의 나이를 출력

class Kim Parents       
variable age count count    
constructor Kim()        

- #19 에서 굳이 this 키워드를 사용하지 않아도 출력은 동일하다. 설명을 위하여 구분하기 위해 사용하였다

- 여기서 super 과 this() 의 차이점은 각각 상위클래스의 객체와 생성자를 의미한다는 부분이다

- 상속관계를 전제로 하며, super.변수명 의 형식으로 사용한다

※ 상속관계가 아닐 경우 에러(count 변수를 찾을 수 없다)가 발생한다

 

 2) super()

  • super은 객체를 의미하지만, super()는 생성자를 의미한다
  • 반드시 함수의 첫 줄에 위치하여야 한다

ex1) Parentsname의 변수 count와 Kimname의 변수 count가 동일한 상황에서의 Kimname 과 Parentsname의 나이를 출력하고, Parentsname를 상속받아 모두 출력

class Kimname Parentsname       
variable name count      
constructor Kimname Parentsname      

 

6. Object 클래스

  • 자바 클래스 상속계층도 중 최상위에 위치한 상위클래스이다
  • 자바의 모든 클래스는 Object클래스를 기본적으로 상속되면, Object클래스로부터 확장된다
  • 상속클래스가 없는 경우 자동으로 extends object를 추가하여 Object클래스가 상속된다
class Parent //컴파일러가 "extends Object" 자동 추가 { 
}
class Child extends Parent {
}

※ 기본 Object 메서드 

메서드명  반환 타입 주요 내용
toString() String 객체 정보를 문자열로 출력
equals(Object obj) boolean 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
hashCode() int 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단
wait() void 현재 쓰레드 일시정지
notify() void 일시정지 중인 쓰레드 재동작
 

 

 

▶ 상속 (프로그래밍) : http://wiki.hash.kr/index.php/%EC%83%81%EC%86%8D_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D) 

 

상속 (프로그래밍) - 해시넷

상속(相續, inheritance)은 객체 지향 프로그래밍(OOP)에서 자손 클래스가 조상 클래스의 기능을 그대로 이어받아서 재사용하는 것을 말한다. 자바에서는 계승, 확장이라는 단어로 사용된다.[1] 객체

wiki.hash.kr

  상속 (객체 지향 프로그래밍) : https://ko.wikipedia.org/wiki/%EC%83%81%EC%86%8D_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)

 

상속 (객체 지향 프로그래밍) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍(OOP)에서, 상속(inheritance)은 객체들 간의 관계를 구축하는 방법이다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수

ko.wikipedia.org

  상속의 개념 : http://www.tcpschool.com/java/java_inheritance_concept 

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

   Java inheritance : https://www.youtube.com/watch?v=Zs342ePFvRI 

 

+ Recent posts