2. 데이터 캡슐화 & 상속 & 이클립스 폰트 바꾸기
[프로젝트 : javase03 ]
[1] 데이터 캡슐화(data encapsulation)
캡슐화란 캡슐처럼 안쪽 내용물이 전혀 보이지 않게 된다. 이때, 안쪽의 내용물은 데이터 혹은 필드(속성)을 의미한다.
그리고 그 속에 필드와 같이 정의된 매쏘드를 통해서 필드는 외부와 통신하게 된다.
*캡슐화에 따른 이익
1. Modularity(모듈화) : 객체 안에다가 쓰인 소스코드가 <독립적>으로 존재할 수 있게 되어, 어디서든 쓰일 수 있는 <유연성>이 생긴다.
2. information-hiding(정보 은닉) : 가장 기본적인 특징이다. 정보은닉의 대표적인 예가 데이터캡슐화라고 할 수 있다. 안쪽의 상세내용을 숨기면서 매쏘드를 통해 외부와 통신한다.
3. Code re-use(코드 재사용) : 잘 만들어진 객체는, 다른 개발자들이 가져와서 재사용할 수 있다. 모듈화를 해놨기 때문에 가져와서 붙혓다가 뗄 수 있는 것이다.
4. Pluggability and debugging ease : 플러거빌리티는 마음대로 뺏따 꼽았다 하며 대체될 수 있다는 뜻이고, 하나의 모듈로서 다른 것과 맞물리지 않기 때문에 디버깅 하기 쉽다. 고장나면 바꿔끼면 된다.
[2] 상속(inheritance)
부모클래스가 자식클래스가 <필드와 메소드>를 물려주는 것. is a(이즈 어) 관계라고 한다.
예를 들어)
[생물] 이라는 클래스는
[동물] 과 [식물] 클래스로 나뉘어진다.(자식클래스로 가진다)
이때, 포함관계를 생각하여 반대로 화살표(uml, 상속을 나타내는 화살표)는 거슬러서 올라간다고 생각하면,
[동물->생물] or [식물-> 생물]의 관계가 된다고 생각할 수 있다.
[동물] is a [생물] , [식물] is a [생물] 이 된다.
[동물]도 [포유류]와 [조류] 로 나눌 수 있고, [포유류]도 [인간]과 [원숭이]로 나눌 수 있다.
이러한 것을 계층구조도 [hierarchy(하이어러키)] 라고 한다.
화살표가 위로 갈수록 <일반화> 내려갈수록 <구체화>가 되는 것이 계층구조도의 특징이다.
이때, 부모클래스는 필드와 매쏘드를 물려준다고 했으니, [생물]이 살아있다()라는 매쏘드를 가지고 있다면, [동물]과 [식물]모두 살아있다()라는 매쏘드를 가지고 있게 된다.
[동물]이 움직인다()매쏘드를 가지고 있으면, [포유류], [인간] 과 [원숭이] 다 같이 움직인다() 가지게 된다.
그러므로 굳이 [인간]은 움직인다()라는 것을 매쏘드를 만들어 놓을 필요가 없게 된다.
=> 반복적으로 들어가야하는 코드를 줄여주는 상속의 가장 큰 특징이 있다. 형변환에 있어서 가장 큰 힘을 발휘하는 것이 상속이다.
자바의 구조는 모든 계층구조도의 위(root)에는 Object(객체)라는 클래스를 가진다.
Object(객체)라는 클래스에 있어서 위로 올라가는 <is a>관계를 생각해보면, [생물]도 Object(객체)고, [동물]도 객체고, [포유류]도 객체고, [인간]도 객체가 되게 된다.
public class Car{
String color; // [ 필드 ] 혹은 [ property ] 혹은 [ member variable(멤버변수) ] 3가지로 불린다.
void run(){ //매쏘드
System.out.println("차가 달립니다");
}
}
public class Avante extends Car{ // Avante클래스는 위에서 만든 Car라는 클래스를 상속하였다.
public static void main(String[] args){
Avante a = new Avante(); // 객체를 만들어서, a라는 변수에 넣어줬다.
a.color = "빨간색"; // Car클래스를 상속한 Avante의 객체는 Car클래스의 필드(color)를 사용할 수 있따.
a.run(); // Car클래스를 상속한 Avante의 객체는, Car클래스의 매쏘드run()을 사용할 수 있다.
}
}
*멤버변수 = 클래스 내 필드 라 생각하는 버릇을 가지자
(1) extends는 상속의 예약어(다른데서 쓸수 없음) 이다.
(2) 구조는 [Car]라는 클래스가 있고, [Car]에는 color와 run()매쏘드가 있다. 그리고 [Avante]는 [Car]를 상속했다.
-> Avante는 Car의 필드와 매쏘드를 모두 쓸 수 있다.
(3) 메인매쏘드라는 것은, 클래스를 실행할 때, 실행되는 매쏘드이다.
(4) [Car]는 [부모클래스] = [super class], [Avante]는 [자식클래스] 혹은 [sub class]
[3] 실습
1. 이클립스 폰트 설정 바꾸기
(1) 구글에서 naver개발의 '나눔고딕코딩' 글자를 다운받는다. 영문과 고정폭을 가지고 있어서 쓰기가 좋다
- https://github.com/naver/nanumfont
(2) 다운받은 파일을 더블클릭해 설치한다.
(3) 이클립스의 window>preferences> General > Appearance > Colors and Fonts > Basic > [ Text Font ]를 선택 - Edit버튼을 눌러,
나눔고딕코딩 글꼴을 선택 & 글자크기도 조절한다.
* 나는 기존에 것이 더 맘에 들어서 default 눌러서 다시 돌아왔음.
* 만약 줄번호가 보이지 않는다면, 회색부분에서 우클릭으로 show line numbers를 선택해준다.
* 우측 상단에 J 모양의 아이콘은 Perspective(펄스펙티브)아이콘으로, 자바클래식에서 다양한 시각으로 왔다갔다 할 수 있다.
이것을 끌어다가 PackaageExplorer의 왼쪽 패널로 이동시키고, show text로 바꿔주자.
2. 실습하기
(1) 새로운 프로젝트 javase03으로 만든다.
(2) src폴더에 우클릭 > new class> Car라는 클래스이름으로 생성하고,
나중에 만들 클래스에서 필드와 매쏘드만 상속하고, 실행은 안시킬 것이기 때문에 메인함수 생성은 체크하지않는다.
안에 필드와 매쏘드를 만들어 준다.
public class Car {
String color; //필드, 멤버변수
void run() { //매쏘드
System.out.println("차가 달려요");
}
}
(3) src폴더 우클릭> new class> Avante클래스를 만드는데, superclass에 기본 <java.lang.Object>로 되어있는 것을 [edit]를 눌러,
<Car>를 쳐서 검색하여 선택한다. 메인매쏘드도 체크를 해준다.
(4) Avante클래스의 메인함수에다가, 객체를 생성하여 변수 a에 넣어준다. a. 만 쳐도, 상속한 Car클래스의 필드와 매쏘드가 자동완성 항목으로 뜨게 된다.
public class Avante extends Car {
public static void main(String[] args) {
// TODO Auto-generated method stub
Avante a = new Avante();
a.color ="빨간색";
a.run();
System.out.println(a.color);
}
}
'Java > 심화 개념설명' 카테고리의 다른 글
6. 인터페이스(상세), JavaDoc, 상속, 형변환, 오버라이딩, 다형성, super(생성자/오버라이딩) [javase07] (0) | 2018.02.20 |
---|---|
5. 클래스, 생성자, Overloading, this, 접근제한자, 소유제한자, 객체, JVM메모리구조 [ javase06 ] (0) | 2018.02.19 |
4. 변수의 종류와 배열(Array) [프로젝트 : javase05] (0) | 2018.02.18 |
3. 인터페이스 & 패키지 와 API의 개념 (0) | 2018.02.08 |
1. 객체지향프로그래밍(Object Oriented Programming) (0) | 2018.01.28 |