상속 Inheritance
상속
상속은 [물려줌], [물려받음]을 의미합니다. 자바에서 클래스는 다른 클래스를 상속받을 수 있습니다. 상속받은 클래스는 상속해 준 클래스의 멤버들을 재사용할 수 있습니다. 중복되는 코드를 줄이는 아주 효율적인 방법입니다. 다만, 자바에서는 둘 이상의 클래스로부터 상속을 받을 수 없습니다. (다중 상속을 지원하지 않습니다)
상속과 관련된 다양한 이름들
상속 해준 클래스 | 상속 받은 클래스 |
조상 클래스 | 자손 클래스 |
부모 클래스 | 자식 클래스 |
상위 클래스 | 하위 클래스 |
기반 클래스 | 파생된 클래스 |
형식
클래스를 정의할 때 클래스명 옆에 [extends 상위클래스명]을 붙여 상속받을 수 있습니다.
class 하위클래스 extends 상위클래스
특징
- 상속받은 하위클래스의 생성자 첫 줄에서 상위클래스의 생성자를 호출해야 합니다.
- 명시적으로 선언하지 않았을 경우, 자동적으로 상위 클래스 생성자가 생성됩니다.
- 생성자와 초기화 블록은 상속되지 않고 멤버(멤버변수(속성), 메서드(기능))만 상속됩니다.
- 하위 클래스는 상위 클래스의 멤버들을 재사용하기 때문에
하위 클래스의 멤버 개수 >= 상위 클래스의 멤버 개수입니다.
포함
포함을 사용하여 상속과 같이 클래스를 재사용할 수 있습니다.
형식
클래스의 멤버 변수로 다른 클래스 타입의 참조변수를 선언해 줍니다.
class 클래스명 {
재사용할클래스명 인스턴스명 = new 재사용할클래스명();
}
상속과 포함의 구분
클래스를 재사용하고 싶은데 상속과 포함 중 어떤 방식을 사용해야 할지 헷갈린다면 클래스 간의 관계를 따져보면 됩니다.
- [상속받을 클래스]는 [상속해 줄 클래스]이다. → 상속
- 예 ) 사슴은 동물이다. 영희는 사람이다.
- [상속받을 클래스]는 [상속해 줄 클래스]을 가지고 있다 → 포함
- 예 ) 사슴은 뿔을 가지고 있다. 영희는 코를 가지고 있다.
오버라이딩(overriding)
오버라이딩은 상위 클래스로부터 상속받은 메서드의 내용을 변경하는 것입니다. 오버로딩과 글자가 비슷하여 혼동하기 쉽지만 기능은 전혀 다릅니다.
오버라이딩 할 메서드는
- 상위 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야 하고 접근제어자의 범위가 같거나 커야 합니다. (접근제어자는 아래에서 설명드리겠습니다.)
- 상위 클래스보다 많은 예외를 선언할 수 없습니다.
- 인스턴스 메서드를 static메서드로 변경하거나 static메서드를 인스턴스 메서드로 변경할 수 없습니다.
- static메서드는 오버라이딩 될 수 없습니다.
오버로딩(overloading)
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것입니다. 하나의 메서드 이름으로 매개변수만 다르게 넣어 비슷한 기능을 수행할 수 있도록 할 수 있습니다.
int plus(int a, int b) {
return a + b;
}
int plus(int a, int b, int c) {
return a + b + c;
}
float plus(float a, float b) {
return a + b;
}
- 메서드 이름이 같아야 합니다.
- 매개변수의 개수 또는 타입이 달라야 합니다.
super, super()
자바 쉽게 배우기 7 - 생성자에서 설명드린 this, this()와 비슷한 용도로 사용됩니다.
super
상위 클래스의 멤버와 자신(하위 클래스)의 멤버 이름이 같은 경우에 이를 구분하기 위해 사용합니다.
super()
하위 클래스에서 상위 클래스의 생성자를 호출하는 데 사용합니다. 상속받는 클래스는 생성자의 첫 줄에 super()를 호출해야 합니다. 명시적으로 호출하지 않았을 경우 컴파일러가 자동으로 super(); 코드를 삽입합니다. 모든 클래스는 최상위 클래스 Object를 상속받습니다. 따라서 Object클래스를 제외한 모든 생성자는 첫 줄에 this() 또는 super()를 호출해야 합니다.
패키지(package)
패키지는 쉽게 말해 클래스와 인터페이스를 담는 폴더입니다. 클래스를 유일하게 만들어주는 식별자 역할을 합니다. 소스파일의 가장 윗부분에 선언합니다.
package 패키지명;
- . 을 사용해 패키지명을 선언하면 계층적으로 폴더가 만들어집니다.
- 예시 ) com폴더 안에 example 폴더 안에 developerd 폴더 안에 class Haru생성
package com.example.developerd;
class Haru {
...
}
임포트(import)
패키지 선언 아래에 선언합니다. import의 뜻 그대로 다른 클래스를 불러와 이용하기 위해 사용합니다.
import 패키지명.클래스명;
import 패키지명.*;
- 한 패키지 안의 여러 클래스를 사용할 때 import문을 여러 번 선언하는 것 대신 *로 대체할 수 있습니다.
- 주의할 것은 상위 패키지를 import 했다고 하위 패키지까지 import 되는 것은 아니라는 점입니다.
import static 패키지명.클래스명;
- import문에 static을 붙여주면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있습니다.
제어자 modifier
클래스, 변수, 메서드의 선언 앞부분에 덧붙여 특정한 의미를 부여합니다. 하나의 대상에 여러 제어자를 사용할 수 있습니다.
static
하나의 클래스의 인스턴스들이 공유해야 할 멤버나 초기화 블록에 사용됩니다. 자바 쉽게 배우기 7 - 생성자에서 클래스 초기화 블록에 대해 설명드렸었습니다.
static이 붙은 멤버는 인스턴스 생성 없이도 클래스명.멤버변수, 클래스명.메소드명() 형식으로 사용이 가능합니다. 위에 설명드렸던 import static을 사용하면 클래스명 없이도 사용이 가능해집니다.
final
사용 대상은 다양하나 사용 목적은 비슷합니다. 마지막이라는 뜻처럼 값 변경, 오버라이딩, 상속 등을 제한하는 데 사용됩니다.
변수에 사용 시 한 번 초기화되면 값이 변경될 수 없는 상수가 됩니다.
메서드에 사용 시 오버라이딩이 제한됩니다.
클래스에 사용 시 상속이 제한됩니다.
abstract
클래스와 메소드에 사용됩니다. abstract가 붙은 클래스를 추상클래스라고 부릅니다. 추상 클래스는 추상 메서드를 가지고 있는 클래스를 뜻합니다. 그렇다면 추상 메서드는 무엇일까요? 추상메서드는 선언부만 있고 구현부가 작성되지 않은 메서드를 뜻합니다.
추상클래스는 미완성 상태이기 때문에 인스턴스를 생성할 수 없습니다. 추상클래스를 사용하기 위해서는 추상클래스를 상속받는 클래스를 만들고 추상클래스의 추상메서드를 구현한 후 인스턴스를 생성하여 사용합니다. 추상 메서드가 없어도 abstract 키워드를 붙여 인스턴스 생성을 제한할 수 있습니다.
abstract class 클래스명 {
abstract 리턴타입 메서드명();
}
접근제어자
외부로부터 데이터를 보호하고 불필요한 부분을 감추기 위해(캡슐화와 정보은닉) 사용합니다. 자바에서 접근 제어자가 생략된 경우 default 접근 제어자로 설정됩니다.
접근 제어자 | 접근 범위 |
private | 같은 클래스 내에서만 접근 가능 |
default | 같은 패키지 내에서만 접근 가능 |
protected | 같은 패키지 내에서 혹은 다른 패키지의 하위 클래스에서 접근 가능 |
public | 어디에서도 접근 가능 |
이번 글에서는 상속과 제어자에 대해 다루었습니다. 상속은 객체지향프로그래밍을 하기 위해서는 꼭 제대로 이해하고 넘어가야 하는 부분입니다. 다음 글에서는 객체지향프로그래밍의 특징인 다형성에 대해 알아봅시다.
'개발언어 > Java : 자바' 카테고리의 다른 글
자바 쉽게 배우기 10 - 다양한 클래스와 인터페이스 (0) | 2023.01.21 |
---|---|
자바 쉽게 배우기 9 - 다형성 (0) | 2023.01.14 |
자바 쉽게 배우기 7 - 생성자 (0) | 2023.01.08 |
자바 쉽게 배우기 6 - 클래스와 객체 (0) | 2023.01.06 |
자바 쉽게 배우기 5 - 배열 (0) | 2023.01.04 |