[프로젝트 : javase04 ]


[1] 인터페이스(interface) - 수단


예를 들어, 프린터 포트, vgb포트, usb포트 등 모두 단자, 인터페이스로서 바깥 세상과 통신하기 위한 수단이다.

data encapsulation이란 어떤 객체가 지정된 매쏘드에 의해서 바깥과 통신하는 수단을 구축하는 것이다. 이것을 통해 여러 이익들이 얻어질 수 있다.

이 데이타 인캡슐래이션을 구현화 하는 개념 중 하나가 인터페이스다.


쉽게 설명하면, [노래방 리모콘의 버튼]이라고 생각하면 된다. 숫자를 누르고 시작버튼을 누르면 -> 어떤 객체가 수행할 수 있다는 것을 외부에 알려주면서 통신도 일어나게 한다. 

일반적으로 메세지를 주고 받는데, 객체<->객체간에 주고 받는데, 그 메세지를 주고받기 위한 수단(통로)이 interface이다.

*인터페이스는 매쏘드의 내용이 없고, 선언만 있다.

왜냐면 인터페이스는 외부와 통신하기 위한 수단이므로, 노래방리모콘의 시작버튼일 뿐, 겉에서 볼 땐 노래를 시작하게 하는 것은 아니다.


1. 

public interface Touchable {

void touch();

}


- [public]은 '접근제한자' 라고 한다. 

- [interface]는 인터페이스를 의미한다. 필드와 매쏘드를 가진 클래스라면 class가 들어갈 것이다.

- 클래스와 형식은 보이지만, void라는 [리턴타입]과 Touch()라는 [매쏘드]만 있고 {   }중괄호로의 내용은 없이 바로 끝이난다. 이런형태가 인터페이스이다.

즉, 매쏘드의 선언만 있을 뿐이다.


2. 다형성(Polymorhism)

public class SmartPhone implements Touchable {


public void touch(){

System.out.println("터치를 하다.");

}

}


- 클래스 SmartPhone은 인터페이스 Touchable을 상속하였다(implements). 상속이라는 것은 부모클래스가 자식클래스에게, 자기가 가진 필드와 매쏘드를 물려주는 것인데, 인터페이스도 상속이 된다.

- 클래스의 상속은 [extends]를 쓰지만, 인터페이스의 상속은 [implements]라는 예약어 쓴다.

* 클래스의 상속은 구현화안해도 되지만, 인터페이스의 상속은, 인터페이스에는 실제적인 내용이 없기 때문에, 상속받는 SmartPhone이라는 클래스에서 반드시 구현을 해줘야한다.

 위 코드에서 Touch()매쏘드가  { }중괄호가 열리면서 내용을 작성하였다.

* 인터페이스는 상속(implements)시 여러개의 상속이 가능하다.



[2] 패키지와 API(package & API)


패키지(package) :  interface나 class(객체를 찍어내는 틀, 공통 필드와 매쏘드를 쓰게함)들을, 목적이 비슷한 종류끼리 모아놓은 폴더 같은 것

API(Application Programming Interface) : 프로그램을 만드는데 필요한, 미리 제공되는 패키지(interface+class 모음 폴더)들의 집합 by JDK

*나는 

패키지=class + interface의 모음/ 

API = class+interface의 모음인 패키지들이 제공되는 것 = 라이브러리

이라 기억할 것임.

가장 먼저 볼 패키지는 Java.lang이라고 하는 패키지이다. 실습시간에 살펴본다.

구글에서 Java SE 8 API 검색 하면된다. 라이브러리라고도 한다.


총정리)

자바는 OOP의 개념으로 이루어진 객체지향언어이다. 객체끼리 메세지를 주거받거나 객체를 매쏘드로 이용하는 것

객체는 모든 것이다.

클래스는 객체를 만들어내는 틀이다.

상속(inheritance)는, 클래스만으로 부족하여, 부모클래스가 자식클래스에게 Field와 Method를 물려주는 것이다.

인터페이스(interface)는 다른 객체와 통신하기 위한 수단이다.(내용물은 x , 쓰는놈이 구현화해야함)

패키지(package)는 class와 interface들인데, 비슷한 목적을 가진 것들을 분류해놓은 폴더이다. ex> java.lang



[3] 실습 [javase04]

(1) 새로운 프로젝트(javase04)를 만들고, src > 우클릭 > java > interface >  Package(클래스+인터페이스 모음) : test / Name : Touchable 이라 만든다.

(2) 내부에 void touch(); 매쏘드를 만들자. 인터페이스는 { } 중괄호를 이용해서 매쏘드의 [body]를 만들어주면 오류가 뜬다.  내용물은 비어있어야한다.


package test; //패키지 선언이다. 인터페이스 Touchable은 test라는 패키지안에 들어있게 된다.


public interface Touchable {

void touch();

}


(3) 이제 Touchable을 상속받는 클래스 SmartPhone을 만들어본다. 

 *test패키지 우클릭 >new>class> 

Package : test확인 후 / Name에 SmartPhone / Interfaces > Add... > Touchable을 검색해서 상속할 인터페이스를 추가 / main매쏘드 추가(실행할 클래스니까)


package test;


public class SmartPhone implements Touchable {


@Override

public void touch() {

// TODO Auto-generated method stub


}


public static void main(String[] args) {

// TODO Auto-generated method stub


}


}


(4) 생성해보면 위와같이, touch()라는 매쏘드가 자동으로 오버라이딩 되어있다. ( touch()에 에러가 나면, 이클립스를 다시시작하면 없어진다.)

(5) touch()매쏘드 내부에는 출력문을 하나 적어준다. 

(6) 메인매쏘드에서는 SmartPhone의 객체를 하나 만들어보고, 클래스의 touch()매쏘드를 호출해서, 실행시켜보자. 

public static void main(String[] args) {

// TODO Auto-generated method stub

SmartPhone s = new SmartPhone();

s.touch();


}


(인터페이스의 빈 매쏘드-> 구현화로서, 내용을 적어주고 -> 객체를 생성해서 사용) : 

굳이.. 빈 매쏘드를 채워서 사용하는지 아직까지는 필요성을 못느끼겠다.



[4] API문서(비슷한목적의 class/interface를 모아놓은 패키지를 제공해주는 것 = 라이브러리) 보기

1. 구글에 'java se 8 api'라고 검색한 뒤, 오라클 홈페이지의 문서를 보자(프로그램 제거에서 나의 자바버전 확인했다)

- https://docs.oracle.com/javase/8/docs/api/

2. api문서에서 첫번째 화면에 Packages가 나와있다. java.***.*** 이 설명과 함께 제공된다.

3. java.lang을 찾아가보자. 자바프로그래밍 언어의 디자인에 대한 기본적인 클래스들이라고 나와있다. 클릭해보자.

4. Interface Summary 와 Class Summary가 있다. 여기서 눈여겨볼 것은 Class Summary의 Object다.(클래스, 인터페이스는 대문자 시작)

- Object는 모든 클래스 계층구조(hier archy)의 뿌리. 이말은, 우리가 만든 모든 클래스의 머리에는 Object가 부모로 존재한다.

5. Object를 클릭해보면, 생성자(Constructors)에 대한 설명이 나온다. 그리고 Method에 대한 것들이 나온다. 

6. 우측의 hashCode()라는 매쏘드를 써보자.설명에는 객체에 대한 해쉬코드를 리턴해주는 매쏘드라 나와있다.


7. 실습화면에서

(1) SmartPhone객체를 참조한 변수 s.hashCode();를 작성해보자. (즉, 우리가 만든 클래스 SmartPhone이라는 것은, 클래스이므로 object클래스의 자식이고, 그 Object라는 클래스속 매쏘드 .hashCode();를    우리가 만든 클래스의 객체인 s에서도 사용이 가능한 것이다.)

(2) 이걸로 끝이 아니다 hashCode();에 마우스를 갖다 대면 리턴타입으로 int라고 나와있다. 좌항에서 int변수에 결과값을 받는다. 그 값을 출력해보자.

-hashCode();는 객체마다 고유의 int값을 리턴한다.


SmartPhone s = new SmartPhone();

s.touch();

int i = s.hashCode();

System.out.println(i);


8. 중요한 것은,  우리가 만든 클래스일지라도, SmartPhone 이라는 클래스는 Object를 상속받고 있고, 그 Object의 매쏘드인 hashCode();라는 매쏘드를 쓸 수 있다.

 

+ Recent posts