Java

Java - 객체지향 - 단일 책임 원칙과 클래스 상속시에 주의할 점

dev_SiWoo 2022. 1. 6. 09:25

 

 아래의 코드를 보면 단일 책임을 원칙을 위배하여 Unit이라는 클래스에서

저글링, 탱크, 정찰기 등 2가지 이상의 것들에 대해서 Unit이 책임을 지고 있다.

 

 
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
//단일 책임 원칙을 위배하여 코드를 작성한 예시이다.
package SPR_test;
 
public class Unit {
    private String name;
    public int speed;
    private int status;
 
    public void attack(){
 
    }
 
    public void move(Object unit){
 
    }
 
    public void move(){
 
        if(name.equals("저글링")){
            speed+=3;
        }else if(name.equals("탱크")){
            if(status==1){
                speed = 0;//시즈모드
            }else{
                speed = 10;
            }
        }else if(name.equals("정찰기")){
            speed +=15;
            status=3// 충돌 false
        }
    }
}
 
 
cs

 

 하지만 이런식으로 프로그래밍할 경우 Unit클래스에 대한 의존성이 너무 높아지게된다.

좋은 객체지향 프로그래밍은 의존성을 낮추어야 하므로 다시 아래와 같이 작성해야한다.

 

 

 

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
package SPR_test;
 
public class zergling extends Unit {
    public void move() {
        this.speed += 3;
    }
}
 
 
package SPR_test;
 
public class Observer extends Unit{
    public void move() {
        this.speed += 3;
        this.status =3;
    }
}
 
 
package SPR_test;
 
public class tank extends Unit {
    public void move() {
        this.speed += 3;
        if (this.status == 1) {
            speed = 0;
        }else{
            speed = 10;
        }
    }
}
cs

 

 또 이렇게 저글링, 탱크, 정찰기가 각각의 기능만 수행하게 작성하려고

Unit클래스를 상속받게 되는데 이때

 

 priavate 접근제한을 갖는 필드와 메소드는 상속은 되지만 자식 클래스에서 직접 접근할 수 없다.

따라서 자식클래스에게 상속시켜야 하는 필드나  메소드가 있다면

private이 아닌 protected또는 public 으로 선언해야할 것이다.

 

status를 priavte로 선언하면 자식 클래스에서는 접근할 수 없기 때문에 IDE 자동완성에서도 status를 보여주지 않고 있다.