본문 바로가기
JAVA/JAVA

[JAVA] 04. 캡슐화, 추상화, 인터페이스

by ssunooo 2024. 7. 12.

 

1. 캡슐화

캡슐화는 기능을 단위별로(JAVA 기본단위=클래스별로) == 모듈화, 컴포넌트화
보관하는 java특성 덕분에
구현에 필요한 기능이 있다면
이미 만들어진것을 가져오면 된다는 내용이다.

내가 사용하는 클래스, 패키지 등등 내용을 몰라도
"사용방법(용법,언제쓰는지)"만 알면 쉽게 가져다가 사용할수있다.

내가 개발한 내용을 상대방이 몰라도 쓸수있게 묶어서 배포해야 한다. == 정보은닉(hiding)

그래서 함수명이 쉬워야하고, 인자와 아웃풋이 그럴듯 해야한다.
그렇기에 메서드 시그니쳐만 보고도 다른 사람들이 쉽게 이해할수 있어야 한다.

 

ex)
int plus(int[] datas) - int[] datas를 모두 더하는 함수임을 알 수 있다.
boolean isEmpty(int[] datas,int cnt) - int[] datas의 수가 없을 때 쓰는 함수임을 알 수 있다.


private 된 멤버변수의 값을 변경하려면
반드시 메서드를 거쳐야한다.
멤버변수에 값을 넣을때에는 set멤버변수명(),
멤버변수의 값을 받아올때에는 get멤버변수명()로 메서드를 설정한다.


그래서 getter,setter를 반드시 추가해야한다.

그 때 우클릭 후 Source - Generate Getterss and Setters... 를 누르면 자동으로

private 멤버변수들의 getter,setter이 생성된다.

 

getter,setter 생성

 


private은 자식클래스도 접근할 수 없다.
자식클래스는 접근할 수 있도록 하려면

private 대신 protected하면된다.

 

protected 사용 예시

 

 

2. 추상화

세상 모든 JAVA기반 언어들이 공통으로 하는 기준은
"추상화" 개념을 반드시 가지고있다는 점이다.


추상화를 하려면 "abstract"를 사용하면 된다.

abstract을 붙인 클래스를 추상 클래스,
abstract을 붙인 메서드를 추상 메서드라고 한다.
이렇게 생성된 추상클래스는 객체화할 수 없고,

추상메서드는 기능구현을 할 수 없으며 오버라이딩을 강제한다.

클래스들의 틀(추상 클래스) ---> 클래스 ---> 객체순으로 작성한다.


추상클래스에서 자식클래스에게
특정 메서드를 오버라이딩하라고 '강제'하고싶은 상황에

추상메서드를 사용할 수 있다.

추상클래스와 추상메서드의 예

 

 

인터페이스

같은 기능을 수행하는 메서드들끼리 이름이나 인자,리턴이 다르면
구현이 불편하고 유지보수가 불리하다.


개발자의 제 1목표는 유지보수 용이 극대화이므로
같은 기능을 수행하는 메서드들끼리
이름이나 인자,리턴이 같아야한다.

 

즉 메서드 시그니쳐를 "강제"해야할 필요성이 있다.

오버라이딩을 하면 메서드 시그니쳐가 같다.
근데 상속관계가 아닐때가 있는데

이때 인터페이스를 활용한다.

 

인터페이스는 패키지 익스플로러에서 우클릭후

new-Interface를 클릭하면 생성가능하다.

interface 위치

 

인터페이스에서 메서드는 메서드 바디를 생성하지않고

생성한 인터페이스는 클래스명 뒤에 "implements"를 넣어 

그 안에 메서드를 해당 클래스에 일치 시킨다.

 

 

위 3가지(캡슐화, 추상화, 인터페이스)를 모두 구현하는 프로그램을 작성해보았다.

 

요구사항

1) 캐릭터 클래스가 있습니다.
2) 캐릭터는 이름,레벨,무기를 가집니다.
3) 캐릭터는 attack() 공격을 할수있습니다.
4)  캐릭터가 무기를 가졌다면, 무기로 공격합니다.
5)  캐릭터는 이름을 반드시 가져야합니다.
6)  캐릭터는 레벨 10으로 시작합니다.
7)  캐릭터에게 무기가 없다면 맨손으로 공격합니다...
8)  무기를 이용한 공격이 성공한다면, 레벨이 +1 증가합니다.
9)  캐릭터가 attack()을 성공했는지 실패했는지에 대한 결과를
     main()에서 알수있습니다.

10)  무기 클래스가 있습니다.
11)  캐릭터가 무기를 활용해서 attack() 공격을 하기 때문에,
      무기 클래스도 attack() 메서드를 구현해야합니다.

 

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package class07;
 
import java.util.Random;
 
interface CharacAction { // 어택을 인터페이스한다.
   boolean attack();
}
class Charac implements CharacAction { // 캐릭터 클래스가 있습니다. // 추상클래스 // 무기 공격 인터페이스
   private String name; // 멤버변수 // 캐릭터는 이름,레벨,무기를 가집니다.
   private int level; // 추상클래스는 getter,setter 설정해야한다. // 메인에서 수정하지 못하게
   private Weapon weapon; // 무기 클래스가 따로 있다.
   Charac(String name){
      this(name,null); // null 없다 == 맨손
   }
   Charac(String name,Weapon weapon){ // 무기가 있을때
      this.name=name;
      this.level=10// 캐릭터는 레벨 10으로 시작합니다.
      this.weapon=weapon;
    }
 
    public String getName() { // getter 값을 얻는 메서드
        return name;
    }
 
    public void setName(String name) { // setter 값을 넣는 메서드
        this.name = name;
    }
 
    public int getLevel() {
        return level;
    }
 
    public void setLevel(int level) {
        this.level = level;
    }
 
    public Weapon getWeapon() {
        return weapon;
    }
 
    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }
 
    @Override
    public boolean attack() { // 메인에 공격 성공, 실패로 나누기 위해서
        // 캐릭터가 무기를 가졌다면, 무기로 공격
        // 캐릭터에게 무기가 없다면 맨손으로 공격합니다...
        // 무기를 이용한 공격이 성공한다면, 레벨이 +1 증가합니다.
 
      if(this.weapon != null) { // 무기가 없지 않다면
         
         if(this.weapon.attack()) { // Weapon 클래스의 메서드를 CharacAttack 인터페이스를 통하여 일치시킨다.
            this.level++// 레벨업
            return true// 공격성공 시 true 반환
         }
         System.out.println("무기공격 실패..."); // Weapon클래스의 attack()이 false값일때
      }
      else {
         System.out.println("맨손으로 공격..."); // 무기가 없다면 = 맨손
      }
      
      
      return false// 무기공격 실패, 맨손공격은 false 반환
   }
}
abstract class Weapon implements CharacAction { // 포켓몬스터 : 추상클래스
   String name;
   Weapon(String name){ // Weapon은 이름을 가진다.
      this.name=name;
   }
   abstract public boolean attack(); // : 추상메서드 - 메서드시그니쳐를 강제한다.
}
class Fork extends Weapon { // Weapon클래스에 상속
 
   Fork() {
      super("포크");
   }
 
   @Override
   public boolean attack() { // Weapon의 추상메서드 오버라이딩
      if(new Random().nextBoolean()) {
         System.out.println("포크던지기~~");
         return true// 성공시에 true 반환
      }
      System.out.println("포크가 빗나갔습니다...");
      return false// 실패시에 false 바환
   }
   
}
class Gun extends Weapon { // 피카츄,파이리,...
 
   Gun() {
      super("총");
   }
 
   @Override
   public boolean attack() { // Weapon의 추상메서드 오버라이딩
      System.out.println("빵야!");
      return true// 백프로 성공하는 공격
   }
   
}
public class Test01 {
   public static void main(String[] args) {
      
   }
 
}
 
 
cs

 

 

 

2024.07.12

'JAVA > JAVA' 카테고리의 다른 글

[JAVA] 06. MVC 패턴  (0) 2024.07.16
[JAVA] 05. 컬렉션 - 배열리스트, 맵  (4) 2024.07.16
[JAVA] 03. 포켓몬 게임 프로그램 작성  (2) 2024.07.11
[JAVA] 02-1 상속(2)  (0) 2024.07.11
[JAVA] 02. 상속  (0) 2024.07.04