[프로젝트 : 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);


}


}



+ Recent posts