JAVA Interface, Abstract

최범균님의 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴을 보고 느낀건,,,

첫번째 역시나 내가 너무 생각없이 일했구나,,,

두번째 예전에 객체 지향, 디자인 패턴 책을 보았을 때 느낌과는 상당히 틀리구나,,,

셋째 Interface, Abstract 정의

넷째 좌절 또 좌절,,,

어찌되었건,,,

Java에는 Interface란 놈과 Abstract란 놈이 있다.

Interface 정의
– 골격만 가지고 있는 클래스
– 몸체 없는 메서드(추상 메서드)로만 이루어진 클래스

1
2
3
4
5
6
7
8
9
10
11
12
public interface IRemoteControl{
    void powerOn(); //추상 메서드
    void powerOff(); //추상 메서드
    void channelUp(); //추상 메서드
    void channelDown(); //추상 메서드
    /*
    public abstract void powerOn(); //추상 메서드
    public abstract void powerOff(); //추상 메서드
    public abstract void channelUp(); //추상 메서드
    public abstract void channelDown(); //추상 메서드
    */

}

Interface 특징
– 메서드들은 abstract 메서드이기 때문에 abstract 생략 (public abstract)
– 메서드들은 구현 목적이기에 default public 속성 (일반 클래스는 default private)
– abstract 메서드를 포함하고 있기 때문에 객체 생성 불가

Interface 주의사항
– 인터페이스도 클래스의 한 종류이다.
– Interface 메서드를 모두 구현하지 않으면 Abstract가 된다.(모두 구현해야만 객체 생성 가능)

Abstract 정의
– 골격만 가지고 있는 클래스(불완전)
– 몸체 없는 메서드(추상 메서드)로만 이루어진 클래스
– 추상 메서드를 하나라도 포함하고 있으면 추상 클래스

1
2
3
4
5
public abstract class Test{ //추상 클래스를 포함 클래스
        public void sayHello(){  } // 일반 메서드
        public void sayHi(){  } // 일반 메서드
        public void sayHowareyou(); //몸체 없는 메서드 - 추상 메서드
}

Abstract 특징
– 메서드, 클래스 선언부 abstract 키워드 사용
– 미완성 클래스이기 때문에 자체적(Abstract를 이용해서)으로 절대 객체 생성 출가
– 하위 클래스(extends 받은 class)에서는 상위 클래스의 추상 메서드를 하나도 빼지 말고 전부 구현해야 한다.
– Abstract를 상속한 후 추상 메서드를 하나라도 남겨 두었다면 그 자체도 Abstract가 된다.
– 상속을 통해서 추상 메서드를 전부 구현해야만 객체 생성 가능
– Abstract는 메서드의 프로토타입(Prototype)만 가지고 있다.
– 클래스 구조 잡기 위한 방법으로 사용
– 일반 클래스에 abstract 키워드 사용으로 Abstract 구현시 상속 자체만으로 완전한 클래스가 된다.
– 추상 메서드를 포함하지 않는 Abstract를 사용하는 이유(Abstract를 무조건 상속받도록 하기 위해서)

1
2
3
4
5
6
7
/**
추상 클래스 - 2개의 추상 메서드를 포함한 추상 클래스의 예
**/

public abstract class EmptyCan {
    public abstract void printContent(); //추상 메서드
    public abstract void printName(); //추상 메서드
}
1
2
3
4
5
6
7
8
9
/**
추상의 추상 - 추상 클래스의 메서드를 모두 구현하지 않은 예
**/

public abstract class InCompleteCan extends EmptyCan{
    //EmptyCan의 printName() 구현
    public void printName() {
        System.out.println("InCompleteCan에서 printName() 구현");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
모든 추상 메서드의 구현
InCompleteCan에 남아 있던 모든 추상 메서드를 구현한 후 객체를 생성하는 예
**/

public class CompleteCan extends InCompleteCan {
    public void printContent(){//EmptyCan의 printContent() 구현
        System.out.println("CompleteCan에서 printContent() 구현");
    }
    public void sayHello() {//새로운 멤버 메서드 추가
        System.out.println("CompleteCan에서 sayHello() 추가 구현");
    }
    public static void main(String args[]) {
        CompleteCan cc = new CompleteCan(); //객체 생성
        cc.printName();
        cc.printContent();
        cc.sayHello();
    }
}

– Abstract EmptyCan는 두개의 추상 메서드를 가지고 있는데 상속받은 InCompleteCan 클래스에서 한개의 추상 메서드만 구현하였기 때문에 InCompleteCan 클래스 또한 Abstract가 된다. 그리고 InCompleteCan 클래스를 상속받은 CompleteCan에서 남은 추상 메서드를 구현했기 때문에 완전한 클래스가 되어서 객체 생성이 가능한다. InCompleteCan 클래스에서 한개의 추상 메서드만 구현하였지만 상속받은 InCompleteCan 클래스에서 구현한 추상 메서드 또한 실행가능

Abstract 주의사항
– 인터페이스도 클래스의 한 종류이다.
– Interface 메서드를 모두 구현하지 않으면 Abstract가 된다.(모두 구현해야만 객체 생성 가능)

Abstract와 Interface
– Abstract는 클래스의 일부분이 추상 메서드이다.
– Interface는 추상 메서드로만 이루어져 있다.

Abstract와 Interface 2
– 일반 클래스, Abstract는 extends를 이용해서 추상 메서드를 구현(상속)한다.
– Interface는 implements를 이용해서 추상 메서드를 구현(확장)한다.

찾아본 링크들 정리

http://www.okjsp.net/seq/235733

http://okjsp.net/bbs?seq=56298

http://okjsp.net/bbs?seq=133632

http://okjsp.net/bbs?seq=106693

http://okjsp.net/bbs?seq=114903

http://www.okjsp.net/bbs?seq=114923

http://silverktk.tistory.com/134

http://blog.naver.com/PostView.nhn?blogId=rkqnrdlrns&logNo=10177633885

http://iamreo.tistory.com/entry/%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%B0%A8%EC%9D%B42

http://chester777.tistory.com/150

IIS Network Drive 파일 쓰기

최근 작업 중에 이미지 에디터의 파일 생성 작업을 진행하였다.

TEST 서버는 IIS에서 D 드라이브로 작성하여 아무런 이슈가 없었는데

운영 서버 반영 이후 파일생성 시 30초가량의 시간이 소요되는 현상이 발생 되었다.

일단 타임 체크를 해보았는데 역시나 리쿼스트, 쿼리 등 모든 작업은 정상이었는데

파일 생성 시 시간이 오래 걸리는 이슈였다.

jquery 기반의 php 이미지 에디터였는데 php 내부에서도 network drive를 인식 하지 못하는 이슈도 발생

고난의 연속이었다.

1. php 에서 접근하는 경로를 k:/devenjoy/test 형식으로 되어 있던 경로를
//devenjoy.com/test 형식으로 바꿔주니 정상적으로 파일 경로는 찾을 수 있었음

2. 이미지 파일 생성 부분은 기존에는 network drive에 직접 라이트 하는 방식을 사용하였다.

1
2
3
4
5
6
7
8
9
10
11
File tempFile = new File("k:/devenjoy/test/test.jpg");
FileOutputStream fos =
      new FileOutputStream( tempFile );

int chunk = 0;
InputStream gifdata = result.getBinaryStream("photo_img");
while ((chunk = gifdata.read()) != -1) {
    fos.write(chunk);
}        // flush the data
fos.flush();
fos.close();

상위 방법에서 k 드라이브의 network drive 대신 IIS의 로컬 드라이브로 바꾼후
network drive로 파일 이동 처리하니 0초에 처리

1
2
3
4
// 이미지 복사
// IIS 로컬에 생성했던 임시 저장장소
File tempFile = new File("c:/temp/test/test.jpg");
tempFile.renameTo(new File( "k:/devenjoy/test/test.jpg" ));

이렇게 삽질을 끝냈다.

linux 나 다른 OS상에서도 발생할지 모르지만 삽질할 때 짜증은 났지만 차후를 위한 유익한 경험이었다.