달력

4

« 2024/4 »

  • 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
2010. 12. 12. 00:23

타입을 정의할 때만 인터페이스를 사용 Study/Java2010. 12. 12. 00:23

인터페이스는 참조하는데 사용될 수 있는 타입의 역할을 하는데 이외의 목적으로는 좋지않다.

소위 말하는 상수 인터페이스 등이 있는데 메소드를 갖지 않으며 외부에 제공하는 상수 값을 갖는 static final 필드 만으로.

ex)

interface Sangsu{
static final int A = 2;
static final int B = 3;
static final int C = 10;
}

문제점이 뭐가 있을까.

이 상수를 더 이상 사용할 필요가 없어서 클래스를 변경하더라도 바이너리 호환성 유지를 위해

여전히 인터페이스를 구현해야한다.

이럴 때는 상수 유틸리티 클래스(유형4) 로 구현하는게 좋다.

public class Sangsu{
private Sangsu(){
public static final A = 2;
public static final B = 3;
public satic final C = 10;
}
}

즉 인터페이스는 타입을 정의할 뿐이고 상수를 외부에 제공되기 위한 목적이 아니다.
:
Posted by 유쾌한순례자
2010. 12. 11. 23:28

인터페이스 Study/Java2010. 12. 11. 23:28

인터페이스란?

구현 된 것은 아무것도 없는 밑바탕만 있는 "기본 설계도" 라고 생각하면 된다.

인터페이스 작성방법
ex)
interface 인터페이스 이름{
//모든 멤버변수는 public static final 이어야 하고
//모든 메서드는 public abstract 이어야한다.
}
내가 기존에 알고 있던 인터페이스는 C++ 에는 있지만 자바에는 없는 다중 상속을 사용할 때

기존의 다중상속의 장점만을 취해서 하는 것이라고 생각했다.

(※자바의 정석 298page 에 보면 인터페이스가 단순히 다중 상속을 위한 것으로 오해를 사고는 하는데 공부를 하다보면 참된 의미를 알 것이라고 하였다.)

ex)
interface A{
..생략..
}
interface B{
..생략..
}
interface C extends A,B{
..생략..
}

인터페이스의 장점만을 적어보자면 (자바의 정석 page 303)

1. 개발 시간을 단축 : 메서드를 호출 하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면됨!
2. 표준화가 가능 : 기본틀을 인터페이스로 작성하여 일관화되고 정형화된 개발이 가능
3. 서로 관계없는 클래스들끼리 관계를 맺어 줌 : 하나의 인터페이스를 공통적으로 구현하도록 관계를 맺어줌.
4. 독립적인 프로그래밍 가능 : 선언과 구현을 분리시킬 수 있다.

문제 : (interface를 사용할것!)
온풍기 냉풍기 가 가능한 에어콘이 있다.
on 이라는 명령을 내리고 설정온도를 입력하면 25도 초과일때 Hot mode
25도 미만일때 Cold mode
25도 일때 Air Care mode
로 출력하게 하며
off 일때는 종료가 엉뚱한 명령어가 입력되거나 최대값 30도, 최저값 18도 범위 밖일 경우도 종료시켜라.

음. 내가 만든 문제는 아니고 어디선가 봤던 문제인듯.

(정답을 몰라서 일단 내 코딩을 등록해두고 과감히 평가받기)


import javax.swing.JOptionPane;
interface Airconable{
abstract void mode(int temp);
}

class Aircon{
private int max_temp = 30;
private int min_temp = 18;
void operate(String operate, int temp){
if(operate.equals("on")){
if(control(temp)){
System.out.println("작동중");
}
else{
System.exit(0);
}
}
else if(operate.equals("off")){
System.out.println("정지");
System.exit(0);
}
else{
System.out.println("잘못입력했습니다");
System.exit(0);
}
}
boolean control(int temp){
System.out.println(temp+"도로 설정되었습니다.");
if(temp > max_temp){
System.out.println("온도가 너무 높게 설정되었습니다."+"종료합니다.");
return false;
}
else if(temp<min_temp){
System.out.println("온도가 너무 낮게 설정되었습니다."+"종료합니다.");
return false;
}
else{
return true;
}
}
}

class SelectMode extends Aircon implements Airconable{
SelectMode(String operate, int temp){
super.operate(operate,temp);
mode(temp);
}
@Override
public void mode(int temp) {
if(temp>25){
System.out.println("HOT MODE");
}
else if(temp<25){
System.out.println("COLD MODE");
}
else{
System.out.println("AIR CORE MODE");
}
}
}
public class aircon2 {
public static void main(String args[]){
String oper = "";
String question = "";
int temp = 25;
oper = JOptionPane.showInputDialog("시작:on  ,    종료:off.");
if(oper.equals("on")){
question = JOptionPane.showInputDialog("온도를 입력하세요.");
temp = Integer.parseInt(question);
}
SelectMode sm = new SelectMode(oper, temp);
}
}
:
Posted by 유쾌한순례자

추상클래스로 정의된 타입을 구현하는 클래스는 반드시 추상 클래스의 서브 클래스가 되어야 한다.

인터페이스를 구현하는 클래스의 경우는 인터페이스에 정의된 모든 메소드를 구현하고 인터페이스 구현 계약을 지키면

되므로 클래스 상속계층과는 무관하다.

각각의 장점(?) 즉 외부에 공개된 중요한 인터페이스와 연관시킨 골격 구현 추상클래스를 제공하여 인터페이스와

추상 클래스의 장점을 결합한다.

골격 구현 클래스의 작성법은 다음과 같다.

우선 대상이 되는 인터페이스를 파악하고, 구현할 메소드와 그대로 둘 메소드를 결정한다

그대로 둘 메소드가 골격 구현 클래스의 추상 메소드가 될 것이다.

그다음 그대로 둘 메소드를 제외한 인터페이스의 나머지 모든 메소드를 구현한다.

다음의 예제를 한번 보면 좀 더 이해가 갈 것 같다.

public abstract class AbstractMapEntry<K,V> implements Map.Entry<K,V> {
public abstract K getKey();
public abstract V getValue();

public V setValue(V value){
throw new UnsupportedOperationException();
}

//기타 Map.Entry.equals 메소드에 약속된 보면적 계약은 생략...
}

음 여기 항목도 결론은 상황에 따라 추상 클래스와 인터페이스 중 잘 선택해서 쓰자 라는 것.

추상 클래스는  진화의 용이성 이 중요할 때

인터페이스는 유연성이 중요할 때  인 것 같다.

:
Posted by 유쾌한순례자