티스토리 뷰
자바 상속의 특징
자바에서 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
상속을 이용하면 코드의 재사용성을 높이고 코드의 중복을 제거할 수 있다.
상속에서 상속을 하는 클래스를 부모(조상)클래스 또는 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)인 것이다.
자바 상속 정리
- 자바에서 상속은 단일 상속만 가능하다. 다중 상속은 지원하지 않는다.
- 자바에서 최상위 클래스는 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
www.yes24.com/Product/Goods/15651484
docs.oracle.com/javase/tutorial/java/index.html
www.yes24.com/Product/Goods/17350624?OzSrank=1
- Total
- Today
- Yesterday
- springboot
- intellij
- jQuery
- Linux
- mybatis config
- 베리 심플
- docker
- Kotlin
- LocalDate
- k8s
- config-location
- Java
- elasticsearch
- 북리뷰
- mybatis
- rocky
- Spring Security
- input
- oracle
- svn
- JavaScript
- maven
- Github Status
- Mac
- Spring
- Bash tab
- LocalDateTime
- window
- localtime
- 오라클
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |