리팩토링이란?


리팩토링은 기존의 코드를 외부의 동작방식에는 변화없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 말한다. 리팩토링을 하면 코드 내부의 설계가 개선되어 코드를 이해하기가 더 편해지고, 변화에 효율적으로 대응할 수 있다. 결국 생산성은 올라가고, 코드의 품질은 높아지며, 유지보수하기 용이해지고, 견고하면서도 유연한 제품을 개발할 수 있다. 리팩토링은 절실히 필요한 코드의 특징을 나쁜 냄새라고 부르기도 한다. 대표적으로, 중복된 코드는 매우 흔하게 발견되는 나쁜 냄새다. 이런 코드는 적절한 리팩토링 방법을 적용해 나쁜 냄새를 제거해 줘야 한다.


리팩토링은 개발자가 지관적으로 수행할 수 있긴 하지만, 본격적으로 적용하자면 학습과 훈련이 필요하다. 나쁜 냄새에는 어떤 종류가 있고, 그에 따른 적절한 리팩토링 방법은 무엇인지 알아보고, 충분한 연습을 해두면 도움이 된다. 리팩토링을 공부할 때는 리팩토링에 관해 체계적으로 잘 정리한 책인 리팩토링 (마틴 파울러, 켄트 벡 공저)를 추천한다.





★ 자바의 역사


자바는 마이크로시스템즈에서 개발하여 1996년 1월에 공식적으로 발표한 객체지향형 프로그래밍 언어이다.


자바의 가장 중요한 특징은 운영체제에 독립적이라는 것이다. 자바로 작성된 프로그래밍은 운영체제의 종류에 상관없이 실행이 가능하다.


자바는 풍부한 라이브러리를 통해 프로그래밍에 필요한 요소들을 기본적으로 제공한다.


자바의 역사는 제임스고슬링 1991년 썬의 엔지니어들이 의해서 고안된 오크라는 언어에서 시작이 되었다.


자바의 특징

운영체제의 독립적이다. 자바로 작성된 프로그램은 운영체제와 하드웨어에 상관없이 실행 가능하며, 이것이 한번 작성이 되면 어디서나 실행이 된다.


객체지향적인 언어이다. 자바는 프로그래밍의 대세로 자리 잡은 객체지향 프로그래밍 언어 중의 하나로 객체지향개념의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수한 객체지향언어라는 평가를 받고 있다.


자동메모리 관리

자바로 작성된 프로그램이 실행되면, 

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
package Extends;
 
class DeckTest {
    public static void main(String args[]) {
        Deck d = new Deck(); // 카드 한 벌(Deck)을 만든다.
        Card c = d.pick(0); // 섞기 전에 제일 위의 카드를 뽑는다.
        System.out.println(c);
        d.shuffle(); // 카드를 섞는다.
        c = d.pick(0); // 섞은 후에 제일 위의 카드를 뽑는다.
        System.out.println(c);
    }
 
}
 
// Deck클래스
class Deck {
    final int CARD_NUM = 52// 카드의 개수
    Card c[] = new Card[CARD_NUM];
 
    Deck() { // Deck의 카드를 초기화한다.
        int i = 0;
        for (int k = Card.KIND_MAX; k > 0; k--) {
            for (int n = 1; n < Card.NUM_MAX + 1; n++) {
                c[i++= new Card(k, n);
            }
        }
    }
 
    Card pick(int index) { // 지정된 위치(index)에 있는 카드 하나를 선택한다.
        return c[index % CARD_NUM];
    }
 
    Card pick() { // Deck에서 카드 하나를 선택한다.
        int index = (int) (Math.random() * CARD_NUM);
        return pick(index);
    }
 
    void shuffle() { // 카드의 순서를 섞는다.
        for (int n = 0; n < 1000; n++) {
            int i = (int) (Math.random() * CARD_NUM);
            Card temp = c[0]; // 첫 번째 카드와 임의로 선택된 카드를 서로 바꾼다.
            c[0= c[i];
            c[i] = temp;
        }
    }
}
 
// Card클래스
class Card {
    static final int KIND_MAX = 4// 카드 무늬의 수
    static final int NUM_MAX = 13// 무늬별 카드 수
    static final int SPADE = 4;
    static final int DIAMOND = 3;
    static final int HEART = 2;
    static final int CLOVER = 1;
    int kind;
    int number;
 
    Card() {
        this(SPADE, 1);
    }
 
    Card(int kind, int number) {
        this.kind = kind;
        this.number = number;
    }
 
    public String toString() {
        String kind = "";
        String number = "";
        switch (this.kind) {
            case 4:
                kind = "SPADE";
                break;
            case 3:
                kind = "DIAMOND";
                break;
            case 2:
 
                kind = "HEART";
                break;
            case 1:
                kind = "CLOVER";
                break;
            default:
        }
        switch (this.number) {
            case 13:
                number = "K";
                break;
            case 12:
                number = "Q";
                break;
            case 11:
                number = "J";
                break;
            default:
                number = this.number + "";
        }
        return "kind : " + kind + ", number : " + number;
    }
}
 
cs

'23.12.24 삭제예정 > 자바' 카테고리의 다른 글

리팩토링  (0) 2018.06.18
자바의 역사  (0) 2018.02.21
★★ 상속 extends에 관하여  (0) 2017.08.08
★★★변수의 초기화★★★  (0) 2017.08.07
★★this 생성자 개인적으로 연습해서 만든것  (0) 2017.08.07
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
package Extends;
 
class Tv {
    boolean power; // 전원상태(on/off)
    int channel; // 채널
 
    void power() {
        power = !power;
    }
 
    void channelUp() {
        ++channel;
    }
 
    void channelDown() {
        --channel;
    }
}
 
class CaptionTv extends Tv {
    boolean caption; // 캡션상태(on/off)
 
    void displayCaption(String text) {
        if (caption) { // 캡션 상태가 on(true)일 때만 text를 보여 준다.
            System.out.println(text);
        }
    }
}
 
class CaptionTvTest {
    public static void main(String args[]) {
        CaptionTv ctv = new CaptionTv();
        /*ctv라는 참조변수가 CaptionTv라는 인스턴스를 참조한다.*/
        //여기서 CaptionTv는 Tv의 모든 기능을 상속받았다.
        //여기서 말하는 TV의 상속기능은 위에 나온 인스턴스변수이며 메소드또한 마찬가지임
        //자식클래스의 CaptionTvTest에서는 따러 caption 상태만 추가 됨
        //최초 channel은 null상태인데 10이라는 숫자가 들어감
        //이후 channelUp() 메소드를 통해 숫자를 한단계 상승시킴
        //그 숫자를 출력하기 때문에 자연스럽게 11이라는 숫자가 출력
        //자식클래스의 caption에서 boolean을 했기 때문에 true, false만이 되는데
        //최초 아무런 설정을 하지 않은 Hello, World는 생성이 안되고
        //caption을 true시킨 다음 문장만이 실행이 된다.
        //ctv가 참조변수로써 displayCaption을 호출하고 그곳에 Hello, World가 매개변수로 들어가고
        //if문이 true이기에 문장이 출력되는 구조
        
        ctv.channel = 10// 조상클래스로부터 상속받은 멤버
        ctv.channelUp(); // 조상클래스로부터 상속받은 멤버
        System.out.println(ctv.channel);
        ctv.displayCaption("Hello, World");
        ctv.caption = true// 캡션기능을 켠다.
        ctv.displayCaption("Hello, World"); // 캡션을 화면에 보여 준다.
    }
}
cs


+ Recent posts