설 연수
하하호홓
설 연수
전체 방문자
오늘
어제
  • 분류 전체보기 (231)
    • Back-End (2)
      • Java (20)
      • JSP (13)
      • Spring (18)
      • Kotlin (0)
      • node.js (0)
    • Front-End (68)
      • JavaScript (19)
      • jQuery (39)
      • Angular (4)
      • HTML (5)
    • Dev-Ops (12)
      • Linux, Cloud (5)
      • docker, k8s (5)
      • ElasticSeach (2)
    • Other (33)
      • OOP (3)
      • 알고리즘 (2)
      • DB (12)
      • Git (1)
      • Swift (4)
    • Backup (65)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 패스트캠퍼스
    • flex
    • 크로스도메인
    • Angular
    • Kafka
    • Redis
    • RESTful
    • jquery invalid
    • 404 error
    • angular callback
    • jOOQ
    • angular2
    • angular 콜백
    • CORS
    • angular4
    • page not found
    • MYSQL
    • INVALID
    • mongodb
    • docker

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    설 연수

    하하호홓

    Other/OOP

    interface 를 왜 사용하는가

    2012. 9. 14. 17:21

    자바를 처음 접한 건 아마 2001년인 것 같다.

    그 때는 이것저것 관심이 많아서 온 갖 거를 들쑤시고 다녔는데

    java 도 그 중에 하나였던듯

    어렴풋한 기억에 그 때 jdk1.2 였나.. 1.4였나 그 정도 버젼을 썼던 것 같다

     

    java 에 가장 실망한 거는

    독립 배포가 불가능하다는 거였는데

    배포하려면 jre도 함께 배포해야 한다는

    크나큰 단점 때문에 공부를 좀 하다가 말았던 것 같다

     

    그러다가 군대 갔을 때 짬먹으니깐 너무 심심해서 코딩 좀 하고 싶었는데

    그 때 부실한 인트라넷 환경에서

    겨우 구한 컴파일러가 JDK 였다.

    그걸로 이것저것 했던 기억이 난다.

     

    한번은 망고메신저라는 걸 만들었었는데

    당시 군대에는 맨날 컴퓨터 만지는 행정병이라도 메신저가 없어서 영 불편한 게 아니었다

    옆 사무실 애들한테 밥 먹으러 가자고 찾아가야 하고 잡담도 못하고 말야.

    그래서 만든게 망고메신저..

    난 망고다 이런게 아니고 사무자동화를 통해 망고가 되자

    뭐 이런 걸 표방한 것이었다 --;;

     

    후임들한테 보채서 반강제로 jre깔게하고 java 실행하는 거 배치파일로 만들어서 깔게하고

    채팅 테스트를 하는데...

    아나 다 좋은데

    대화창 스크롤바가 계속 가장 아래로 내려가서 가장 마지막에 한 대화가 보여야 하는데

    그게 안되고 스크롤바가 계속 원래 있던 위치에만 있었음.

    즉 대화를 입력할 때 마다 손으로 스크롤바를 내려줘야 한다는 -_-;;

    api 찾아가면서 별 짓을 다했는데도 안되서 포기.

    그 이후 전산보안감사에 걸려가지고 -_- 폐기되었다 ㅋㅋㅋ

     

     

     

    잡설이 길었고

    이 java 라고 하는 걸 공부하면서 가장 혼란스러웠던게

    바로 interface 가 뭐냐 였다.

    그래서 참고용으로 잠깐 노트를 둔다. 정확하지 않을수도 있다.

     

     

    일단 상속에 대해서 생각해보자

    상속은 엄마 클래스가 갖고 있는 field와 method 를 자식 클래스가 가져오는 것이다.

    예를 들어

    금융상품 이란 엄마클래스가 있으면

    이걸 상속받은 자식클래스들은 주식상품, 펀드상품, 채권상품 클래스가 있을 수 있다는거지.

    금융상품 이란 클래스에는 공통적인 상품의 field와 method 를 모아 놓고

    자식클래스에는 각 상품별로만 필요한 field 와 method 만 넣어놓는거다.

     

    이렇게 하면 확실히 하나의 클래스에 모든 field 를 모아 놓는 것 보다 메모리를 효율적으로 사용할 수 있고

    새로운 상품이 나오거나 특정 상품에 대한 변경이 있을 시 유지보수가 깔끔하다.

    그래서 상속이라는 거를 쓰는거다.

    단점은 design 이 어렵다. 확실히 현업에서는 이런 경우 공통된 field 와 method 를 정립하는 게

    꽤나 어려운 일이다. 이게 공통부인지 개별부인지 헤깔리는 것도 많고 말야.

    여기까지가 기본적인 상속.

    (중간저장)

     

    근데 금융상품에 매도 라는 method 가 있다고 치자.

    상품 잔고를 줄이고 해당하는 금액만큼 돈이 인출되는 것임.

    근데 자식 중에 펀드상품은 세금계산하는 부분이 복잡하고 다른 상품들이랑은 다르네.

    이런 경우 펀드상품은 매도method 를 재작성한다.

    이런 걸 overriding 이라고 한다.

    overriding 을 통하면 공통method 를 사용하고 싶은 상품들은 별도로 그 method 를 구현할 필요가 없고

    별도 method 가 필요한 class 는 구현하면 된다.

     

     

    자 이젠 금융서비스를 만들어보자

    input 으로는 계좌안의 상품 중에 어떤 ? 상품이 들어오고

    output 은 상품의 평가금액이라고 한다.

    문제는 input 에 어떤 상품이 들어올지 모른다는 것인데

    그렇기 때문에 각 상품별로 서비스를 각각 만들어야 하는것인가?

    그건 너무 비효율적이다.

    그래서 그런 경우 엄마 클래스인 금융상품 클래스 타입으로 input 을 받으면 된다

     

    즉 다시 말하면 엄마클래스의 인스턴스는 자식클래스의 인스턴스를 담을 수 있다.

    예) 금융상품 a = new 주식상품();

    대신 a 는 금융상품의 field 와 method 에만 접근이 가능하다.

    그리고 주식상품에 평가금액() 라는 메소드가 금융상품 평가금액() 라는 메소드를 overriding 한 경우

    예) a.평가금액(); 를 하는 경우

    금융상품.평가금액() 가 아닌 주식상품의 평가금액() 가 호출된다.

     

    즉, 각 특정상품별로 평가금액() 이 모두 overriding 되어 있다고 한다면

    요청된 서비스는 다음과 같이 구성될 수 있겠다

     

    금액 평가금액내놔(금융상품 a){

      return a.평가금액();

    }

     

     

    자 근데,, 금융상품 클래스에는 평가금액 구하는 방법을 구현해놓기가 애매하고

    자식클래스들에게 평가금액 구하는 방법을 다 구현하라고 시키고 싶어.

    이런 경우 엄마클래스인 금융상품 클래스를 abstract 로 선언을한다.

    그리고 평가금액 method 도 abstract 로 선언하여 포함시키고 구현은 하지 않는다.

    이런 경우 모든 자식 클래스들은 평가금액 method 를 overriding 해야 하는 의무가 있다.

    대신 이제는 엄마클래스로는 instance를 생성할 수 없다는 것.

     

    자 여기까지 오면 상속은 반쯤 희석화된다는 느낌이 온다.

    그리고 interface 가 등장한다.

    interface 는 상속에서 엄마 클래스라고 보면 되는데

    모든 메소드를 자식 클래스에게 구현하라고 시키는 것이다. 모조건 의무적으로 말이지.

    그래서 자식클래스 애기들은 interface를 상속extends 하는 것이 아니라

    implements구현한다.

     

    이제 interface 는 껍데기가 되는 것이고 말그래도 interface 역할만 하는 매개체 같은 놈,

    여러 클래스의 인스턴스를 담을 수 있는 그릇 같은 것이 된다

    모든 구현부는 이 interface 를 구현하는 구현class 들에게 맡긴 채 말야.

     

    이런  경우 해당 interface 를 구현하는 class 들의 spec 은 표준화 되기 때문에

    하나의 interface 객체로 여러 class 의 메소드를 호출할 수 있다.

    상속은 준다는 의미가 강한데 비해 그런 의미는 희석화 되고 부담만을 지우는 interface

    뭐랄까 polymorphism 의 극대화 같다는 느낌이 든다.

     

    이 interface 는 표준화된 관리가 필요한 enterprise 영역에서

    EJB 등의 형태로 많이 사용되고 있다.


    http://raweater.blog.me/20108834608

    [출처] java | interface 를 왜 사용하는가|작성자 raweater  

    [출처] java | interface 를 왜 사용하는가|작성자 raweater

    저작자표시 (새창열림)

    'Other > OOP' 카테고리의 다른 글

    헤드퍼스트 디자인패턴  (0) 2012.10.08
    객체지향(OOP) paste  (0) 2012.09.14
      'Other/OOP' 카테고리의 다른 글
      • 헤드퍼스트 디자인패턴
      • 객체지향(OOP) paste
      설 연수
      설 연수

      티스토리툴바