Java - 상속(inheritance),패키지활용

2020. 6. 14. 12:27Java

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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
public class Ex {
 
    public static void main(String[] args) {
        /*
         * 상속(Inheritance)
         * - Is-a 관계(A is a B 가 성립되면 A 는 B 를 상속받아 정의했다는 의미가 됨)
         * - 슈퍼클래스의 멤버(변수 및 메서드)를 서브클래스에서 물려받아 선언없이 사용하는 것
         *   => 슈퍼클래스(= 부모클래스 = 상위클래스) : 멤버를 물려주는 클래스
         *      서브클래스(= 자식클래스 = 하위클래스) : 멤버를 물려받는 클래스
         *   => A is a B 일 때 A 가 서브클래스, B 가 슈퍼클래스가 된다.
         * - 코드 중복 제거가 가능하며, 유지보수성이 향상됨
         * - 상속을 적용하기 위해서는 서브클래스 정의 시 서브클래스명 뒤에
         *   extends 키워드를 사용하여 슈퍼클래스의 이름을 지정해야함
         * 
         * < 상속 적용 기본 문법 >
         * class 서브클래스명 extends 슈퍼클래스명 {}
         * 
         */
        
        // Child 클래스의 인스턴스 생성
        Child c = new Child();
        // Child 클래스에서 선언하고 정의한 멤버를 사용할 수 있으며 
        System.out.println(c.childName);
        c.childPrn();
        // Parent 클래스에서 선언하고 정의한 멤버도 별다른 선언없이 그대로 물려받아 사용 가능함!
        System.out.println(c.parentName);
        c.parentPrn();
        
        System.out.println("========================================");
        
//        아버지 아버지 = new 아버지();
//        // 아버지 인스턴스로 접근 가능한 변수 및 메서드 : 4개
//        System.out.println(아버지.car); // 아버지 클래스에서 선언한 변수
//        System.out.println(아버지.house); // 할아버지 클래스로부터 상속받은 변수
//        
//        아버지.drawWell(); // 아버지 클래스에서 정의한 메서드
//        아버지.singWell(); // 할아버지 클래스로부터 상속받은 메서드
        
        System.out.println("---------------");
        
        나 나 = new 나();
        // 나 인스턴스로 접근 가능한 변수 및 메서드 : 6개
//        System.out.println(나.pc);
//        System.out.println(나.car);
//        System.out.println(나.house);
//        
//        나.programmingWell();
//        나.drawWell();
//        나.singWell();
        
        나.showMyAbility();
        
        
    }
 
}
 
class 할아버지 {
    String house = "이층집";
    
    public void singWell() {
        System.out.println("노래를 잘한다!");
    }
}
 
// 할아버지 클래스를 상속받는 아버지 클래스 정의
class 아버지 extends 할아버지 {
    String car = "스포츠카";
    
    public void drawWell() {
        System.out.println("그림을 잘 그린다!");
    }
}
 
class 나 extends 아버지 {
    String pc = "최신형 PC";
    
    public void programmingWell() {
        System.out.println("프로그래밍을 잘한다!");
    }
    
    public void showMyAbility() {
        // 자신의 클래스 내에서 자신의 멤버는 물론, 상속받은 부모의 멤버에도 자유롭게 접근 가능
        programmingWell(); // 자신의 클래스에서 정의한 메서드
        drawWell(); // 상속받은 메서드
        singWell(); // 상속받은 메서드
        
        System.out.println(pc); // 자신의 클래스에서 선언한 멤버변수
        System.out.println(car); // 상속받은 멤버변수
        System.out.println(house); // 상속받은 멤버변수
    }
    
}
 
 
 
// --------------------------------------------------------
 
class Parent {
    String parentName = "슈퍼클래스";
    
    public void parentPrn() {
        System.out.println("슈퍼클래스의 parentPrn()");
    }
}
 
// 슈퍼클래스인 Parent 클래스를 상속받는 Child 클래스 정의
// => 서브클래스 정의 문장 뒤에 extends Parent 를 명시
class Child extends Parent {
    String childName = "서브클래스";
    
    public void childPrn() {
        System.out.println("서브클래스의 childPrn()");
    }
    
}
//--------------------------------------------------------
 
class 자동차 {
    // Has-a 관계 : 특정 객체 내에 또 다른 객체가 포함되는 관계
    // => A has a B = A 가 B 를 포함하고 있다.
    // ex) 자동차 has a 라디오, 자동차 has a 엔진
    라디오 라디오 = new 라디오();
    엔진 엔진 = new 엔진();
}
 
class 라디오 {}
 
class 엔진 {}
 
 
public class Test {
 
    public static void main(String[] args) {
        // Account 클래스를 상속받아 정의한 ItwillBank 클래스는
        // 별다른 선언없이 Account 클래스 내의 멤버들을 사용할 수 있게 된다!
        ItwillBank ib = new ItwillBank();
        // ----- 기존 Account 클래스의 고유 기능(상속관계이므로 사용 가능) -----
        ib.setAccountNo("111-1111-111");
        ib.setOwnerName("홍길동");
        ib.setBalance(50000);
        
        ib.deposit();
        ib.withdraw();
        // ------ ItwillBank 에서 새로 정의한 고유 기능 ------
        ib.loan();
        
        
        
    }
 
}
 
// ItwillBank 클래스 정의 - Account 클래스 상속
class ItwillBank extends Account {
    public void loan() {
        System.out.println("대출 기능!");
    }
}
 
class Account {
    // 슈퍼클래스의 멤버가 private 접근지정자를 사용하게 되면
    // 서브클래스에서는 해당 멤버에 접근 불가능
    private String accountNo;
    private String ownerName;
    private int balance;
    
    public String getAccountNo() {
        return accountNo;
    }
    public void setAccountNo(String accountNo) {
        this.accountNo = accountNo;
    }
    public String getOwnerName() {
        return ownerName;
    }
    public void setOwnerName(String ownerName) {
        this.ownerName = ownerName;
    }
    public int getBalance() {
        return balance;
    }
    public void setBalance(int balance) {
        this.balance = balance;
    }
    
    public void showAccountInfo() {
        System.out.println("계좌번호 : " + accountNo);
        System.out.println("예금주명 : " + ownerName);
        System.out.println("현재잔고 : " + balance);
    }
    
    public void deposit() {
        System.out.println("입금 기능!");
    }
    
    public void withdraw() {
        System.out.println("출금 기능!");
    }
}
 
package kr.co.itwillbs;
 
// 각각의 클래스를 별도의 import 로 지정
//import kr.co.itwillbs.Radio;
//import kr.co.itwillbs.Tv;
 
// 하나의 패키지 내의 모든 클래스를 지정
//import kr.co.itwillbs.*;
 
public class Ex {
 
    public static void main(String[] args) {
        // kr.co.itwillbs 패키지의 Tv 클래스 타입 변수 선언
        // => 패키지명을 직접 입력하여 지정
//        kr.co.itwillbs.Tv tv;
        
        // import 문을 사용하여 Tv 클래스의 패키지 위치(kr.co.itwillbs)를 지정
        Tv tv;
        
        // import 문을 사용하여 Radio 클래스의 패키지 위치(kr.co.itwillbs)를 지정
        Radio radio;
        
        // 만약, 동일한 이름의 클래스에 대한 패키지를 이미 import 문으로 등록한 경우
        // 다른 패키지의 클래스를 import 문으로 등록할 수 없다!
        // => 패키지명.클래스명으로 명시적인 위치를 반드시 사용해야한다!
        kr.co.google.Radio radio2;
        
        // --------------------------------------
        // java.lang 패키지는 유일하게 별도의 import 가 필요없는 패키지이다
        // => 자동으로 import 되는 패키지
        java.lang.System.out.println("Hello, World!");
        java.lang.String str = "홍길동";
        
    }
 
}
package kr.co.google;
 
public class Radio {
 
}
import kr.co.itwillbs.Radio;
 
public class Ex2 extends Radio {
 
}
package jp.co.sony;
 
public class Ex {
 
}
package kr.co.google;
 
public class Ex {
 
}
package kr.co.itwillbs;
 
public class Radio {
 
}
package kr.co.itwillbs;
 
public class Tv {
 
}
package kr.go.busan;
 
public class Ex {
    
}
 
 
 
cs

상속과 패키지를 활용하는 방법에 대해서 배워 보았다. 상속이 아주 중요한 개념이라고 해주셔서 엄청 집중해서 듣게 되었고 그래서 그런지 생각보다는 쉽게 받아들여져서 배우는데 어려움은 없었다. 개념 자체는 쉽게 받아들였지만 역시 활용할 때가 좀 복잡했던 것 같다. 어렵진 않았지만 상속의 관계에 대해서 명확히 알고 있어야 상속을 활용하여 인스턴스화를 시켰을 때 막히는 부분 없이 잘 활용이 될 거 같다. 재미있는 개념이었고 활용할 수 있는 방법이 무궁무진할 것 같다. 패키지에 대해서도 배우게 되었는데 정리정돈을 좋아하는 나로서는 아주 좋은 개념이었다. import를 활용하여 다른 패키지의 것들을 사용할 수 있는 개념도 아주 좋았다. 좀 더 복습해서 이런 건 잊어 먹지 않도록 해야 하겠다.