본문 바로가기

TIL

2022.11.17 JAVA 객체지향

추상 클래스

추상메소드를 선언할 수 있는 클래스, 클래스와는 달리 상속받는 클래스 없이 그 자체로 인스턴스를 생성할 수 없음.

형식 : 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(113);
        System.out.println("-- 공작새 --");
        peacock.fly(113);
        System.out.println("-- 비둘기 --");
        pigeon.fly(3330000);
    }
}
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(123);
//        bird.printLocation(); // compile error
    }
}
cs
    1. 인터페이스 vs 추상클래스
    • 인터페이스
    1. 구현하려는 객체의 동작의 명세
    2. 다중 상속 가능
    3. implements를 이용하여 구현
    4. 메소드 시그니처(이름, 파라미터, 리턴 타입)에 대한 선언만 가능
    • 추상클래스
    1. 클래스를 상속받아 이용 및 확장을 위함
    2. 다중 상속 불가능 , 단일 상속
    3. extends를 이용하여 구현
    4. 추상메소드에 대한 구현 가능

 

소프트웨어 가치 = 변화
• 낮은 비용으로 변화 가능해야함.
◦ 비용 → 분석, 수정, 테스트, 기능 추가에 대한 시간
• 소프트웨어가 변화하지 않는다면, 망한 소프트웨어
• 기능을 수정하는데, 비용이 계속 증가하면, 해당 소프트웨어는 뒤쳐지고 결국 망
한다.
• 앞으로의 변화에 대응할 수 있는가가 중요

 

객체 지향은 어떻게 비용을 낮춰주는가?
 캡슐화 + 다형성(+추상화)

 

접근제어자 사용 이유
- 객체지향 프로그래밍이란 객체들 간의 상호작용을 코드로 표현하는 것입니다.
- 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요
가 생깁니다.
- 클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해서!
 - 이런 것을 캡슐화(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