○ 상속(inheritance)
: 기존의 클래스를 재사용해 새로운 클래스를 작성하는 것
○ 조상 클래스
: 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
○ 자손 클래스
: 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스
- 자손 클래스는 조상 클래스의 모든 멤버를 상속받음 ( 생성자, 초기화 블럭 제외 )
- 자손 클래스의 멤버 개수는 조상 클래스의 멤버 개수보다 많거나 같음
- 클래스 관계에서 '형제 관계'라는 건 없음
- 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버 + 자손 클래스의 멤버가 합쳐진 인스턴스가 생성됨
- 자바에서는 단일 상속만 허용함
- Object 클래스는 모든 클래스의 조상 클래스임
○ 포함 관계
: 한 클래스의 멤버 변수가 다른 클래스 타입의 참조변수일 때
class Circle{
Point c = new Point(); // Circle은 Point를 가지고 있다는 포함관계를 맺음
int r;
}
○ 오버라이딩(overriding)
: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
○ 오버라이딩의 조건
1. 조상 클래스의 메서드와 선언부가 일치해야 함
2. 접근 제어자를 조상 클래스의 메서드보다 좁게 설정할 수 없음
3. 조상 클래스의 메서드보다 많은 예외를 선언할 수 없음
(Exception은 모든 예외의 조상이므로, 가장 많은 개수의 예외를 선언하는 것이나 마찬가지임)
4. 인스턴스 메서드를 static으로 또는 그 반대로 변경할 수 없음
○ super
: 자손 클래스에서 조상 클래스의 멤버를 참조할 때 사용하는 참조변수
○ super()
: 조상 클래스의 생성자
- Object 클래스를 제외한 모든 클래스는 첫줄에 this()나 super()를 호출해야 함. 그렇지 않으면 컴파일러가 자동으로 super()를 첫줄에 삽입해줌
○ package
: 클래스의 묶음
- 클래스가 물리적으로 하나의 클래스 파일(.class)인 것처럼, 패키지는 물리적으로 하나의 디렉토리임
- 하나의 소스파일에는 첫 문장에 패키지선언을 단 한 번 할 수 있음
package 패키지명;
- 모든 클래스는 반드시 하나의 패키지에 속해야 함
- 패키지는 '.'를 구분자로 해 계층구조로 구성할 수 이음
○ import문
: 사용하고자 하는 클래스의 패키지명을 미리 명시해주는 것
- 컴파일 시에 컴파일러가 모든 클래스이름 앞에 import문에 명시된 패키지명을 붙여줌
- 같은 패키지에서 여러 개의 클래스를 사용할 때,
import문을 여러 번 선언하는 거나 '패키지명.*'으로 선언하는 거나 프로그램 실행 시 성능상의 차이는 없음
○ 제어자(modifier)
: 클래스나 변수, 메서드 선언부에 사용되어 부가적인 의미를 부여하는 역할
접근 제어자 - public, protected, default, private
그 외 - static, final, abstract, native, ...
○ static - 클래스의, 공통적인
제어자 | 대상 | 의미 |
static | 멤버변수 | - 모든 인스턴스가 공통적인 값을 갖는 클래스변수 - 인스턴스를 생성하지 않고도 사용할 수 있는 클래스변수 - 클래스가 메모리에 로드될 때 생성됨 |
static | 메서드 | - 인스턴스를 생성하지 않고도 사용할 수 있는 클래스메서드 - 인스턴스 멤버, 인스턴스 메서드를 사용할 수 없음 |
○ final - 마지막의, 변경될 수 없는
제어자 | 대상 | 의미 |
final | 클래스 | - 다른 클래스의 조상이 될 수 없는 클래스(= 변경될 수 없는, 확장될 수 없는 클래스) |
final | 메서드 | - 오버라이딩으로 재정의될 수 없는 메서드 |
final | 멤버변수 | - 값을 변경할 수 없는 상수 |
final | 지역변수 | - 값을 변경할 수 없는 상수 |
○ abstract - 추상의, 미완성의
제어자 | 대상 | 의미 |
abstract | 클래스 | - 추상 메서드가 포함된 클래스 |
abstract | 메서드 | - 선언부만 있고 구현부는 없는 추상 메서드 |
○ 접근 제어자(access modifier)
접근 제어자가 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 생성자
private : 같은 클래스 내에서만 접근 가능
default : 같은 패키지 내에서만 접근 가능
protected : 같은 패키지 + 다른 패키지의 자손 클래스에서 접근 가능
public : 접근 제한 없음
○ 접근 제어자를 사용하는 이유
1. 외부로부터 데이터를 보호하기 위해서
2. 외부에는 불필요한 부분을 감추기 위해서
○ 캡슐화
: 멤버 변수의 접근제어자를 private로 선언하고,
멤버 변수에 접근하는 메서드를 public으로 선언해 '간접 접근'하도록 하는 것
- getter : 멤버 변수의 값을 읽는 메서드
- setter : 멤버 변수의 값을 변경하는 메서드
○ 다형성(polymorphism)
: 조상 클래스의 참조 변수로 자손 클래스의 인스턴스를 참조할 수 있게 한 것
○ 참조변수의 형변환
: 상속관계에 있는 클래스끼리 참조변수의 형변환이 가능함
- 같은 타입의 인스턴스라도 참조변수의 타입에 따라서 사용할 수 있는 멤버의 개수가 달라짐
- 참조하고 있는 인스턴스에는 아무런 영향을 미치지 않음
○ instanceof 연산자
: 형변환이 가능한지 검사하는 연산자. 가능하다면 true 아니면 false를 반환함
○ 참조변수와 인스턴스의 연결
: 조상 클래스와 자손 클래스에 이름이 중복되는 멤버변수가 있을 경우,
참조변수 타입에 따라 사용되는 멤버변수가 달라짐
( 참조변수가 조상 클래스 타입이면 조상 클래스의 멤버 변수가 사용됨)
○ 매개변수의 다형성
: 함수의 매개변수를 조상 클래스의 참조변수로 선언하면,
그 조상 클래스의 자손타입의 참조변수는 다 매개변수로 받아들일 수 있음
class Product{
int price;
int bonusPoint;
}
class Tv extends Product {}
class Computer extends Product {}
class Audio extends Product {}
// 이 매개변수로 Product, Tv, Computer, Audio의 참조변수가 다 올 수 있음
void Buy(Product P){
}
○ 추상 클래스
: 추상 메서드가 포함된 클래스
- 인스턴스를 생성할 수 없음
abstract class 클래스명{
}
○ 추상 메서드
: 선언부만 작성돼있고 구현부가 없는 메서드
- 꼭 필요하지만 자손타입마다 다르게 구현될 것으로 예상되는 경우 사용됨
abstract 리턴타입 메서드이름();
○ 인터페이스(interface)
: 추상 메서드의 집합
- 모든 멤버변수가 public static final이어야 함(생략가능)
- 모든 메서드가 public abstract이어야 함(생략가능)
interface 인터페이스이름{
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
○ 인터페이스의 상속
: 자바는 단일상속이 원칙이지만,
인터페이스는 추상 메서드(내용이 없는 메서드)의 집합이라 다중상속을 해도 충돌이 발생하지 않음
따라서 인터페이스는 다중상속이 가능함
○ 인터페이스의 구현
: 인터페이스도 추상클래스처럼 인스턴스를 생성할 수 없음
- 인터페이스에 정의된 추상메서드의 구현부를 작성하는 클래스를 작성해야 함
- 인터페이스에 정의된 추상메서드 중 일부만 구현하는 클래스라면 추상클래스임( 선언부에 abstract 추가해야 함)
class 클래스이름 implements 인터페이스이름{
// 인터페이스의 추상메서드를 구현해야 함
}
○ 인터페이스를 이용한 다형성
: 조상클래스의 참조변수로 자손클래스 인스턴스를 참조하는 것이 가능한 것처럼
인터페이스 타입의 참조변수로 인터페이스를 구현한 클래스의 인스턴스를 참조하는 것이 가능함
// 클래스 Fighter가 Fightable 인터페이스를 구현했을 때 다음 문장들이 가능함
Fightable f = (Fightable)new Fighter();
Fightable f = new Figher();
- 메서드의 매개변수 타입이 인터페이스
= 매개변수 자리에 인터페이스를 구현하는 모든 클래스의 인스턴스가 올 수 있음
- 메서드의 반환타입이 인터페이스
= 메서드가 그 인터페이스를 구현한 클래스의 인스턴스를 반환함
○ 인터페이스의 장점
1. 개발시간 단축
2. 표준화 가능
3. 서로 관계없는 클래스들이 같은 인터페이스를 구현함으로써 관계를 맺어줄 수 있음
4. 독립적인 프로그래밍이 가능함
○ 디폴트메서드
: 인터페이스에 새로운 추상메서드를 하나 추가하면,
그 인터페이스를 구현하는 모든 클래스에 새로운 추상메서드를 구현해줘야 함
→ 불편함 해결을 위해 등장한 게 디폴트메서드(몸통이 있는 메서드)
- 새로 추가된 디폴트메서드는 몸통이 있어서, 기존의 메서드와 이름이 동일해 충돌하는 경우가 발생할 수 있음
→ 인터페이스를 구현한 클래스에서 디폴트메서드를 오버라이딩함
→ 조상 클래스의 메서드가 상속되고 디폴트메서드는 무시됨
interface MyInterface{
void method();
default void newMethod(){}
}
○ 내부 클래스(inner class)
: 클래스 내에 선언되는 클래스
○ 내부 클래스의 장점
1. 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있음
2. 코드의 복잡성을 줄일 수 있음(캡슐화)
내부 클래스 | 특징 |
인스턴스 클래스(instance class) | - 외부 클래스의 인스턴스멤버처럼 다루어짐 |
스태틱 클래스(static class) | - 외부 클래스의 static멤버처럼 다루어짐 |
지역 클래스(local class) | - 선언된 영역 내에서만 사용될 수 있음 |
익명 클래스(anonymous class) | - 클래스의 선언과 객체의 생성이 동시에 이루어지는 이름없는 일회용 클래스 |
○ 내부 클래스의 제어자와 접근성
- 원래 클래스의 접근 제어자는 public, default만 가능한데
내부 클래스는 public, protected, default, private 모두 가능함
- static 내부 클래스만 static 멤버를 정의할 수 있음
→ static멤버는 객체 생성없이 사용할 수 있어야 하는데, 인스턴스 내부 클래스에 static 멤버가 있으면 모순 발생
- 외부 클래스의 지역변수는 final이 붙은 상수만 접근 가능
( 가끔 메서드 내부에 선언된 내부 지역 클래스의 객체가 메서드가 종료된 이후에도 남아있을 수 있음.
그러나 외부 클래스의 지역변수는 메서드가 종료되면 소멸됨.
이때 내부 지역 클래스의 객체에서 소멸된 '외부 클래스의 지역변수'를 참조하고 있었다면 문제가 발생할 수 있음
따라서 외부 클래스의 지역변수와 별개로 관리되는 'static이 붙은 상수'만 접근할 수 있게 하는 것임)
- 내부 클래스에서 외부 클래스의 private 멤버에 접근 가능
○ 익명 클래스(anonymous class)
: 클래스 선언과 객체의 생성을 동시에 하는 일회용 클래스
- 조상클래스나 인터페이스의 이름을 사용해서 정의함
new 조상클래스이름(){
// 멤버 선언
}
new 구현인터페이스이름(){
}
class InnerEx6{
Object iv = new Object(){ void method(){} };
static Object cv = new Object(){ void method(){} };
void myMethod(){
Object lv = new Object(){ void method(){} };
}
}
'자바의 정석' 카테고리의 다른 글
06 객체지향 프로그래밍 1 요약 (0) | 2022.06.19 |
---|---|
02 변수 variable (0) | 2022.05.05 |
01 자바를 시작하기 전에 (0) | 2022.05.04 |