일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 카카오 2차 코딩테스트
- 메서드명
- 우테코
- db
- 계층별 구조
- 월간회고
- DeleteAll
- SQL 실행순서
- jacoco
- 어댑티브 해시 인덱스
- 회고
- B+TREE
- ci/cd
- useQuery
- 블로그 병행
- BalancedTree
- java
- 멀티쓰레드 프로그래밍
- 프리코스
- 주간회고
- InnoDB 버퍼 풀
- 기능별 구조
- Blue-Green
- 백기선 스터디
- mysql
- 클래스
- 도커
- Jenkins
- N+1
- useMutation
- Today
- Total
Haneul's Blog
[Java] 상속 본문
목표 [백기선 자바 스터디 6주차]
자바의 상속에 대해 학습하세요.
학습할 것
- 자바 상속의 특징
- super 키워드
- 메소드 오버라이딩
- 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 추상 클래스
- final 키워드
- Object 클래스
자바 상속의 특징
상속이라는 뜻은 부모의 유산을 물려받는 것을 의미합니다. 자바에서의 상속도 마찬가지로 부모 클래스의 변수와 메서드를 물려 받는 것을 의미하는데 이러한 상속을 통해서 코드의 재사용성 및 코드의 간결성을 확보해줍니다.
이러한 상속은 아래와 같이 extends라는 키워드로 상속받을 수 있습니다.
class Phone{}
class IPhone extends Phone{}
상속은 부모 클래스의 변수나 메서드를 물려받는다고 했는데 그렇다고 모든 변수나 메서드를 다 물려받을 수는 없습니다.
접근 제어자에 따라서 상속해도 사용할 수 없는 변수나 메서드가 존재하게 됩니다. 대표적으로 private이 있고 private으로 접근 제어자를 설정하였다면 상속 받아도 사용할 수 없습니다.
또 다른 특징으로는 단일 상속만 가능하다는 점입니다. extends 뒤에는 하나의 클래스만 올 수 있으면 여러 개를 상속받으려면 implements를 통해서 받아야 합니다.
하지만 implements는 클래스를 상속받는 것이 아닌 인터페이스를 상속받는다는 차이점이 있습니다.
그리고 상속 이외에도 클래스를 재사용할 수 있는 방법이 한 가지 더 있습니다. 그것은 포함(Composite) 관계를 맺어주는 것인데 이는 한 클래스의 멤버 변수로 다른 클래스 타입의 참조 변수를 선언하는 것을 의미합니다.
class Location{}
class Board{
Location location;
}
super 키워드
super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수입니다.
인스턴스 변수의 이름과 지역 변수의 이름이 같은 경우에 인스턴스 변수 앞에 this키워드를 붙여 구분할 수 있었는데 이와 마찬가지로 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같은 경우 super 키워드를 사용하여 구분할 수 있습니다.
즉, super 키워드를 통해 부모 클래스의 멤버에 접근 가능합니다.
이를 사용하는 방법은 변수, 메서드, 생성자 모두 비슷하지만 약간 다릅니다.
부모 클래스의 멤버 변수에 접근하는 경우엔 super.멤버변수로 접근 가능하고,
부모 클래스의 멤버 메서드에 접근하는 경우엔 super.멤버메서드(매개변수)로 접근 가능하고,
부모 클래스의 생성자를 호출하는 경우엔 super(매개변수)로 접근 가능합니다.
주의할 점
- 반드시 자식 클래스의 생성자 첫 라인에서 부모 생성자를 호출해야 합니다.
- 자식 클래스의 생성자 내에서 반드시 부모 생성자를 호출해야 합니다.
- 명시적으로 자식 클래스에서 부모 생성자를 호출하지 않아도 super 키워드를 이용한 생성자 호출이 자동 삽입되어 부모 클래스의 생성자를 호출하게 되며 만약 별도 매개변수를 가진 생성자를 자식 클래스에서 생성했다면 부모 클래스의 생성자를 호출하는 super() 를 직접 입력해야 합니다.
사실 this와 super는 거의 비슷하며 this는 자신의 클래스를 호출할 경우 사용하고 super는 부모 클래스를 호출할 경우 사용하다는 것이 다릅니다.
메서드 오버라이딩
메서드 오버로딩과 오버라이딩은 이전 5주차 스터디에서 정리했기 때문에 밑의 링크를 참조하면 좋을 것 같습니다.
https://haneulss.tistory.com/22
[Java] 클래스
목표 [백기선 자바 스터디 5주차] 자바의 Class에 대해 학습하세요. 학습할 것 클래스 정의하는 방법 객체 만드는 방법 (new 키워드 이해하기) 메서드 정의하는 방법 생성자 정의하는 방법 this 키워
haneulss.tistory.com
추가적으로 메서드 오버라이딩을 할 때 @Override라는 애노테이션이 붙는데, 이를 하는 이유는 컴파일 시점에 정말 오버라이드가 되는 것이 맞는지 check 해주는 역할을 합니다.
또한 애노테이션을 붙여줌으로써 가독성을 좋게 가져갈 수 있다는 장점도 있기 때문에 오버라이딩을 할 경우 @Override를 붙여주는 것이 좋습니다.
다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
먼저 dispatch라는 단어를 간단하게 알아보면 무엇인가를 보낸다 정도로 설명할 수 있습니다.
자바는 객체들간의 메시지 전송 즉, 메서드를 서로 호출하며 문제를 해결해 나가는데 여기서 메서드를 호출하는 것을 Dispatch라고 부릅니다.
이러한 Dispatch에는 static dispatch와 dynamic dispatch가 있습니다.
static dispatch : 구현 클래스를 이용해 컴파일 시점에서부터 어떤 메서드가 호출될지 정해져 있는 경우
class Dispatch {
public static void main(String[] args) {
Car car = new Car();
car.drive(); // 컴파일 시점에서 어떤 메서드를 호출할 것인지 명확히 알고 있음
}
}
class Car {
void drive() {
System.out.println("drive");
}
}
dynamic dispatch : 인터페이스를 이용하여 참조함으로써 호출되는 메서드가 동적으로 정해지는 경우
class Dispatch {
public static void main(String[] args) {
Car car1 = new K3();
car1.drive(); // 런타임시에 메서드를 결정한다.
Car car2 = new Bently();
car2.drive(); // 런타임시에 메서드를 결정한다.
}
}
abstract Car {
abstract void drive() {}
}
class Bently extends Car{
@Override
void drive() {
System.out.println("벤틀리 운전");
}
}
class K3 extends Car{
@Override
void drive() {
System.out.println("K3 운전");
}
}
추상 클래스(Abstract Class)
추상 클래스는 클래스를 만들기 위한 일종의 설계도로 인스턴스를 생성할 수 없는 클래스입니다. 이를 사용하기 위해서는 반드시 자식 클래스에서 상속을 받아 클래스를 모두 구현해야 합니다.
아래와 같이 abstarct 키워드를 사용하여 추상 클래스를 만들 수 있습니다.
abstract class 클래스이름{}
이러한 추상클래스는 반드시 하나 이상의 추상 메서드를 포함하고 있어야 하고 생성자와 멤버변수, 일반 메서드 모두를 가질 수 있습니다.
인터페이스(Interface)
인터페이스는 추상 클래스보다 추상화 정도를 높게 하여 일반 메서드나 멤버 변수를 가질 수 없습니다. 오직 추상 메서드와 상수만을 멤버로 가질 수 있는 것이 인터페이스입니다.
인터페이스의 모든 멤버 변수는 public static final이어야 하고 이를 생략할 수도 있습니다. 또한 메서드는 public abstract여야 하며 이도 생략 가능합니다.
또한 위의 상속 부분에서 잠깐 말했듯이 인터페이스는 클래스와 달리 다중 상속이 가능합니다.
Object 클래스
java.lang.Object 클래스는 모든 클래스의 최상위 클래스입니다. 즉, 모든 클래스는 extends Object를 하지 않아도 자동으로 Object 클래스를 상속받게 됩니다.
Object 클래스의 주요 메서드
메소드
|
설명
|
boolean equals(Object obj)
|
두 객체가 같은 지 비교한다.(같으면 true, 틀리면 false)
|
String toString()
|
객체의 문자열을 반환한다.
|
protected Object clone()
|
객체를 복사한다.
|
protected void finalize()
|
가비지 컬렉션 직전에 객체의 리소스를 정리할때 호출한다.
|
Class getClass()
|
객체의 클레스형을 반환한다.
|
int hashCode()
|
객체의 코드값을 반환한다.
|
void notify()
|
wait된 스레드 실행을 재개할 때 호출한다.
|
void notifyAll()
|
wait된 모든 스레드 실행을 재개할 때 호출한다.
|
void wait()
|
스레드를 일시적으로 중지할 때 호출한다.
|
void wait(long timeout)
|
주어진 시간만큼 스레드를 일시적으로 중지할 때 호출한다.
|
void wait(long timeout, int nanos)
|
'Java' 카테고리의 다른 글
[Java] 인터페이스 (0) | 2022.10.19 |
---|---|
[Java] 패키지 (0) | 2022.10.18 |
[Java] 클래스 (0) | 2022.10.16 |
[Java] 제어문 (0) | 2022.10.15 |
[Java] 연산자 (1) | 2022.10.13 |