추상 클래스
추상메소드를 선언할 수 있는 클래스, 클래스와는 달리 상속받는 클래스 없이 그 자체로 인스턴스를 생성할 수 없음.
형식 : abstract 리턴타입 메소드이름();
|
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
abstract class Bird {
private int x, y, z;
void fly(int x, int y, int z) {
printLocation();
System.out.println("이동합니다.");
this.x = x;
this.y = y;
if (flyable(z)) {
this.z = z;
} else {
System.out.println("그 높이로는 날 수 없습니다");
}
printLocation();
}
abstract boolean flyable(int z);
public void printLocation() {
System.out.println("현재 위치 (" + x + ", " + y + ", " + z + ")");
}
}
class Pigeon extends Bird {
@Override
boolean flyable(int z) {
return z < 10000;
}
}
class Peacock extends Bird {
@Override
boolean flyable(int z) {
return false;
}
}
public class Main {
public static void main(String[] args) {
Bird pigeon = new Pigeon();
Bird peacock = new Peacock();
System.out.println("-- 비둘기 --");
pigeon.fly(1, 1, 3);
System.out.println("-- 공작새 --");
peacock.fly(1, 1, 3);
System.out.println("-- 비둘기 --");
pigeon.fly(3, 3, 30000);
}
}
|
cs |
인터페이스
객체의 특정 행동의 특징을 정의하는 간단한 문법.
함수의 특징인 접근제어자, 리턴타입, 메소드 이름만을 정의하고 함수의 내용은 없음.
인터페이스를 구현하는 클래스에서 인터페이스의 함수 내용을 구현해야 함.
형식 interface 인터페이스명{ public abstract void 추상메서드명(); }
|
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
|
interface Bird {
void fly(int x, int y, int z);
}
class Pigeon implements Bird{
private int x,y,z;
@Override
public void fly(int x, int y, int z) {
printLocation();
System.out.println("날아갑니다.");
this.x = x;
this.y = y;
this.z = z;
printLocation();
}
public void printLocation() {
System.out.println("현재 위치 (" + x + ", " + y + ", " + z + ")");
}
}
public class Main {
public static void main(String[] args) {
Bird bird = new Pigeon();
bird.fly(1, 2, 3);
// bird.printLocation(); // compile error
}
}
|
cs |
-
- 인터페이스 vs 추상클래스
- 인터페이스
- 구현하려는 객체의 동작의 명세
- 다중 상속 가능
- implements를 이용하여 구현
- 메소드 시그니처(이름, 파라미터, 리턴 타입)에 대한 선언만 가능
- 추상클래스
- 클래스를 상속받아 이용 및 확장을 위함
- 다중 상속 불가능 , 단일 상속
- extends를 이용하여 구현
- 추상메소드에 대한 구현 가능
소프트웨어 가치 = 변화
• 낮은 비용으로 변화 가능해야함.
◦ 비용 → 분석, 수정, 테스트, 기능 추가에 대한 시간
• 소프트웨어가 변화하지 않는다면, 망한 소프트웨어
• 기능을 수정하는데, 비용이 계속 증가하면, 해당 소프트웨어는 뒤쳐지고 결국 망
한다.
• 앞으로의 변화에 대응할 수 있는가가 중요
객체 지향은 어떻게 비용을 낮춰주는가?
• 캡슐화 + 다형성(+추상화)
접근제어자 사용 이유
- 객체지향 프로그래밍이란 객체들 간의 상호작용을 코드로 표현하는 것입니다.
- 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요
가 생깁니다.
- 클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해서!
- 이런 것을 캡슐화(encapsulation)라고 합니다.
- 접근 제어자는 캡슐화가 가능할 수 있도록 돕는 도구입니다.
알듯 말듯한 객체지향의 개념을 정리하는 시간
'TIL' 카테고리의 다른 글
| [WIL] 2022.11.14~11.18 (1) | 2022.11.20 |
|---|---|
| 2022.11.18 제네릭스, 람다 (0) | 2022.11.20 |
| 2022.11.16 TIL JAVA 날짜와 시간 (0) | 2022.11.16 |
| 2022.11.15 TIL JAVA 예외, 에러 처리 (0) | 2022.11.15 |
| 2022.11.14 TIL 알고리즘 4장 (0) | 2022.11.14 |