1. 상속(inheritance)
1.1 상속의 정의와 장점
상속이란? 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
- 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
- 자손의 멤버개수는 조상보다 적을 수 없다.
class Child extends Parent{
//...
}
- 조상 클래스 : 부모클래스, 상위클래스, 기반클래스
- 자손 클래스 : 자식클래스, 하위클래스, 파생된 클래스
1.2 클래스간의 관계 - 포함관계
class Point { // 원점
int x;
int y;
}
class Circle {
int x; // 원점의 x좌표
int y; // 원점의 y좌표
int r;
}
class Circle {
Point c = new Point(); // 포함관계(원점)
int r;
}
1.3 클래스간의 관계 결정하기
- 'is ~ a(상속관계)'와 'has ~ a(포함관계)'로 구별한다.
ex) Circle is a Point. : 원은 점이다.- Circle has a Point.가 더 자연스러우므로 포함관계이다.
Circle has a Point. : 원은 점을 가지고 있다.
1.4 단일 상속(single inheritance)
- Java에서는 단일 상속만 허용하므로, 상속과 포함관계를 적절히 사용해야 한다.
1.5 Object 클래스 - 모든 클래스의 조상
- Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
- 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 한다.
따라서 Object클래스에 정의된 멤버들을 사용할 수 있다.
2. 오버라이딩(overriding)
2.1 오버라이딩이란?
- 조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 의미.
2.2 오버라이딩의 조건
- 선언부가 같아야 한다.(이름, 매개변수,리턴타입)
- 접근제어자를 좁은 범위로 변경할 수 없다.
- 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
2.3 오버로딩 vs 오버라이딩
- 오버로딩 : 기존에 없는 새로운 메서드를 정의(new)
- 오버라이딩 :상속받은 메서드의 내용을 변경(change, modify)
2.4 super
(참조변수)
- this와 같음. 조상의 멤버와 자신의 멤버를 구별하는 데 사용.
2.5 super()
- 조상 클래스의 생성자
- 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화를 시켜야되기 때문에, 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야 한다.
Object
클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자this()
또는super()
를 호출해야한다. 그렇지 않으면 컴파일러가 자동적으로super();
를 생성자의 첫줄에 삽입한다.- 조상 클래스의 멤버변수는 조상의 생성자에 의해 초기화되도록 해야 한다.
3. package와 import
3.1 패키지(package)
- 서로 관련된 클래스와 인터페이스의 묶음.
- 폴더와 같음
- 서브패키지를 가질 수 있으며 '.'로 구분.
3.2 패키지의 선언
package 패키지명;
- 소스파일에 첫 번째 문장(주석 제외)으로 단 한번 선언
- 하나의 소스파일에 둘 이상의 클래스가 포함된 경우 모두 같은 패키지에 속하게 된다.(단, 하나의 소스파일에 단 하나의 public 클래스만 허용한다.)
- 모든 클래스는 하나의 패키지에 속하며, 패키지가 선언되지 않은 클래스는 이름없는 패키지(unnamed package)에 속하게 된다.
3.3 import문
- 사용할 클래스가 속한 패키지를 지정하는데 사용
- 클래스를 사용할 때 패키지명을 생략할 수 있다.
3.4 import문의 선언
- <순서>
- package문
- import문
- 클래스 선언
//<선언방법>
import 패키지명.클래스명;
//또는
import 패키지명.*;
3.5 static import문
- static import문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.
import static java.lang.Integer.*;
import static java.lang.Math.random;
import static java.lang.System.out;
out.println(random());
4. 제어자(modifier)
4.1 제어자란?
- 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여한다.
- 하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있지만, 접근제어자는 단 하나만 사용할 수 있다.
- 접근 제어자 -
public
,protected
,default
,private
- 그 외 -
static
,final
,abstract
, native, transient, synchronized, volatile, strictfp
4.2 static
- 클래스의, 공통적인
- 사용될 수 있는 곳 : 멤버변수, 메서드, 초기화 블럭
4.3 final
- 마지막의, 변경될 수 없는
- 사용될 수 있는 곳 : 클래스, 메서드, 멤버변수, 지역변수
4.4 abstarct
- 추상의, 미완성의
- 사용될 수 있는 곳 : 클래스, 메서드
- 미완성 설계도이므로 인스턴스를 생성할 수 없다.
4.5 접근 제어자(access modifer)
- 멤버 또는 클래스에 사용되어, 외부로부터의 접근을 제한한다.
- 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드 ,생성자
- private : 같은 클래스 내에서만 접근이 가능
- default : 같은 패키지 내에서만 접근이 가능
- protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
- public : 접근 제한이 전혀 없다.
- 접근 범위가 넓은 쪽에서 작은 순서대로 나열하면
- public > protected > (default) > private
대상 | 사용가능한 접근 제어자 |
---|---|
클래스 | public , (default ) |
메서드 | public , protected , (default ), private |
멤버변수 | public , protected , (default ), private |
지역변수 | 없 음 |
- <접근 제어자를 사용하는 이유>
- 외부로부터 데이터를 보호하기 위해서 → 캡슐화
- 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
5. 다형성(polymorphism)
5.1 다형성
- 조상 타입 참조 변수로 자손 타입 객체를 다루는 것 → 반대는 안됨.
5.2 참조변수의 형변환
- 사용할 수 있는 멤버의 갯수를 조절하는 것
- 조상 - 자손 관계의 참조변수는 서로 형변환 가능
5.3 instanceof연산자
- 참조변수의 형변환 가능여부 확인에 사용. 가능하면 true 변환
형변환을 할 때 항상 instanceof로 확인하고 사용해야 한다.
5.4 참조변수와 인스턴스의 연결
- 멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의된 경우, 조상타입의 참조변수를 사용했을 때는 조상 클래스에 선언된 멤버변수가 사용되고, 자손타입의 참조변수를 사용했을 경우 자손 클래스에 선언된 멤버변수가 사용된다.
5.5 매개변수의 다형성
- 참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
- <다형성의 장점>
- 다형적 매개변수
- 하나의 배열로 여러 종류 객체 다루기
5.6 여러 종류의 객체를 배열로 다루기
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
// 위와 아래는 동일
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
6.추상클래스(abstract class)
6.1 추상클래스란?
- 미완성 설계도. 미완성 메서드를 갖고 있는 클래스
- 특징
- 추상 클래스의 인스턴스 생성 불가
- 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
abstract class 클래스이름 {
abstract void play(int pos); //{ }
}
6.2 추상 메서드(abstract method)
- 미완성 메서드. 구현부(몸통, {})가 없는 메서드
- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 쓰임
6.3 추상클래스의 작성
- 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
7. 인터페이스(interface)
7.1 인터페이스란?
- 추상 메서드의 집합, 상수도 추가될 수 있음
- 구현된 것이 전혀 없는 설계도(모든 멤버가
public
)
인터페이스 ↔ 추상클래스
- 인터페이스는 추상메서드와 상수로만 이루어짐
- 추상클래스는 추상메서드와, 생성자, iv등으로 이루어짐
7.2 인터페이스의 작성
- public abstract 생략가능
- 상수는 public static final 생략가능
- 제어자는 모두 생략할 수 있고, 하나씩 생략도 가능하다.
7.3 인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상x)
- 다중 상속 가능(추상메서드의 충돌은 문제 없음)
7.4 인터페이스의 구현
- 인터페이스에 정의된 추상 메서드를 상속을 통해서 완성하는 것
- 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 한다.
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야한다.
}
7.5 인터페이스를 이용한 다중상속
7.6 인터페이스를 이용한 다형성
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { /* */
public void attack(Fightable f) { /*내용생략*/ }
}
Unit u = new Fighter(); // 가능
Fightable f = new Fighter(); // 가능
매개변수의 타입이 인터페이스면 그 인터페이스를 구현한 클래스의 인스턴스만 사용할 수 있다.
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
7.7 인터페이스의 장점
- 두 대상(객체) 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
- 장점
- 개발시간 단축.
- 표준화가 가능.
- 서로 관계없는 클래스들에게 관계를 맺어 줌.
- 독립적인 프로그래밍 가능.
- 선언과 구현을 분리시킬 수 있게 한다.(변경에 유리한 설계가 가능)
7.8 디폴트 메서드와 static 메서드
- 디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반, 조상클래스에 새로운 메서드를 추가한 것과 동일해짐) -> 충돌 문제가 생김
- <해결 규칙>
- 여러 인터페이스의 디폴트 메서드 간의 충돌
→ 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야 한다. - 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
→ 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
- 여러 인터페이스의 디폴트 메서드 간의 충돌
8. 내부 클래스(inner class)
8.1 내부 클래스란?
- 클래스 내부에 선언된 클래스
- <내부 클래스의 장점>
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다(캡슐화).
8.2 내부 클래스의 종류와 특징
- 내부 클래스의 선언 위치에 따라서 종류가 바뀐다.
내부 클래스 | 특 징 |
---|---|
인스턴스 클래스 | 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언된다. |
스태틱 클래스 | 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어진다. 주로 외부 클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언된다. |
지역 클래스 | 외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다. |
익명 클래스 | 클래스의 선언과 객체의 생성을 동시헤 하는 이름없는 클래스(일회용) |
8.3 내부 클래스의 선언
class Outer {
class InstanceInner {} // 인스턴스 클래스
static class StaticInner {} // 스태틱 클래스
void myMethod() {
class LocalInner{} // 지역 클래스
}
}
8.4 내부 클래스의 제어자와 접근성
- 스태틱 내부 클래스만이 static멤버를 정의 할 수 있다.
- 내부 클래스에서 외부 클래스의 static멤버를 참조할 수 있다.
- 외부 클래스의 지역변수는 내부클래스에서 상수만 참조가능하다.
8.5 익명 클래스(anonymous class)
- 이름이 없는 클래스로써, 클래스의 선언과 객체의 생성을 동시에 한다.
- 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있다.
- 단 하나의 클래스를 상속받거나 단 하나의 인터페이스마을 구현할 수 있다.
new 조상클래스이름() {
// 멤버 선언
}
/////////or///////////
new 구현인터페이스이름() {
// 멤버 선언
}
'LANGUAGE > [JAVA]' 카테고리의 다른 글
Chapter09 java.lang패키지와 유용한 클래스(java.lang package & util classes) (0) | 2021.08.26 |
---|---|
Chapter08 예외 처리(exception handling) (0) | 2021.08.25 |
Chapter06 객체지향 프로그래밍 I(Object-oriented Programming I) (0) | 2021.08.20 |
Chapter05 배열(array) (0) | 2021.08.18 |
Chapter04 조건문과 반복문 if, switch, for, while statement (0) | 2021.08.17 |