티스토리 뷰

728x90

자바 상속의 특징

자바에서 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
상속을 이용하면 코드의 재사용성을 높이고 코드의 중복을 제거할 수 있다.
상속에서 상속을 하는 클래스를 부모(조상)클래스 또는 Super 클래스라고 하며 상속을 받는 클래스를 자손클래스 또는 Sub클래스라고 부른다.

자바에서 상속은 extends 라는 예약어를 사용한다.

public SubClass extends SuperClass {

}

그리고 자바의 상속 특징은 다중 상속을 허용하지 않는다는 점이다.

public SubClass extends SuperClass, SuperClass2 { //다중상속은 컴파일오류

}

위 처럼 SuperClass 와 SuperClass2를 다중상속할 수 없다. extends 뒤에는 단 하나의 부모클래스만 와야 한다.

오라클 Tutorial의 설명과 함께 소스를 살펴보면 다음과 같다.

Bicycle 클래스

public class Bicycle {

    // the Bicycle class has three fields
    public int cadence;
    public int gear;
    public int speed;

    // the Bicycle class has one constructor
    public Bicycle(int startCadence, int startSpeed, int startGear) {
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;
    }

    // the Bicycle class has four methods
    public void setCadence(int newValue) {
        cadence = newValue;
    }

    public void setGear(int newValue) {
        gear = newValue;
    }

    public void applyBrake(int decrement) {
        speed -= decrement;
    }

    public void speedUp(int increment) {
        speed += increment;
    }

}

Bicycle 클래스를 상속받은 MountainBike 클래스이다.

public class MountainBike extends Bicycle {

    // the MountainBike subclass adds one field
    public int seatHeight;

    // the MountainBike subclass has one constructor
    public MountainBike(int startHeight,
                        int startCadence,
                        int startSpeed,
                        int startGear) {
        super(startCadence, startSpeed, startGear);
        seatHeight = startHeight;
    }

    // the MountainBike subclass adds one method
    public void setHeight(int newValue) {
        seatHeight = newValue;
    }
}

MountainBike 클래스는 상속을 통해서 Bicycle의 필드와 메소드를 사용할 수 있다.

계층구조를 다이어그램으로 나타내면 아래와 같다.

사실 이 다이어그램에서도 보이지는 않지만 자바 상속의 특중 중에 또 한가지는 모든 자바 클래스들은 Object 클래스를 상속하고 있다는 점이다. Java 플랫폼 안의 모든 클래스들은 Object의 자손(Superclass)인 것이다.

출처 - Oracle Java Tutorial

자바 상속 정리

  • 자바에서 상속은 단일 상속만 가능하다. 다중 상속은 지원하지 않는다.
  • 자바에서 최상위 클래스는 Object 이다. 모든 클래스는 Object클래스를 상속받고 있다.
  • 부모 메소드를 자식 클래스에서 재정의 할 수 있다.

super 키워드

상속을 받은 서브클래스가 있을 때 서브클래스를 생성하면, 부모클래스가 먼저 생성되고 자식클래스가 그 다음에 생성된다.
부모클래스를 호출할 때 사용하는 키워드가 super이다.

public class Superclass {

    public void printMethod() {
        System.out.println("Printed in Superclass.");
    }
}

printMethod를 재정의하는 Subclass이다.

public class Subclass extends Superclass {

    // overrides printMethod in Superclass
    public void printMethod() {
        super.printMethod();
        System.out.println("Printed in Subclass");
    }
    public static void main(String[] args) {
        Subclass s = new Subclass();
        s.printMethod();
    }
}

super 키워드를 사용해서 부모클래스에 접근할 수 있다.
부모클래스에 있던 printMethod를 재정의해서 출력한다.

//결과
Printed in Superclass.
Printed in Subclass

또 super 키워드를 사용해서 부모클래스의 생성자를 호출할 수 있다. super()

public MountainBike (int startHeight, 
                    int startCadence,
                    int startSpeed,
                    int startGear) {
    super (startCadence, startSpeed, startGear);
    seatHeight = startHeight;
}

위의 MountainBike의 생성자 메소드를 보면 super() 를 사용해서 부모클래스의 생성자를 호출해서 초기화한다.
부모클래스 생성자 호출은 서브클래스 생성자의 첫 번째 행이어야 한다.
부모 클래스의 생성자를 호출할 때는 super()를 사용하고 매개변수가 있는 부모클래스 생성자를 호출하려면 super(매개변수 목록) 으로 호출하면 된다.
만약 매개변수값과 일치하는 부모클래스의 생성자가 없을 경우에는 컴파일 오류가 발생한다.
부모클래스에 기본 생성자가 없고 매개 변수가 있는 생성자만 있다면 서브클래스 생성자에서 반드시 부모클래스 호출을 위해 super(매개변수 목록)을 명시적으로 호출해야 한다.

메소드 오버라이딩

메소드 오버라이딩은 조상클래스에 정의된 메서드를 자식클래스에서 재정의 하는 것을 말한다.
메소드가 오버라이딩되었으면 조상클래스의 메소드는 숨겨지기 때문에 자식클래스에서 메소드를 호출하면 오버라이딩된 서브클래스의 메소드가 호출된다.

public class Parent {
    void display() {
        System.out.println("부모 클래스의 display() 메소드입니다.");
    }
}

public class Child extends Parent {
    void display() {
        System.out.println("자식 클래스의 display() 메소드입니다.");
    }
}

public class Inheritance05 {

    public static void main(String[] args) {
        Parent pa = new Parent();
        pa.display();
        Child ch = new Child();
        ch.display();
        Parent pc = new Child();
        pc.display(); // Child cp = new Parent();  다형성
    }
}

//결과
부모 클래스의 display() 메소드입니다.
자식 클래스의 display() 메소드입니다.
자식 클래스의 display() 메소드입니다.

메소드 오버라이딩 규칙

  • 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개변수 리스트)를 가져야 한다.
  • 접근 제한을 더 강하게 오버라이딩할 수 없다.
  • 새로운 예외(Exception)을 throws 할 수 없다.

다이나믹 메소드 디스패치(Dynamic Method Dispatch)

추상 클래스

클래스 앞에 abstract 키워드가 붙은 클래스를 추상클래스라고 한다.
추상클래스는 클래스들의 공통적인 특성을 추출해서 선언한 클래스를이다.

public abstract class 클래스명{
  필드
  추상메소드
  일반 메소드
}

추상 클래스의 특징으로는 추상클래스는 객체를 직접 생성해서 사용할 수 없다. 즉 new 키워드를 사용해서 인스턴스를 생성시키지 못한다.
추상클래스는 extends 뒤에만 올 수 있는 클래스이다.
클래스에 추상메소드가 포함되어 있는 경우 그 클래스는 반드시 추상클래스이어야 한다.

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

final 키워드

자바에서 final 키워드는 변경 불가능을 의미한다. final 키워드는 클래스, 필드, 메소드 선언 시에 사용할 수 있다.
클래스 앞에 final을 붙이면 상속할 수 없는 클래스가 된다.
메소드 앞에 final을 붙이면 오버라이딩 할 수 없는 메소드가 된다.
필드 앞에 final을 붙이면 변경할 수 없는 값이 된다.
final 필드의 초기값을 줄 수 있는 방법은 두 가지인데 첫 번째는 필드 선언 시에 주는 방법이고, 두 번째는 생성자에서 주는 방법이다.
생성자에서 final 필드의 최종 초기화를 마쳐야 하는데, 만약 초기화되지 않은 final 필드를 그대로 남겨두면 컴파일 에러가 발생한다.

Object 클래스

java.lang 패키지의 클래스들은 프로그램이 실행될 때 자동으로 추가되기 때문에 따로 import 문이 필요없이 사용할 수 있다.

java.lang 패키지에 있는 클래스 중 Object 클래스는 모든 자바 클래스들의 조상이 되는 클래스이다.

Object 클래스는 필드가 없고 메소드들로 구성되어 있다. 당연히 모든 클래스가 Object를 상속하기 때문에 모든 클래스에서 사용이 가능하다.

equals()

Object 클래스의 equals() 메소드는 비교 연산자인 ==과 동일한 결과를 리턴한다.
두 객체가 동일한 객체라면 true를 리턴하고 그렇지 않으면 false를 리턴한다.
Object의 equals() 메소드는 직접 사용되지 않고 하위 클래스에서 재정의하여 논리적으로 동등 비교할 때 이용된다.
대표적으로 String 클래스가 Object 클래스의 equals()를 오버라이딩하여 문자열 값이 같으면 true를 하고 다르면 false를 리턴한다.

public boolean equals(Object obj) {
    return (this == obj);
}

hashCode()

Object의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다.
두 객체가 같으면 해시코드도 같아야 하는데 equals() 메소드를 재정의하면 두 객체가 동일하게 적용되는 방식이 변경되고 Object클래스의 hashCode()는 더 이상 유효하지 않다. 따라서 equals() 메소드를 재정의하는 경우 hashCode() 메소드도 재정의해야한다.

toString()

객체의 문자열 형태를 반환한다.

참조

www.yes24.com/Product/Goods/24259565?OzSrank=2

 

Java의 정석

최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 `자바의 정석`의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을 잘 파악하고 쓴 책. 뿐만 아

www.yes24.com

www.yes24.com/Product/Goods/15651484

 

이것이 자바다

15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서. 저자 직강의 인터넷 강의와 Q/A를 위한 커뮤니티(네이커 카페)까지 무료로 제공하여 자바 개발자로 가

www.yes24.com

docs.oracle.com/javase/tutorial/java/index.html

 

Trail: Learning the Java Language (The Java™ Tutorials)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

www.yes24.com/Product/Goods/17350624?OzSrank=1

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량 애플리케이션 프레임워크인 스프링은 자바와 객체 지향이라는 기반 위에 굳건히 세워져 있다. 따라서 스프링을 제대로 이해하고 활용

www.yes24.com

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함